Niveau – gevorderd/expert
Tijdsduur – 30/45 Min
kosten – €49,75

In dit project laat ik jullie zien hoe je zelf een Arduino Radar maakt.

Dit is een gemiddeld/gevorderd project.

Als je project in elkaar zit zullen objecten tot 50 cm van de sensor weergeven. Als je de code aanpast kan de radar objecten tot wel 5 meter waarnemen.

Voor dit project heb je twee verschillende programma’s nodig Arduino IDE en Processing. De taal die Processing gebruikt is java dus houd hier rekening mee.

Stap 2: Bouwen en Bedraden

Nu gaan we het project in elkaar zetten.

Je begint met de 5V vanaf de Arduino naar het breadbord te sturen. Daarna ga je vanaf het breadbord naar de plus poort van de servo en de sensor.

Als dat is gedaan je vanaf de GND van de servo en de sensor naar de GND van de Arduino.

Tot slot sluit je de stuur kabel van de servo aan op pin 9, de echopin op pin 6 en de trigpin op pin 7.

Stap 3: Programmeren

Nu je klaar bent met het bedraden en bouwen van je Arduino radar kun je beginnen met het programmeren van de Arduino Uno.

Voor deze code moeten wij een include file invoegen.

Een Library of Include file bevatten vaak code welke vaak hergebruikt kan worden in andere Sketches. Vaak zijn libraries (bibliotheken) een verzameling samenhangende functies gericht op een bepaalde toepassing. Bijvoorbeeld om een strip met LEDjes aan te sturen, speciale wiskundige functies of bijvoorbeeld om een LCD schermpje aan te sturen.

Voor dit project gebruiken we de include servo file, als je deze niet erin doet dan kan je Arduino de servo niet besturen en dan werkt je sonar niet.

De onderstaande overtypen in de Arduino IDE. Kopiëren en plakken is ook mogelijk maar daar leer je minder van 😉

#include <Servo.h>           
Servo leftRightServo;         
int leftRightPos = 0;        
const int numReadings = 10;  
int index = 0;               
int total = 0;              
int average = 0;           
int echoPin = 6;              
int trigPin = 7;         
unsigned long pulseTime = 0;  
unsigned long distance = 0;  
 
 

void setup() {
  leftRightServo.attach(9);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(9600);
} 
 

void loop() {
  for(leftRightPos = 0; leftRightPos < 180; leftRightPos++) { 
    leftRightServo.write(leftRightPos);
      for (index = 0; index<=numReadings;index++) {          
        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(trigPin, HIGH);                         
        delayMicroseconds(10);                               
        digitalWrite(trigPin, LOW);                           
        pulseTime = pulseIn(echoPin, HIGH);              
        distance = pulseTime/13;                            
        total = total + distance;                        
        delay(10);
      }
    average = total/numReadings;                               
    if (index >= numReadings)  {                              
      index = 0;
      total = 0;
    }
    if(average >= 300){
      average = 300;
    }
    Serial.print("X");                                        
    Serial.print(leftRightPos);                              
    Serial.print("V");                                         
    Serial.println(average);                                
  }
 
  for(leftRightPos = 180; leftRightPos > 0; leftRightPos--) { 
    leftRightServo.write(leftRightPos);
    for (index = 0; index<=numReadings;index++) {
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      pulseTime = pulseIn(echoPin, HIGH);
      distance = pulseTime/13;
      total = total + distance;
      delay(10);
    }
    average = total/numReadings;
    if (index >= numReadings)  {
      index = 0;
      total = 0;
    }
    if( average >= 300){
      average = 300;
    }
    Serial.print("X");
    Serial.print(leftRightPos);
    Serial.print("V");
    Serial.println(average);
   }
}
Arduino Radar / Sonar processing

Nadat je de code hebt ingevoerd in de Arduino IDE kan je de onderstaande code in Processing invoeren.

import processing.serial.*;    
Serial arduinoport;                 
float x, y;                       
int radius = 350;               
int w = 300;                    
int degree = 0;                 
int value = 0;                  
int motion = 0;                 
int[] newValue = new int[181];  
int[] oldValue = new int[181]; 
PFont myFont;                  
int radarDist = 0;             
int firstRun = 0;               
void setup(){

size(750, 450);
background (0); 
myFont = createFont("verdana", 12);
textFont(myFont);
arduinoport = new Serial(this, "COM10", 9600);

}


void draw(){
fill(0);                              
noStroke();                         
ellipse(radius, radius, 750, 750); 
rectMode(CENTER);                  
rect(350,402,800,100);              
if (degree >= 179) {              
motion = 1;                       
}
if (degree <= 1) {                  
motion = 0;                        
}

strokeWeight(7);                     
if (motion == 0) {                   
for (int i = 0; i <= 20; i++) {  
stroke(0, (10*i), 0);           
line(radius, radius, radius + cos(radians(degree+(180+i)))*w, radius + sin(radians(degree+(180+i)))*w); 
}
} else {                             
for (int i = 20; i >= 0; i--) {    
stroke(0,200-(10*i), 0);        
line(radius, radius, radius + cos(radians(degree+(180+i)))*w, radius + sin(radians(degree+(180+i)))*w);
}
}

noStroke();                          

fill(0,50,0);                        
beginShape();                        
for (int i = 0; i < 180; i++) {     
x = radius + cos(radians((180+i)))*((oldValue[i])); 
y = radius + sin(radians((180+i)))*((oldValue[i])); 
vertex(x, y);                     
}
endShape();                           

fill(0,110,0);
beginShape();
for (int i = 0; i < 180; i++) {
x = radius + cos(radians((180+i)))*(newValue[i]);
y = radius + sin(radians((180+i)))*(newValue[i]);
vertex(x, y);
}
endShape();

fill(0,170,0);
beginShape();
for (int i = 0; i < 180; i++) {
x = radius + cos(radians((180+i)))*((newValue[i]+oldValue[i])/2); 
y = radius + sin(radians((180+i)))*((newValue[i]+oldValue[i])/2);
vertex(x, y);
}
endShape();

if (firstRun >= 360) {
stroke(150,0,0);
strokeWeight(1);
noFill();
for (int i = 0; i < 180; i++) {
if (oldValue[i] - newValue[i] > 35 || newValue[i] - oldValue[i] > 35) {
x = radius + cos(radians((180+i)))*(newValue[i]);
y = radius + sin(radians((180+i)))*(newValue[i]);
ellipse(x, y, 10, 10); 
}
}
}

for (int i = 0; i <= 5; i++){
noFill();
strokeWeight(1);
stroke(0, 255-(30*i), 0);
ellipse(radius, radius, (120*i), (120*i)); 
fill(0, 100, 0);
}
for (int i = 0; i <= 6; i++) {
strokeWeight(1);
stroke(0, 55, 0);
line(radius, radius, radius + cos(radians(180+(30*i)))*w, radius + sin(radians(180+(30*i)))*w);
fill(0, 55, 0);
noStroke();
if (180+(30*i) >= 300) {
text(Integer.toString(180+(30*i)), (radius+10) + cos(radians(180+(30*i)))*(w+10), (radius+10) + sin(radians(180+(30*i)))*(w+10), 25,50);
} else {
text(Integer.toString(180+(30*i)), radius + cos(radians(180+(30*i)))*w, radius + sin(radians(180+(30*i)))*w, 60,40);
}
}
noStroke();
fill(0);
rect(350,402,800,100);
fill(0, 100, 0);
text("Degrees: "+Integer.toString(degree), 100, 380, 100, 50);            
text("Radar screen code ", 540, 380, 250, 50);
fill(0);
rect(70,60,150,100);
fill(0, 100, 0); 
text("Screen Key:", 100, 50, 150, 50);
fill(0,50,0);
rect(30,53,10,10);
text("First sweep", 115, 70, 150, 50);
fill(0,110,0);
rect(30,73,10,10);
text("Second sweep", 115, 90, 150, 50);
fill(0,170,0);
rect(30,93,10,10);
text("Average", 115, 110, 150, 50);
fill(0, 255, 0);
text("10", 455, 375, 200, 200);
fill(0, 255, 0);
text("20", 455, 310, 200, 200);
fill(0, 255, 0);
text("30", 455, 250, 200, 200);
fill(0, 255, 0);
text("40", 455, 190, 200, 200);
fill(0, 255, 0);
text("50", 455, 130, 200, 200);
}


void serialEvent (Serial arduinoport) {
String xString = arduinoport.readStringUntil('\n');  
if (xString != null) {  
xString = trim(xString);
String getX = xString.substring(1, xString.indexOf("V"));
String getV = xString.substring(xString.indexOf("V")+1, xString.length());
degree = Integer.parseInt(getX); 
value = Integer.parseInt(getV);
oldValue[degree] = newValue[degree];
newValue[degree] = value;  
firstRun++;
if (firstRun > 330) {
firstRun = 333;
}
}
}