Tasapainoileva ESP8266-robotti
Olen jo pidempään muun muassa labrailloissa puuhaillut kahdella renkaalla tasapainoilevan robotin parissa. Projekti-idea ei sinänsä ole mitenkään uniikki – tasapainorobotteja löytyy YouTubesta vaikka millä mitalla hakusanalla self balancing robot.
Tässä projektissa on kuitenkin hieman tavanomaisesta poikkeavat lähtökohdat. Idea lähti itämään, kun kuulin ensi kertaa ESP8266-mikrokontrollerista, jossa on 32-bittinen prosessoriydin yhdistettynä WiFi-rautaan. Olin rakentanut aiemmin yksinkertaisen tasapainorobotin Arduino Nanon päälle, mutta paremmat kauko-ohjausmahdollisuudet kiinnostivat. ESP8266:lla voisi pyörittää HTTP-palvelinta, jonka kautta robottia voi ohjailla kännykällä. Eikä siinä vielä kaikki: halusin, että kaikki laskenta tapahtuisi samalla mikrokontrollerilla. Enpä silloin tiennyt, mihin olin ryhtymässä.
Noin vuoden päästä ensimmäisestä ideasta robotti liikkui jo. Ensimmäinen toteutus tehtiin ESP8266:lle portatun Arduino-ympäristön päälle. Arduinon avulla oli helppoa päästä alkuun perehtymättä mikro-ohjaimeen kovin syvällisesti.
Ensimmäisessä protossa käytin robotin asennon mittaamiseen MPU6050-anturia, jossa on kolmen akselin gyro sekä kiihtyvyysanturi samassa paketissa. Nyttemmin olen ottanut käyttöön vastaavan, hieman edullisemman LSM6DS3:n. Anturilukemista pystyy sensorifuusion avulla määrittämään robotin asennon – tai painovoimavektorin suunnan robotin koordinaatistossa. Tästä eteenpäin kaskadi-PID-säädin säätää DC-moottorien nopeuksia pitääkseen robotin pystyssä. Laskenta on toteutettu kokonaan kokonaislukuaritmetiikalla, sillä ESP8266:ssa ei ole liukulukuyksikköä, ja liukulukulaskujen tekeminen softalla veisi liikaa aikaa – 1.66 kHz näytteenottotaajuudella ei ole kovinkaan paljon aikaa mittausarvojen käsittelyyn.
Arduino-toteutuksessa oli kuitenkin omat ongelmansa. Koska WiFi-yhteys ja verkkototeutus pyörivät samalla prosessoriytimellä kuin aikakriittinen säätökoodi, aiheutti välillä sivun lataaminen kännykällä hieman nykimistä tasapainoiluun. Lisäksi aika ajoin tapahtui satunnaisia jumiutumisia. Netistä kuitenkin löytyi lupaava esp-open-rtos-projekti, jossa sovelluskoodi pyörii FreeRTOS-reaaliaikakäyttöjärjestelmän päällä. Huomattava parannus robotin vakauteen saavutettiin, kun laitoin laskentakoodin pyörimään korkeammalla prioriteetilla kuin TCP-yhteys. esp-open-rtos on muutenkin osoittautunut erinomaiseksi alustaksi, jota voisi suositella kenelle tahansa, joka haluaa kaivautua syvemmälle ESP8266:n maailmaan.
Aivan ongelmaton ESP8266 ei ole muutenkaan. Tarvitsen robotissa sekä PWM-lähtöä että I2C-yhteyttä, joista kummastakaan ei ole ESP8266:ssa rautatoteutusta. Softatoteutuksia molemmista pyörii netissä useita, mutta kesti hyvän aikaa löytää I2C-toteutus, joka todella saavuttaa lupaamansa siirtonopeudet. Lisäksi täytyy kehua ESP8266_new_pwm-kirjastoa, joka saavuttaa 20 kHz taajuuden 8 bitin resoluutiolla. Moottorien ininästä ei enää tarvitse kärsiä!
Moottoriohjaimena käytin aluksi L293D:tä, jossa pääteasteet on toteutettu bipolaaritransistoreilla. Myöhemmin kuitenkin selvisi, että niistä aiheutuu parin voltin jännitehäviö, jolloin DC-moottoreista ei saa täysiä tehoja irti. Niinpä vaihdoin myöhemmin DRV8835-piiriin, jossa on MOSFET-pääteasteet.
Protoversiossa käytettiin IC:itä valmiille breakout-levyille asennettuina ja johdoilla yhteen kytkettyinä. Hiljattain suunnittelin robolle varta vasten piirilevyn, ja OSH parkin valmistama lopputulos onkin varsin siistin näköinen.
Nyt kun pohjatyöt on tehty hyvin, aion seuraavaksi keskittyä käyttöliittymän hiomiseen – erityisesti PID-säädinten viritykseen tarkoitettu käyttöliittymä on nykyisellään hieman hankala. Olisi myös hauskaa suunnitella robolle 3D-tulostettava runko, jolloin se alkaisikin olla valmis massatuotantoon. Valmista tästä ei kuitenkaan varsinaisesti tule koskaan – onhan projekti jo ollut pari vuotta tekeillä. Jos alkaa tuntua tylsältä, saatan laittaa taas kaiken uusiksi päivittämällä ESP32:een ja ottamalla DC-moottorien sijaan käyttöön askelmoottorit.
Robotin koodit, piirilevykuvat ja kytkentäkaaviot ovat vapaasti saatavilla GitHubissa.
comments
Add comment