soodan sivut

arkisto

237 kirjotelmaa.

avainsanat

RC-servot ovat pienessä mittakaavassa oikein mukavia robottivimpaimia niiden suhteellisen yksinkertaisen ohjattavuuden ja tarkkuuden ansiosta. Ukki harrasteli mm. kauko-ohjattavia helikoptereita, ja nyt minulla on noita servoja toistakymmentä. Jo parin vuoden ajan on ollut hirveä hinku väsätä niistä jotain älyttömän siistiä mutten vain ole saanut aikaiseksi. Ensin tarvitsisi myös kehittää jonkinlainen ohjausjärjestelmä.

Kivointahan olisi tietenkin ohjata niitä aluksi ihan pc:ltä käsin, koska sille on helpointa kehittää softaa. Tarvitsen siis jonkinlaisen palikan pc:n ja servojen välille, ja mikrokontrollerithan ovat oikein ihania. Niihin ei montaa euroa kulu ja ohjelmointi on suht helppoa, etenkin AVR:ien tapauksessa koodata voi suoraan C:tä ja kääntää tutulla gcc:llä (avr-gcc). Esim. pikkuinen attiny2313 riittää mainiosti. Siinä on mm. sisäänrakennettu USART, eli pc-juttelu ei ole mikään ongelma, suoraan sarjaporttiin kiinni vaan. Toisillekin avr:ille on helppo jutella tuon kautta sit sarjamuodossa.

Tuumasta toimeen (koodaamaan). Servo-ohjain voisi vaikka muistaa itse servojen sijainnit ja päivitellä niitä sen tarvittavan 50 kertaa sekunnissa. Samalla se kuuntelee sitten sarjaporttia ja jos sieltä tulee dataa, niin päivitetään servojen ohjainsignaalit sen mukaan miten data sanoo. Helpommin kuitenkin sanottu kuin tehty, ja lisäksi ilmaantui vaikka mitä kiireitä projektin aikana joten se unohtui kuukausiksi pöydän nurkalle. Vihdoin riitti taas kuitenkin innostusta debugata, ja sainkin homman kokonaisuudessaan yhdessä illassa toimimaan.

Kyseessä on aika aikakriittinen tehtävä - servoja ohjataan noin 1-2 millisekunnin mittaisilla pulsseilla, pulssin pituus kertoo mihin asentoon servon "käsi" pitäisi asettaa. Olisi ihan kiva jos ohjaus ei heittelehtisi dataa vastaanotettaessa tms.

Sarjaporttidatan vastaanotto käsitellään keskeytyksissä, eli muun koodin suoritus keskeytyy ja hypätään datanvastaanottoaliohjelmaan. Yhden servon ohjaussignaali koostuu kahdesta tavusta, joista ensimmäinen määrää ohjattavan servon ja toinen sen sijainnin. Koodi hallitsee jossain määrin virheellisen signaalin - jos servo-id menee yli ohjattavien maksimimäärästä, signaalidata jätetään huomiotta, ja lisäksi id-data-parit voi resetoida jos tietokoneen pää unohtaa, kuuluisiko seuraavan tavun olla id vai sijainti. Keskeytys voi sattua kesken kaiken tuon millisekuntipulssin miettimisen, eikä olisi kauhean kivaa jos servojen sijainti häröilisi sitä mukaa kun uutta sijaintidataa päivitetään (vaikkei tuo datan käpistely montaa kellojaksoa viekään, niin silti).

Myöskin olis kauheen kiva voida ohjata montaa servoa samaan aikaan (13 vapaata i/o-nastaa! Pienellä koodin viilauksella vaikka joku iso atmega käyttöön niin saadaan nastoja vieläkin enemmän) eli joku tosi tyhmä viivelooppi ei kelpaa. Käytössä olevassa mikrokontrollerissa on sopivasti 16-bittinen taustalla pyörivä laskuri, johon voi vertailla servojen sijaintidatoja. Kun laskuri on laskeskellut taustalla x arvoa, kellojaksoja on kulunut x määrä (laskuri kasvaa yhdellä joka kellojaksolla, kun esijakajaa ei ole käytössä sille), ja siis aikaa x/kellotaajuus sekuntia. Tämän perusteella laskuria vertaillaan varastossa oleviin servojen sijaintidatoihin: ensin asetetaan jokainen signaali päälle, ja sitten looppaillaan servoja läpi ja vedellään pulsseja alas kun servojen sijainteja (jokaiselle oma) vastaava aika on kulunut. Kun viimeinenkin servodata on käsitelty, odotellaan hetki jotta päivitysväli olisi se ~50 Hz ettei servot hämääntyis (?) ja aloitetaan ohjaus alusta.

Sijaintidatat voisi kyllä antaa pc:ltäkin "raakana" eli odotettavien kellojaksojen määränä, mutta pidin elegantimpana ratkaisuna sitä, että pc:n ei tarvitse tietää tästä mitään vaan se vain antaa arvon väliltä 0-255 (ihan riittävän tarkka, ja mahtuu yhteen tavuun) joka kertoo vain sijainnin, jonka mukaan ohjainmikro miettii, kauanko pulssi kestää. Kahden kilon flash-muistiin mahtuu ihan hyvin pienen softakoodin lisäksi tuo 256 (sijaintiarvot 0-255) 16-bittistä arvoa esilaskettuna joista katsotaan kauanko odotellaan, yhteensä puoli kilotavua. Ai niin, avoin lähdekoodi on hauska juttu, auttaa vaikka muiden oppimista (?). Yritä ymmärtää jos huvittaa, tuo on puolidebugvaiheessa oleva, ehkä joskus selostan enemmän: servo.c.

Jadajada. Tietokone siis juttelee servokontrollerille sarjaportilla, ja se pitää huolta, että servoille lähtee oikeat sijaintidatat. Servot sitten tämän mukaan yrittävät parhaansa mukaan pitää sijaintinsa siinä missä pitää.

Sitten niitä pakollisia kuvia.

Pitäis jaksaa piirilevynsyövyttelymöhnät ja muut hommata. Onneksi tällaisissa pienemmissä projekteissa verolevylle kasaaminen ei ihan hirveää ole kuitenkaan. Lopputuloskin aika paljon siistimpi kuin leipiksellä.

Great success. Servot pyörii yhtäaikaa eivätkä pörise turhia vaan pitävät asentonsa ihan hyvin. Olen pienestä pitäen ("sitten joskus isona") haaveillut tietokoneella ohjattavasta robottikädestä sun muusta robotiikasta, mutten jostain syystä ikinä ole oikein saanut vielä sitä aikaiseksi. Kun sain ohjauksen toimimaan kunnolla ja ajatukset viilattua vielä skoopinkin mukaan oikein (bugikoodia illalla niin ei mistään voi olla varma! teoria ei oo käytäntö, nii!), oli tietenkin pakko väsätä äkkiä heti jonkinlainen robokäsi materiaaleista, joita nyt käsien ulottuvilta löytyy. (tää robokäsi ei oo pääasia! Älä hauku sitä rumaks, se vaan demoaa ohjainta :/ oisko jännempi sit vaan pari servoa pöydällä pörisemässä?) Tein pienen skriptin joka lähettelee servoille joitain ääripääarvoja jotta käsi heiluisi edestakaisin ja siitä näkisi miten nopeasti pelaa ja otin videotakin.

Myöhemmin sitten kun ehtii niin tietenkin rakennan jonkun ihan kunnollisen robokäden, eli uutta viritystä tulossa siitäkin. Pahvit korvataan vaikka pleksillä tai alumiinilla, teippi ruuveilla ja väsätään yhdestä servosta vielä joku tartuntaelin niin ai että kun tulee hieno. Lisäks noita servoja voisi vähän modata jotenkin kun liikerata ei ole kuin jotain 90 astetta. Kun noita servoja nyt kerran riittää, niin niistä pitää tehdä ainakin myös joku kauko-ohjattava tai ihan itse kävelevä hämähäkki. Kun ohjausprotokolla on nyt niin simppeli, niin on suorastaan riemuisaa kytkeä tämä ohjain toiseen mikrokontrolleriin kiinni joka miettii kävelyä abstraktimmin ja vain juttelee helposti tälle ja tämä ohjaa jalkoja sitten tarkemmin.

20 kommenttia

Oma kommenttisi

Mielipide tämän sivun asiasta? Kirjoita toki. Älä raapusta kuitenkaan ihan asiattomia juttuja.

Jos on yksityisempää asiaa, tarkkaa kysyttävää tai aihetta pidemmälle keskustelulle, käytä yhteydenottolomaketta kommentoinnin sijaan.

Hölmöt kommentit saatetaan moderoida pois jälkikäteen.

Nimimerkki:

Spammibottiesto: Mikä on kahden ja nollan summa? (vastaus numeroina)