Arduino 2019-6a: montage ServoMoteur avec UltraSon HC-SR04 _ Processing
bricolage:
consignes pour monter le servomoteur avec le capteur UltraSon HC-SR04:
Montage 1:2 servomoteur Ultrason SR04
Montage 2:2 servomoteur Ultrason SR04
programmes: Crepp_radar.ino
le servomoteur va tourner lentement de gauche à droite puis de droite à gauche, permettant au capteur ultrason de mesurer la distance par rapport au plus proche objet.
Le programme envoie à la fenêtre terminal le couple de donnée degré,distance.
code Arduino
// ajout bibliothèque du servo moteur #include <Servo.h>. // Definition broches Trig et Echo pour ultrason const int trigPin = 10; const int echoPin = 11; const float VitesseSon = 0.034; // vitesse son= 340 m/s // Variables duree et distance long duree; int distance; // objet servo moteur pour controler le servo Servo myServo; /* ******************************************************************************** */ void setup() { pinMode(trigPin, OUTPUT); // trigPin en Sortie pinMode(echoPin, INPUT); // echoPin en entrée Serial.begin(9600); myServo.attach(12); // pin du servo moteur } /* ******************************************************************************** */ void loop() { // rotation du servo motor de 15 à 165 degres for(int i=15;i<=165;i++){ myServo.write(i); delay(30); // appel fonction de calcul de la distance // mesurée par le capteur Ultrasonic pour chaque degré distance = calculateDistance(); Serial.print(i); // envoie angle en degré sur le port série Serial.print(","); // ajout de , pour séparer les données pour Processing Serial.print(distance); // envoie distance sur le port série Serial.print("."); // ajout de . pour terminer les données pour Processing } // idem pour le retour de 165 à 15 degres for(int i=165;i>15;i--){ myServo.write(i); delay(30); // appel fonction de calcul de la distance // mesurée par le capteur Ultrasonic pour chaque degré distance = calculateDistance(); Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print("."); } } /* ******************************************************************************** */ // Fonction de calcul de la distance mesurée par le capteur UltraSonic int calculateDistance(){ digitalWrite(trigPin, LOW); delayMicroseconds(2); // trigPin à HIGH state pour 10 micro secondes digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duree = pulseIn(echoPin, HIGH); // lit echoPin pour mesurer le parcours du son en micro secondes // 2: mesure aller +retour distance= duree*VitesseSon/2; return distance; }
on obtient des données de type degré,distance obstacle. et dans le terminal on lit les résultats:
utilisons Processing pour mettre en forme ces données en temps réel sous forme d’un graphique.
logiciel Processing
1er pas dans la programmation créative car nous utiliserons Processing pour la mise en page, en image des données acquises en temps réel sur l’Arduino _ ici la distance mesurée par le capteur ultra-son HC-SR04_
Il faut installer Processing sur votre micro-ordinateur:
Windows 64 bit, ( Windows 32 bit ), Linux 64 bit, Mac OSX,
Référence des instructions Processing à notre disposition
voici une présentation des possibilités de base de Processing:
quelques exemples ICI
on va utliser quelques fonctions de dessin/traçage de Processing
size (400, 500); // taille affichage fill(98,245,31); // fond vert rect(0, 0, width, height-height*0.065); // un rectangle borde l'affichage pour faire joli ! // arc de cercle commençant en x:200, y:200, largeur, hauteur, // angle début en radian, angle fin radian, // façon de terminer le dessin: CHORD/OPEN/TWO_PI/PIE _tarte!_ ) arc(200, 200, 300, 300, 0, PI+QUARTER_PI, PIE);
couleur: R/Rouge, G/Vert, B/Bleu fill(0,0,255); // bleu fill(50); // noir
programme: Crepp_radar.pde
import processing.serial.*; // imports library for serial communication import java.awt.event.KeyEvent; // imports library for reading the data from the serial port import java.io.IOException; // * // nouvel objet port série ... // où arrive le flux de données Arduino Serial myPort; // * // définition des variables String angle=""; String distance=""; String data=""; String noObject; float pixsDistance; int iAngle, iDistance; int index1=0; int index2=0; int RadarLimite=40; // on se limite à scanner 40 cm PFont orcFont; // rappel couleur RGB // http://www.proftnj.com/RGB3.htm // stroke(r,g,b) et fill(r,g,b) // (255,10,10)red color, stroke(0,0,255) red blue // (255, 255,0); red yellow, (154,205,50); red yellow green, (98,245,31); vert // (98,245,31); vert, (30,250,60); vert sombre, (98,245,31); vert vif // (0,4,0); noir, // * // *********************************** void setup() { // * // résolution écran size (1200, 700); smooth(); //myPort = new Serial(this,"COM5", 9600); // starts the serial communication myPort = new Serial(this,"/dev/cu.usbmodemFA131", 9600); // starts the serial communication myPort.bufferUntil('.'); // reads the data from the serial port up to the character '.'. So actually it reads this: angle,distance. } //* // *********************************** void draw() { fill(98,245,31); // vert // simulating motion blur and slow fade of the moving line noStroke(); fill(0,4); // noir rect(0, 0, width, height-height*0.065); fill(98,245,31); // green color // appels des focntions pour dessiner le radar drawRadar(); drawLine(); drawObject(); drawText(); } // * // *********************************** void serialEvent (Serial myPort) { // début de lecture des données du port Série // découpage des données issues du port Série: // au caractère de fin de données "." on place les données dans la variable "data" data = myPort.readStringUntil('.'); data = data.substring(0,data.length()-1); // trouve le caractère "," et on place les dans la variable "index1" index1 = data.indexOf(","); // ainsi la variable "angle" est la partie de "data" // du 1er caractère de "data" au "index" ième caratère angle= data.substring(0, index1); // ainsi la variable "distance" est la partie de "data" // du "index+1" ième caratère à la fin _= data.length() _ distance= data.substring(index1+1, data.length()); // conversion des variables en entier pour la suite des calculs iAngle = int(angle); iDistance = int(distance); } // * // *********************************** void drawRadar() { pushMatrix(); // nouvelle origine des coordonées translate(width/2,height-height*0.074); noFill(); strokeWeight(2); stroke(98,245,31); // vert // dessine des lignes des arcs de cercle arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI); arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI); arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI); arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI); // dessine les lignes des angles line(-width/2,0,width/2,0); line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30))); line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60))); line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90))); line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120))); line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150))); line((-width/2)*cos(radians(30)),0,width/2,0); popMatrix(); } // * // ***************** void drawObject() { pushMatrix(); // nouvelle origine des coordonées translate(width/2,height-height*0.074); strokeWeight(9); stroke(255,10,10); // rouge stroke(#0055FF); // bleu // calcule la distance de cm en pixels pixsDistance = iDistance*((height-height*0.1666)*0.025); // portée limite à distance 40 cm if(iDistance<RadarLimite){ // dessine en focntion de l'angle et de la diastance line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle))); } popMatrix(); } // * // *********************** // * // ***************** void drawObject_old() { pushMatrix(); // nouvelle origine des coordonées translate(width/2,height-height*0.074); strokeWeight(9); stroke(255,10,10); // rouge // calcule la distance de cm en pixels pixsDistance = iDistance*((height-height*0.1666)*0.025); // portée limite à distance 40 cm if(iDistance<RadarLimite){ // dessine en focntion de l'angle et de la distance line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle))); } popMatrix(); } // * // ************************* void drawLine() { pushMatrix(); strokeWeight(9); stroke(30,250,60); // vert sombre // origine des coordonnées décallées translate(width/2,height-height*0.074); // dessine en focntion de l'angle line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); popMatrix(); } // * // *********************************** void drawText() { // affiche le texte à l'écran pushMatrix(); if(iDistance>40) { noObject = "hors portée"; } else { noObject = "radar en focntion"; } fill(0,0,0); noStroke(); rect(0, height-height*0.0648, width, height); fill(98,245,31); // vert vif textSize(25); text("10cm",width-width*0.3854,height-height*0.0833); text("20cm",width-width*0.281,height-height*0.0833); text("30cm",width-width*0.177,height-height*0.0833); text("40cm",width-width*0.0729,height-height*0.0833); textSize(40); text(" CREPP 2020", width-width*0.9, height-height*0.0277); text("Angle: " + iAngle +" °", width-width*0.6, height-height*0.0277); text("Distance: ", width-width*0.3, height-height*0.0277); if(iDistance<40) { text(" " + iDistance +" cm", width-width*0.225, height-height*0.0277); } textSize(25); fill(98,245,60); // vert translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30))); rotate(-radians(-60)); text("30°",0,0); resetMatrix(); translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60))); rotate(-radians(-30)); text("60°",0,0); resetMatrix(); translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90))); rotate(radians(0)); text("90°",0,0); resetMatrix(); translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120))); rotate(radians(-30)); text("120°",0,0); resetMatrix(); translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150))); rotate(radians(-60)); text("150°",0,0); popMatrix(); }