Echipa:
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ă.
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.
Î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.
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:
Cantitate | Componentă |
---|---|
1 | punte H L298N |
8 | diodă BY 299 |
1 | condensator electrolitic 1mF,35V |
Notă : Implementarea se găseşte în arhiva de la secţiunea Download
Un robot funcţional.
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 . Î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 :
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 totul mergea perfect.
La scurt timp am terminat şi partea software a proiectului .
Connection time out : ⇒ Ai cablu scos …