Radar Arduino & Processing
Autor: bogdan.soky -05/04/2011-
Sa dorit crearea unui “Radar” mai rudimentar, radar ce se poate monta pe o platforma mobilă sau pe un robot. Ideea este destul de simplu de pus in practică, mai greu este integrarea acesteia într-un sistem de genu un roboţel care sa iasa dintr-un labirint, sau realizarea unei harti a unui plan mult mai mare decât raza senzorului folosit, sau poate chiar şi alte aplicaţii.
Programele realizate suportă extraordinar de multe îmbunătăţiri, vreau sa precizez de la început că este primul meu program scris în Processing şi al doilea pentru Arduino.
Materiale necesare (totul gasiţi pe www.robofun.ro, mai puţin sursa de laborator pe care o folosesc, dar se poate înlocui cu orice fel de sursă):
-placă de dezvoltare de tip Arduino (UNO în cazul meu)
-servo motor (Nu cu rotaţie completă)
-senzor de distanţă cu infraroşu (Sharp GP2Y0A21YK (10cm – 80cm) am folosit)
-sursă de laborator (trebuie să folosiţi o sursă separată de curent (baterie, sau alt tip de alimentare) deoarece senzorul de distantă este destul de sensibil la variaţiile de tensiune care apar în timpul mişcării servomotorului)
-softul în care s-a realizat partea grafică (http://www.processing.org/, este gratis şi arată exact ca cel în care programăm arduino)
Comanda motorului servo se va face din cât în câte grade dorim. In prima figură se observă rezultatul pentru un salt in 3 in 3 grade (pe o jumatate de rotatie 180 grave vom avea 60 de citiri)
Fig. 1. Citire din 3 in 3 grade
Am putea spune ca putem obţine informaţii mai detaliate legate de corpurile ce se află în jurul senzorului.
Un alt exemplu se poate observa in figura de mai jos daca optăm pentru un salt din 10 în 10 grade
Fig.2. Citire din 10 în 10 grade
Comanda servomotorului se realizează de pe pinul 9 iar citirea distanţei de pe pinul A0, după cum se poate observa şi în figura de mai jos
Fig.3. Conexiunile plăcii
Unde -firul rosu este comanda servomotorului
-firul negru e pentru a uni masele sursei de alimentare cu a lui Arduino
-firul alb este pentru citirea datelor de la senzor
Senzorul se montează pe servomotor (cel mai simplu cu bandă dubluadezivă). Colegii spun că seamănă cu Wally
Fig.4. Senzorul şi servomotorul
În figura 5 putem observa o imagine de ansamblu.
Fig.5. Imagine de ansamblu
În Processing se poate urmării inclusiv datele primite de la serial
Fig.6. Captură din Processing
Codul sursă cu explicaţiile aferente
Cod sursa Arduino
#include <Servo.h> // bibliotecă pentru comanda servo motorului
const int analogInPin = A0; // pe pinul A0 recepţionez date de la senzor
int a=200;
int b=222; // a, b 2 variabile folosite pe post de indentificatori ca să
//stiu ce trimit programului processing şi cum sa le interpretez
Servo myservo;
int distance=0; //distanta pana la obiect
int pos = 0; // cate grade ma misc
void setup() {
myservo.attach(9); // atasam comanda servomotorului pe pinul 9
Serial.begin(9600); // setăm portul serial
}
void loop() {
for (int i=0; i<180; i=i+10) // i este folosit pentru a şti din cîte în cîte grade mă misc
{
myservo.write(i);
float distance = 12343.85*pow(analogRead(0), -1.15);
// convertim ce citesc de la senzor în distanţă
if (distance<10) distance=10;
if (distance>80) distance=80; // elimin ce ar fi sub 10 si peste 80 cm,
Serial.write(a); delay(50); // trimit date pe serial prima data val lui a adica 200
Serial.write(i);delay(50); // trimit pozitia unde se afla servomotorul
Serial.write(b);delay(50); // trimit val lui b adica 222
Serial.write(distance); // trimit distanta
delay(50);
}
myservo.write(0); // a ajuns servo la 180 de grade si il aducem iara la inceput
delay(1000); // asteptam 1 secunda pt ca să parcurga 180 de grade
}
Cod sursa Processing
import processing.serial.*;
Serial myPort;
int val;
int aux=0;
int a=0;
int v1=0;
int v2=0;
int v3=0;
int v4=0;
int ung=180;
void setup()
{
size(200, 200);
size(600, 400);
myPort = new Serial(this, “COM5″); // trebuie modificat pentru ce com este arduino
background(255);
}
void draw()
{
fill(100);
if ( myPort.available() > 0) { // If data is available,
aux=val; val = myPort.readChar(); // citim datele care sunt trimise pe serial
if (aux != val) {
if (a==3) {v4=val; a=a+1;} // îmi aranjey datele primite astfel ca sa stiu
if (a==2) {v3=val; a=a+1;} // care este distanta si care este unghiul
if (a==1) {v2=val; a=a+1;}
if (a==0) {v1=val; a=a+1;}
if (a==4) a=0;
}
if( v1==200 && a==0)
{
println(“unghiul= ” + v2);
println(“valoare= ” + v4);
arc(300,400,v4*7,v4*7, radians(ung),radians(ung+10));
// trasăm arcul corespunzator distantei
redraw();
ung=ung+10;
if (ung==360){ ung=180; background(255);}
}
delay(20);
}
}
Sugestii şi discuţii cu mare plăcere pe forum:
30.03.2011 Sochirca Bogdan
Vezi aici detalii complete.











Ro-Bot-X
April 6th, 2011
Bravo Bogdan! Arata bine imaginea afisata in processing. Daca vrei sa vezi cum arata pe un ecran color montat direct pe un robot acest tip de scanare si afisare, arunca o privire pe articolul meu mai vechi:
http://www.tehnorama.ro/scaneaza-si-afiseaza-harta-cu-obiectele-detectate/
Eu am folosit la inceput doar un senzor ultrasonic, apoi am adaugat inca 2 senzori Sharp de distanta lunga asezati la 45 de grade spre stanga si spre dreapta fata de senzorul ultrasonic si am afisat pe aceeasi harta distantele citite de toti trei senzorii, fiecare cu culoare diferita. E interesant sa vezi diferenta intre ultrasonic si infrarosu, primul are conul de sunet larg, deci obiectele apar mai late decat sunt in realitate. Pe de alta parte, un perete oblic este “invizibil” pentru ultrasunet, dar este corect detectat de infrarosu. Dar, senzorul infrarosu returneaza uneori date false daca nu detecteaza nici un obiect. Am facut un al doilea video ca sa vezi cum arata harta. Nu se vede foarte bine deoarece ecranul emite prea multa lumina, dar totusi… Iata link-ul:
http://www.youtube.com/watch?v=DZxGn4aG_NA
Concurs Robofun 2012 | Robofun Blog
February 5th, 2012
[...] ROBOTL – robot cu retele neurale, Animatronic Hand, Swirl, Smart Home Management System, Radar Arduino, Valkirie [...]