Motoriserade, ljud reagerar Star Wars på St Bandai modell, med Arduino. (9 / 12 steg)
Steg 9: Programmet Arduino
Programmet
Dags för att programmera vårt Arduino, måste du ansluta den till en USB-porten på din pc, och sedan öppna EDI och ladda upp skissen nedan.
Om denna kod som jag gjort kan jag säga:
- Det använder Millis och inte förseningar att göra sitt jobb
- Den har 3 lägen:
- "Scan": det är när maskinen är som skanning miljön går långsamt huvudet vänster och höger.
- "AfraidSx": det är när ett ljud har upptäckts på vänster. Maskinen visar till vänster, och slumpmässigt flyttar en det är huvud räkna ut om det finns något att skjuta på.
- "AfraidDx": samma som ovan, men till höger.
Sund upptäckt utlöser en av dessa transportmedel
- "Upptäcka buller" (den svåraste delen) är alltid igång och dess syfte är att göra åtskillnad mellan mellan samtal och buller. Innan detta introducerades, något utlöste huvud rotation och var inte mycket cool.
#include < br >
Servo servo;
int center = 115;
int limitsx = 85.
int limitdx = 145;
int beteende = 1; setta behaviuour iniziale
int pos = 85.
int riktning = 1;
byte endingAfraid = 0;
Knock
CONST int gaspedalsignal = 5; piezo är ansluten till analoga stift 0
CONST int tröskel = 100; tröskelvärde som beslutar när upptäckta ljudet är en knock eller inte
int sensorReading = 0;
osignerade långa millisAtKnockDx = 0;
slå sx
CONST int knockSensor2 = 3; piezo är ansluten till analoga stift 0
CONST int tröskel = 100; tröskelvärde som beslutar när upptäckta ljudet är en knock eller inte
int sensorReading2 = 0;
osignerade långa millisAtKnockSx = 0;
Verboselog
CONST int VelocityCiclo1 = 1000;
int CountCiclo1 = 0;
osignerade långa previousMillis1;
afraiddx
CONST int StartVelocityCiclo2 = 100;
CONST int EndVelocityCiclo2 = 500.
int CountCiclo2 = 0;
osignerade långa previousMillis2;
byte servoSweep2 = 0;
afraidsx
CONST int StartVelocityCiclo4 = 100;
CONST int EndVelocityCiclo4 = 500.
int CountCiclo4 = 0;
osignerade långa previousMillis4;
byte servoSweep4 = 0;
ledloop
CONST int VelocityCiclo5 = 200.
int CountCiclo5 = 0;
osignerade långa previousMillis5;
byte servoSweep5 = 0;
Scan
CONST int VelocityCiclo3 = 130;
int CountCiclo3 = 0;
osignerade långa previousMillis3;
int pos3 = 0;
DetectnOise
int KnockDetected = 0;
int PreviousKnockDetected = 0;
CONST int VelocityCiclo6 = 500. lentezza del ciclo di upptäcka rumore
int CountCiclo6 = 0;
osignerade långa previousMillis6;
int NoiseTresh = 2; Soglia. abbassare per rendere meno sensibile al casino. se ho eller 3 slå 1000 MSEK allora non è un tirgeer...
int NoiseDetected = 0;
DDelayUscita da buller
CONST int VelocityCiclo7 = 1000; lentezza de la quale tornare alla normalità...
int CountCiclo7 = 0;
osignerade långa previousMillis7;
void setup() {
servo.attach(6);
Serial.BEGIN(9600); initiera seriell kommunikation 4 debug
pinMode (ControlSwitch, indata); //
pinMode (Led5, OUTPUT);
pos3 = limitsx;
//IntLed----------------------
ledde
pinMode (12, OUTPUT);
pinMode (11, OUTPUT);
pinMode (10, OUTPUT);
pinMode (9, OUTPUT);
pinMode (8, OUTPUT);
pinMode (7, OUTPUT);
//IntLed----------------------
}
void loop() {
Växla (beteende) {
fall 1:
Scan();
AfraidFr();
bryta;
fall 2:
om ((millis() < = millisAtKnockDx)) {/ / cicli dopo jag quali tornare i scan
AfraidDx();
}
annat {
Riktning = 0;
Beteende = 1;
endingAfraid = 1;
}
bryta;
fall 3:
om ((millis() < = millisAtKnockSx)) {/ / cicli dopo jag quali tornare i scan
AfraidSx();
}
annat {
Riktning = 1;
Beteende = 1;
endingAfraid = 1;
}
bryta;
}
KnockTriggerDx();
KnockTriggerSx();
VerboseLog();
DetectNoise();
digitalWrite 12, hög.
digitalWrite (11, hög).
digitalWrite 10, hög.
digitalWrite (9, hög).
digitalWrite 8, hög.
digitalWrite (7, hög).
}
void KnockTriggerDx() {
Läs sensorn och lagrar det i variabeln sensorReading:
sensorReading = digitalRead(knockSensor);
om sensorn läsningen är större än tröskelvärdet:
om (sensorReading == 1) {
Växla status för ledPin:
Serial.println ("Knock DX!");
KnockDetected ++; setetför att per riconoscere parlato.
millisAtKnockDx = millis() + random(3000,10000); azzero counter rädd dx
om (NoiseDetected == 0) {
Beteende = 2; Vado i rädd dx
}
Delay(200);
}
}
void KnockTriggerSx() {
Läs sensorn och lagrar det i variabeln sensorReading:
sensorReading2 = digitalRead(knockSensor2);
om sensorn läsningen är större än tröskelvärdet:
om (sensorReading2 == 1) {
Växla status för ledPin:
Serial.println ("Knock SX!");
KnockDetected ++; setetför att per riconoscere parlato.
millisAtKnockSx = millis() + random(3000,10000); azzero counter rädd dx
om (NoiseDetected == 0) {
Beteende = 3; Vado i rädd sx
}
Delay(200);
}
}
void AfraidDx() {
om (millis() > = previousMillis2) {
CountCiclo2 ++;
previousMillis2 = previousMillis2+random(StartVelocityCiclo2,EndVelocityCiclo2); varje fall blir 100ms
servoSweep2 = random(1,4); seleziona caso slumpmässiga tra 1 e 3
/ * om (servoSweep == 7) {//cicla tutti jag casi
servoSweep = 1;
}*/
}
växel (servoSweep2) {
fall 1:
POS = limitdx-3;
servo.write(POS);
bryta;
fall 2:
POS = limitdx-6;
servo.write(POS);
bryta;
fall 3:
POS = limitdx;
servo.write(POS);
bryta;
} / / end av svep
}
void AfraidSx() {
om (millis() > = previousMillis4) {
CountCiclo4 ++;
previousMillis4 = previousMillis4+random(StartVelocityCiclo4,EndVelocityCiclo4); varje fall blir 100ms
servoSweep4 = random(1,4); seleziona caso slumpmässiga tra 1 e 3
/ * om (servoSweep == 7) {//cicla tutti jag casi
servoSweep = 1;
}*/
}
växel (servoSweep4) {
fall 1:
POS = limitsx + 3.
servo.write(POS);
bryta;
fall 2:
POS = limitsx + 6.
servo.write(POS);
bryta;
fall 3:
POS = limitsx;
servo.write(POS);
bryta;
} / / end av svep
}
void LedLoop() {
}
void Scan() {
om (millis() > = previousMillis3) {
om (endingAfraid == 1) {//se till uscendao da rädd resetto la pos per fluidità
endingAfraid = 0;
om (riktning == 0) {
previousMillis3 = previousMillis2;
pos3 = limitdx - 6.
}
annat {
previousMillis3 = previousMillis4;
pos3 = limitsx + 6.
}
}
CountCiclo3 ++;
debug / / Serial.println(pos3);
previousMillis3 = previousMillis3 + VelocityCiclo3;
om (riktning % 2) {//se Odd (da basso en alto) (da gräns sx en gräns dx)
IF(pos3 < limitdx) {
pos3 ++;
servo.write(pos3);
}
annat {
Riktning ++; se ho raggiunto il limite aumenta di 1 direzione, invertendola
}
}
annat //se pari
IF(pos3 > limitsx) {
pos3--;
servo.write(pos3);
}
annat {
Riktning ++; se ho raggiunto il limite aumenta di 1 direzione, invertendola
}
}
}
void DetectNoise()
{
om (millis() > = previousMillis6) {
CountCiclo6 ++;
se dopo un po di tempo/VelocityCiclo6)...
previousMillis6 = previousMillis6 + VelocityCiclo6;
Ho accumulato troppi knokkeddx ed sx...
om (PreviousKnockDetected < = KnockDetected) {/ / per capirlo sottracco quelli di ora - quelli föregående ciclo (lento) se > x sono i buller...
PreviousKnockDetected = KnockDetected + NoiseTresh; Azzer... NoiseTresh = soglia che vado en aggiugnere...
Serial.println();
Serial.println("!!! brus upptäckt! Chi parla???"); triggero logg
Serial.println();
Beteende = 1; e vado i modalità idonea...
NoiseDetected = 1; QS variabile impedisce ad altri knoc di cambiare beteende x un po'...
previousMillis7 = previousMillis6 + VelocityCiclo7; setetför att dalay per rientro varaibile NoiseDetected
} annat {
om (millis() > = previousMillis7) {//dopo xx ulteirori millisecondi...
CountCiclo7 ++;
NoiseDetected = 0; Vado via dastato di noisedetected...
}
}
PreviousKnockDetected = KnockDetected + NoiseTresh;
debug / / Serial.print ("utlösa rilevati i unità di tempo =");
debug / / Serial.println(PreviousKnockDetected-KnockDetected);
}
}
void VerboseLog()
{
om (millis() > = previousMillis1) {
CountCiclo1 ++;
previousMillis1 = previousMillis1 + VelocityCiclo1; varje fall blir 100ms
kul Verboselog
Serial.Print("| CountCiclo1 = ");
Serial.Print(CountCiclo1);
Serial.Print("| knockDX = ");
Serial.Print(millisAtKnockDx);
Serial.Print ("PreviousKnocKDetected =");
Serial.Print(PreviousKnockDetected);
Serial.Print ("KnocKDetected =");
Serial.Print(KnockDetected);
Serial.Print ("NoiseDetectedStatus =");
Serial.Print(NoiseDetected);
Serial.println("End");
}
}