Constructia unui robot • Pentru construirea unui robot aveti nevoie de cunostinte minime in electronica, mecanica si programare. Nu trebuie sa va speriati, ca nu e chiar asa de complicat. Va voi explica cate ceva, iar restul puteti sa mai gasiti pe internet (probabil in limba engleza). Un robot este compus din o parte mecanica (sasiu, roti, reductoare de turatie gear box, eventual un brat cu un cleste - arm + gripper), o parte electronica (senzori, motoare, afisaj, difuzor, microfon, controller) si o parte de logica (programul care decide felul in care robotul actioneaza motoarele in functie de datele returnate de senzori). Cand incepeti sa construiti un robot trebuie sa va ganditi la ce il veti folosi. Daca este destinat participarii la diverse competitii pe teme robotice, cititi regulametele sa vedeti daca nu sunt specificate dimensiuni, greutate, etc. de la care nu trebuie sa va abateti. Cel mai bine este sa va ganditi la un sistem modular, usor reconfigurabil, pe care sa il puteti folosi la un numar cat mai mare de competitii. Acelasi lucru este valabil si in cazul in care construiti un robot pentru uzul personal in casa. Cea mai importanta componenta a robotului o constituie controllerul. Acesta poate fi un micro-controller sau chiar un calculator. Dar si daca optati pentru un PC ca fiind "creierul" robotului, cel mai bine este sa aveti si un micro-controller (conectat la portul serial sau USB), care sa citeasca senzorii si sa dea comenzi motoarelor. In felul acesta PC-ul se poate ocupa de calcule mai grele, cum ar fi recunoasterea de imagine, pozitia pe harta, recunoastere de voce si altele. Cel mai des intalnita este combinatia laptop-micro-controller, dar se poate lucra si cu componente ale unui calculator desktop, pentru reducerea costului. Micro-controllerul poate fi din familia Basic Stamp, Atmel AVR, OOPIC, PIC Micro, Basic Atom, etc. Cea mai ieftina si usor accesibila este familia PIC Micro, pretul unui controller fiind de la 3-4 dolari pana pe la 14-15. Se gaseste si in Romania la magazinele de componente electronice care aduc piese din Germania. Partea proasta este ca aveti nevoie de un asa numit "programmer", care este un montaj electronic pe care se pune controllerul pentru a fi programat, un compiler, care este un software care traduce instructiunile scrise de voi in diverse limbaje si apoi le descarca in controller. Ca sa nu fie necesara la fiecare programare scoaterea controllerului de pe placa electronica si punerea in programator, se poate folosi un "boot loader" care permite programarea controlerului in circuit, folosind portul serial sau un conector special al programatorului. Deplasarea. Robotii se pot deplasa folosind roti, senile sau picioare. Mai rar se intalnesc robotii care se deplaseaza in apa sau aer, folosind diverse mijloace de propulsie, bazate in general pe motor si elice. Deplasarea pe roti se poate face in doua feluri: stil masina - un motor propulseaza robotul si alt motor asigura directia, si stil tanc - un motor propulseaza roata stanga a robotului si alt motor roata dreapta a robotului. Aceasta deplasare se mai numeste si deplasare diferentiala. Pentru echilibrare, robotul fie foloseste una sau doua roti cu rotire independenta, fie foloseste cate doua roti motoare pe fiecare parte, care lucreaza in stil senila de tanc. Motoarele. Cel mai des intalnite sunt motoarele de curent continuu, conectate la un reducator de turatie cu roti dintate (sau curele). Aceste motoare sunt usor de gasit in diverse jucarii electrice si in aparatura video. Un caz aparte reprezinta servo-motoarele, care au reductorul de turatie si circuitul de comanda gata integrate. Aceste motoare au un unghi de deplasare de circa 180 grade, dar se pot modifica destul de usor pentru rotire continua. Avantajul lor este folosirea unui singur port al controllerului pentru a le comanda, spre deosebire de motoarele de curent continuu care au nevoie de un circuit de comanda si de 3 porturi ale controllerului. Se mai intalnesc si motoare pas-cu-pas, care permit un control mai bun al deplasarii dar necesita mai folosirea mai multor porturi ale controllerului. Senzorii. Pentru a se putea deplasa fara sa se izbeasca de primul obiect intalnit in cale, robotul foloseste diversi senzori. Acesti senzori pot fi de contact, de
lumina, de proximitate, de distanta, de temperatura, de presiune,de sunet, de imagine. Senzorii de contact sunt de obicei mecanici si sunt montati pe un fel de bare de protectie, care la atingerea de un obiect inchid sau deschid un circuit semnaland robotului coliziunea. Senzorii de lumina sunt de obicei foto-rezistente de tipul CDS, care isi modifica rezistenta in functie de lumina ambienta. Senzorii de proximitate sunt de obicei o combinatie de emitator-receptor de lumina infra-rosie, care se bazeaza pe emiterea unei unde infra-rosii care se reflecta pe suprafata unui obiect si este apoi receptionata. Acesti senzori semnaleaza controllerului prezenta unui obiect la o anumita distanta, robotul putand astfel evita coliziunea. Senzorii de distanta se bazeaza pe acelasi principiu ca cei de proximitate, dar masoara ungiul de intoarcere a razei infra-rosii, determinand astfel distanta pana la obiect. Alt fel de senzori de distanta sunt senzorii ultrasonici, care masoara timpul in care se intoarce sunetul reflectat de un obiect. Senzorii de temperatura masoara temperatura unui obiect, cei de sunet detecteaza prezenta unui sunet sau volumul lui, cei de presiune masoara presiunea aerului sau a unui lichid intr-un sistem pneumatic sau hidraulic. Senzorii de imagine sunt de obicei camere video care sunt folosite pentru recunoastere de obiecte. Surse de componente pentru construirea unui robot: Jucarii electrice, timere, casetofoane, orice aparatura care poate contine motoare si eventual senzori. In special video-casetofoanele stricate sunt sursele cele mai bune de componente in construirea unui robot. In aceste aparate se gasesc, in afara de resistente si condensatori, unul sau doua motoare cu reductoare de turatie, uneori chiar cu reductor de tip melc-roata melcata, care este perfect pentru realizarea unui brat pentru robot, un senzor IR modulat pe frecventa de 38 sau 40 KHz, perfect pentru telecomanda, detectare de obiecte sau comunicare intre roboti, una sau doua fotodiode IR si unul sau doua LED-uri IR, folosite la detectarea de margine alb-negru sau proximitate. . Am atasat o schema electronica a unui robot care poate fi folosit la meciuri de Sumo, urmarire de linie, labirint, deplasare la intamplare cu evitarea obstacolelor intalnite in cale, etc. Dupa cum se vede de pe schema, componenta principala o reprezinta controllerul Nemesis, care este un PIC micro 16F88 cu un "boot loader" pre-programat. De ce am ales acest controller? In primul rand pentru ca este usor de programat in limbaj Basic, apoi pentru ca mediul de programare se descarca gratuit de pe internet impreuna cu documentatia aferenta si se pot gasi o gramada de exemple de folosire in forumul de pe site-ul firmei producatoare, Kronos Robotics (www.kronosrobotics.com). Un alt criteriu reprezinta pretul de numai $12.95. Un PIC 16F88 se poate cumpara intre 4 si 8 dolari, in functie de magazin. Dar aveti nevoie de un programator (cel mai ieftin e in jur de $40) si de un compilator (in limbaj Basic cel mai ieftin e $99 sau pentru limbaj de asamblare se poate descarca gratuit). De fapt, si pentru programarea lui Nemesis aveti nevoie de un adaptor de nivel logic pentru portul serial. (Vezi schema Adaptor) A doua componenta importanta este integratul SN754410E, fabricat de Texas Instruments, care este un "Quad Half H-Bridge", cu care se pot comanda 2 motoare de curent continuu sau un motor pas-cu-pas. Costa in jur de 2 dolari si se poate comanda la magazinele de import de piese electronice. Fiecare motor are 2 pini de comanda plus un pin de enable, care poate fi oscilat cu o frecventa crescatoare pentru un efect de accelerare sau descrescatoare pentru un efect de incetinire. Interesant este ca daca ambii pini de comanda sunt 1 logic si pinul de enable tot 1 logic, motorul este franat electronic. Piesa U1 este un "Photo IC" PNA4613, 40KHz, fabricat de Panasonic. Este un senzor infrarosu, sensibil la un semnal modulat pe o frecventa de 40KHz, care se gaseste
in mai toate aparatele electronice care folosesc telecomanda - video, TV, DVD, etc. In aceasta schema, senzorul este folosit pentru mai multe scopuri, in functie de necesitati. In principal este folosit la detectarea oponentului, dar se pate folosi si pentru a telecomanda robotul sau pentru a primi mesaje sau comenzi de la un alt robot. Dupa cum vedeti in schema, la stanga si la dreapta lui U1 se afla cate un LED infrarosu, pe lungimea de unda de 940nm, in capsula de 5mm. Aceste LED-uri sunt comandate de portul 6 al controllerului, care poate fi setat ca Pulse Width Modulation pentru generarea unui semnal cu frecventa de 40KHz. Din semireglabilul R3 se regleaza curentul care trece prin LED pentru reglarea distantei la care obstacolele vor fi detectate. Din cauza ca exista un singur port pentru comanda a 2 LED-uri, am conectat fiecare LED la un port diferit al controllerului, selectand din program care LED va fi activ. Am folosit 2 LED-uri pentru a avea detectectia obstacolelor pe stanga-centru-dreapta. Se mai observa in scema 2 grupuri de LED-Fototranzistori infrarosii, care sunt recuperate dintr-un video casetofon stricat. Fototranzistorii sunt in capsula de 3 mm, cu lungimea de unda de 940nm. Pentru realizarea acestui montaj aveti nevoie de 2 LED-uri infrarosii in capsula de 3 mm. (LED-ul din aparatul video era de 5 mm si l-am folosit la detectia obstacolelor impreuna cu cel recuperat din telecomanda aparatului). Se pot cumpara senzori incapsulati in plastic, in capsule de diverse marimi si forme, pentru 2-4 dolari bucata. Din semireglabilul R6 se regleaza sensibilitatea senzorilor (intre 1 si 2 cm). Acesti senzori detecteaza trecerea de pe negru (high) pe alb (low) si sunt folositi pentru detectarea marginii ringului de Sumo sau a unei linii negre pe fond alb - la urmarire de linie. Regulatorul de tensiune este de tip "low dropout" LM 2940. Se poate folosi si un regulator de tip 7805 dar atunci montajul trebuie alimentat la 7,5-9V. Motoarele sunt de curent continuu, recuperate dintr-o jucarie electrica (masina telecomandata) sau video casetofon, etc. Trebuie sa fiti atenti ca firele de alimentare ale motoarelor sa fie rasucite si motoarele sa aibe condensatori ceramici de decuplare de 0.1uF montati direct pe motor astfel: unul intre cele doua fire, unul de la un fir la carcasa si altul de la celalalt fir la carcasa. In urmatoarea parte a tutorialului voi atasa si discuta un program de deplasare la intamplare cu evitarea obstacolelor. Dupa cum am spus in partea I, pentru programarea lui Nemesis aveti nevoie de un adaptor de semnal pentru portul serial. Acesta este realizat cu un circuit integrat MAX232, care aduce semnalul de la portul serial la nivel TTL si il inverseaza. Aceasta schema se poate integra in schema robotului sau se poate realiza separat pentru a se putea folosi la programarea a mai multor roboti. Iata si programul, scris in limbaj Basic, folosind mediul de programare Athena dezvoltat de firma Kronos Robotics. Poate fi usor transcris in limbaj de asamblare si programat intr-un PIC 16F88. Descarcati programul in Visual Basic Pentru a fi usor de inteles de catre novici, am scris in romana numele de variabile, etichete, subrutine, etc. In mod normal se scrie direct in engleza, eventual comentariile in romana. Celelalte programe asa vor fi scrise. Programul e simplu: citeste senzorul, afiseaza valorile (pentru teste), decide cum trebuie facuta deplasarea, mergi la inceput. Sa le luam pe rand. 1. Citirea senzorului IR. In acest caz am folosit un singur senzor IR si doua LEDuri pe care le pornesc pe rand, pentru o fractiune de secunda, dupa care citesc valoarea senzorului si o scriu intr-o variabila pentru fiecare LED in parte. Se pot folosi 2 senzori si 2 LED-uri, in acest caz LED-urile fiind legate in serie intre semireglabil si masa. Astfel se elibereaza un port care poate fi folosit la altceva. 2. Afisarea valorilor. Afisarea se face in fereastra Debug (pe calculator), cablul serial fiind inca conectat la controller. (Este bine ca alimentarea motoarelor sa aibe un comutator sa le puteti scoate din functiune pentru teste.) Afisarea valorilor e importanta pentru reglarea sensibilitatii detectiei din semireglabilul R3. Luati o foaie de hartie si tineti-o in fata robotului la distanta maxima la
care doriti ca robotul sa inceapa sa detecteze obiecte si apoi rotiti semireglabilul pana cand valorile se schimba din 1 in 0. Ori de cate ori doriti sa modificati sensibilitatea, procedati ca mai sus. Veti observa ca in functionare, robotul va reactiona diferit la diverse materiale si culori, cel mai greu de detectat fiind culoarea neagra, mata. 3. Decizia deplasarii. Imaginati-va ca sunteti la bordul unui tanc. Aveti doua manse, una pentru comanda motorului stang si una pentru comanda motorului dreapt. Daca le miscati in fata, tancul merge inapoi. Daca le miscati in spate, tancul merge inainte. Ca sa cotiti la stanga, mansa stanga o miscati in spate, cea dreapta fiind in fata, si invers, daca vreti sa cotiti spre dreapta. In acelasi fel functioneaza decizia deplasarii si la robotul de fata. Daca nu este detectat nici un obiect, robotul merge inainte. Daca un obiect este detectat la stanga, robotul trebuie sa coteasca spre dreapta, adica sa faca motorul din dreapta sa mearga inapoi. Daca un obiect este detectat spre dreapta, trebuie sa faca motorul din stanga sa mearga inapoi. Dar daca este detectat un obiect in fata? Atunci robotul va face ambele motoare sa mearga in spate. 4. Reluare. Ciclul s-a incheiat, o luam de la inceput. Acest program este foarte simplu si se poate folosi si cu alte tipuri de senzori, ca: senzori de contact, senzori de margine - pentru urmarire de linie sau sumo, cu foarte mici modificari (la citirea senzorilor). Imbunatatiri. Daca il puneti in practica, veti observa ca se pot aduce imbunatatiri in functionare, in special in situatii in care robotul se impotmoleste intr-un colt de camera. O alta situatie este atunci cand nu reuseste sa detecteze un obiect si se loveste de el. In acest caz, se pot folosi senzori de contact, conectati la cele doua porturi ramase libere. Dar daca vrem ca robotul sa mearga intr-un anume loc si apoi sa se intoarca la locul de unde a plecat (baza)? Pentru asta trebuie sa masuram distanta parcursa si unghiurile de cotire. Acest lucru se poate face in doua moduri: cu un contor de timp sau cu un contor de impulsuri. Dar daca adaugam robotului un brat simplu si vrem sa se deplaseze la intamplare prin camera si sa culeaga diverse obiecte (pe care le poate apuca) si sa le aduca la baza? Despre toate aceste posibilitati vom vorbi in lectiile urmatoare... Ca sa vedeti ce se poate face din piese recuperate din VCR-uri stricate (video cassette recorder), am adunat de la gunoi (de fapt le-am luat de la o firma care repara televizoare, ca fiind nerecuperabile) 2 VCR-uri diferite, dar care s-au dovedit a fi foarte asemanatoare. Am facut cateva poze la unul din ele, sa va pot arata care sunt piesele importante. Fotodiodele IR (5 buc in total, dar am folosit doar 3), LED-urile IR (cate unul in mijlocul fiecarei placi), senzorul demodulator IR, cativa rezistori de 10K, unul de 100 de ohmi, un condensator de 10uF, unul de 1000uF, motoarele, impreuna cu curelele mici), 2 rotite care trag banda in caseta, un micro-intrerupator, un Led verde, un semireglabil, un suport de plastic si o bucatica de tabla cu 2 gauri au fost scoase din aceste 2 aparate. Pe langa aceste piese am mai cumparat: o placa de textolit perforata, cu "pastile" de cupru pe o parte, un soclu de integrate cu 18 pini, unul cu 16 pini, un conector cu 5 pini in linie (female), 2 conectori cu 3 pini (female), un conector cu 2 pini (male), mansoane termoconstrictibile, un soclu de baterii A6 (pt 4 buc), un circuit integrat SN754410E, un controller Nemesis. Am mai folosit 2 cuie, cateva saibe, cateva surubele de lemn, cateva suruburi cu piulita de 3 mm, o bucsa, cateva bucati de... tie-wraps si sarma de wrapping. Ciocan de lipit, fludor, etc. Dupa ce am deslipit piesele de care aveam nevoie, am pregatit placa perforata. Am taiat o bucata de circa 75x100 mm, am taiat 2 colturi la 45 grade (in fata) si am slefuit-o cu smirghel. Am pregatit rotile, folosind cuiul si 2 saibe, apoi am prins cuiele pe placa, cu rotile montate pe ele, cu ajutorul a catorva bucati de
sarma rasucite si lipite. Am luat motoarele si curelele si l-am pozitionat pe placa, marcand locul unde vor fi instalate. Am dat 8 gauri de 4 mm in locurile marcate si apoi am prins motoarele pe placa folosind tie wraps. Bineinteles ca am uitat sa montez pe ele condensatorii de filtraj, asa ca a trebuit sa le dau jos, sa-i pot monta mai usor... Am inceput sa lipesc piese pe placa, incepand cu soclurile pentru integrate, condensatorii de 0.1u si de 10u, rezistorii de 10K, soclul cu 5 pini (pentru programare), micro-intrerupatorul, condensatorul de 1000u, conectorul cu 2 pini si jumper (pentru a putea decupla tensiunea de alimentare la motoare in timpul programarii), LED-ul verde, rezistorul de 100ohmi. Am lipit apoi senzorul demodulator, cele 2 LED-uri IR (dupa ce in prealabil le-am prelungit piciorusle si le-am acoperit cu mansoane termoconstrictibile) si semireglabilul. Cea mai mare problema este faptul ca acele pastile sunt foarte usor de rupt daca se incearca miscarea unei piese. Din acest motiv a trebuit sa indoi piciorusele si sa le lipesc pe mai multe pastile. La sfarsit am montat cele 2 conectoare cu 3 pini, pe care le voi folosi sa atasez o placuta pe care voi monta cele 3 diode IR impreuna cu 2 LED-uri IR asezate intre ele, pe care le vom folosi la urmarile de linie. Dupa ce toate piesele au fost lipite pe placa, am inceput sa le unesc folosind sarma de wrapping. La sfarsit am conectat soclul de baterii si am cautat o solutie pentru a "fabrica" a 3-a roata. Am luat o bucata de plastic (din VCR) care avea un tub fixat vertical pe o placa orizontala (pe care am taiat-o mai mica) si am montat-o pe placa cu ajutorul unui surub de lemn. Am luat apoi o bucatica de tabla cu 2 gauri la capete (tot din VCR), pe care am rasucit-o in asa fel incat o gaura sa fie verticala si cealalta orizontala. Am gasit in una din cutiile mele cu piese o bucsa din plastic, de marime cam cat o rola presoare de la un casetofon audio (o rola presoare e mult mai buna din cauza ca are cauciuc pe ea), pe care am prins-o, folosind un surub cu piulite, de un capat al tablei. Folosind un alt surub cu piulite, am prins tabla de tubul de plastic, in asa fel incat sa se poata invarti usor. Am pus apoi bateriile, am scos jumperul sa nu porneasca motoarele si am bagat adaptorul serial in conectorul cu 5 picioare. Am descarcat programul in controller si pe ecran s-a deschis fereastra de debug aratandu-mi valorile citite de senzor. Tinand mana in fata senzorului, am reglat semireglabilul incat sa se schimbe valorile cand mana se afla la circa 10 cm in fata robotului. Am oprit apoi robotul si am deconectat adaptorul serial si am pus inapoi jumperul. Am pus apoi robotul pe jos si i-am dat drumul! A pornit in viteza spre un perete si cand a ajuns aproape s-a intors fara sa se loveasca! A reusit sa evite aproape toate obiectele din camera, cea mai mare problema fiind obiectele negre. Ca sa puteti si voi vedea cum merge, am facut un mic filmulet cu camera digitala pe care puteti sa-l descarcati folosind linkul de mai jos. Sper sa va placa!
Program Visual Basisc pt programare Nemesis '===============================================================
'Robot cu 2 Motoare si 1 senzor IR pt. detectare de proximitate 'Deplasare la intamplare folosind "faruri" InfraRosii 'Programul compilat ocupa: 176 biti (din 1024 biti) '=============================================================== '-------------------------------------------------'Declaratii variabile,etichete,etc. '-------------------------------------------------dim StangaIR dim DreaptaIR const const const const const
Motor1a Motor1b Motor2a Motor2b MotorEn
'variabile in care se vor stoca valorile 'senzorului IR pt stanga respectiv dreapta 8 9 10 14 13
'motor dreapta ' 'motor stanga ' 'activeaza motoare
const IRsenzor const IRmod
5 6
'senzorul IR de proximitate 'modulator
const IRLedSt const IRLedDr
11 7
'IR LED proximitate stanga 'IR LED proximitate dreapta
const IRmargineS 2 const IRmargineD 3
'IR LED margine stanga 'IR LED margine dreapta
hwpwm 0,50,15
'initializare modulator 40KHz 60% "on time"
'================================================================= 'Programul principal '================================================================= output Motor1a 'Se declara porturile la care sunt conecoutput Motor1b 'tate motoarele si LED-urile IR ca iesire output Motor2a '"output" si apoi se seteaza starea output Motor2b 'portului sus "high" sau jos "low". low Motor1a 'Porturile nedeclarate vor fi automat low Motor1b 'setate ca intrare "input". low Motor2a low Motor2b output IRLedSt output IRLedDr high IRLedSt high IRLedDr output MotorEn high MotorEn '----------------------------------------------------------------'Bucla principala '----------------------------------------------------------------Mainloop: '------------------------------------------------'citeste senzorii
'------------------------------------------------gosub CitireSenzorIR '------------------------------------------------'afiseaza in fereastra Debug valorile citite '------------------------------------------------print "Stanga ",StangaIR," Dreapta ",DreaptaIR '------------------------------------------------'decide directia deplasarii '------------------------------------------------if DreaptaIR = 0 then 'obstacol detectat la dreapta gosub StangaInapoi 'motorul stanga inapoi else 'nimic detectat gosub StangaInainte 'motorul stanga inainte endif if StangaIR = 0 then 'obstacol detectat la stanga gosub DreaptaInapoi 'motorul dreapta inapoi else 'nimic detectat gosub DreaptaInainte 'motorul dreapta inainte endif goto Mainloop
'mergi la inceputul buclei
'================================================================= 'Subrutine '================================================================= '------------------------------------------------'Controlul motoarelor '------------------------------------------------DreaptaInainte: low Motor1b high Motor1a return DreaptaInapoi: low Motor1a high Motor1b return StangaInainte: low Motor2b high Motor2a return StangaInapoi: low Motor2a high Motor2b return '------------------------------------------------'Citeste senzorul IR de proximitate '------------------------------------------------CitireSenzorIR: low IRLedDr 'activeaza LED IR dreapta output IRmod 'porneste modulatorul
pause 1 input IRmod DreaptaIR = inp.IRsenzor pause 1 high IRLedDr low IRLedSt output IRmod pause 1 input IRmod StangaIR = inp.IRsenzor pause 1 high IRLedSt return
'asteapta o milisecunda 'opreste modulatorul 'citeste senzorul 'asteapta o milisecunda 'dezactiveaza LED IR dreapta 'activeaza LED IR stanga 'porneste modulatorul 'asteapta o milisecunda 'opreste modulatorul 'citeste senzorul 'asteapta o milisecunda 'dezactiveaza LED IR stanga