Hur man bygger en annan värdelös maskin: lätt att göra, och svårt att använda! (9 / 9 steg)
Steg 9: Valfri uppdatering: rörelse detektering
Att detta ytterligare steg, jag antar att du redan har byggt hjulen för att möjliggöra rörlighet (se valfria steg 8). Alla vad som återstår nu är att lägga till sensorn och göra vissa ändringar i koden för rörelse upptäckten.
Sensorn har 3 trådar, gul signal tråd ansluten till stift 3 på arduino, medan den röda och svarta är anslutna till v5 och marken respektive på styrelsen.
Jag har placerat sensorn dolt under dörren som visas i bilden, så det kan "se" användarens rörelse endast när dörren öppnas. exakt vad jag behöver!
Jag hade också ändra koden lite (här) för att genomföra en rörelse upptäckten rutin (se koden i funktionen zee7()), så att när rörelse upptäcks, rutan kommer att flytta, först till höger och sedan till vänster, sedan handen vänder växeln och Dölj. Koden är kraftigt kommenterade, jag hoppas jag inte överdriva!
Du kan hitta uppdaterade koden nedan, Observera också att jag har gjort den maskin plockar flyttas slumpmässigt, detta kan ändras tillbaka till sekventiellt genom att helt enkelt ange boolean randomize = false;
Tack alla för era bra förslag!
Koden (bättre att hämta filen bifogas detta steg i stället för att klistra in nedan) :
#include
Servo doorServo;
Servo handServo;
osignerade långa TimerA, TimerB; timer för rörelse upptäckten rutinen
int switch_pin = 2; Ställ in omkopplaren på pin 2
motoriska variabler
int motorThrottle = 11;
int motorDirection = 13.
int motorBrake = 8;
Avståndet variabler
int motionPin = 3; Motion sensor stift på analoga 0
int lastDist = 0; att komma ihåg senaste avstånd
int currentDist = 0;
int tröska = 200. Tröskelvärde för rörelse (ställa in den så att du får den önskade sensetivity av rörelsedetektorn)
int pos = 0;
int selectedMove = 0; flytta väljaren
int Testmove = 0; testläge: att flytta nummer att testa bara en valda drag
(inställd på noll för att köra normalt dvs: roundrobbin på alla flyttar)
Boolean randomize = sant; om sant, rutan kommer att göra movers slumpmässigt, om inställd på false då flyttar kommer att ske sequencially från 1 till 10
void setup()
{
Serial.BEGIN(9600);
pinMode (switch_pin, ingång);
doorServo.attach(9); ställa in dörren servo på Pin 9 pwm
handServo.attach(10); ställa in hand servo på Pin 10 pwm
doorServo.write(80); Ställ in dörren till gömmer sig position
handServo.write(0); Ställ in hand för att dölja position
UppsΣttningskanal B, sedan kanal A är reserverade av dörren och hand servon och inte kan ber används samtidigt
pinMode (motorDirection, produktionen); Initierar Motor kanal B pin
pinMode (motorBrake, produktionen); Initierar broms kanal B pin
}
void loop()
{
om den är påslagen, då flytta dörren och hand att stänga av...
IF(digitalRead(switch_pin) == hög)
{
om (Testmove == 0)
{
IF(randomize == false)
{
om (selectedMove > 10)
{
selectedMove = 0; När alla flyttar spelas, upprepa flyttar från början
}
}
annat
{
selectedMove = random(11);
}
}
annat
{
selectedMove = Testmove;
}
Serial.println(selectedMove);
om (selectedMove == 0) {switchoff();}
annat if (selectedMove == 1) {switchoff();}
annat if (selectedMove == 2) {switchoffbitaraddod();}
annat if (selectedMove == 3) {crazydoor();}
annat if (selectedMove == 4) {crazyslow();}
annat if (selectedMove == 5) {m7anika7anika();}
annat if (selectedMove == 6) {m3alla2();}
annat if (selectedMove == 7) {switchoff();}
annat if (selectedMove == 8) {matrix();}
annat if (selectedMove == 9) {sneak();}
annat if (selectedMove == 10) {zee7();}
om (Testmove == 0 & & randomize == false) {
selectedMove ++; Växla till nästa drag om inte i testläge
}
}
}
Biblioteket flyttar
grundläggande drag
void switchoff()
{
Rörliga dörren
för (pos = 80, pos < 155, pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Rörliga hand
för (pos = 0; pos < 129; pos = 4)
{
handServo.write(pos);
Delay(15);
}
gömmer sig hand
för (pos = 129, pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
Flytta 3: öppna och vänta, sedan flytta handen och vänta, sedan byta av och dölja
void switchoffbitaraddod()
{
Rörliga dörren
för (pos = 80, pos < 155, pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(800);
Rörliga hand
för (pos = 0; pos < 100; pos = 4)
{
handServo.write(pos);
Delay(15);
}
Delay(1000);
för (pos = 100; pos < 129; pos = 4)
{
handServo.write(pos);
Delay(15);
}
gömmer sig hand
för (pos = 129, pos > = 0; pos-= 5)
{
handServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
Flytta 4: öppna dörren då nära den många gånger, vänta, sedan snabbt reoprn en nd switch off och dölja.
void crazydoor()
{
Rörliga dörren
för (pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 125; pos > = 80; pos-= 5)
{
doorServo.write(pos);
Delay(15);
}
Rörliga dörren
för (pos = 80; pos < 110; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 110; pos > = 80; pos-= 15)
{
doorServo.write(pos);
Delay(15);
}
Delay(700);
Rörliga dörren
för (pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(700);
dölja dörren
för (pos = 125; pos > = 80; pos-= 5)
{
doorServo.write(pos);
Delay(15);
}
---av växeln av---/ /
Rörliga dörren
för (pos = 80, pos < 155, pos = 8)
{
doorServo.write(pos);
Delay(15);
}
Rörliga hand
för (pos = 0; pos < 129; pos = 3)
{
handServo.write(pos);
Delay(15);
}
gömmer sig hand
för (pos = 129, pos > = 0; pos-= 3)
{
handServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 155; pos > = 80; pos-= 15)
{
doorServo.write(pos);
Delay(15);
}
}
flytta 5: öppna dörren, sedan flytta handen mycket långsamt fram och tillbaka till gömmer sig mycket långsamt och sedan snabbt stänga dörren
void crazyslow()
{
Rörliga dörren
för (pos = 80, pos < 155, pos = 1)
{
doorServo.write(pos);
Delay(30);
}
Rörliga hand
för (pos = 0; pos < 129; pos = 1)
{
handServo.write(pos);
Delay(30);
}
gömmer sig hand
för (pos = 129, pos > = 0; pos-= 1)
{
handServo.write(pos);
Delay(30);
}
dölja dörren
för (pos = 155; pos > = 125; pos-= 1)
{
doorServo.write(pos);
Delay(30);
}
Delay(100);
för (pos = 125; pos > = 80; pos-= 4)
{
doorServo.write(pos);
Delay(15);
}
}
flytta 6:
void m7anika7anika() {
Rörliga dörren
för (pos = 80, pos < 155, pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Rörliga hand
för (pos = 0; pos < 70; pos = 1)
{
handServo.write(pos);
Delay(15);
}
Delay(800);
dölja dörren
för (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
handServo.write(40);
Delay(1000);
Rörliga hand
för (pos = 40; pos < 129; pos = 4)
{
handServo.write(pos);
Delay(15);
}
gömmer sig hand
för (pos = 129, pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
för (pos = 120; pos > = 80; pos-= 1)
{
doorServo.write(pos);
Delay(15);
}
}
void m3alla2() {
Rörliga dörren
för (pos = 80, pos < 155, pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Rörliga hand
för (pos = 0; pos < 127; pos = 4)
{
handServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(2000);
för (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos);
Delay(15);
}
för (pos = 155; pos > = 140; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
för (pos = 140, pos < 155, pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(500);
gömmer sig hand
för (pos = 127; pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
void matrix()
{
Rörliga dörren
för (pos = 80, pos < 155, pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Rörliga hand
för (pos = 0; pos < 80; pos = 4)
{
handServo.write(pos);
Delay(15);
}
för (pos = 80; pos < 129; pos = 1)
{
handServo.write(pos);
Delay(30);
}
Delay(300);
för (pos = 129, pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(10);
}
dölja dörren
för (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
void sneak()
{
Rörliga dörren
för (pos = 80; pos < 130; pos = 1)
{
doorServo.write(pos);
Delay(30);
}
Delay(2000);
Rörliga hand
för (pos = 0; pos < 40; pos = 1)
{
handServo.write(pos);
Delay(30);
}
Delay(500);
för (pos = 130; pos < 155; pos = 4)
{
doorServo.write(pos);
Delay(15);
}
Delay(100);
för (pos = 40; pos < 90; pos = 4)
{
handServo.write(pos);
Delay(15);
}
Delay(500);
gömmer sig hand
för (pos = 90; pos > = 70; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
Delay(100);
för (pos = 70; pos < 90; pos = 4)
{
handServo.write(pos);
Delay(15);
}
Delay(100);
för (pos = 90; pos > = 70; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
Delay(100);
för (pos = 70; pos < 129; pos = 4)
{
handServo.write(pos);
Delay(15);
}
för (pos = 129, pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}
Detta steg kommer att öppna dörren och vänta för rörelse, om de upptäcks nära växeln,
rutan kommer att flytta först till höger och sedan till vänster, och slutligen handen rör sig och stänger av växeln
void zee7()
{
öppna dörren
för (pos = 80, pos < 155, pos = 3)
{
doorServo.write(pos);
Delay(15);
}
Delay(1200); vänta med att stabilisera sensormätningar när dörren öppnas
ställa in timern och läsa sensorn
vänta för rörelse som överstiger tröskeln eller om timer går ut (5 sek),
lastDist = analogRead(motionPin);
TimerA = millis();
medan (millis ()-TimerA < = 5000)
{
currentDist = analogRead(motionPin);
Det nuvarande avståndet avviker från senaste avståndet mer än tröskeln?
Om ja, sedan flytta rutan till höger
om ((currentDist > lastDist tröska || currentDist < lastDist - tröska) || currentDist > 300)
{
framåt @ halvfart till vänster (välja hastighet och förseningen
(i.e delay(300) du rutan och batterispänningen så att rörelsen kasta är önskvärt)
digitalWrite (motorDirection, låg); Upprättar rätt riktning av kanal A
digitalWrite (motorBrake, låg); Lossa bromsen för kanal B
analogWrite (motorThrottle, 100); Snurrar motorn på kanal B i full fart
Delay(300);
digitalWrite (motorBrake, hög); Eengage bromsar för kanal B
bryta;
}
lastDist = currentDist;
}
ställa in timern och läsa sensorn
vänta för rörelse som överstiger tröskeln eller om timer går ut (5 sek),
Delay(1200); vänta med att stabilisera sensormätningar när dörren öppnas
lastDist = analogRead(motionPin);
TimerB = millis();
medan (millis ()-TimerB < = 5000)
{
currentDist = analogRead(motionPin);
rutan redan rörde sig till höger och det nuvarande avståndet avviker från det senaste avståndet mer än tröskeln?
Om ja, sedan flytta till vänster
om ((currentDist > lastDist tröska || currentDist < lastDist - tröska) || currentDist > 300)
{
bakåt @ halvfart till höger (välja hastighet och förseningen
(i.e delay(300) du rutan och batterispänningen så att rörelsen kasta är önskvärt)
digitalWrite (motorDirection, hög); Upprättar vänster riktning av kanal B
digitalWrite (motorBrake, låg); Lossa bromsen för kanal B
analogWrite (motorThrottle, 100); Snurrar motorn på kanal B på halvfart
Delay(300);
digitalWrite (motorBrake, hög); Eengage bromsar för kanal B
bryta;
}
lastDist = currentDist;
}
Delay(100);
Rörliga hand
för (pos = 0; pos < 130; pos = 4)
{
handServo.write(pos);
Delay(15);
}
gömmer sig hand
för (pos = 130; pos > = 0; pos-= 4)
{
handServo.write(pos);
Delay(15);
}
dölja dörren
för (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos);
Delay(15);
}
}