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




Ceva neclar in articolul de mai sus ? Ai vrea sa discuti cu cineva despre proiectul tau ? Vino in fiecare marti seara de la ora 19:00 la Intalnirea Tehnorama, sau ne poti contacta direct.
Vezi aici detalii complete.

Despre... bogdan.soky

Acest autor a publicat 2 articole.

Share

FacebookTwitterEmailWindows LiveTechnoratiDeliciousDiggStumbleponMyspaceLikedin

Comentarii


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

[...]  ROBOTL – robot cu retele neurale, Animatronic Hand, Swirl, Smart Home Management System, Radar Arduino, Valkirie [...]

Trimite un comentariu