Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

In deze Arduino-tutorial laat ik je zien hoe je deze coole radar kunt maken met het Arduino-bord en de Processing-ontwikkelomgeving. Je kunt de volgende video bekijken of de geschreven tutorial hieronder lezen voor meer details.

Overzicht

Al wat je nodig hebt voor dit Arduino-project is een ultrasonische sensor voor het detecteren van objecten, een kleine hobby-servomotor voor het roteren van de sensor en een Arduino-bord voor het besturen ervan.

Componenten nodig voor dit Arduino-project

Je kunt deze componenten bij een van de onderstaande sites verkrijgen:

  • Ultrasonische Sensor HC-SR04
  • Servomotor
  • Arduino-bord
  • Breadboard en Jumper-draden

Het apparaat bouwen

  • Eerst maakte ik een kartonnen staander voor het verbinden van de ultrasonische sensor met de servomotor. Ik vouwde het zoals op de onderstaande afbeelding getoond, plakte het vast en bevestigde het aan de servomotor met een schroef.
Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding
  • Ik bevestigde ook een pinheader waarop ik 4 jumper-draden solderde voor het verbinden van de sensor.
Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding
  • Ten slotte bevestigde ik de servomotor aan het Arduino-bord met een elastiekje.
Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

Er zijn ook speciale montagebeugels voor de ultrasonische sensor van Banggood. Je kunt ze via de volgende links krijgen:

  • Ultrasonische Sensor met Montagebeugel
  • Montagebeugel voor Ultrasonische Afstandsmeter Banggood
Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

Arduino Radar Schakelschema

Ik heb de HC-SR04 ultrasonische sensor aangesloten op pennen 10 en 11 en de servomotor op pin 12 van het Arduino-bord.

Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

Broncodes

Nu moeten we een code maken en uploaden naar het Arduino-bord die de interactie tussen de Arduino en de Processing IDE mogelijk maakt. Voor het begrijpen van hoe de verbinding werkt, klik hier om mijn Arduino en Processing-tutorial te bezoeken.

Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

Hier is de Arduino-broncode met beschrijving van elke regel code:

// Inclusie van de Servo bibliotheek
#include <Servo.h>.
// Definieer Trig en Echo pennen van de Ultrasonische Sensor
const int trigPin = 10;
const int echoPin = 11;
// Variabelen voor duur en afstand
long duration;
int distance;
Servo myServo; // Maakt een servo-object aan voor het besturen van de servomotor

void setup() {
  pinMode(trigPin, OUTPUT); // Stelt trigPin in als uitgang
  pinMode(echoPin, INPUT); // Stelt echoPin in als ingang
  Serial.begin(9600);
  myServo.attach(12); // Definieert op welke pin de servomotor is aangesloten
}

void loop() {
  // Roteert de servomotor van 15 tot 165 graden
  for(int i = 15; i <= 165; i++) {
    myServo.write(i);
    delay(30);
    distance = calculateDistance(); // Roept functie aan voor berekenen afstand gemeten door ultrasonische sensor voor elke graad
    Serial.print(i); // Stuurt huidige graad naar seriële poort
    Serial.print(","); // Stuurt extra teken naast vorige waarde voor indexering in Processing IDE
    Serial.print(distance); // Stuurt afstandswaarde naar seriële poort
    Serial.print("."); // Stuurt extra teken naast vorige waarde voor indexering in Processing IDE
  }
  // Herhaalt vorige lijnen van 165 tot 15 graden
  for(int i = 165; i > 15; i--) {
    myServo.write(i);
    delay(30);
    distance = calculateDistance();
    Serial.print(i);
    Serial.print(",");
    Serial.print(distance);
    Serial.print(".");
  }
}

// Functie voor berekenen van afstand gemeten door ultrasonische sensor
int calculateDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Stelt trigPin op HIGH staat voor 10 microseconden
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); // Leest echoPin, retourneert geluidsgolf reistijd in microseconden
  distance = duration * 0.034 / 2;
  return distance;
}
Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

Nu ontvangen we de waarden voor de hoek en de door de sensor gemeten afstand van het Arduino-bord in de Processing IDE met behulp van de SerialEvent()-functie, die de gegevens van de seriële poort leest en we zetten de waarden van de hoek en de afstand in de variabelen iAngle en iDistance. Deze variabelen worden gebruikt voor het tekenen van de radar, de lijnen, de gedetecteerde objecten en een deel van de tekst.

Voor het tekenen van de radar maakte ik de functie drawRadar(), die bestaat uit arc() en line() functies.

void drawRadar() {
  pushMatrix();
  translate(960, 1000); // Verplaatst startcoördinaten naar nieuwe locatie
  noFill();
  strokeWeight(2);
  stroke(98, 245, 31); // Tekent de booglijnen
  arc(0, 0, 1800, 1800, PI, TWO_PI);
  arc(0, 0, 1400, 1400, PI, TWO_PI);
  arc(0, 0, 1000, 1000, PI, TWO_PI);
  arc(0, 0, 600, 600, PI, TWO_PI);
  // Tekent de hoeklijnen
  line(-960, 0, 960, 0);
  line(0, 0, -960*cos(radians(30)), -960*sin(radians(30)));
  line(0, 0, -960*cos(radians(60)), -960*sin(radians(60)));
  line(0, 0, -960*cos(radians(90)), -960*sin(radians(90)));
  line(0, 0, -960*cos(radians(120)), -960*sin(radians(120)));
  line(0, 0, -960*cos(radians(150)), -960*sin(radians(150)));
  line(-960*cos(radians(30)), 0, 960, 0);
  popMatrix();
}
Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

Voor het tekenen van de lijn die langs de radar beweegt, maakte ik de functie drawLine(). Het rotatiecentrum is ingesteld met de translate()-functie en met de line()-functie, waarin de iAngle-variabele wordt gebruikt, wordt de lijn voor elke graad opnieuw getekend.

void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30, 250, 60);
  translate(960, 1000); // Verplaatst startcoördinaten naar nieuwe locatie
  line(0, 0, 950*cos(radians(iAngle)), -950*sin(radians(iAngle))); // Tekent de lijn volgens de hoek
  popMatrix();
}
Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

Voor het tekenen van de gedetecteerde objecten maakte ik de drawObject() functie. Het haalt de afstand van de ultrasonische sensor op, zet dit om in pixels en tekent in combinatie met de hoek van de sensor het object op de radar.

void drawObject() {
  pushMatrix();
  translate(960, 1000); // Verplaatst startcoördinaten naar nieuwe locatie
  strokeWeight(9);
  stroke(255, 10, 10); // Rode kleur
  pixsDistance = iDistance * 22.5; // Zet afstand van sensor van cm naar pixels
  // Bereik beperken tot 40 cm
  if(iDistance < 40) {
    // Tekent object volgens hoek en afstand
    line(pixsDistance*cos(radians(iAngle)), -pixsDistance*sin(radians(iAngle)), 950*cos(radians(iAngle)), -950*sin(radians(iAngle)));
  }
  popMatrix();
}

Voor de tekst op het scherm maakte ik de drawText() functie die teksten op specifieke locaties tekent.

Al deze functies worden aangeroepen in de hoofdfunctie draw(), die continu herhaalt en het scherm tekent. Hier gebruik ik ook de fill() functie met 2 parameters voor het simuleren van bewegingsverwarring en langzame vervaging van de bewegende lijn.

void draw() {
  fill(98, 245, 31);
  textFont(orcFont);
  // Simuleer bewegingsverwarring en langzame vervaging van de bewegende lijn
  noStroke();
  fill(0, 4);
  rect(0, 0, width, 1010);
  fill(98, 245, 31); // Groene kleur
  // Roep functies aan voor het tekenen van de radar
  drawRadar();
  drawLine();
  drawObject();
  drawText();
}

Hier is de uiteindelijke uitstraling van de radar:

Bouw een Arduino Radar Systeem met Ultrasonische Sensor & Servo – Stap-voor-stap Handleiding

Hier is de complete Processing-broncode van de Arduino Radar:

import processing.serial.*; // Importeer bibliotheek voor seriële communicatie
import java.awt.event.KeyEvent; // Importeer bibliotheek voor het lezen van data van de seriële poort
import java.io.IOException;
Serial myPort; // Definieert Serial-object
// Definieer variabelen
String angle = "";
String distance = "";
String data = "";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1 = 0;
int index2 = 0;
PFont orcFont;

void setup() {
  size(1920, 1080);
  smooth();
  myPort = new Serial(this, "COM4", 9600); // Start seriële communicatie
  myPort.bufferUntil('.'); // Leest data van seriële poort tot karakter '.'. Dus het leest eigenlijk: hoek,afstand.
  orcFont = loadFont("OCRAExtended-30.vlw");
}

void draw() {
  fill(98, 245, 31);
  textFont(orcFont);
  // Simuleer bewegingsverwarring en langzame vervaging van de bewegende lijn
  noStroke();
  fill(0, 4);
  rect(0, 0, width, 1010);
  fill(98, 245, 31); // Groene kleur
  // Roep functies aan voor het tekenen van de radar
  drawRadar();
  drawLine();
  drawObject();
  drawText();
}

void serialEvent(Serial myPort) {
  // Start met lezen van data van de seriële poort
  // Leest data van de seriële poort tot karakter '.' en zet in String variabele "data"
  data = myPort.readStringUntil('.');
  data = data.substring(0, data.length() - 1);
  index1 = data.indexOf(","); // Vindt karakter ',' en zet in variabele "index1"
  angle = data.substring(0, index1); // Leest data van positie "0" tot positie van variabele index1, dat is de waarde van de hoek die het Arduino-bord naar de seriële poort stuurde
  distance = data.substring(index1 + 1, data.length()); // Leest data van positie "index1" tot einde van data, dat is de waarde van de afstand
  // Converteer String-variabelen naar Integer
  iAngle = int(angle);
  iDistance = int(distance);
}

void drawRadar() {
  pushMatrix();
  translate(960, 1000); // Verplaatst startcoördinaten naar nieuwe locatie
  noFill();
  strokeWeight(2);
  stroke(98, 245, 31); // Tekent de booglijnen
  arc(0, 0, 1800, 1800, PI, TWO_PI);
  arc(0, 0, 1400, 1400, PI, TWO_PI);
  arc(0, 0, 1000, 1000, PI, TWO_PI);
  arc(0, 0, 600, 600, PI, TWO_PI);
  // Tekent de hoeklijnen
  line(-960, 0, 960, 0);
  line(0, 0, -960*cos(radians(30)), -960*sin(radians(30)));
  line(0, 0, -960*cos(radians(60)), -960*sin(radians(60)));
  line(0, 0, -960*cos(radians(90)), -960*sin(radians(90)));
  line(0, 0, -960*cos(radians(120)), -960*sin(radians(120)));
  line(0, 0, -960*cos(radians(150)), -960*sin(radians(150)));
  line(-960*cos(radians(30)), 0, 960, 0);
  popMatrix();
}

void drawObject() {
  pushMatrix();
  translate(960, 1000); // Verplaatst startcoördinaten naar nieuwe locatie
  strokeWeight(9);
  stroke(255, 10, 10); // Rode kleur
  pixsDistance = iDistance * 22.5; // Zet afstand van sensor van cm naar pixels
  // Bereik beperken tot 40 cm
  if(iDistance < 40) {
    // Tekent object volgens hoek en afstand
    line(pixsDistance*cos(radians(iAngle)), -pixsDistance*sin(radians(iAngle)), 950*cos(radians(iAngle)), -950*sin(radians(iAngle)));
  }
  popMatrix();
}

void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30, 250, 60);
  translate(960, 1000); // Verplaatst startcoördinaten naar nieuwe locatie
  line(0, 0, 950*cos(radians(iAngle)), -950*sin(radians(iAngle))); // Tekent de lijn volgens de hoek
  popMatrix();
}

void drawText() {
  // Tekent de teksten op het scherm
  pushMatrix();
  if(iDistance > 40) {
    noObject = "Out of Range";
  } else {
    noObject = "In Range";
  }
  fill(0, 0, 0);
  noStroke();
  rect(0, 1010, width, 1080);
  fill(98, 245, 31);
  textSize(25);
  text("10cm", 1180, 990);
  text("20cm", 1380, 990);
  text("30cm", 1580, 990);
  text("40cm", 1780, 990);
  textSize(40);
  text("Object: " + noObject, 240, 1050);
  text("Hoek: " + iAngle + " °", 1050, 1050);
  text("Afstand: ", 1380, 1050);
  if(iDistance < 40) {
    text(" " + iDistance + " cm", 1400, 1050);
  }
  textSize(25);
  fill(98, 245, 60);
  translate(961 + 960*cos(radians(30)), 982 - 960*sin(radians(30)));
  rotate(-radians(-60));
  text("30°", 0, 0);
  resetMatrix();
  translate(954 + 960*cos(radians(60)), 984 - 960*sin(radians(60)));
  rotate(-radians(-30));
  text("60°", 0, 0);
  resetMatrix();
  translate(945 + 960*cos(radians(90)), 990 - 960*sin(radians(90)));
  rotate(radians(0));
  text("90°", 0, 0);
  resetMatrix();
  translate(935 + 960*cos(radians(120)), 1003 - 960*sin(radians(120)));
  rotate(radians(-30));
  text("120°", 0, 0);
  resetMatrix();
  translate(940 + 960*cos(radians(150)), 1018 - 960*sin(radians(150)));
  rotate(radians(-60));
  text("150°", 0, 0);
  popMatrix();
}

Nieuwe geüpdate versie van de Arduino Radar-code om elke schermresolutie te passen:

Verander gewoon de waarden in de size()-functie, met je schermresolutie.

/* Arduino Radar Project
* 
* Geüpdate versie. Past bij elke schermresolutie!
* Verander gewoon de waarden in de size() functie,
* met je schermresolutie.
* 
* door Dejan Nedelkovski,
* www.HowToMechatronics.com
*/
import processing.serial.*; // Importeer bibliotheek voor seriële communicatie
import java.awt.event.KeyEvent; // Importeer bibliotheek voor het lezen van data van de seriële poort
import java.io.IOException;
Serial myPort; // Definieert Serial-object
// Definieer variabelen
String angle = "";
String distance = "";
String data = "";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1 = 0;
int index2 = 0;
PFont orcFont;

void setup() {
  size(1920, 1080); // ***VERANDER DIT NAAR JE SCHERMRESOLUTIE***
  smooth();
  myPort = new Serial(this, "COM4", 9600); // Start seriële communicatie
  myPort.bufferUntil('.'); // Leest data van seriële poort tot karakter '.'. Dus het leest eigenlijk: hoek,afstand.
  orcFont = loadFont("OCRAExtended-30.vlw");
}

void draw() {
  fill(98, 245, 31);
  textFont(orcFont);
  // Simuleer bewegingsverwarring en langzame vervaging van de bewegende lijn
  noStroke();
  fill(0, 4);
  rect(0, 0, width, height - height*0.065);
  fill(98, 245, 31); // Groene kleur
  // Roep functies aan voor het tekenen van de radar
  drawRadar();
  drawLine();
  drawObject();
  drawText();
}

void serialEvent(Serial myPort) {
  // Start met lezen van data van de seriële poort
  // Leest data van de seriële poort tot karakter '.' en zet in String variabele "data"
  data = myPort.readStringUntil('.');
  data = data.substring(0, data.length() - 1);
  index1 = data.indexOf(","); // Vindt karakter ',' en zet in variabele "index1"
  angle = data.substring(0, index1); // Leest data van positie "0" tot positie van variabele index1, dat is de waarde van de hoek die het Arduino-bord naar de seriële poort stuurde
  distance = data.substring(index1 + 1, data.length()); // Leest data van positie "index1" tot einde van data, dat is de waarde van de afstand
  // Converteer String-variabelen naar Integer
  iAngle = int(angle);
  iDistance = int(distance);
}

void drawRadar() {
  pushMatrix();
  translate(width/2, height - height*0.074); // Verplaatst startcoördinaten naar nieuwe locatie
  noFill();
  strokeWeight(2);
  stroke(98, 245, 31); // Tekent de booglijnen
  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);
  // Tekent de hoeklijnen
  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); // Verplaatst startcoördinaten naar nieuwe locatie
  strokeWeight(9);
  stroke(255, 10, 10); // Rode kleur
  pixsDistance = iDistance * ((height - height*0.1666) * 0.025); // Zet afstand van sensor van cm naar pixels
  // Bereik beperken tot 40 cm
  if(iDistance < 40) {
    // Tekent object volgens hoek en afstand
    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); // Verplaatst startcoördinaten naar nieuwe locatie
  line(0, 0, (height - height*0.12)*cos(radians(iAngle)), -(height - height*0.12)*sin(radians(iAngle))); // Tekent de lijn volgens de hoek
  popMatrix();
}

void drawText() {
  // Tekent de teksten op het scherm
  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("Hoek: " + iAngle + " °", width - width*0.48, height - height*0.0277);
  text("Afstand: ", 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();
}

Productieproces

  1. Bouw een indrukwekkend monitor Ambilight-systeem met Arduino
  2. Bouw een Klassiek Pong-spel op Arduino UNO met OLED-display – Stap-voor-stap Tutorial
  3. Servo-gestuurde obstakelvermijdende robot: Bouw met Arduino & HC-SR04
  4. Arduino Audio Frequentie Detector – Meet de luidste geluidspieken met hoge gevoeligheid
  5. Bouw Je Eigen Arduino Tamagotchi: Een Digitale Huisdier DIY Project
  6. Slimme Draadloze Lichtschakelaar Controller: Arduino-gebaseerde Remote Switch Manipulator
  7. Arduino Boter-Kaas-Eieren met MAX7219 LED Matrix en Kartonnen Behuizing
  8. Slimme beweegactiverde waterpistool gebouwd met Arduino Nano
  9. Bouw een Betrouwbare Arduino Afteltimer met SparkFun 7‑Segment Display
  10. Arduino Zonnebloem: Bouw een elektronische zon-volgende zonnebloem
  11. Bouw je eigen RC Porsche-auto met Arduino: Stap-voor-stap handleiding