Kako bi i sami mogli dokučiti koji senzor je bolji za autonomnu vožnju te kako pisati efikasniji kod koji se izvodi brže od prethodnog donosimo vam ovu radionicu kao uvod u gradnju robota s autonomnim djelovanjem.
U ovoj radionici naučit ćete osnove automatike s ciljem postizanja autonomnog kretanja robota. Svakim danom se autonomna vožnja koristi na sve većem broju robota. Namjerno pišemo robot, a ne automobil, vozilo ili sl.
Podsjetimo se, Robot je stroj kojeg je moguće programirati pomoću računala, a sposoban obavljati složeni niz radnji samostalno. Roboti se mogu pokretati uz korištenje vanjskog upravljačkog uređaja (tzv. daljinska kontrola) ili se kontrola može ugraditi unutar samog robota.
Roboti se mogu dizajnirati u raznim oblicima. Tako mogu poprimiti ljudski oblik, ali ipak je većina robota nalik najobičnijem stroju koji je dizajniran za izvršavanje određene zadaće. Takvi strojevi većinom se koriste za izvršavanje repetitivnih poslova poput onih u tvornicama, najviše tvornicama automobila.
Svatko od vas ima nekoliko robota u vlastitome domu. Najrašireniji od njih je perilica rublja. Ona je robot koji obavlja repetitivan posao pranja rublja. Perilicu rublja ne možemo nazvati pametnim strojem jer ona nije svjesna svoje okoline, tj. uključite li ju bez rublja, ona će ipak odraditi zadatak koji joj je zadan odabirom programa i neće stati s radom dok ne odradi predviđeni ciklus pranja. Takvo ponašanje može biti problematično ukoliko se radi o nekoj drugoj vrsti stroja, robota, koji bi svojim automatskim djelovanjem mogao ozlijediti čovjeka nađe li se u blizini. Kako se to ne bi desilo s kućnim robotima, poput perilice rublja, zatvorili smo robota u kutiju. Tako se strojevi poput perilica i sušilica rublja te perilica posuđa nazivaju Roboti u kutiji (Robot in a Box).
Međutim, danas imamo vrlo široku primjenu robota. Autonomni automobili su roboti koji se oslanjaju na mnogobrojne senzore, radare, lidare (laserske radare), ali i kamere koje pokušavaju protumačiti što se točno nalazi na slici. Neki smatraju kako je manje – više. Što kada dva senzora, npr. radar i kamera dođu do proturječnih zaključaka? Kome vjerovati? Radaru ili kameri? Elon Musk je na Twitteru u postu na linku https://twitter.com/elonmusk/status/1380606694816800768 rekao kako će maknuti radar jer je kamera bolja u čudnim rubnim slučajevima, kao i pod utjecajem loših vremenskih uvjeta. Naravno, to ponajviše ovisi o kvaliteti kamere koja se koristi, kao i o kvaliteti programskog koda.
No, kako bi vi sami mogli dokučiti koji senzor je bolji za autonomnu vožnju te kako pisati efikasniji kod koji se brže izvodi donosimo vam ovu radionicu kao uvod u gradnju robota s autonomnom vožnjom.
Bit će vam potrebno:
VIDI X mikroračunalo kao mozak koji odlučuje i upravlja vašim robotom – https://hr.vidi-x.org/hardware
Velleman KSR11 kit robot za sve terene – https://www.chipoteka.hr/artikl/111243
4 x AA baterije od 1.5 V te 3 punjive od 1.2 V – za napajanje VIDI X mikroračunala mogu se koristiti punjive baterije dok za napajanje robota treba imati punih 6 V, https://e-radionica.com/hr/industrijska-baterija-aa.html ili https://www.chipoteka.hr/search?q=aa+baterij
VL53L1X laserski senzor udaljenosti – za mjerenje udaljenosti ispred robota, https://e-radionica.com/hr/laserski-senzor-udaljenosti-tof-vl53l1x.html
2 x 5 KOhm otpornik – za stabilnu I2C komunikaciju. Koristili smo po dva 10K otpornika kako bi dobili 5K vrijednost paralelnim spojem, https://e-radionica.com/hr/15x-10k-otpornik-pull-up-pull-down.html
2 x Dual H bridge L298n – za pogon motora robota, https://www.aliexpress.com/wholesale?SearchText=L298n&opensearch=true
Mini breadboard – za lakše povezivanje komponenata spojnim žicama, https://e-radionica.com/hr/mini-eksperimentalna.html
Nešto spojnih žica – https://e-radionica.com/hr/set-kablica-musko-zenski.html,
https://e-radionica.com/hr/set-kablica-za-eksperimentalnu-plocicu.html,
https://e-radionica.com/hr/muski-header-40-pinski.html
Nešto muških headera – kako bi ih zalemili na Dual H bridge, https://e-radionica.com/hr/muski-header-40×2.html
Lemilica – praktičnost je vrlo bitna, https://e-radionica.com/hr/usb-lemilica.html
Lem – najčešće uz lemilicu dolazi malo lema, no ako ga nemate https://e-radionica.com/hr/lem-16g-sn99-3cu0-7-1mm.html
Prvi korak
Kako bi mogli krenuti s vašim projektom pametnog robota potrebno je sastaviti KSR11 kit uz pomoć uputa koje ste dobili u pakiranju.
Moguće je izvesti tri varijante te su upute priložene za sve tri vrste. Mi smo se odlučili za verziju koja izgleda kao tenk, jer ima najviše izgleda za savladavanje prepreka terena, a ima i dovoljno prostora za montažu dodatnih senzora kojima ga namjeravamo opremiti.
Korisno je testirati robota uz pomoć priloženog upravljača na žicu kako biste se uvjerili da je sve u redu s robotom.
Kasnije ćete upravljač rastaviti, jer nam od njega treba držač baterija kako bismo ga montirali direktno na robota. Možda se već sjećate naše ranije objavljene radionice u kojoj smo više rekli o samom sastavljanju te je korisno prisjetiti se njenog sadržaja na linku https://hr.vidi-x.org/radionice/vidi-project-x-87-robot-nadograden-vidi-project-x-mikroracunalom/.
Spomenuta radionica nam je korisna sve do podnaslova Spajanje trećeg motora, jer smo ovaj put taj treći motor spojili uz pomoć još jednog Dual H bridge L298n drivera kako bismo imali hardversku i softversku pripremu za eventualnu prenamjenu oblika robota iz ovog gusjeničara u gusjeničara s hvataljkom ili u viljuškara.
Elektronička shema spajanja
Kada ste gotovi sa sastavljanjem kit robota, potrebno je odabrati kompatibilan Dual H bridge L298n driver kako biste izbjegli moguća neslaganja s motorima robota.
Što to točno znači?
Kako naš motor troši 300 mA koje smo izmjerili principom opisanim u radionici na linku https://hr.vidi-x.org/radionice/vidi-project-x-87-robot-nadograden-vidi-project-x-mikroracunalom/ te radi na cca 6 V dok treći radi na pola te voltaže, potrebno je odabrati drivere koji će biti sposobni raditi na obje spomenute voltaže. Pri tome treba imati na umu kako je naš logički napon s VIDI X mikroračunala ograničen na 3 V te treba odabrati driver čija logika također radi na naponu od 3 volte. Kako takvog drivera nema za nabaviti u trgovinama el. opreme u Zagrebu, potrebno je potraži ga na web shopovima. Na linku https://www.aliexpress.com/wholesale?SearchText=L298n&opensearch=true možete pronaći razne izvedbe Dual H bridge L298n drivera za pogon DC motora, a uz vizualnu pomoć priloženih slika odaberite ovaj odličnih specifikacija za motore snage manje od 15 W.
Spomenuti driver može se kupiti sa zalemljenim nožicama (muškim headerom), no češća je situacija da ih morate zalemiti sami. Za taj dio vam je potrebna lemilica i nešto lema. Lemilicu možete nabaviti s linka https://e-radionica.com/hr/usb-lemilica.html ili https://www.chipoteka.hr/artikl/6265, a njezine odlike su brzo zagrijavanje vrha (potrebno je oko 15 sekundi) te zamjenjivi vrh lemilice po pristupačnoj cijeni, a to je bitno jer početnici mogu vrlo brzo uništiti vrh ne pridržavaju li se pravila, iako je i sama lemilica vrlo pristupačna cijenom. No, za početnike koji leme „tu i tamo“ po žičicu, dvije ili par pinova, stvarno nije potrebna lemilica skuplja od ove. Jednom kada naučite lemiti znat ćete treba li vam skuplja varijanta lemilice.
Što je potrebno znati prije lemljenja?
Nakon paljenja lemilice potrebno je pričekati da se zagrije njen vrh. Obavezno vrh lemilice prekrijte lemom. Kako bi lemilica bila što bolje sačuvana, njezin vrh mora uvijek imati tanki sloj lema. Pri lemljenju spoja lemilicu obrišite o mokru spužvicu za brisanje lema i vrh lemilice prislonite na spoj istovremeno dotičući štampanu pločicu i nožicu pina. Tako zadržite oko jedne sekunde, što je dovoljno vremena da se zagriju kontakti. Sada lemnom žicom dotaknite to čvorište lemilice, pina i štampane pločice. Kroz sekundu, dvije lemna žica se topi i razlijeva po spoju. Prvo rastopljeni oblik lema poprima konveksni oblik (poput kuglice), no kada kompletan spoj postigne dovoljnu temperaturu lem poprima konkavni oblik (kao da se lem malo slegnuo). Kada je postignut taj konkavni oblik znate da je spoj savršen i odmaknite lemilicu od spoja. Spoj ostavite da se sam ohladi, nemojte mu pomagati puhanjem u njega. Ovaj kompletan postupak trebao bi trajati dvije do tri sekunde.
Naravno, možda vam neće uspjeti od prve, a do drugog pokušaja odmorite desetak sekundi kako bi se spoj ohladio jer ne želite oštetiti komponente predugim zagrijavanjem. Kod lemljenja pinova je najlakše savladati te početničke greške jer se predugim držanjem lemilice na spojnome mjestu može eventualno otopiti plastika pina, što i nije neka velika šteta za samu funkcionalnost komponente. Jedino je izgled nešto narušen.
Lemite u provjetrenoj prostoriji jer dim od lema je toksičan, posebno je toksičan dim lema koji ima neki postotak olova u sebi. No s takvim lemom je lakše raditi jer ima nižu temperaturu tališta, dok bezolovni lem treba temperaturu vrha lemilice oko 400 °C kako bi se rastopio. Korisno je imati maleni ventilator koji će dim otpuhivati prema prozoru umjesto da se diže od lemilice ravno u zrak, jer najčešće se dimi direktno iznad lema i lemilice gdje se u trenutku lemljenja nalazi vaš nos.
Jednom kada imate spremne drivere s pinovima za spajanje, spojite ih s VIDI X mikroračunalom prema priloženoj shemi. Osim drivera motora koje je relativno jednostavno spojiti s VIDI X mikroračunalom, trebate spojiti i VL53L1X laserski senzor udaljenosti uz pomoć I2C komunikacije.
Za taj senzor potrebno je saznati I2C adresu samog senzora, a programska skica uz pomoć koje možete saznati adresu senzora nalazi se na linku https://github.com/VidiLAB-com/Vidi-X/tree/master/i2c_scan
Imate li bilo kakvih nepoznanica za spajanje VL53L1X senzora ili ga spajate prvi put s VIDI X mikroračunalom, preporučujemo Vam pogledati radionicu na linku https://hr.vidi-x.org/radionice/vidi-project-x-66alarm-s-vl53l1x-laserskim-senzorom-udaljenosti/ kako biste doznali detalje specifične za I2C komunikaciju i spajanje VL53L1X laserskog senzora udaljenosti. Pri spajanju VL53L1X senzora prema shemi priloženoj na spomenutom linku poželjno je senzor spojiti na malu breadboard pločicu kako biste ju mogli lakše pričvrstiti na robota.
Kada se uspješno povezali VL53L1X senzor s VIDI X-om možete na mini breadboard postaviti vaše drivere motora i spojiti ih prema priloženoj shemi.
Breadboard smo na robota zalijepili s obostrano ljepljivom trakom, a na breadboard smo istom trakom zalijepili laserski senzor udaljenosti.
VIDI X mikroračunalo također je zalijepljeno obostrano ljepljivom trakom za robota.
Kada je sve povezano i na mjestu spremni ste za upload koda na VIDI X.
Dešava li vam se da je breadboard loš te žice ne provode struju kako treba? Razmislite o lemljenju svih spojeva jer trešnja robota pri kretanju može rezultirati odspajanjem nekog spoja
Upload koda
Za modifikaciju i upload koda potreban vam je Arduino IDE koji, ukoliko nije već konfiguriran za korištenje s VIDI X mikroračunalom, možete konfigurirati uz pomoć uputa s linka https://hr.vidi-x.org/radionice/vidi-project-x-91-arduino-ide/
Sada preuzmite kod s VidiLABovog GitHub-a s linka https://github.com/VidiLAB-com/Vidi-X/tree/master/VidiX-Robot_senzor-udaljenosti_v.2
Modifikacija Koda
Kod kreće s okretanjem robota oko njegove osi te u 16 pravilno raspoređenih točaka mjeri udaljenost laserskim senzorom udaljenosti. To mjerenje postavili smo u funkciju izmjeri_udaljenost();.
Nakon što je napravio puni krug, vraća se na onu točku koja je imala najveću udaljenost te se počinje kretati prema naprijed za neki iznos vremena. Taj iznos vremena definiran je u milisekundama, a dobiven je množenjem udaljenosti u milimetrima koja je izmjerena na toj točci s deset. Mjerenje najdalje točke postavili smo u funkciju mjeri_najdalje();.
Pri tome je implementirano dodatno mjerenje udaljenosti za vrijeme kretanja robota te ukoliko mu se nešto ispriječi na put, kućni ljubimac ili sl., robot će stati s kretanjem. Za taj dio zadužena je while petlja
while ( srednjaVreijdnost > 300 ) { // delay( najdalje / 2 ); // Kreći se naprijed prema nekom mjerenju brzi_senzor(); TFT.setTextColor(ILI9341_YELLOW); // postavljamo boju teksta u žutu TFT.print(distance); TFT.print(“; “); }
Kako su navedene operacije u glavnoj petlji programa loop program kreće ispočetka s mjerenjem udaljenosti oko njegove osi s nove pozicije.
Dakle, cilj ovog koda je demonstracija programiranja automatiziranog kretanja uz mogućnost mjerenja udaljenosti. Pri tome smo vam u kodu dali potrebne funkcije za pokretanje svih motora robota u oba smjera te se tako on može kretati naprijed, nazad te okretati lijevo, desno oko svoje osi. Može i upravljati nagibom gusjenica funkcijama Motor_Up(); i Motor_Down();.
Nagib gusjenica je ovdje u ulozi naginjanja senzora udaljenosti pa ga tako možete postaviti da mjeri niže prema tlu ili više prema gore. Idealno bi bilo postaviti ga u potpuno horizontalan položaj.
Isto tako, poželjno je povećati broj mjerenja udaljenosti na puno više od 16 mjerenja, jer uz maleni broj mjerenja najčešće ne detektiramo malu udaljenost do noge stola pa gusjenicom udarimo u nju.
Troubleshooting
Pri spajanju kompletnog projekta naišli smo na neke stvari koje su nam zadale muke. Desilo nam se da se motori nisu okretali kako smo zamislili. Problem je bio u spojevima žica s breadboardom jer jeftiniji breadboardovi imaju raširene spojnice u koje umećemo žice, dok su kod kvalitetnijih spojene spojnice skupljene skroz u jednom cijelu i raširene pri vrhu kako biste lakše ugurali žicu u njih.
Kako bi mogli detektirati probleme sa spojevima napravili smo funkciju Test(Duration); i DTest(Duration); koje će pokrenuti sva tri motora u oba smjera za iznos vremena koji ste naveli umjesto Duration varijable, a na serijskoj konzoli računala će se ispisati koji motor (tj. koji pin) sada dobiva signal HIGH. Nakon što je pin postavljen u vrijednost 1 tj. HIGH ostat će u toj vrijednosti za iznos navedenih milisekundi, nakon čega se poziva funkcija Stop(); koja sve pinove postavlja na vrijednost LOW tj. 0.
Funkcija Test i DTest razlikuje se po načinu na koji smo postigli rad motora – u jednoj uz korištenje For petlje, a u drugoj uz pauziranje izvođenja programa na neko vrijeme.
Korištenje For ili neke druge petlje je odlično želite li u vrijeme dok se robot kreće odraditi i neko dodatno mjerenje senzora kako biste prilagodili putanju kretanja robota jer kada koristimo pauzu za kretanje robota, nije moguće mijenjati tijek izvođenja prethodno zadane operacije dok pauza ne završi.
Funkcije troubleshootinga koristite tako da umjesto glavne petlje programa pozovete traženu funkciju
void loop(void) { DTest(1000); }
Ovaj primjer pokrenut će sve motore u oba smjera u trajanju od 1 sekunde tj. 1000 milisekundi.
Zašto nismo koristili znatno jeftiniji ultrazvučni senzor za mjerenje udaljenosti?
Ultrazvučni senzor udaljenosti ne može precizno odrediti udaljenost za vrijeme pokretanja motora s četkicama kakve koristi Vellemanov KSR11 kit robot za sve terene. Želite li pokušati koristiti ultrazvučni senzor, rješenje je zaustaviti robota u trenutku mjerenja jer iskra s četkica motora ometa rad senzora.