Etape 9: Mise à jour facultative : détection de mouvement
Pour cette étape supplémentaire, je suppose que vous avez déjà construit les roues pour permettre le mouvement (voir étape facultative 8). Tout ce qui reste maintenant est d’ajouter la sonde et de faire quelques modifications dans le code de détection de mouvement.
Le capteur a 3 fils de fils, jaune signal connectée à la broche 3 sur arduino, tandis que le rouge et le noir sont connectés à la v5 et sol respectivement sur la planche.
J’ai placé le capteur caché sous la porte, comme illustré dans l’image, donc il peut « voir » les mouvements de l’utilisateur uniquement lorsque la porte s’ouvre. exactement ce que j’ai besoin !
J’ai dû également changer le code un peu (ici) pour mettre en œuvre une routine de détection de mouvement (voir le code, dans la fonction zee7()), telle que lorsque le mouvement est détecté, la boîte se déplacera, tout d’abord à droite, puis vers la gauche, puis la main fait basculer l’interrupteur et se cacher. Le code est largement commenté, j’espère que je n’en faites pas trop !
Vous pouvez trouver le code de mise à jour ci-dessous, Notez également que j’ai fait le choix de machine les coups au hasard, ceci peut être changé en séquentiel en définissant simplement boolean randomiser = false ;
Merci à tous pour vos excellentes suggestions !
Le code (préférable de télécharger le fichier joint à cette étape au lieu de copier/coller par le dessous) :
#include
Servo doorServo ;
Servo handServo ;
unsigned long TimerA, TimerB ; minuterie pour la routine de détection de mouvement
int switch_pin = 2 ; Mettez l’interrupteur sur la broche 2
moteurs variables
int motorThrottle = 11 ;
int motorDirection = 13 ;
frein moteur int = 8 ;
Variables de distance
int motionPin = 3 ; Motion sensor broche analogique 0
int lastDist = 0 ; se rappeler la dernière distance
int currentDist = 0 ;
battre l’int = 200 ; Seuil de mouvement (Réglez-le de sorte que vous obtenez le sensetivity désiré de détection de mouvement)
int pos = 0 ;
int selectedMove = 0 ; déplacer le sélecteur
int Testmove = 0 ; mode test : ensemble pour déplacer nombre pour ne tester qu’un seul déplacement sélectionné
(la valeur zéro à fonctionner normalement c’est à dire : roundrobbin sur tous les coups)
randomize, boolean = true ; Si true, la boîte fera déménageurs au hasard, si la valeur false, puis les coups seront fera sequencially de 1 à 10
void setup()
{
Serial.Begin(9600) ;
pinMode (switch_pin, entrée) ;
doorServo.attach(9) ; Set servo porte sur 9 broches pwm
handServo.attach(10) ; Set servo main sur 10 broches pwm
doorServo.write(80) ; ensemble porte pour cacher la position
handServo.write(0) ; Set main pour cacher la position
Installation canal B, étant donné que canal A est réservé par les servos de porte et de la main et ne peut pas ber utilisé en même temps
pinMode (motorDirection, sortie) ; Goupille d’initiés moteur canal B
pinMode (frein moteur, sortie) ; Goupille d’initiés frein canal B
}
void loop()
{
Si l’interrupteur est allumé, puis déplacez la porte et la main pour l’éteindre...
if(digitalRead(switch_pin) == HIGH)
{
Si (Testmove == 0)
{
if(Randomize == false)
{
Si (selectedMove > 10)
{
selectedMove = 0 ; Lorsque tous les coups sont joués, répétez les mouvements du début
}
}
d’autre
{
selectedMove = random(11) ;
}
}
d’autre
{
selectedMove = Testmove ;
}
Serial.println(selectedMove) ;
Si (selectedMove == 0) {switchoff();}
ElseIf (selectedMove == 1) {switchoff();}
ElseIf (selectedMove == 2) {switchoffbitaraddod();}
ElseIf (selectedMove == 3) {crazydoor();}
ElseIf (selectedMove == 4) {crazyslow();}
ElseIf (selectedMove == 5) {m7anika7anika();}
ElseIf (selectedMove == 6) {m3alla2();}
ElseIf (selectedMove == 7) {switchoff();}
ElseIf (selectedMove == 8) {matrix();}
ElseIf (selectedMove == 9) {sneak();}
ElseIf (selectedMove == 10) {zee7();}
Si (Testmove == 0 & & randomiser == false) {}
selectedMove ++ ; passer au coup suivant, sinon en mode test
}
}
}
Bibliothèque de mouvements
mouvement de base
Sub switchoff()
{
Porte en mouvement
pour (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Passer la main
pour (pos = 0; pos < 129; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
cacher la main
pour (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
}
déplacer 3: ouvrir et attendre, puis passer la main et attendre, puis changez d’et cacher
Sub switchoffbitaraddod()
{
Porte en mouvement
pour (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Delay(800) ;
Passer la main
pour (pos = 0; pos < 100; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
Delay(1000) ;
pour (pos = 100; pos < 129; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
cacher la main
pour (pos = 129; pos > = 0; pos-= 5)
{
handServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
}
déplacer les 4: ouvrir la porte puis fermez ça plusieurs fois, attendre, puis rapidement reoprn une nd éteindre et cacher.
Sub crazydoor()
{
Porte en mouvement
pour (pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 125; pos > = 80; pos-= 5)
{
doorServo.write(pos) ;
Delay(15) ;
}
Porte en mouvement
pour (pos = 80; pos < 110; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 110; pos > = 80; pos-= 15)
{
doorServo.write(pos) ;
Delay(15) ;
}
Delay(700) ;
Porte en mouvement
pour (pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Delay(700) ;
porte de masquage
pour (pos = 125; pos > = 80; pos-= 5)
{
doorServo.write(pos) ;
Delay(15) ;
}
---de commutateur de---/ /
Porte en mouvement
pour (pos = 80; pos < 155; pos = 8)
{
doorServo.write(pos) ;
Delay(15) ;
}
Passer la main
pour (pos = 0; pos < 129; pos = 3)
{
handServo.write(pos) ;
Delay(15) ;
}
cacher la main
pour (pos = 129; pos > = 0; pos-= 3)
{
handServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 155; pos > = 80; pos-= 15)
{
doorServo.write(pos) ;
Delay(15) ;
}
}
déplacer 5: porte ouverte, puis déplacez main très lentement vers l’avant et arrière à cacher très lentement, puis refermez vite la porte
Sub crazyslow()
{
Porte en mouvement
pour (pos = 80; pos < 155; pos = 1)
{
doorServo.write(pos) ;
Delay(30) ;
}
Passer la main
pour (pos = 0; pos < 129; pos = 1)
{
handServo.write(pos) ;
Delay(30) ;
}
cacher la main
pour (pos = 129; pos > = 0; pos-= 1)
{
handServo.write(pos) ;
Delay(30) ;
}
porte de masquage
pour (pos = 155; pos > = 125; pos-= 1)
{
doorServo.write(pos) ;
Delay(30) ;
}
Delay(100) ;
pour (pos = 125; pos > = 80; pos-= 4)
{
doorServo.write(pos) ;
Delay(15) ;
}
}
déplacer 6 :
void m7anika7anika() {}
Porte en mouvement
pour (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Passer la main
pour (pos = 0; pos < 70; pos = 1)
{
handServo.write(pos) ;
Delay(15) ;
}
Delay(800) ;
porte de masquage
pour (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
handServo.write(40) ;
Delay(1000) ;
Passer la main
pour (pos = 40; pos < 129; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
cacher la main
pour (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos) ;
Delay(15) ;
}
pour (pos = 120; pos > = 80; pos-= 1)
{
doorServo.write(pos) ;
Delay(15) ;
}
}
void m3alla2() {}
Porte en mouvement
pour (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Passer la main
pour (pos = 0; pos < 127; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 155; pos > = 130; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Delay(2000) ;
pour (pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
pour (pos = 155; pos > = 140; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
pour (pos = 140; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Delay(500) ;
cacher la main
pour (pos = 127; pos > = 0; pos-= 4)
{
handServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
}
matrix() Sub
{
Porte en mouvement
pour (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Passer la main
pour (pos = 0; pos < 80; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
pour (pos = 80; pos < 129; pos = 1)
{
handServo.write(pos) ;
Delay(30) ;
}
Delay(300) ;
pour (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos) ;
Delay(10) ;
}
porte de masquage
pour (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
}
Sub sneak()
{
Porte en mouvement
pour (pos = 80; pos < 130; pos = 1)
{
doorServo.write(pos) ;
Delay(30) ;
}
Delay(2000) ;
Passer la main
pour (pos = 0; pos < 40; pos = 1)
{
handServo.write(pos) ;
Delay(30) ;
}
Delay(500) ;
pour (pos = 130; pos < 155; pos = 4)
{
doorServo.write(pos) ;
Delay(15) ;
}
Delay(100) ;
pour (pos = 40; pos < 90; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
Delay(500) ;
cacher la main
pour (pos = 90; pos > = 70; pos-= 4)
{
handServo.write(pos) ;
Delay(15) ;
}
Delay(100) ;
pour (pos = 70; pos < 90; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
Delay(100) ;
pour (pos = 90; pos > = 70; pos-= 4)
{
handServo.write(pos) ;
Delay(15) ;
}
Delay(100) ;
pour (pos = 70; pos < 129; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
pour (pos = 129; pos > = 0; pos-= 4)
{
handServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
}
ce mouvement va ouvrir la porte et d’attendre pour le mouvement, si détecté près de l’aiguillage,
la boîte se déplacera d’abord à droite, puis vers la gauche, et enfin la main se déplace et s’éteint l’interrupteur
Sub zee7()
{
porte ouverte
pour (pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
Delay(1200) ; attendre pour stabiliser les lectures du capteur après l’ouverture de la porte
Réglez la minuterie et lire le capteur
Attendez de mouvement qui dépasse le seuil, ou si la minuterie expire (5 s),
lastDist = analogRead(motionPin) ;
TimerA = millis() ;
tandis que (millis ()-TimerA < = 5000)
{
currentDist = analogRead(motionPin) ;
La distance actuelle s’écarte de la dernière distance supérieure au seuil ?
dans l’affirmative, puis déplacer boîte vers la droite
Si ((currentDist > lastDist battre || currentDist < lastDist - battre) || currentDist > 300)
{
avant @ demi-vitesse vers la gauche (choisir la vitesse et le retard
(boîte de delay(300) c’est à dire selon vous et tension de la batterie telle que le mouvement jeter est souhaitable)
digitalWrite (motorDirection, basse) ; Établit la bonne direction du canal A
digitalWrite (frein moteur, faible) ; Débloquer le frein pour le canal B
analogWrite (motorThrottle, 100) ; Fait tourner le moteur à pleine vitesse sur canal B
Delay(300) ;
digitalWrite (frein moteur, HIGH) ; Eengage le frein pour le canal B
rupture ;
}
lastDist = currentDist ;
}
Réglez la minuterie et lire le capteur
Attendez de mouvement qui dépasse le seuil, ou si la minuterie expire (5 s),
Delay(1200) ; attendre pour stabiliser les lectures du capteur après l’ouverture de la porte
lastDist = analogRead(motionPin) ;
TimerB = millis() ;
tandis que (millis ()-TimerB < = 5000)
{
currentDist = analogRead(motionPin) ;
la boîte déjà bougea vers la droite et l’actuelle dévient de distance de la dernière distance supérieure au seuil ?
Dans l’affirmative, puis déplacer vers la gauche
Si ((currentDist > lastDist battre || currentDist < lastDist - battre) || currentDist > 300)
{
en arrière @ moitié de vitesse vers la droite (choisir la vitesse et le retard
(boîte de delay(300) c’est à dire selon vous et tension de la batterie telle que le mouvement jeter est souhaitable)
digitalWrite (motorDirection, HIGH) ; Établit à gauche en direction du canal B
digitalWrite (frein moteur, faible) ; Débloquer le frein pour le canal B
analogWrite (motorThrottle, 100) ; Fait tourner le moteur sur le canal B à mi-vitesse
Delay(300) ;
digitalWrite (frein moteur, HIGH) ; Eengage le frein pour le canal B
rupture ;
}
lastDist = currentDist ;
}
Delay(100) ;
Passer la main
pour (pos = 0; pos < 130; pos = 4)
{
handServo.write(pos) ;
Delay(15) ;
}
cacher la main
pour (pos = 130; pos > = 0; pos-= 4)
{
handServo.write(pos) ;
Delay(15) ;
}
porte de masquage
pour (pos = 155; pos > = 80; pos-= 3)
{
doorServo.write(pos) ;
Delay(15) ;
}
}