Az előző részben nagyvonalakban megterveztük a vonalkövető robotot.
Most jöhet a következő lépés. Építsük meg!
Építés
Robotépítésnél 3 főbb területhez is értenünk kell, hogy működőképes robotot hozzunk létre. Névszerint: mechanika, elektronika és programozás. A cikkben is ezen felosztás szerint tárgyalom az építés menetét
- Mechanika
Ebben a fejezetben az előző részben már felvázolt egyszerű robotalvázát építem meg. Ez egy univerzális konstrukció, amely később könnyen felhasznalható más robotok alapjául is (pl. labirintusjáró robot, falnaknemütköző robot stb...). - Elektronika
Ebben a fejezetben megépítem a LED-ből és fotoellenállásból álló vonalérzékelő szenzort és a motorvezérlő panelt, ami a robot mozgatásáért felelős DC motorokat irányítja. A robot “agya” egy AVR ATMega328-as mikrovezérlőt tartalmazó, Arduino Nano-ra épülő robotvezérlő panel lesz. - Programozás
Ebben a fejezetben a robotot megtanítom “gondolkodni” (beprogramozom az Arduino-t, hogy az egyes környezeti ingerekre (az érzékelők jeleire) miként is válaszoljon).
- Mechanika (Robot alváz)
Legelőször is szükségünk lesz egy stabil alvázra, amire majd fel tudjuk erősíteni az alább felsorolt főbb részeket:
- 2 db kapcsolókkal ellátott áramforrás (egy 9V-os és egy 6V-os)
- differenciális meghajtás (2db kerekekkel ellátott áttételes DC motor + egy bolygókerék)
- L293D IC-n alapuló motorvezérlő panel
- Arduino Nano-t tartalmazó robotvezérlő panel.
- Vonalérzékelő szenzorok, amelyekkel a robot a külvilágot érzékeli
Az alváz elrendezése nagyon sokféle lehet. Ennek a kialakítása nagymértékben függ a rendelkezésre álló alapanyagoktól. Használhatunk farost lemezt, műanyag lapot, fém építőjátékot, de akár egy CD lemezt is.
Az alváz alsó felére kell felszerelni a két áttételes motort és a bolygókereket. A kormányzás a két hajtott kerék sebességének, és a forgási irányának változtatásával történik majd. Hátul a bolygókerék bármerre szabadon elfordulhat, biztosítva ezzel az irányváltoztatást. Az alábbi ábrán egy saját gyártású robotalváz látható, amit egy plexi lapra építettem. Egy fénykövető robothoz, Robomoly-hoz használtam.
A vonalkövető robothoz egy gyári alvázat fogok felhasználni (látható hogy nincs sok lényegi különbség a saját gyártású alvázzal összehasonlítva):
Az alváz elkészülte után jöhet a többi alkatrész elkészítése.
- Elektronika
Vonalérzékelő szenzor
A robot a vonal érzékelésére egy fotoellenállást használ, aminek az ellenállása a rá eső fény értékétől függően változik. Nagy fényerősség esetén az ellenállás alacsony, sötétben pedig nagy. Ezt az ellenállásváltozást kell olyan érték változásává alakítani, amit a mikrokontroller mérni tud. Az alábbi ábrának megfelelően csatlakoztatva a fotoellenállást a mikrokontrollerhez, átalakíthatjuk az ellenállásváltozást feszültségszint változássá.
A LED-től és a hozzá tartozó áramkorlátozó ellenállástól eltekintve, a fenti kapcsolás értelmezhető egy olyan speciális feszültségosztó kapcsolásként is, amelyben az egyik ellenállás (a fotoellenállás) értéke változik. Ezzel a kapcsolással az érzékelő az LDR-re visszaverődott fény erősségétől függő feszültségjelet ad válaszul (nagyobb fényerő esetén nagyobb feszültséget). Ezt a jelet a mikrovezérlő már tudja kezelni. A fehér LED a talajt megvilágító állandó nagyságú fényerősségről gondoskodik.
A feszültségosztó kapcsolás egyenletei alapján, a szenzor kimenetén lévő feszültség az alábbi képlettel számolható:
Amikor a fotoellenállás a világos padló felett van, akkor a több visszavert fény miatt a fényerősség nagy, az LDR ellenállása (RLDR ) kicsi, ezért nagy áram folyik az áramkör ezen ágában. A kis ellenálláson eső feszültség is kicsi, ezért a kimeneti lábon lévő feszültség közelítőleg VCC-vel egyezik meg (5V). Amikor a fotoellenállás a fekete vonal felett van, a kevés visszavert fény miatt az LDR ellenállása nagy, ezért kis áram folyik az áramkör ezen ágában. A nagyobb ellenálláson nagy a feszültségesés is, ezért a kimenetre jutó feszültség közelít a 0V-hoz. Ezt az analóg feszültséget alakítjuk át az ADC-vel egy digitális számmá.
A fényes és sötét állapotok közötti relatív feszültségváltozást az alábbi képlettel számolhatjuk ki:
Ahol Rsötét és Rvilágos a fotoellenállás sötétben és világosban mért ellenállása. A szenzor érzékenységének maximalizálásához az R ellenállás értékét úgy kell megválasztani, hogy a relatív feszültségváltozás a lehető legnagyobb legyen.
Az ideális szenzornak közel nulla lenne az ellenállása fényben, és végtelen nagy lenne sötétben, ezért a fényes és a sötét állapotok között maximális feszültségváltozást adna válaszul. Az áltam használt szenzor közel sem tökéletes, világosban mért ellenállása kb 10kOhm, sötétben pedig 100kOhm. Ha ezeket a fenti képletbe beírjuk, és a relatív feszültségváltozást az R ellenállás függvényében ábrázoljuk, akkor az alábbi grafikont kapjuk:
A grafikonról látható, hogy 100 kOhm-os érték esetén lesz a legnagyobb a szenzor válasza. De ekkora ellenállást alkalmazva, a fellépő áram értéke nagyon kicsi, emiatt a szenzor a zajokra fokozottan érzékenyebb lesz. Meg kell találni a megfelelő kompromisszumot az érzékenység és a zajosság között, ezért a szenzornál egy 22kOhm-os ellenállást használtam.
A vonalérzékelő szenzort úgy alakítottam ki, hogy a fotoellenállás a LEDhez viszonyítva előrébb legyen. Így a LED fénye a fotoellenállás mögül jön, ezért a LED közvetlenül nem tud rávilágítani a fotoellenállásra, csak a padlóról visszaverődött szórt fény éri el a szenzort. Az alábbi kép ezt mutatja.
A követendő vonal 18mm széles fekete szigetelőszalagból készült. A vonalkövető szenzort úgy kell megépíteni, hogy a vonal a két érzékelő között helyezkedjen el. Ezért a szenzorok között kb. 30mm-es távolságot hagytam.
A vonalérzékelő szenzorokat egyetlen próbanyákra építettem meg.
A fotoellenállás nagyon érzékeny a környezeti fényviszonyokra. Ezért a szenzort megpróbáltam a lehető legjobban leárnyékolni úgy, hogy a fotoellenállást lehetőleg csak a LED-ről jövő, a padlóról visszaverődött fény világítsa meg.
A vonalérzékelő szenzort a robot elejére, a talajtól kb 3-5 mm távolságra szereltem fel.
Motorvezérlő panel
A motorokat nem köthetjük közvetlenül a mikrovezérlőre, azon oknál fogva, hogy a motoroknak nagy áramra van szüksége, amit a mikrokontrollerek nem tudnak leadni. A megoldás az, hogy egy motorvezérlő IC-t használunk, ami a gyenge áramú vezérlőjeleket a motorokat meghajtó nagy áramú jelekké alakítja át.
Az L293D motorvezérlő IC az első részben ismertetett, H-híd kapcsolásnak felel meg, azzal a különbséggel, hogy elektronikus kapcsolókat használ, amelyek az IC megfelelő lábaira adott 0V-os vagy 5V-os vezérlőjelekkel nyithatók és zárhatók. Ezáltal a H-híd IC könnyedén vezérelhető a mikrokontrollerrel. Az L293D két H-hidat tartalmaz, ezért egyetlen IC elég a robot két motorjának a vezérléséhez.
Az alábbi ábrán látható a motorvezérlő panel kapcsolási rajza, amit egy próbanyákon állítottam össze:
Most nézzük meg részletesen hogy a kapcsolás egyes elemei milyen feladatot látnak el.
Az L293D motorvezérlő IC-nek motoronként (H-hidanként) 2 bemenete van a motor forgásirányának a beállítására, és egy engedélyező bemenete a motor ki/be kapcsolására. Az alábbi táblázatokban az látható, hogyan vezérelhetjük az egyik motort az L293D IC INPUT1, INPUT2 és ENABLE1 lábaira adott feszültségjelektől függően. A motor forgásiránya az INPUT1 és INPUT2 lábakra adott digitális jelekkel vezérelhető. A motor sebessége pedig az ENABLE1 lábra adott változó kitöltési tényezőjű PWM jellel változtatható. (Ehhez hasonlóan a másik motor az INPUT3, INPUT4 és az ENABLE2 lábakra adott feszültségjelekkel vezérelhető.)
A motorokra jutó átlagfeszültség a PWM jel kitöltési tényezőjétől függ. A PWM jel több százszor ki-be kapcsolja a motor tápfeszültségét, ezért a motorok tekercseiben is másodpercenként több százszor épül fel és szűnik meg az elektromágneses tér. Ez a fellépő önindukció miatt nagy feszültség és áramlökéseket generálhat (elektromos zaj), amik akár tönkre is tehetik a mikrovezérlőt. Ennek kivédésere az L293D motorvezerlő IC rendelkezik beépített védődiódákkal.
Az egyik DC motort az L293D IC OUTPUT1 és OUTPUT 2 érintkezőire kell kötni, a másikat pedig az OUTPUT3-ra és OUTPUT4-re. A Vcc-vel jelölt érintkezőre kell a stabilizált 5V-ot kötni, a Vs-sel jelölt érintkezőre pedig a DC motorokat meghajtó tápfeszültséget.
Zajszűrés és a motorok simább járása érdekében ajánlatos 0,22 μF-os poliészter pufferkondenzátort kötni a motor pólusai közé, és 0,1 μF-os kerámia kondenzátort kötni a motor pólusai és a föld közé. A motorvezérlő panelre érkező, nem stabilizált motorfeszültség és a föld közé is érdemes egy 100 μF-os kondenzátort kötni.
Látható, hogy a motor forgásirányát megadó INPUT1 és INPUT2 lábakon lévő feszültségszint mindig egymás ellentettje (ha az egyiken 5V van, akkor a másikon 0V-nak kell lennie). Ráadásul mindkét lábon nem lehet egy időben 5V sem, mert az rövidre zárná a motorok tápfeszültségét, ami könnyen leégetheti az IC-t. Ez egy hex inverter IC-t használatával könnyen elkerülhető, ami gondoskodik arról, hogy a forgásirányt megadó INPUT lábakon mindig különböző jelek legyenek. Ráadásul így két I/O lábat is megspórolok az Arduino-n, mert a két INPUT láb egyetlen jellel vezérelhető.
Az L293D IC-nek és a CD4069-es hex inverter IC-nek a működéshez stabilizált 5V kell.
Robotvezérlő panel
A robotnál szükségünk lesz ADC-re a vonalérzékelő szenzorok jeleinek a feldolgozásához. Szükség lesz digitális jelekre is a motorok forgásirányának a beállításához és szükség lesz PWM jelekre a motorok sebességének a beállításához.
Az alábbi ábra az Arduino Nano lábkiosztását mutatja. A D0 - D13 lábak digitális ki/bemeneti lábak, amelyek közül 6 db képes PWM jelek előállítására is (D3, 5, 6, 9, 10 és 11). Az A0 - A7 lábak az analóg bemeneti lábak, ezek a mikrovezérlő ADC-jére vannak kötve.
A robotvezérlő panel az Arduino Nano köré épül. Fő feladata hogy az Arduino panel kivezetéseit jobban elérhetővé tegye, és megkönnyítse a vonalérzékelő szenzorok csatlakoztatását.
A panelt úgy alakítottam ki, hogy az Arduino Nano minden lábát kivezettem egy tüskesorra. Látható, hogy minden analóg lábnál lévő csatlakozó 3 érintkezős. Az analóg lábhoz menő csatlakozó mellé közvetlenül a +5V is és a föld (GND) is oda van vezetve. Ezzel egy univerzális 3 érintkezős csatlakozót alakítottam ki, amelyre a vonalérzékelő szenzorokat könnyen rá tudom csatlakoztatni. A fejlesztés is sokkal gyorsabb és egyszerűbb így, mert az Arduino Nano minden lába könnyen hozzáférhető.
Az ábráról az is látható, hogy minden csatlakozónál az 5V van középen, a GND az Arduino-tól távolabbi szélen, az analóg lábak pedig az Arduinohoz közelebbi szélen. Ez azért előnyös, mert ha véletlenül valaki fordítva is dugná rá az érzérelők csatlakozóját a panelre (velem pl. rendszeresen előfordul), akkor maximum az érzékelő nem fog működni, de legalább nem lesz az érzékelőn fordított polaritás, ami akár tönkre is teheti a szenzort vagy az Arduino-t.
A képeken látható még néhány kondenzátor is. Zajszűrés és pufferelés céljából a bejövő 9V-os tápfeszültség és GND közé, plussz az analóg lábakhoz menő 5V és GND közé is tettem egy-egy 100uF-os és 0.1uF-os kondenzátort.
Összeszerelés
Most már minden elem elkészült, hozzáláthatok a robot végleges összeszereléséhez. Az alábbi ábrának megfelelően rákötöttem a vonalérzékelő szenzor kimeneteit a A4-es és A5-ös analóg bemeneti lábakra. Összekötöttem az Arduino panel digitális D4-es, D5-ös, D6-os és D7-es lábait a motorvezérlő panel megfelelő érintkezőivel. Rákötöttem az elemeket és a stabilizált 5V-ot is a panelekre és a vonalérzékelő szenzorokra.
Ezzel el is készült a robot!
A robot programozása az építés utolsó lépése, ami nem választaható élesen külön a következő fázistól, a teszteléstől.
A harmadik, befejező részben a programozással, a robot tesztésével és a továbbfejlesztési lehetőségek vizsgálatával folytatom...