Vakta hunden och Mailman Scenario med Arduino (4 / 4 steg)
Steg 4: programmering
Vakthund
För vakthund robot, koden är programmerat som en "om annat" klausul. I dess vilande tillstånd, eller med andra ord den "else" del av satsen programmeras roboten att utföra "svajar" funktion där den skannar från sida till sida. Funktionen sway består av Arduino skicka signaler till servon till sväng vänster, fördröjning för lite, och sedan vända sig till rätt, förseningen för lite, och upprepa. Om någon av de infraröda sensorerna upptäcker något inom en viss zon, att roboten utföra en typ av larm. Larmet innehåller en "ögla" samt koder för att utlösa ljus och ljud. Larmet börjar genom att stoppa servon, sedan initierar den for-loop. Loopen utlöser blinkande av 4 lysdioder på Arduino styrelsen enligt hur många blixtar i loop funktion, i det här fallet valde vi 20 blixtar. Arduinoen fortsätter sedan att spela en ton sedan köra framåt spela en andra signal och sedan tillbaka bort till sin startposition. Grunden för detta program är att vakthund är vakar över sitt territorium, om det ser något då det larmar och "jagar" inkräktaren bort.
Kod för vakthund:
#include / / include Servo biblioteket
Servo servoLeft; Deklarera vänster och höger Servos Servo servoRight;
void setup() / / initiering kod
{pinMode (10, ingång); / / Ställ in stift till input/output power
pinMode (9, OUTPUT);
pinMode (3, ingång);
pinMode (2, utgång);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
tonen (11, 3000, 1000); Spela tonen i 1 sekund
Delay(1000);
servoLeft.attach(13); Anslut vänster och höger servon till stift
servoRight.attach(12); }
void loop() / / Main looping kod
{int irLeft = irDetect (9, 10, 39000); / / ställa in vänster och höger infraröda sensorer för att upptäcka för rörelse inom visst område intervall
int irRight = irDetect (2, 3, 39000);
om ((irLeft == 0) || (irRight == 0)) Om vänster eller höger infraröda sensorer upptäcker något, utföra alarmfunktionen
{alarm(20);
}
annat / / i alla andra fall, utföra funktionen "svajar"
{sway(0);}
}
int irDetect (int irLedPin, int irReceiverPin, lång frekvens)
{tonen (irLedPin, frekvens, 8); / / IRLED 38 kHz för minst 1 ms
Delay(1); Vänta 1 ms
int ir = digitalRead(irReceiverPin); IR-mottagare -> IR-variabel
Delay(1); Ner tid innan dubbelgranska
returnera ir; Returnera 1 ingen identifiera, 0 upptäcka}
Annullera larm (int blinkar) / / Alarm funktion
{servoLeft.writeMicroseconds(1500); / / skicka stopp signaler till både servon
servoRight.writeMicroseconds(1500);
för (int jag = 1; jag < = blinkar; i ++) / / ställa upp för funktionen "för loop" som variabeln ökar från 1 till antalet blixtar förklarade
{digitalWrite 5, hög, digitalWrite (6, hög); / / slå på lysdioder på stift 5 och 6
Delay(50); Fördröjning för 50 millisekunder
digitalWrite (5, låg). Stänga av lysdioder på stift 5 och 6
digitalWrite (6, låg).
Delay(50); Fördröjning för 50 millisekunder
} tonen (11, 4000, 1000); Spela tonen i 1 sekund
Delay(1000);
Forward(2000); Gå framåt i 2 sekunder
digitalWrite 5, hög,
digitalWrite (6, hög); / / slå på lysdioder på stift 5 och 6
tonen (11, 2000, 1000); Spela tonen i 1 sekund
Delay(1000);
digitalWrite (5, låg).
digitalWrite (6, låg).
Backward(2000); Gå bakåt i 2 sekunder
}
Annullera sway (int tid) / / gunga funktion
{servoLeft.writeMicroseconds(1700); / / rotera servon vid full hastighet moturs servoRight.writeMicroseconds(1700);
Delay(1000); ... för 1 sekund
servoLeft.writeMicroseconds(1300); Rotera servon på full hastighet medurs servoRight.writeMicroseconds(1300);
Delay(1000); ... för 1 sekund
}
utan laga kraft framåt (int tid) / / framåt funktion
{servoLeft.writeMicroseconds(1700); / / vänster Servo full hastighet moturs servoRight.writeMicroseconds(1300); / / rätt Servo full hastighet medurs
Delay(Time); Fördröjning för deklarerade tidsvärde
}
tomrum bakåt (int tid) / / bakåt funktion
{servoLeft.writeMicroseconds(1300); / / vänster Servo full hastighet medurs
servoRight.writeMicroseconds(1700); Rätt Servo höghastighets-motsols
Delay(Time); Fördröjning för deklarerade tidsvärde
}
Mailman
För Mailman robot, koden är programmerat som en "om annat" klausul också. Den huvudsakliga funktionen är att genom phototransistors, Mail mannen robot kommer att trenden mot ljuskällan. Om brevbäraren upptäcker något via dess IR-sensorer på vardera sidan, kommer att sedan brevbäraren släppa ut en viss ton som signalerar att den inser att det har uppmärksammats av den vakthund. Sedan, brevbäraren kommer backup för att komma bort från hunden eftersom det kommer in mot roboten. Grunden för denna del av koden är att brevbäraren vill komma till ljuskällan; om det ser hunden, sedan vet det dock att uppgiften inte kan ske.
Kod för Mailman Robot:
#include / / include servo bibliotek
Servo servoLeft; Deklarera vänster och höger servo Servo servoRight;
void setup() / / inbyggda initiering block {pinMode (10, ingång); / / Set pins till input/output power pinMode (9, OUTPUT), pinMode (3, OUTPUT), pinMode (2, utgång); pinMode (5, ingång); pinMode (12, OUTPUT), tonar (11, 3000, 1000); / / spela tonen för 1 andra delay(1000); / / fördröjning för att avsluta tonen servoLeft.attach(13); / / bifoga vänster signal till stift 13 servoRight.attach(12); / / koppla rätt signal till stift 12} void loop() / / Main slinga auto-repetitioner {int irLeft = irDetect (9 10, 39000); Ställa in vänster och höger infraröda sensorer för att upptäcka för rörelse inom vissa området rad int irRight = irDetect (2, 3, 39000); flyta TLämnad = float(rcTime(12)); Hamna på ljus & göra float float tRight = float(rcTime(2)); Få rätt ljus & göra float float ndShade; Normaliserade differentiell skugga ndShade = tRight / (TLämnad + tRight) - 0,5; Beräkna det och subtrahera 0.5 int speedLeft, speedRight; Deklarera hastighet variabler om ((irLeft == 0) || (irRight == 0)) Om vänster eller höger infraröda sensorer upptäcker något, utföra funktionen larm {backward(2000);} else om (ndShade > 0,0) / / skugga höger? {/ / Långsamt ner vänster hjul speedLeft = int (200,0 - (ndShade * 1300.0)); speedLeft = begränsa (speedLeft, -200, 200); speedRight = 200; / / Full fart rätt hjul} else om (ndShade < 0,0) / / skugga på vänster? {/ / Långsamt ner rätt hjul speedRight = int (200,0 + (ndShade * 1300.0)), speedRight = begränsa (speedRight, -200, 200); speedLeft = 200; / / Full fart vänster hjul} annat {} manöver (speedLeft, speedRight, 20); Ställ in ratten hastigheter}
lång rcTime (int pin) / / rcTime mäter förfall på pin {pinMode (pin, utgång); / / laddning kondensator digitalWrite (pin, hög); / /... genom att ställa in pin ouput-hög delay(5); // .. för 5 ms pinMode (pin, mata); Ställ in pinkodsskydd att mata in digitalWrite (pin, låg); // .. med ingen pullup lång tid = micros(); Markera den tid while(digitalRead(pin)); Väntar på spänning < tröskel tid = micros() - tid. Beräkna förfalla time återvända tid; Returer förfalla tid}
int irDetect (int irLedPin, int irReceiverPin, lång frekvens) {tonen (irLedPin, frekvens, 8); / / IRLED 38 kHz för minst 1 ms delay(1); / / Wait 1 ms int ir = digitalRead(irReceiverPin); / / IR-mottagare -> IR-variabel delay(1); / / ned tid innan dubbelgranska tillbaka ir; / / återvända 1 ingen identifiera, 0 upptäcka}
manöver funktionen void manöver (int speedLeft, int speedRight, int msTime) {servoLeft.writeMicroseconds(1500 + speedLeft); / / ställa in vänster servo hastighet servoRight.writeMicroseconds (1500 - speedRight); / / Ställ in rätt servo hastighet if(msTime==-1) / / om msTime = -1 {servoLeft.detach(); / / Stop servo signaler servoRight.detach();} delay(msTime); / / fördröjning för msTime}
tomrum bakåt (int tid) / / bakåt funktionen {servoLeft.writeMicroseconds(1300); / / vänster Servo full hastighet medurs servoRight.writeMicroseconds(1700); / / rätt Servo full hastighet moturs delay(time); / / fördröjning för deklarerade värde}
utan laga kraft framåt (int tid) {servoLeft.writeMicroseconds (1700); servoRight.writeMicroseconds (1300); delay(time);}