Fórum témák

» Több friss téma
Cikkek » WILL-I V2.0 (Robotika és AVR kezdőknek)
WILL-I V2.0 (Robotika és AVR kezdőknek)
Szerző: Fizikus, idő: Feb 5, 2010, Olvasva: 40000, Oldal olvasási idő: kb. 4 perc
Lapozás: OK   5 / 9

RoboMoly (robotlepke)

Miután most már tudjuk, hogy hogyan használjuk az ADC-t, és hogyan kössük a fotoellenállást a mikrovezérlőre, nekiállhatunk egy robotlepke (fénykövető robot) építésének, ami mindíg a fényforrás felé akar menni.

WILL-I egy aprócska robot, eléggé nehezen lehetett minden alkatrészt belezsúfolni a szűkös hely miatt. Minden programmódosításnál szét kellett szedni, hogy a vezérlőpanelhez hozzá lehessen férni a programozó kábellel, ezért kicsit karcsúsítottam a robotvezérlő és a motorvezérlő paneleken, így ezek a kisebb méretek miatt már jobban el fognak férni WILL-I-ben. Az alábbi képen jól látható a régi és az új panelek közötti méretbeli különbség.  

 

Ha már úgyis az elektronikus panelekről van most szó, gyorsan kitérnék egy apróságra, ami az előző cikkemből kimaradt, de a kezdőknek hasznos lehet ha megemlítem. 
A vezérlőpanelen kialakított csatlakozókról van szó.

A fenti ábra a régi vezérlőpanelt mutatja. Látható, hogy minden csatlakozó 3 érintkezős (kivéve persze az UART, ISP, Motorvezérlő stb.. csatlakozókat). Minden egyes I/O 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 minden kapcsolót, LED-et, érzékelőt és szervót könnyen rá tudok csatlakoztatni (csak rá kell dugni és kész).

Az ábráról az is látható, hogy minden csatlakozónál az 5V van középen, a GND az AVR-től távolabbi szélen, az I/O lábak pedig az AVR-hez közelebbi szélen. Ez azért van, mert ha pl. az 5V és a GND a csatlakozó két szélén lenne, és véletlenül valaki (velem pl. rendszeresen előfordul) fordítva dugná rá a szervó / érzérelő / LED stb... csatlakozóját a panelre, akkor a fordított polaritás tönkre is teheti a szervót, érzékelőt stb...
Ezért a +5V van a középső csatlakozón, mert így ha esetleg fordítva is dugna rá valaki egy csatlakozót, akkor maximum az érzékelő nem fog működni, de legalább nem füstöl el. Még a bemenő 9V-os tápcsatlakozó és az AVR alatt lévő stabilizált 5V-ot adó csatlakozók is 3 érintkezősek, ahol mindig középen van a feszültség és a szélen a föld (a harmadik, a rajzon x-el jelölt, szélső érintkező nem használt, nincs rákötve semmi sem).

Mielőtt beszereltem volna az új paneleket, gyorsan összedobtam egy, az előző cikkben már felvázolt egyszerű robotalvázat, amire már kényelmesen fel lehet rakni minden szükséges elemet. A fejlesztés is sokkal gyorsabb és egyszerűbb így, mert a vezérlőpanelek minden érintkezője könnyen hozzáférhető. A különböző érzékelők és a programozókábel is minden nehézség nélkül csatlakoztatható.

 

Az előző oldalon lévő ábrának megfelelően rákötöttem a fotoellenállást a 0-ás és 1-es ADC lábra (PC0 és PC1 AVR láb), a PD2-es lábra pedig egy nyomógombot. Összekötöttem a motorvezérlő és a robotvezérlő panelek érintkezőit és rákötöttem az elemeket is a panelekre az előző cikkben leírt módon (LINK).

Ezzel kész is egy új robot! Már csak a vezérlő programját kell elkészíteni!

Ezt a robotot én RoboMoly-nak kereszteltem el, mivel két fotoellenállás az érzékelője és fénykövetésre fogom beprogramozni. (Remélem senki figyelmét sem kerüli el a tápegységek rögzítésénél  használt csúcstechnológiás  megoldás)

A fénykövető algoritmus elég egyszerű, az alábbi folyamatábráról könnyen megérthető:

 

Bekapcsolás után RoboMoly gombnyomásra vár (PD2 lábra kötött gomb), majd elindul előre. Az ADC-vel beolvassuk először a jobb, majd a bal oldali LDR érzékelővel mért fényerősséget (a fényerősséggel arányos feszültséget). Ha a fényforrás balra van (a bal oldali szenzor által mért fényerősség a nagyobb), és a 2 érzékelő közötti különbség nagyobb az általnuk megadott határértéknél, akkor a robot balra fordul a fényforrás felé. Ha jobbra van a fényforrás (a jobb oldali szenzor által mért fényerősség a nagyobb), és a 2 érzékelő közötti különbség nagyobb az általnuk megadott határértéknél, akkor a robot jobbra fordul. Ha a két detektor jelei közötti különbség kisebb mint a határérték (a fényforrás a robot előtt van), akkor a robot előre megy.

A határérték, a késleltetés és R értékének változtatásával lehet a robotot finomhangolni.

  •  R – előtétellenállás értéke attól függ, hogy milyen fényviszoyok között akarjuk használni az érzékelőt. Az általam használt LDR szenzor sötétben mért ellenállása 1 000k Ohm, világosban pedig 10k Ohm volt, ezért egy 33k Ohm-os előtétellenállást használtam.
     
  • Határérték – minél nagyobb, annál érzéketlenebb a robot és annál inkább egyenesen megy előre. Ezzel a paraméterrel azt állítjuk be, hogy mekkora legyen az a minimális fényerősség különbség, aminél már elfordul a robot.
     
  •  Késleltetés – A motornak adott parancsok után kiadott delay utasítással várakozik a mikrovezérlő. Ez az oszcillációk csökkentésére szolgál. Képzeljük el hogy hogyan mozogna a robotunk, ha másodpercenként akár több ezerszer mérnénk meg a két fényérzékelő jele közötti különbséget, és ettől függően másodpercenként több ezerszer utasítanánk a robotot hogy forduljon jobbra/balra vagy menjen előre.

Én RoboMolyt úgy állítottam be (kisfiaim legnagyobb örömére), hogy a félig sötét szobában a zseblámpával a padlóra vetített fénykört kövesse.

(Ahhoz hogy az alábbi kód működjön, kell az előző cikkben leírt motor.h kód is! (LINK))

  1. // RoboMoly fenykoveto robot vezerlo program
  2. //---------------------------------------------------------------------
  3. #define F_CPU 1000000UL /* 1 MHz-es CPU orajel megadasa*/
  4. #include <util/delay.h> // idozito, keslelteto rutinokat tart. fajl
  5. #include <avr/io.h> //AVR konstansokat, beallitasokat tart. fájl
  6. #include <util/motor.h> // motorvezerlo utasitasokat tart. fajl
  7.  
  8. volatile int LDRjobb = 0;
  9. volatile int LDRbal = 0;    
  10. unsigned char ingerkuszob = 8;  // minel nagyobb ez a szam, annal erzeketlenebb lesz a robot
  11.  
  12. void Konfig8bitADC()        // ADC konfiguralas (beallitas)
  13. {
  14.     ADMUX |= (1<<REFS0)|(1<<ADLAR);    // Vcc mint referencia, balra rendezett ADC eredmeny
  15.     ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);   //ADC engedelyezese, ADC eloosztas = 8 (125 KHz)
  16. }
  17.  
  18. unsigned char Beolvas8bitADC(unsigned char csatorna)
  19. {
  20. ADMUX = (ADMUX & 0b11110000) | csatorna;
  21. ADCSRA |= (1<<ADSC);    // ADC konverzio elinditasa
  22. while (ADCSRA & (1<<ADSC));        // varas az atalakitasra
  23. ADCSRA |= (1<<ADSC);          // konverzió elindítás
  24. while (ADCSRA & (1<<ADSC));        // varas az atalakitasra
  25. return (ADCH);        // ADC ertek visszaadasa (csak a felso 8 bit (ADCH), az also 2 zajos bit elhagyasa)
  26. }
  27.  
  28. int main (void)
  29. {
  30. PORTD |= (1<<PD2);    // PD2-es lab pull-up bekapcs (nyomogomb)
  31. DDRC &= ~(1<<PC0);    // PC0-as lab bemenet (jobb LDR)
  32. DDRC &= ~(1<<PC1);     // PC1-es lab bemenet (bal LDR)
  33. PORTC = 0x00;    // PORTC osszes laban a felhuzoellenallasok kikapcsolva
  34.  
  35. Konfig8bitADC();    // ADC beallitas lefuttatasa
  36.  
  37. while (PIND & (1<<PD2)); /* várakozó cilkus amíg PD2 erteke nem 0 (amig a gomb nincs lenyomva) */
  38.  
  39. while (1)
  40.     {
  41.  
  42.     LDRjobb = Beolvas8bitADC(0);
  43.     LDRbal = Beolvas8bitADC(1);
  44.  
  45.         if ( LDRbal> LDRjobb && (LDRbal - LDRjobb) > ingerkuszob)  
  46.         {  
  47.         fordul_bal(100);     // fordulas balra
  48.         }
  49.         else if ( LDRjobb > LDRbal && (LDRjobb - LDRbal) > ingerkuszob)
  50.         {
  51.         fordul_jobb(100);     // fordulas jobbra  
  52.         }
  53.         else
  54.         {
  55.         elore(100);     // teljes gozzel elore!
  56.         }    
  57.     _delay_ms(50);     // egy kis kesleltetes a gyors oszcillaciok megszuntetese erdekeben
  58.     }
  59. }


A cikk még nem ért véget, lapozz!
Következő: »»   5 / 9
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem