• Sun. Oct 24th, 2021
    • Introduction: In this project, we will show you how to design a simple Radar Application using Arduino and Processing. This Arduino Radar Project is implemented with the help of Processing Application. Radar is a long-range object detection system that uses radio waves to establish certain parameters of an object like its range, speed and position. Radar technology is used in aircraft, missile, marine, weather predictions and automobiles. Even though the title says Arduino Radar Project, technically the project is based on Sonar technology as I will be using an Ultrasonic Sensor to determine the presence of any object in a particular range.
    • Components Required:

    Hardware

    1. Arduino UNO/Nano
    2. HC-SR04 Ultrasonic Sensor
    3. Tower Pro SG90 Servo Motor
    4. Mounting Bracket for Ultrasonic Sensor (optional)
    5. Connecting Wires
    6. Jumper Cables
    7. 5v Power Supply
    8. USB Cable (for Arduino)

    Software

    1. Arduino IDE
    2. Processing Application
    • How to Make:
    Connections with Arduino UNO
      • Connect VCC of servomotor (red wire) and VCC of ultrasonic sensor to 5v of Arduino.
      • Connect the GND of ultrasonic sensor and servo (black wire) to ground of the Arduino.
      • Connect trig and echo pin of the ultrasonic sensor of 8 and 7 of Arduino.
      • Connect signal pin of servo to pin 9 of Arduino.

    Connection With Arduino Nano for Nano user

    • Connect VCC of servomotor (red wire) and VCC of ultrasonic sensor to 5v of Arduino.
    • Connect the GND of ultrasonic sensor and servo (black wire) to ground of the Arduino.
    • Connect trig and echo pin of ultrasonic sensor to D10 and D11 of Arduino Nano.
    • Connect signal pin of servo to pin D12 of Arduino Nano.
    • In the code just change pins to D10, D11, D12.

    Download Arduino IDE
    Download Processing IDE
    • Paste the given code in processing IDE.
    • Run the processing IDE.
    • Note: change the COM3 on the code to your com port to which Arduino IDE is connected.
    • To know which COM port you are connected follow the image.

    Code:

    • Code for Arduino UNO:
    #include <Servo.h>
    
    /*
    code for arduino bord ultrasonic radar system.
    for more arduino projects --->  teamdiy.in
    */
                 
    Servo leftRightServo;         // set a variable to map the servo
    int leftRightPos = 0;         // set a variable to store the servo position
    const int numReadings = 10;   // set a variable for the number of readings to take
    int index = 0;                // the index of the current reading
    int total = 0;                // the total of all readings
    int average = 0;              // the average
    int echoPin = 7;              // the SRF05's echo pin
    int initPin = 8;              // the SRF05's init pin
    unsigned long pulseTime = 0;  // variable for reading the pulse
    unsigned long distance = 0;   // variable for storing distance
     
    /* setup the pins, servo and serial port */
    void setup() {
      leftRightServo.attach(9);
      // make the init pin an output:
      pinMode(initPin, OUTPUT);
      // make the echo pin an input:
      pinMode(echoPin, INPUT);
      // initialize the serial port:
      Serial.begin(9600);
    } 
     
    /* begin rotating the servo and getting sensor values */
    void loop() {
      for(leftRightPos = 0; leftRightPos < 180; leftRightPos++) {  // going left to right.
        leftRightServo.write(leftRightPos);
          for (index = 0; index<=numReadings;index++) {            // take x number of readings from the sensor and average them
            digitalWrite(initPin, LOW);
            delayMicroseconds(50);
            digitalWrite(initPin, HIGH);                           // send signal
            delayMicroseconds(50);                                 // wait 50 microseconds for it to return
            digitalWrite(initPin, LOW);                            // close signal
            pulseTime = pulseIn(echoPin, HIGH);                    // calculate time for signal to return
            distance = pulseTime/58;                               // convert to centimetres
            total = total + distance;                              // update total
            delay(10);
          }
        average = total/numReadings;                               // create average reading
     
        if (index >= numReadings)  {                               // reset the counts when at the last item of the array
          index = 0;
          total = 0;
        }
        Serial.print("X");                                         // print leading X to mark the following value as degrees
        Serial.print(leftRightPos);                                // current servo position
        Serial.print("V");                                         // preceeding character to separate values
        Serial.println(average);                                   // average of sensor readings
      }
      /*
      start going right to left after we got to 180 degrees
      same code as above
      */
      for(leftRightPos = 180; leftRightPos > 0; leftRightPos--) {  // going right to left
        leftRightServo.write(leftRightPos);
        for (index = 0; index<=numReadings;index++) {
          digitalWrite(initPin, LOW);
          delayMicroseconds(50);
          digitalWrite(initPin, HIGH);
          delayMicroseconds(50);
          digitalWrite(initPin, LOW);
          pulseTime = pulseIn(echoPin, HIGH);
          distance = pulseTime/58;
          total = total + distance;
          delay(10);
        }
        average = total/numReadings;
        if (index >= numReadings)  {
          index = 0;
          total = 0;
        }
        Serial.print("X");
        Serial.print(leftRightPos);
        Serial.print("V");
        Serial.println(average);
       }
    }
    
    • Code for Processing IDE:
    /*
    Radar Screen Visualisation for HC-SR04
    Maps out an area of what the HC-SR04 sees from a top down view.
    Takes and displays 2 readings, one left to right and one right to left.
    Displays an average of the 2 readings
    Displays motion alert if there is a large difference between the 2 values.
    for more projects ----> teamdiy.in
    */
    import processing.serial.*;     // import serial library
    Serial arduinoport;                  // declare a serial port
    float x, y;                       // variable to store x and y co-ordinates for vertices   
    int radius = 350;               // set the radius of objects
    int w = 300;                    // set an arbitary width value
    int degree = 0;                 // servo position in degrees
    int value = 0;                  // value from sensor
    int motion = 0;                 // value to store which way the servo is panning
    int[] newValue = new int[181];  // create an array to store each new sensor value for each servo position
    int[] oldValue = new int[181];  // create an array to store the previous values.
    PFont myFont;                   // setup fonts in Processing
    int radarDist = 0;              // set value to configure Radar distance labels
    int firstRun = 0;               // value to ignore triggering motion on the first 2 servo sweeps
    /* create background and serial buffer */
    void setup(){
    // setup the background size, colour and font.
    size(1204, 650);
    background (0); // 0 = black
    myFont = createFont("verdana", 12);
    textFont(myFont);
    // setup the serial port and buffer
    arduinoport = new Serial(this, "COM3", 9600);
    }
    
    /* draw the screen */
    void draw(){
    fill(0);                              // set the following shapes to be black
    noStroke();                           // set the following shapes to have no outline
    ellipse(radius, radius, 750, 750);    // draw a circle with a width/ height = 750 with its center position (x and y) set by the radius
    rectMode(CENTER);                     // set the following rectangle to be drawn around its center
    rect(350,402,800,100);                // draw rectangle (x, y, width, height)
    if (degree >= 179) {                  // if at the far right then set motion = 1/ true we're about to go right to left
    motion = 1;                         // this changes the animation to run right to left
    }
    if (degree <= 1) {                    // if servo at 0 degrees then we're about to go left to right
    motion = 0;                         // this sets the animation to run left to right
    }
    /* setup the radar sweep */
    /* 
    We use trigonmetry to create points around a circle.
    So the radius plus the cosine of the servo position converted to radians
    Since radians 0 start at 90 degrees we add 180 to make it start from the left
    Adding +1 (i) each time through the loops to move 1 degree matching the one degree of servo movement
    cos is for the x left to right value and sin calculates the y value
    since its a circle we plot our lines and vertices around the start point for everything will always be the center.
    */
    strokeWeight(7);                      // set the thickness of the lines
    if (motion == 0) {                    // if going left to right
    for (int i = 0; i <= 20; i++) {     // draw 20 lines with fading colour each 1 degree further round than the last
    stroke(0, (10*i), 0);             // set the stroke colour (Red, Green, Blue) base it on the the value of i
    line(radius, radius, radius + cos(radians(degree+(180+i)))*w, radius + sin(radians(degree+(180+i)))*w); // line(start x, start y, end x, end y)
    }
    } else {                              // if going right to left
    for (int i = 20; i >= 0; i--) {     // draw 20 lines with fading colour
    stroke(0,200-(10*i), 0);          // using standard RGB values, each between 0 and 255
    line(radius, radius, radius + cos(radians(degree+(180+i)))*w, radius + sin(radians(degree+(180+i)))*w);
    }
    }
    /* Setup the shapes made from the sensor values */
    noStroke();                           // no outline
    /* first sweep */
    fill(0,50,0);                         // set the fill colour of the shape (Red, Green, Blue)
    beginShape();                         // start drawing shape
    for (int i = 0; i < 180; i++) {     // for each degree in the array
    x = radius + cos(radians((180+i)))*((oldValue[i])); // create x coordinate
    y = radius + sin(radians((180+i)))*((oldValue[i])); // create y coordinate
    vertex(x, y);                     // plot vertices
    }
    endShape();                           // end shape
    /* second sweep */
    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();
    /* average */
    fill(0,170,0);
    beginShape();
    for (int i = 0; i < 180; i++) {
    x = radius + cos(radians((180+i)))*((newValue[i]+oldValue[i])/2); // create average
    y = radius + sin(radians((180+i)))*((newValue[i]+oldValue[i])/2);
    vertex(x, y);
    }
    endShape();
    /* if after first 2 sweeps, highlight motion with red circle*/
    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); 
    }
    }
    }
    /* set the radar distance rings and out put their values, 50, 100, 150 etc.. */
    for (int i = 0; i <=6; i++){
    noFill();
    strokeWeight(1);
    stroke(0, 255-(30*i), 0);
    ellipse(radius, radius, (100*i), (100*i)); 
    fill(0, 100, 0);
    noStroke();
    text(Integer.toString(radarDist+50), 380, (305-radarDist), 50, 50);
    radarDist+=50;
    }
    radarDist = 0;
    /* draw the grid lines on the radar every 30 degrees and write their values 180, 210, 240 etc.. */
    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);
    }
    }
    /* Write information text and values. */
    noStroke();
    fill(0);
    rect(350,402,800,100);
    fill(0, 100, 0);
    text("Degrees: "+Integer.toString(degree), 100, 380, 100, 50);         // use Integet.toString to convert numeric to string as text() only outputs strings
    text("Distance: "+Integer.toString(value), 100, 400, 100, 50);         // text(string, x, y, width, height)
    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);
    noFill();
    stroke(150,0,0);
    strokeWeight(1);
    ellipse(29, 113, 10, 10); 
    fill(150,0,0);
    text("Motion", 115, 130, 150, 50);
    fill(0,450,500);
    text("Developed by: VAISAKH ", 350, 400, 150, 50);
    text("teamdiy.in ", 400, 430, 150, 50);
    fill(0,110,0);
    }
    /* get values from serial port */
    void serialEvent (Serial arduinoport) {
    String xString = arduinoport.readStringUntil('\n');  // read the serial port until a new line
    if (xString != null) {  // if theres data in between the new lines
    xString = trim(xString); // get rid of any whitespace just in case
    String getX = xString.substring(1, xString.indexOf("V")); // get the value of the servo position
    String getV = xString.substring(xString.indexOf("V")+1, xString.length()); // get the value of the sensor reading
    degree = Integer.parseInt(getX); // set the values to variables
    value = Integer.parseInt(getV);
    oldValue[degree] = newValue[degree]; // store the values in the arrays.
    newValue[degree] = value;  
    /* sets a counter to allow for the first 2 sweeps of the servo */
    firstRun++;
    if (firstRun > 360) {
    firstRun = 360; // keep the value at 360 
    }
    }
    }

    And Here You Go….

    Leave a Reply

    Your email address will not be published. Required fields are marked *