Menu Fermer

FABRIQUER UN RADAR A ULTRASONS 📡

📌  Aujourd’hui, je vais vous montrer comment fabriquer facilement un radar a ultrasons ðŸ“¡, parfait pour détecter des obstacles et même mesurer une distance.

📌 Pour reproduire le projet, tu as besoin de

 

📌 Après avoir téléchargé le logiciel pour programmer l’Arduino ðŸ“‘ https://sup.yt/arduinosoftware, il va falloir envoyer le code ci-dessous dans la carte:

📄 CODE ARDUINO
// Includes the Servo library
#include <Servo.h>. 
// Defines Tirg and Echo pins of the Ultrasonic Sensor
const int trigPin = 9;
const int echoPin = 10;
// Variables for the duration and the distance
long duration;
int distance;
Servo myServo; // Creates a servo object for controlling the servo motor
void setup() {
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  Serial.begin(9600);
  myServo.attach(3); // Defines on which pin is the servo motor attached
}
void loop() {
  // rotates the servo motor from 15 to 165 degrees
  for(int i=15;i<=165;i++){  
  myServo.write(i);
  delay(30);
  distance = calculateDistance();// Calls a function for calculating the distance measured by the Ultrasonic sensor for each degree
  
  Serial.print(i); // Sends the current degree into the Serial Port
  Serial.print(","); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
  Serial.print(distance); // Sends the distance value into the Serial Port
  Serial.print("."); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
  }
  // Repeats the previous lines from 165 to 15 degrees
  for(int i=165;i>15;i--){  
  myServo.write(i);
  delay(30);
  distance = calculateDistance();
  Serial.print(i);
  Serial.print(",");
  Serial.print(distance);
  Serial.print(".");
  }
}
// Function for calculating the distance measured by the Ultrasonic sensor
int calculateDistance(){ 
  
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
  distance= duration*0.034/2;
  return distance;
}

📌 Enfin il faut lancer l’interface graphique, après avoir téléchargé le logiciel Processing ðŸ“‘ https://sup.yt/processing, il va falloir envoyer le code ci-dessous dans la carte:

📄 CODE PROCESSING
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;
Serial myPort; // defines Object Serial
// defubes variables
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
void setup() {
  
 size (1920, 1080); // ***CHANGE THIS TO YOUR SCREEN RESOLUTION***
 smooth();
 myPort = new Serial(this,"COM4", 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);
  // simulating motion blur and slow fade of the moving line
  noStroke();
  fill(0,4); 
  rect(0, 0, width, height-height*0.065); 
  
  fill(98,245,31); // green color
  // calls the functions for drawing the radar
  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
}
void serialEvent (Serial myPort) { // starts reading data from the Serial Port
  // reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
  data = myPort.readStringUntil('.');
  data = data.substring(0,data.length()-1);
  
  index1 = data.indexOf(","); // find the character ',' and puts it into the variable "index1"
  angle= data.substring(0, index1); // read the data from position "0" to position of the variable index1 or thats the value of the angle the Arduino Board sent into the Serial Port
  distance= data.substring(index1+1, data.length()); // read the data from position "index1" to the end of the data pr thats the value of the distance
  
  // converts the String variables into Integer
  iAngle = int(angle);
  iDistance = int(distance);
}
void drawRadar() {
  pushMatrix();
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  noFill();
  strokeWeight(2);
  stroke(98,245,31);
  // draws the arc lines
  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);
  // draws the angle lines
  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();
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  strokeWeight(9);
  stroke(255,10,10); // red color
  pixsDistance = iDistance*((height-height*0.1666)*0.025); // covers the distance from the sensor from cm to pixels
  // limiting the range to 40 cms
  if(iDistance<40){
    // draws the object according to the angle and the 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);
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); // draws the line according to the angle
  popMatrix();
}
void drawText() { // draws the texts on the screen
  
  pushMatrix();
  if(iDistance>40) {
  noObject = "Out of Range";
  }
  else {
  noObject = "In Range";
  }
  fill(0,0,0);
  noStroke();
  rect(0, height-height*0.0648, width, height);
  fill(98,245,31);
  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("Object: " + noObject, width-width*0.875, height-height*0.0277);
  text("Angle: " + iAngle +" °", width-width*0.48, height-height*0.0277);
  text("Distance: ", width-width*0.26, height-height*0.0277);
  if(iDistance<40) {
  text("        " + iDistance +" cm", width-width*0.225, height-height*0.0277);
  }
  textSize(25);
  fill(98,245,60);
  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(); 
}

18 Comments

  1. Alexandre Teppaz

    Bonjour, j’ai bien installé les 2 logiciels, Arduino marche très bien mais l’autre logiciel ne trouve pas « COM6 Â». (bug au niveau de la 16 ligne)
    Je n’arrive pas a résoudre ce problème. Je vous prie de m’aider.
    Alexandre

  2. Pavelo

    Bjr, j’ai un problème niveau processing. Dans le code processing lis les donnes du com4. Quand je change com 4 par com 6 (mon arduino ne marche que sur com6) j’obtiens  Â» error opening serial port COM6″ une solution? Je suis sous windows 7.

  3. Gregoire

    Bonjour je débute dans ce domaine et j’ai un problème avec d’une part le servo moteur, il est très lent alors que j’ai recopié votre code, comment peut il aller aussi vite que sur la video? et d’autre part dans le deuxième code que représente le COM4 et y a t il des lignes de code à compléter?
    merci

  4. Brunel

    bonjour
    j’utilise votre programme et dans processing, le port com4 n’est pas reconnu. Avez-vous une solution pour que mon système voit bien les infos arrivant sur mon port ?

    Amitiés

  5. Appolo

    Boujour,
    Je souhaite reproduire le projet pour en faire une expérimentation sur l’eau
    Je souhaite savoir si il ne faut que les logiciels demandés pour afficher l’interface graphique où faut-il considerer d’autre logiciels car à chaque fois que je copie les partie du code processing progressivement. Un plantage apparaît alors que le code arduino de ma carte est televersé
    Pouvez vous m’aider
    Appolo

  6. john

    Bonjour et merci pour votre tuto.
    j’ai un souci avec processing, du coté de l’arduino pas de souci et j’ai réussi a envoyer le code dans processing.
    Le dessin du radar s’affiche bien mais il n’y a aucune interaction lorsque l’arduino est brancher en usb sur le pc.
    Pourriez vous me dire d’où pourrait venir le problème ?
    Merci

  7. clara

    bonjour serait-il possible d’avoir une explication pour chacun des deux codes nécessaires à l’expérience ?
    j’ai du mal à comprendre toutes les manipulations effecutées…
    merci d’avance !

  8. BEUCLER

    Bonjour, j’ai mis votre programme dans processing sur mac et j’obtiens une erreur sur cette phrase:

    myPort = new Serial(this, Â»COM4″, 9600); // starts the serial communication

    voici le message d’erreur:
    RuntimeException: Error opening serial port COM4: Port not found
    RuntimeException: Error opening serial port COM4: Port not found
    RuntimeException: Error opening serial port COM4: Port not found

    comment puis je faire pour résoudre ce problème 🙂 svp?

  9. Lucien VERDIER

    Bonjour
    Je ne comprend pas ou il faut mettre le deuxieme programme quand je le mets sous le premier il met : variable or field ‘serialEvent’ declared void.
    Merci pour votre aide. Je suis retraité et j’essai d’apprendre cette nouvelle technologie

Répondre à reda Annuler la réponse

Votre adresse e-mail ne sera pas publiée.