Sommaire |
Il était une fois un servomoteur très peureux : dès qu'on s'approchait de lui, il reculait. Pour voir les gens venir, il s'était lié d'amitié avec une carte arduino et un capteur de distance...
On alimente en 5V le capteur et le servomoteur (fil rouge du servomoteur et Vcc du capteur). Le fils noir du servomoteur ainsi que le GND du capteur sont reliés au ground (GND) d'arduino. Le dernier fils du servomoteur sera relié à la broche 9 : c'est par là que les commandes arrivent au servomoteur. La broche Trig du capteur sera reliée à l'entrée 12 et echo à 11.
#include <Servo.h> Servo myservo; // crée l'objet servomoteur pour contrôler le servomoteur int pos = 0; // variable pour sauvegarder la position du servomoteur int etat = 0; // variable permettant de connaître la position du servomoteur //création des variables de gestion du capteur int trig = 12; int echo = 11; long lecture_echo; long cm; void setup() { pinMode(trig, OUTPUT); //gestion du capteur digitalWrite(trig, LOW); pinMode(echo, INPUT); myservo.attach(9); // On précise que le servomoteur utilise la broche 9 } void loop() { //récupération de la distance séparant un obstacle du capteur digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); lecture_echo = pulseIn(echo, HIGH); cm = lecture_echo / 58; if((cm>25)&&!(etat==0)) { // si cette distance est plus grand que 25 cm et que le servomoteur n'est pas dans sa position 0 myservo.write(0); etat = 0; delay(1000); //On le met à la position 0 degrés } else if((cm>20)&&(cm<=25)&&!(etat==45)) { //si la distance est entre 20 et 25 cm et que le servomoteur n'est pas en position 45 degrés etat = 45; for(pos = 0; pos < 45; pos += 1) { myservo.write(pos); delay(15); } //on le met en position 45 degrés delay(1000); } else if((cm>15)&&(cm<=20)&&!(etat==90)) { //si la distance est entre 15 et 20 cm et que le servomoteur n'est pas à 90 degrés etat = 90; for(pos = 45; pos < 90; pos += 1) { myservo.write(pos); delay(15); } //On le met à 90 degrés delay(1000); } else if((cm>10)&&(cm<=15)&&!(etat==135)) { //Si la distance est entre 10 et 15 cm et que le servomoteur n'est pas à 135 degrés etat = 135; for(pos = 90; pos < 135; pos += 1) { myservo.write(pos); delay(15); } //On le met à 135 degrés delay(1000); } else if((cm<=10)&&!(etat==180)) { //Si la distance est inférieur à 10 cm et que le servomoteur n'est pas 180 degrés etat = 180; for(pos = 135; pos < 180; pos += 1) { myservo.write(pos); delay(15); } //On le met à 180 degrés delay(1000); } delay(1000); }
A noter : les lignes commençant par "//" sont des commentaires : ils sont effacés lorsque le programme est envoyé à l'arduino, ils n'influencent pas son application
Les états correspondent à la position en degrés du capteur : de 0 à 180 en allant de 45 en 45.
On voit qu'au fur est à mesure qu'on approche la main, le servomoteur recule :
La distance est récupérée par le capteur par la lecture de l'écho : un ultrason est émis par l'entrée Trig et est lu par l'entrée echo. Le temps de réponse diffère selon la distance entre le capteur et l'obstacle. Ensuite on vient comparer la distance avec les distances incluses dans le programme. Selon l'intervalle où se trouve la distance, la carte arduino pilote le servomoteur.
Cela permettrait-il de contrôler un servomoteur selon les mouvements d'une main devant un capteur de distance ?
Autres expériences avec le même concept, recherche sur internet (indiquer les liens).
Cela peut potentiellement permettre de contrôler un servomoteur à la main...
Plutôt dans une salle afin qu'on puisse utiliser un ordinateur. Attention au calibrage du capteur qui peut parfois être nécessaire.
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique