Tasapainoilurobottia tekemässä

Minulla olisi suunnitteilla tasapainoilurobotti. Tuon tapaista siis: youtube.com/watch?v=kmnYl479Ets

Mikrokontrolleriksi/kehitysalustaksi valitsin arduino-yhteensopivan ET-Easy168 mallin ATMega168 mikrokontrollerilla http://www.futurlec.com/ET-Easy168_Stamp.shtml. Renkaita pyörittelemään ajattelin laittaa kaksi 360 astetta pyörivää servoa. Wiin nunchuck-ohjaimesta ja motionplus palikasta kiihtyvyys- ja gyroskooppianturi.

Tässä olisi sitten kysyttävää:

  • ATMega168:ssa on vain yksi 16 bittinen ajastin ja olisi tarkoitus ohjata kahta servoa erikseen. Onnistuuko kahden servon ohjaus yhdellä ajastimella kunnolla? Mitä nyt ymmärsin, niin ATMegan ajastimen pinniä voi vaihdella kahden välillä.
  • Mikrokontrolleriin menee ilmeisesti kolme I2C laitetta. Kiihtyvyys- ja gyroskooppianturi sekä vielä wiin kapula ohjausta/hallintaa varten. Riittääkö mikrokontrollerilla tehoja näin suuren(?) datavirtauksen lukemiseen?
  • Ajattelin seurata akun jännitettä jotenkin. Tällä hetkellä olisi mielessä yksi LiPo-akku, jonka jännite on 7.2V (ladattuna jotakin 8V). Miten saisin tämän semmoiseen muotoon (alle 5V), että jännitettä voisi lukea ATMegan ADC pinnillä? Joku vastus tai diodi?

Tässä kaikki mitä tuli tällä kertaa mieleen. Kysyn sitten lisää kun tulee mieleen.
Kiitokset etukäteen vastauksista.

Tästä en oikeasti osaa sanoa mitään. Mutta mietin vain että niitähän enimmäkseen tarvitaan tasapainoilun takia ohjata yhtäaikaa. Ja sitten vain haluttaessa kääntyä pyöritettäisiin toista hieman enemmän.

Tähän onkin helpompi vastata oikeasti. Vastuksessa on ihan oikean suuntaista ideaa, käytännössä voisi tehdä kahdella vastuksella jännitteenjaon tuohon. Helpoin tietenkin laittaa kaksi samankokoista vastusta sarjaan akun napojen kanssa, jolloin yhden yli jää puolet akun jännitteestä. Ihan pieniä vastuksia ei kannata käyttää, ettei akku tyhjene niiden kautta turhaan ja toisaalta jotta vastukset eivät kuume liikaa. Vähintään kilo-ohmien kokoluokkaa käyttäisin tuossa, mega-ohmeissa saattaa mikrokontrollerin tulon kuorma toisen vastuksen rinnalla muuttaa vastusjakoa ja vääristää tulosta, joten ei kuitenkaan montaa megaohmia kannata varmaan käyttää.

Koska AD-muuntimen tulo varmaankin vaatii paljon virtaa hetkellisesti, niin tulon ja maan välillä saattaisi olla hyödyksi käyttää kondensaattoria, joka varautuu mitattavaan jännitteeseen ja josta se saadaan nopeasti siirrettyä AD-muuntimen omaan kondensaattoriin muunnosta varten. Akkujännitettä mitattaessahan tulokset mittausten välillä eivät varmaan muutu nopeasti, joten liian iso kondensaattori ei ole sen suhteen ongelma että se hidastaisi jännitteen muutosta.

Jos haluaa paremmin hyödyntää AD-muuntimen koko tuloalueen, niin käyttää esimerkiksi 3k ja 5k vastuksia, eli täydestä 8 voltin jännitteestä saataisiin tuon 5k vastuksen yli 5V, mutta suuremmilla arvoilla oltaisiinkin jo tapissa. Litium-kennothan ladataan 4,1-4,2 V riippuen tyypistä, joten ehkä vähän enemmän varaa pitäisi jättää. Helpon laskennan takia saattaisin pitäytyä ihan puoliksi jakamisessa.

Voin puolestani vastata tähän. Olen näköjään kirjoittanut RuuviBot-artikkelin ensimmäisessä osassa näin:

ATmega168:n datalehden sivulla 107 kirjoitetaan sen sijaan näin Features-otsikon alla:

Eli kyllä onnistuu :wink:

Tämä ei tule olemaan mikään ongelma. I2C-väylään voi kytkeä jopa yli sata laitetta, kun käytetään yleensä käytettävää 7 bitin osoiteavaruutta. En ole itse tutustunut vielä tarkemmin Wiin I2C-liikennöintiin, mutta yleensähän homman voi hoitaa I2C:n tapauksessa niin, että luetaan arvoja sopivalla taajuudella (loopissa) eri laitteilta vuorotellen.

Tuosta servojen ohjauksesta sen verran että niissä yleensä käytetään PWM ohjausta ja timereistä yleensä löytyykin suoraan tätä varten määriteltävä ulostulopinni. Mikäli kuitenkin haluaa tehdä enemmän asioita ajastimella niin onhan mahdollista kirjoittaa timerin jollekin vertailuarvolle keskeytysfunktio ja sillä vaikka tehdä oma “softa pwm” ja laittaa se ohjaamaan vaikka kaikkia servoja. ja kun noita asetettavia vertailuarvoja on useampia niin voi vaikka jokaiselle tehdä oman keskeytysfunktionsa.

Heipä hei, projekti on vielä elossa :slight_smile:. Keksin taas lisää kysyttävää.
Miten jännitteen jännitteen pudotus kannattaisi hoitaa, kun akku on ladattuna 8,4V ja tyhjänä 7,4V, ja pitäisi saada virtaa näihin laitteisiin:

  • Servot 5V-6V
  • Arduino 4,5V-5,5V
  • Anturit 3,3V
  • LCD-näyttö 3,0V-5,5V

Ajattelin, että voisi jollakin säädettävällä regulaattorilla tiputtaa jännite 5,5 Volttiin ja sitten diodeilla tiputtaa siitä jännitettä antureille tai sitten omalla 3.3V regulaattorilla. Servoille haluaisin syöttää mahdollisimman suurta jännitettä, jotta vääntö ja nopeus paranisi. Ongelmana on, että jännitteen pudotus on liian suuri low-dropout regulaattoreille ja liian pieni “normaaleille” regulaattoreille. Esimerkiksi 7805 vaatii vähintään 8V sisään, jotta regulaattori toimisi vakaasti.

Minulta saat ostettua 3.3v reguja.
st.com/internet/com/TECHNICA … 000971.pdf
ja focus.ti.com/lit/ds/symlink/lp2951.pdf

Eli 100mA ja 250 mA ulostavia.

Oaa YV niin sovitaan hinnasta.

Ainakin mitä minä kattoin, niin 7805 haluaa vain 2v enemmän jännitettä kuin outputti. Eli ne toimis vaikka tyhjän akun kanssa.
Tai esim. LD1117 on 1v dropilla oleva regu. Se diodihomma ei oli hyvä, hukkaa tehoa ja ei ammattimainen.

Mitä se lineaariregulaattori tekee, ellei lämmitä? Plämmitys = (Vin-Vout)*Iulos + Pregun_itse_tarvisema_teho

Ja jännitteen pudotus diodilla on rumaa. Siitä ollaan yhtämieltä.

Minulla meni akun jännitteet sekaisin. 8,4V ladattuna ja kun katsoin netistä niin 6,5V alkaa olemaan tyhjä akku. Tuon LD1117 suurin pudotus on n. 1.5V luokkaa, joten se ei käy tähän tarkoitukseen. Kaipa sitä pitää sitten käyttää 7805 jos ei löydy parempaa ratkaisua.

No esim. AP1186T550L-U, sillä onnistuu. Dropout max 0.38v. Poistuva
Tai MIC29500-5.0WT, 5A virrankesto, 0.37v max dropout. Tässä ei muuta huonoa ole kuin ~5e hinta.
MIC29750-5.0WWT sama 7.5A mallina. 0.425v dropout. ~15e
L4940V5 DO 0.5v 1.5A kestää virtaskaa
AP1184T550L-U 0.7V DO 4A virtaa.

On noita vaihtoehtoja mistä valita. Digikeystä otettu kaikki nuo.

Taisin ymmärtää nämä datasheettien max. dropoutit väärin. Eli max. ilmeisesti tarkoittaakin pienintä dropouttia eikä suurinta?

Jep. eli se tarkoittaa mikä pitää olla minimissään komponentin yli ja tuossa max tarkoittaa huonointa yksilöä.

Ajattelin laittaa piirilevylle DIP-kytkimen, jotta voisin valita ottaako vehje virran akulta, ulkoiselta virtalähteeltä vai usb:ltä. Huomasin, ettei nuo kytkimet kestä paljoa virtaa, esim. 50Vdc @ 100mA. Tarkoittaako tämä, että kytkin kestää esim 5V jännitteellä 1A, vai sitä, että kytkin kestää 100mA jännitteestä riippumatta 50V asti?

100 mA max ja max jännite 50 V. Eli 100 mA maksimi kaikilla jännitteillä 50 V asti.

Robotin piirilevy on nyt lähes valmis. Huomasin, että antureiden regulaattori ei anna oikeaa jännitettä ulos. Regulaattori on l78l33acz, joka on 3,3V 100mA lineaariregulaattori. Regulaattori pudottaa jännitettä tasan 0,7V (7,77V->7,07V), vaikka pitäisi pudottaa paljon enemmän. Regulaattori on 5V 1,5A regulaattorin vieressä ja niillä on “yhteisessä käytössä” 10µF ja 100µF kondensaattorit. Mikä voisi olla vikana?

Ensimmäinen ja tärkein kysymys, eli pinnit varmasti oikein päin? Datalehden pinnikuvan voi ymmärtää TO-92-kotelon tapauksessa väärinkin, mikäli ei huomaa tätä huomautusta: "Figure 2. Pin connection (top view, bottom view for TO-92)".

No väärin päin se olikin mennyt :slight_smile: . Olin tuon kuvan perusteella katsonut pinnit, mutta en ollut huomannut “bottom view” tekstiä.
Testailin tänään servoja ja molemmat meni käyttökelvottomiksi. Huomasin servojen hidastuvan koko ajan ja hetken päästä ne eivät sitten liikkunetkaan. Moottorit olivat olleet niin kuumia, että ympärillä oleva muovi oli sulanut niihin kiinni. Hieman erikoista, koska servoissa ei ollut edes mitään kiinni.

Hyvä, että selvisi :smiley:

BTW, taidan siirtää tämän viestiketjun Ideat ja projektit -alueelle…

Tässä yksi vastaava projekti, mikäli et ole vielä lukenut:

letsmakerobots.com/node/26095

Projekti on edennyt kesäloman aikana:


Itse robotti on nyt aika lailla valmis, mutta ohjelmointipuoli on vielä pahasti kesken. Päädyin käyttämään avr:ää arduinon sijasta, koska halusin oppia tekemään “oikealla” tavalla alusta alkaen. Piirilevy on tehty kokeilutyylillä ilman kummoisia suunnitteluja :sunglasses:.