Urmăritor de bilă

Introducere

Echipa:

  • Vlase Paul, 335 CC
  • Procopciuc Ghennadi, 335 CC

Obiectiv: Un robot care urmărește o bilă

După cum reiese și din obiectiv, proiectul nostru constă în crearea unei mașinuțe ce urmărește o bilă de o anumită culoare. Scopul proiectului a fost acela de a pătrunde în domeniul roboților ce se folosesc de Computer Vision pentru a realiza diverse sarcini. Ideea de la care am pornit a fost, să facem un robot care să nu fie un Line Follower, așa că ne-am decis asupra unui Ball Follower.
Proiectul este unul pur educativ, neavând nici o utilitate practică.

Descriere generală

bf_schema_bloc.jpg

Proiectul constă într-o mașinuță, a cărei singur scop este acela de a urmări o minge.

Pentru a putea prelucra imagini, folosim camera de la un telefon cu Android, având instalată aplicația IPCam pentru a oferi un stream video peste o rețea wireless (nu aveam bani de o IP Camera adevărată). Având un calculator conectat în aceeași rețea cu telefonul, putem să extragem imagini din stream-ul video, peste care se pot alica diverse operaţii. Inițial ne gândeam că va trebui să scriem tot codul necesar pentru prelucrarea imaginilor, noroc că am găsit între timp framework-ul OpenCV. Calculatorul va aplica filtre 2 filtre HSV peste imaginile primite. Rezultatul obţinut este forma unui obiect proiectat într-un plan 2D.

Poza primita de la telefon Imaginea HSV Aplicarea filtrului de culoriObiectul observat de aplicatie

În funcţie de poziţia centrului obiectului referenţiat se ia o decizie privitoare la urmatoarea mişcare a robotului. Comunicaţia dintre robot şi calculator are loc prin intermediul unui modul Ethernet.

Hardware Design

Microcontroller-ul şi driverul de motor

driver_motor.jpg

Modulul ENC28J60

ENC28J60

Regulatorul de tensiune TS1086

TS1086

Medii de dezvoltare

  • Eagle

Lista componente:

Cantitate Componentă
1 plăcuță cu microcontroller-ul ATMEGA-16
1 Placa Retea ENC28J60-H
1 TS1086
1 driver de motor
2 motor de curent continuu
2 cutie 4 baterii R6
1 cablu UTP
1 încărcător telefon
baterii R6 1.5V
pini bareta tată
20 pini bareta mamă
fire
0 pastă decapantă
fludor

Driver-ul de motor este alcătuit din:

Software Design

Microcontroller

  • Pentru a putea realiza comunicaţia calculator ⇔ microcontroller a trebuit să încărcăm pe ATMEGA16 biblioteca modulului ENC28J60.
  • Am modificat biblioteca pentru a avea o comunicaţie persistentă.
  • Modulul de control al motoarelor

Calculator

  • Prelucrarea imaginilor şi comunicaţia cu telefonul mobil a fost făcută prin intermediul bibliotecilor puse la dispoziţie de OpenCV (fişierul : ball_follower_client.cpp)
  • Comunicaţia cu microcontroller-ul s-a făcut cu socketi POSIX.

Notă : Implementarea se găseşte în arhiva de la secţiunea Download

Medii de dezvoltare

  • Visual Studio 2010
  • AVR Studio
  • Make
  • Vim
  • Gedit

Rezultate Obţinute

Un robot funcţional.

The Adobe Flash Plugin is needed to display this content.

The Adobe Flash Plugin is needed to display this content.

Concluzii

  • A fost destul de greu să ne atingem obiectivul.
  • Comunicaţia ne-a dat mari bătăi de cap.
  • A fost primul proiect care a conţinut atât parte software cât şi hardware în cantităţi relativ egale.

Download

Jurnal

Plăcuțiada

  • Fiți cu ochii pe placuța voastră, să nu ajungeți să luați o altă plăcuța (de o calitate mai proastă).

Placă proiect

  • Nu contează ce letcon cumpărați, atâta timp cât aveți fludor bun (cu plumb cred) sau multă pastă decapantă (vă murdăriți un pic plăcuța).

Dezvoltare proiect

  • Atunci cănd folosiți un cod netestat (rezolvări proprii ale laboratoarelor), verificați-l întâi pe acesta, și apoi puneți-vă problema de hardware (economisiți două zile).
  • Investiţi ceva bani de la bun început la capitolul alimentare, care să ofere un curent cât mai mare.

Pvestea

Am vrut să realizăm și noi robotul visurilor noastre (nu știam care încă). După o sesiune de pierdut timpul pe Internet, am rămas impresionați de roboți ce detectează obiecte, chiar și fețe. Cum nu aveam nici o idee despre acest domeniu, am început cu ceva mai simplu, detectarea de obiecte a căror formă într-un plan 2D poate fi descrisă de un cerc. Răsfoind printre resursele oferite de google am dat peste framework-ul OpenCV. Toate operațiile necesare, folosind acest framework s-au redus la câteva linii de cod, astfel am putut să ne axăm pe restul detaliilor. Interacţiunea cu framework-ul nu a fost una deloc uşoară, deoarece acesta încearcă detectarea automată a tipului de streaming folosit. În cazul nostru, formatul MJPG nefiind un stream video în adevăratul sens al cuvăntului, operația se termina cu o eroare m( . În urma unor căutari pe Internet, ce au durat câteva zile, am găsit o soluție propusă de cineva (un patch). Singura problemă era că necesita modificarea şi compilarea codului sursă a întregului framework (200 MB doar surse), încă o noapte pierdută în faţa a 2 laptopuri. Şi ăsta a fost doar începutul … Acum urma partea cea mai frumoasă şi mai simplă a proiectului, cea hardware. Totul începe cu testarea motoarelor prin conectarea acestora la tensiune. Până aici totul părea încă părea simplu. În timpul conectării driver-ului de motoare la ATMEGA16, am observat că plăcuţa noastră începea să devină obraznică, îşi dădea restart la câteva secunde şi nu mai puteam porni motoarele. După o zi pierdută, plus o plimbărică la întâlnirea TEHNORAMA încă nu aveam soluţia problemei. În timpul întâlnirii am asamblat şasiul maşinii în proporţie de 90% + am achiziţionat mult aşteptatul modul ENC28J60. Tot aici am aflat multe din “secretele roboţilor”, printre care :

  • Masa trebuie să fie comună între toate plăcile
  • Sursa de alimentare trebuie să dea destulă putere pentru a alimenta toţi consumatori
  • Debugging-ul in hardware nu se face doar cu un multimetru

Plini de forţe noi am început construcţia efectivă a maşinuţei. Următorul obstacol : ENC28J60. Modulul se încălzea foarte tare şi nu reuşeam să transmitem niciun byte. Consultăm datashet-ul datasheet-urile.

Pentru alimentarea modului ENC28J60 foloseam un TS1086 pe 3V3. Prima dată am folosit metoda cu 2 diode de pe placuţă (alimentarea pentru card-ul SD). Am observat că nu merge, aşa că am folosit ieşirea de 3V3 de la un arduino. Tot nu mergea, aşa ca ne-am chinuit să ajungem până la Maica Domnului şi am luat un TS1086 (un drum pentru o piesă). TS1086 avea Vin 5V de pe placa de arduino.

Am încercat prima dată făra să nu facem nici o adaptare de tensiune pe MISO (suntem studenţi până la urmă, nu ne complicăm), dar cum nu mergea am căutat pe net, şi nu zicea peste tot că nu se face adaptare pe nivel. Am găsit în datasheet-ul de la ENC28J60, cât şi pe diverse site-uri că se face adaptarea de nivel. Aşa că am făcut şi noi adaptare de nivel (citind din datasheet-ul ENC28J60, am găsit pe undeva că pe MISO 1 logic ar fi 0.8 Vcc, adică 0.8 * 3.3 V = 2.64 V, iar tensiunea pentru 1 logic pe ATMEGA16 ar fi 0.6 Vcc, adică 0.6 * 5 V = 3V, de aici am presupus noi că nu ar strica să fim siguri şi să facem o adaptare de tensiune, măcar să ştim că nu e de aici).

Orice tentativă de a rezolva problema din punct de vedere hardware se termina cu insucces. Atunci am hotărât să eliminăm problemele ce pot apărea din software. Astfel am căutat pe net biblioteca pe care o folosea modulul ENC28J60. Am revizuit codul şi la următoarea rulare a programului … minune :-o totul mergea perfect.

La scurt timp am terminat şi partea software a proiectului :-D.

Connection time out : ⇒ Ai cablu scos …

Mulțumiri

  • Mulţumim mult colegei şi prietenei noastre Bold Valentina pentru piesele acordate .
  • Mulţumim mult baieţilor de la întâlnirea TEHNORAMA.

Bibliografie/Resurse

pm/prj2012/abostan/14.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0