Fórum témák

» Több friss téma
Cikkek » RC autó távirányítása Androidos telefonnal
RC autó távirányítása Androidos telefonnal
Szerző: Istvanpisti, idő: Feb 1, 2014, Olvasva: 20728, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   5 / 7

A program célja, hogy a BT-n érkező karaktersorozatokat eltárolja és megkeresse bennük az előre definiált parancsokat, majd ezekre reagáljon, beavatkozzon, válaszoljon.

A uC és az Andoid operációs rendszerű telefon programja számára parancsokat definiáltam, melyek közös jellemzője, hogy a '#' karakterrel kezdődnek, és ',' karakterrel végződnek.

A parancsok a következők :

Telefontól az autó irányába:

  • '#SS," Szervó Stop
  • '#SLnnnn,' Szervó bal, az 'nnnn' pedig egy szám
  • '#SRnnnn,' Szervó jobb, az 'nnnn' pedig egy szám
  • '#DS,' DC motor Stop
  • '#DFnnn,' DC motor előre, az 'nnn' pedig egy szám 0..100 között (%)
  • '#DRnnn,' DC motor hátra, az 'nnn' pedig egy szám 0..100 között (%)
  • '#A_UC,' uC akkumulátor feszültség kérés
  • '#A_MO,' Motor akkumulátor feszültség kérés
  • '#I_MO,' Motor áram kérés
  • '#LAn,' Lámpa bekapcsolás n 0..3
  • '#STOP,' Minden állj (vészleállítás)
  • '#ON,' Bekapcsolás

Autótól a telefon felé :

  • '#AKKU_UCnnn," A uC akkumulátor mérés ADC értéke
  • '#AKKU_MOTnnn," A motor akkumulátor mérés ADC értéke
  • '#CURR_MOTnnn," A motor áram mérés ADC értéke

A szervómotor számára kb. 50 Hz-cel ismétlődő impulzust kell előállítani, mely impulzus hossza határozza meg a szervo elfordulását.

servomotorcontrol.png

 A kormány szervó vezérlését a Timer1-gyel Fast PWM mód használatával oldottam meg. (Mode=14) Ebben az üzemmódban az ICP1 regiszter határozza meg meddig számol a Timer1 (periódus idő), és az OCR1A, vagy OCR1B regiszter tartalma adja meg az impulzus hosszát. A felbontás 1 us (ICP1=19999, osztás 8), amivel elméletben 0,18o felbontás lenne elérhető, de csak kb. 1o felbontást használtam ki, mivel a telefon programja ±90o tartományban küldi az adatot.

A meghajtó motor PWM vezérlését a Timer2 látja el fázishelyes fast PWM üzemmódban (Mode=1), ekkor az OCR2A értéke (0..255), határozza meg az impulzus kitöltési tényezőjét. Nem mellékes a PWM frekvencia, melyet az előosztással lehet befolyásolni (CS22, CS21, CS20). Ebben az üzemmódban a frekvenciát a az alábbi összefüggéssel lehet kiszámítani :

pwm_frekvencia_timer2.png

 Ahol az N értékét az alábbi táblázat szerint kell értelmezni

 timer2.png

A frekvenciát 15.686 Hz és 15 Hz között lehet beállítani.

Több próba után az N=256 mellett döntöttem, amivel 61 Hz PWM frekvencia adódik. A magasabb frekvenciákon zavaró sípoló hangot ad a motor és erőtlenebbnek is érződik. A telefon programja 0..100 (%) közötti értéket küld az autónak, ahol előremenet esetén 0..220, hátramenet esetén 0..150 értékek közé konvertálok. (OCR2A) Ebből látszik, hogy hátramenet esetén kisebb sebesség érhető el a jobb kezelhetőség miatt. Ha ennek módosítására lenne szükség, akkor elég az ATMEGA88 programján módosítani.

A harmadik timert, a Timer0-t CTC módban használom (mode=2) osztás 1024, OCR0A=77, amivel kb. 10 ms-onként végrehajtódik a TIMER0_COMPA interrupt, amiben többféle időzített feladat indítására leállítására is lehetőség nyílik. Itt oldom meg pl. a ADC interrupt engedélyezését 100 ms-onként, áll helyzetben a reflektorok felváltva villogtatását, stb.

Az ADC-t 1,1 V-os referencia feszültségről üzemeltetem 8 bites felbontással balra igazított módon. Négy bemenet jelét mintavételezi. Ha engedélyezve van az ADC interrupt, akkor először az motor akkumlátor, utána a BT kapcsolat jelét, majd a motor áramát, és végül a uC az akku feszültségét méri meg, majd letiltja az ADC interruptut, amit majd 100 ms múlva a Timer0 interruptja fog engedélyezni. Az akkumulátorok feszültségét le kell osztani annyira, hogy a maximális feszültség (4,2 V) esetén se lépje túl a feszültség a leosztás után az 1,1 V-ot.

A BT Tx adatait a USART RX interruptja "kapja" el és helyezi el egy átmeneti tárolóban (fifo), ahonnan a parancsokat a főprogramban keressük meg, amiket majd egy switch case szerkezetben külön-külön lehet kezelni.

A telefonról meghatározott időnként mérésre utasító parancsok érkeznek. A motor áram mérésére vonatkozó parancsok kb. 1,2-1,3 másodpercenként érkeznek, ha 1,5 másodpercig nem érkezik ilyen parancs, akkor az autó megáll. Ugyanígy megáll, ha a BT kapcsolata megszűnt. Ezekkel a védelmi mechanizmusokkal próbáltam elejét venni annak, hogy az autó elszabaduljon.

Nagy vonalakban ennyi a program működése, részletek a mellékelt kódban.

Van még egy félkész funkció, ez pedig az áramkorlát beállítási lehetőség. A cél az lenne, hogy ha egy beállított értéket meghalad a motor áramának értéke, akkor az analog komparátor segítségével (interrupt) beavatkozva, csökkentve az áram kitöltési tényezőjét, lecsökkenjen az áram.

A nyomtatott áramkörre felkerült egy 4 bit felbontású R-2R DAC, mely bitjeiből a 3 alsót szintén a telefonról lehet beállítani. A DAC-ról az analóg komparátor negatív bemenetére jut a jel, a pozitív bemenetre pedig a motorral sorbakötött söntről, egy műveleti erősítő közbeiktatásával. Abban az esetben ha a + bemeneten magasabb a feszültség, akkor megtörténik az intterupt hívás és csökkenteni lehet az OCR2A értékét, letiltani az analog komparátor interruptját, majd egy idő után újra engedélyezni, és a folyamat indul elölről, közben a Timer0 interruptban pedig lassan növelni lehet az OCR2A értékét, hogy az eredetileg kívánt kitöltést elérjük (csak késlelteve).

 vezerlo_elektronika.png


A cikk még nem ért véget, lapozz!
Következő: »»   5 / 7
É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