Stap 9: Optionele Update: beweging detectie
Voor deze extra stap, ik ga ervan uit u al hebt gebouwd de wielen om verkeer toe te staan (Zie optionele stap 8). Alles wat nu overblijft is het toevoegen van de sensor en enkele wijzigingen aanbrengen in de code voor de beweging detectie.
De sensor heeft 3 draden, geel signaal draad aangesloten op pin 3 op de arduino, terwijl de rode en zwarte verbonden bent met de v5 en grond respectievelijk op het bord.
Ik heb de sensor verborgen onder de deur, zoals in de afbeelding geplaatst, dus het kan 'zien' van de gebruiker verkeer alleen wanneer de deur wordt geopend. precies wat ik nodig heb!
Ik had ook voor het wijzigen van de code een beetje (hier) voor de uitvoering van een beweging detectie routine (Zie de code, in de functie zee7()), zodanig dat wanneer beweging wordt gedetecteerd, het vak gaan, eerst naar rechts en naar links, dan de hand klapt de schakelaar en verbergen. De code wordt zwaar commentaar, ik hoop dat ik niet overdrijven!
U kunt de bijgewerkte code hieronder vinden, merk ook op dat ik heb de machine pakt de beweegt willekeurig, kan dit worden veranderd naar sequentiële door gewoon boolean randomize = false;
Bedankt allemaal voor uw geweldige suggesties!
De code (beter te downloaden van het bestand gekoppeld aan deze stap in plaats van kopiëren/plakken van onderen) :
#include
Servo doorServo;
Servo handServo;
unsigned long TimerA, TimerB; timer voor de beweging detectie routine
int switch_pin = 2; set schakelaar op pin 2
motor variabelen
int motorThrottle = 11;
int motorDirection = 13;
int motorrem = 8;
Afstand variabelen
int motionPin = 3; Motion sensor pin op analoge 0
int lastDist = 0; om te onthouden van de laatste afstand
int currentDist = 0;
int propageren = 200; Drempel voor verkeer (instelling is zodanig dat u de gewenste sensetivity van bewegingsdetectie)
int pos = 0;
int selectedMove = 0; verplaatsen van selector
int Testmove = 0; test modus: ingesteld op het nummer voor het testen van slechts één geselecteerde beweging verplaatsen
(ingesteld op nul te lopen normaal dwz: roundrobbin op alle bewegingen)
Boolean randomize = true; Als de waarde true, het vak verhuizers willekeurig, doen zal als ingesteld op false, dan de bewegingen sequencially van 1 tot en met 10 gebeuren zal
VOID Setup
{
Serial.begin(9600);
pinMode (switch_pin, INPUT);
doorServo.attach(9); deur servo ingesteld op Pin 9 pwm
handServo.attach(10); hand servo ingesteld op Pin 10 pwm
doorServo.write(80); set deur verstopt positie
handServo.write(0); set hand standpunt verstopt
Setup kanaal B, aangezien kanaal A is voorbehouden door de deur en hand servo's en niet ber gebruikt op hetzelfde moment
pinMode (motorDirection, OUTPUT); Ingewijden Motor kanaal B pin
pinMode (motorrem, OUTPUT); Ingewijden rem kanaal B pin
}
void loop
{
Als de schakelaar ingeschakeld is, dan deur en hand uit te schakelen het verplaatsen...
if(digitalRead(switch_pin) == HIGH)
{
Als (Testmove == 0)
{
if(randomize == false)
{
Als (selectedMove > 10)
{
selectedMove = 0; Wanneer alle bewegingen worden gespeeld, herhaalt u de bewegingen vanaf begin
}
}
anders
{
selectedMove = random(11);
}
}
anders
{
selectedMove = Testmove;
}
Serial.println(selectedMove);
Als (selectedMove == 0) {switchoff();}
else if (selectedMove == 1) {switchoff();}
else if (selectedMove == 2) {switchoffbitaraddod();}
else if (selectedMove == 3) {crazydoor();}
else if (selectedMove == 4) {crazyslow();}
else if (selectedMove == 5) {m7anika7anika();}
else if (selectedMove == 6) {m3alla2();}
else if (selectedMove == 7) {switchoff();}
else if (selectedMove == 8) {matrix();}
else if (selectedMove == 9) {sneak();}
else if (selectedMove == 10) {zee7();}
Als (Testmove == 0 & & randomize == false) {}
selectedMove ++; overschakelen naar de volgende stap, zo niet in testmodus
}
}
}
Bibliotheek van bewegingen
elementaire beweging
VOID switchoff()
{
Bewegende deur
voor (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
Bewegende hand
voor (pos = 0; pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
verbergen van de hand
voor (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
delay(15);
}
}
verplaatsen van 3: open en wacht, dan verplaatsen van hand en wacht, dan schakelen van en verbergen
VOID switchoffbitaraddod()
{
Bewegende deur
voor (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(800);
Bewegende hand
voor (pos = 0; pos < 100; pos = 4)
{
handServo.write(pos);
delay(15);
}
delay(1000);
voor (pos = 100; pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
verbergen van de hand
voor (pos = 129; pos > = 0; pos-= 5)
{
handServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
delay(15);
}
}
verplaatsen van 4: open deur dan sluit het vele malen, wachten, dan snel reoprn een nd-schakelaar uit en verbergen.
VOID crazydoor()
{
Bewegende deur
voor (pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 125; pos > = 80; pos-= 5)
{
doorServo.write(pos);
delay(15);
}
Bewegende deur
voor (pos = 80; pos < 110; pos = 3)
{
doorServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 110; pos > = 80; pos-= 15)
{
doorServo.write(pos);
delay(15);
}
delay(700);
Bewegende deur
voor (pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(700);
verbergen van deur
voor (pos = 125; pos > = 80; pos-= 5)
{
doorServo.write(pos);
delay(15);
}
---voor de switch van---/ /
Bewegende deur
voor (pos = 80; pos < 155; pos = 8)
{
doorServo.write(pos);
delay(15);
}
Bewegende hand
voor (pos = 0; pos < 129; pos = 3)
{
handServo.write(pos);
delay(15);
}
verbergen van de hand
voor (pos = 129; pos > = 0; pos-= 3)
{
handServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 155; pos > = 80; pos-= 15)
{
doorServo.write(pos);
delay(15);
}
}
verplaatsen van 5: open deur, verplaats hand heel langzaam vooruit en terug naar verbergen heel langzaam, dan snel de deur dicht
VOID crazyslow()
{
Bewegende deur
voor (pos = 80; pos < 155; pos = 1)
{
doorServo.write(pos);
delay(30);
}
Bewegende hand
voor (pos = 0; pos < 129; pos = 1)
{
handServo.write(pos);
delay(30);
}
verbergen van de hand
voor (pos = 129; pos > = 0; pos-= 1)
{
handServo.write(pos);
delay(30);
}
verbergen van deur
voor (pos = 155; pos > = 125; pos-= 1)
{
doorServo.write(pos);
delay(30);
}
delay(100);
voor (pos = 125; pos > = 80; pos-= 4)
{
doorServo.write(pos);
delay(15);
}
}
6 verplaatsen:
ongeldig m7anika7anika() {}
Bewegende deur
voor (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
Bewegende hand
voor (pos = 0; pos < 70; pos = 1)
{
handServo.write(pos);
delay(15);
}
delay(800);
verbergen van deur
voor (pos = 155; pos > 130; = pos-= 3)
{
doorServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 130 pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 155; pos > 130; = pos-= 3)
{
doorServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 130 pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
handServo.write(40);
delay(1000);
Bewegende hand
voor (pos = 40 pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
verbergen van de hand
voor (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos);
delay(15);
}
voor (pos = 120; pos > = 80; pos-= 1)
{
doorServo.write(pos);
delay(15);
}
}
ongeldig m3alla2() {}
Bewegende deur
voor (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
Bewegende hand
voor (pos = 0; pos < 127; pos = 4)
{
handServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 155; pos > 130; = pos-= 3)
{
doorServo.write(pos);
delay(15);
}
delay(2000);
voor (pos = 130 pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
voor (pos = 155; pos > = 140; pos-= 3)
{
doorServo.write(pos);
delay(15);
}
voor (pos = 140 pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(500);
verbergen van de hand
voor (pos = 127; pos > = 0; pos-= 4)
{
handServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
delay(15);
}
}
VOID matrix()
{
Bewegende deur
voor (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
Bewegende hand
voor (pos = 0; pos < 80; pos = 4)
{
handServo.write(pos);
delay(15);
}
voor (pos = 80; pos < 129; pos = 1)
{
handServo.write(pos);
delay(30);
}
delay(300);
voor (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos);
delay(10);
}
verbergen van deur
voor (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
delay(15);
}
}
VOID sneak()
{
Bewegende deur
voor (pos = 80; pos < 130; pos = 1)
{
doorServo.write(pos);
delay(30);
}
delay(2000);
Bewegende hand
voor (pos = 0; pos < 40 pos = 1)
{
handServo.write(pos);
delay(30);
}
delay(500);
voor (pos = 130 pos < 155; pos = 4)
{
doorServo.write(pos);
delay(15);
}
delay(100);
voor (pos = 40 pos < 90; pos = 4)
{
handServo.write(pos);
delay(15);
}
delay(500);
verbergen van de hand
voor (pos = 90; pos > = 70; pos-= 4)
{
handServo.write(pos);
delay(15);
}
delay(100);
voor (pos = 70 pos < 90; pos = 4)
{
handServo.write(pos);
delay(15);
}
delay(100);
voor (pos = 90; pos > = 70; pos-= 4)
{
handServo.write(pos);
delay(15);
}
delay(100);
voor (pos = 70 pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
voor (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
delay(15);
}
}
deze stap zal de deur open en wacht voor verkeer, als gevonden in de buurt van de schakelaar,
het vak gaan eerst naar rechts en vervolgens naar links, en tot slot de hand beweegt en draait de uitschakelaar
VOID zee7()
{
open deur
voor (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(1200); wachten om te stabiliseren sensor lezingen na het openen van de deur
instellen van de timer en lees de sensor
wachten op beweging die groter is dan de drempel of als timer verloopt (5 sec),
lastDist = analogRead(motionPin);
TimerA = millis();
terwijl (millis ()-TimerA < = 5000)
{
currentDist = analogRead(motionPin);
De huidige afstand wijkt af van de laatste afstand door meer dan de drempel?
zo ja, dan naar rechts vak verplaatsen
Als ((currentDist > lastDist propageren || currentDist < lastDist - propageren) || currentDist > 300)
{
voorwaartse @ halve snelheid naar links (Kies de snelheid en de vertraging
(dwz delay(300) volgens u vak en accuspanning zodanig dat het verkeer gooien wenselijk is)
digitalWrite (motorDirection, laag); Bepaalt de richting van kanaal A
digitalWrite (motorrem, laag); Losraken van de rem voor kanaal B
analogWrite (motorThrottle, 100); Draait de motor op Channel B op volle snelheid
delay(300);
digitalWrite (motorrem, hoge); Eengage de rem voor kanaal B
breken;
}
lastDist = currentDist;
}
instellen van de timer en lees de sensor
wachten op beweging die groter is dan de drempel of als timer verloopt (5 sec),
delay(1200); wachten om te stabiliseren sensor lezingen na het openen van de deur
lastDist = analogRead(motionPin);
TimerB = millis();
terwijl (millis ()-TimerB < = 5000)
{
currentDist = analogRead(motionPin);
het vak al bewoog naar rechts en de huidige afstand afwijken van de laatste afstand door meer dan de drempel?
Zo ja, dan naar links verplaatsen
Als ((currentDist > lastDist propageren || currentDist < lastDist - propageren) || currentDist > 300)
{
achterwaartse @ halve snelheid naar rechts (het kiezen van de snelheid en de vertraging
(dwz delay(300) volgens u vak en accuspanning zodanig dat het verkeer gooien wenselijk is)
digitalWrite (motorDirection, hoge); Stelt LINKSAF richting van kanaal B
digitalWrite (motorrem, laag); Losraken van de rem voor kanaal B
analogWrite (motorThrottle, 100); Draait de motor op Channel B op halve snelheid
delay(300);
digitalWrite (motorrem, hoge); Eengage de rem voor kanaal B
breken;
}
lastDist = currentDist;
}
delay(100);
Bewegende hand
voor (pos = 0; pos < 130; pos = 4)
{
handServo.write(pos);
delay(15);
}
verbergen van de hand
voor (pos = 130; pos > = 0; pos-= 4)
{
handServo.write(pos);
delay(15);
}
verbergen van deur
voor (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
delay(15);
}
}