- Osien tasapainottavan robotin osien valitseminen
- 3D-tulostus ja itsetasapainottavan robotin kokoaminen
- Piirikaavio
- Itsetasapainottava robottikoodi
- Arduino-itsetasapainorobotin toiminta
Saatuani inspiraation RYNO-moottoreista ja muista Segwayn itsetasapainottavista skoottereista halusin aina rakentaa oman Arduino Segway -robotini. Ajattelin jonkin aikaa, päätin rakentaa itsetasapainottavan robotin Arduinolla. Tällä tavalla voisin ymmärtää kaikkien näiden skoottereiden taustalla olevan käsitteen ja oppia myös PID-algoritmin toiminnan.
Kun aloitin rakentamisen, tajusin, että tämä botti on vähän haaste rakentaa. Valittavanasi on niin monta vaihtoehtoa, ja sekaannukset alkavat moottoreiden valinnasta oikealle ja pysyvät PID-arvojen virittämiseen saakka. Ja niin monia asioita on otettava huomioon, kuten akkutyyppi, akun sijainti, pyörän kahva, moottorin kuljettajan tyyppi, CoG: n (painopiste) ylläpito ja paljon muuta.
Mutta anna minun rikkoa se sinulle, kun rakennat sen, hyväksyt, että se ei ole niin vaikeaa kuin miltä se kuulostaa. Joten tunnustetaan, tässä opetusohjelmassa dokumentoin kokemukseni itsetasapainottavan robotin rakentamisesta. Saatat olla ehdottomasti aloittelija, joka on vasta aloittamassa tai olet saattanut laskeutua tänne pitkän turhautumisen jälkeen siitä, että bottia ei saada toimimaan. Tämän paikan tarkoituksena on olla lopullinen määränpääsi. Joten aloitetaan……
Osien tasapainottavan robotin osien valitseminen
Ennen kuin kerron sinulle kaikki botin rakentamisen vaihtoehdot, anna minun luetella kohteet, joita olen käyttänyt tässä itsetasapainottavassa robottiprojektissa
- Arduino UNO
- Vaihteistetut tasavirtamoottorit (keltainen) - 2
- L298N-moottorin ohjainmoduuli
- MPU6050
- Pyörät
- 7,4 V: n litiumioniakku
- Johtojen liittäminen
- 3D-painettu runko
Voit sekoittaa ja valita minkä tahansa yllä olevista komponenteista saatavuuden perusteella ja tehdä oman itsestään tasapainottavan robottipaketin, varmista vain, että komponentit vastaavat seuraavia ehtoja.
Ohjain: Ohjain, jota olen käyttänyt täällä, on Arduino UNO, miksi koska sitä on yksinkertaisesti helppo käyttää. Voit käyttää myös Arduino Nano- tai Arduino minia, mutta suosittelen, että pidät kiinni UNO: sta, koska voimme ohjelmoida sen suoraan ilman ulkoista laitteistoa.
Moottorit: Paras valinta moottoriksi, jota voit käyttää itsetasapainottavaan robottiin, on epäilemättä Stepper-moottori. Mutta pitääkseen asiat yksinkertaisina olen käyttänyt DC-vaihdemoottoria. Kyllä, ei ole pakollista pitää askelta; botti toimii hyvin myös näiden halpojen yleisesti saatavilla olevien keltaisten DC-vaihdemoottorien kanssa.
Moottoriohjain: Jos olet valinnut minun kaltaiset tasavirtamoottorit, voit joko käyttää L298N-ohjainmoduulia kuten minä, tai jopa L293D: n pitäisi toimia hienosti. Lisätietoja DC-moottorin ohjaamisesta L293D: n ja Arduinon avulla.
Pyörät: Älä arvioi näitä kavereita; Minulla oli vaikea selvittää, että ongelma oli pyörissäni. Joten varmista, että pyörilläsi on hyvä pito käyttämääsi lattiaan. Tarkkaile tarkasti, pidon ei pitäisi koskaan antaa pyörien luistella lattialla.
Kiihtyvyysmittari ja gyroskooppi: Paras kiihtyvyysmittarin ja gyroskoopin valinta botillesi on MPU6050. Joten älä yritä rakentaa sellaista normaalilla kiihtyvyysmittarilla, kuten ADXL345 tai vastaavalla, se vain ei toimi. Tämän artikkelin lopussa tiedät miksi. Voit myös tarkistaa omistetun artikkelin MPU6050: n käytöstä Arduinon kanssa.
Akku: Tarvitsemme mahdollisimman kevyen akun ja käyttöjännitteen tulisi olla yli 5 V, jotta voimme virtaa Arduinoamme suoraan ilman tehomoduulia. Joten ihanteellinen valinta on 7,4 V: n litiumpolymeeriakku. Täällä, koska minulla oli helposti saatavilla oleva 7,4 V: n litiumioniakku, olen käyttänyt sitä. Mutta muista, että Li-po on edullinen kuin Li-ion.
Alusta: Toinen paikka, josta ei pidä tehdä kompromisseja, on bottien alustasi. Voit käyttää pahvia, puuta, muovia mitä tahansa. Varmista kuitenkin, että runko on tukeva eikä sen pitäisi heilua, kun botti yrittää tasapainottaa. Olen suunnitellut Solidworksin omalla alustallani päättelemällä muista robotteista ja 3D-tulostuksen. Jos sinulla on tulostin, voit myös tulostaa mallin, suunnittelutiedostot liitetään tulevaan otsikkoon.
3D-tulostus ja itsetasapainottavan robotin kokoaminen
Jos olet päättänyt tulostaa kolmiulotteisen rungon, jota käytän botin rakentamiseen, STL-tiedostot voidaan ladata esineistä. Olen myös lisännyt suunnittelutiedostot sen mukana, jotta voit myös muokata sitä henkilöstön mieltymysten mukaan.
Osissa ei ole ulkonevia rakenteita, joten voit tulostaa ne helposti ilman tukia ja 25%: n täyttö toimii hyvin. Mallit ovat melko selkeät, ja kaikkien perustulostimien tulisi pystyä käsittelemään niitä helposti. Käytin Cura-ohjelmistoa mallin leikkaamiseen ja tulostin Tevo Tarantulalla, asetus näkyy alla.
Sinun tulisi tulostaa runko-osa ja neljä moottorin kiinnitysosaa. Kokoonpano on melko suoraviivaista; käytä 3 mm: n muttereita ja pultteja moottorin ja levyjen kiinnittämiseen. Kokoonpanon jälkeen sen pitäisi näyttää jotain tältä, kuten alla olevassa kuvassa.
Varsinainen suunnittelu suunniteltiin L298N-käyttömoduulilla Arduinon alimmassa telineessä ja sen päällä olevalla akulla, kuten yllä on esitetty. Jos noudatat samaa järjestystä, voit ruuvata levyn suoraan mukana olevien reikien läpi ja käyttää lankalappua Li-po-akkuun. Tämän järjestelyn pitäisi myös toimia, paitsi super-tavalliset pyörät, jotka jouduin vaihtamaan myöhemmin.
Botissani olen vaihtanut akun ja Arduino UNO -levyn sijainnin ohjelmoinnin helpottamiseksi ja jouduin myös ottamaan käyttöön täydellisen kortin yhteyksien loppuun saattamiseksi. Joten botini ei näyttänyt suunnitellulta alkuvaiheessa. Suoritettuani johdotuksen ohjelmointitestauksen ja kaiken, kaksipyöräinen robotti näyttää vihdoin tältä
Piirikaavio
Yhteyksien luominen tälle Arduino-pohjaiselle itsetasapainorobotille on melko yksinkertaista. Tämä on itsestään tasapainottava robotti, joka käyttää Arduinoa ja MPU6050: tä, joten voimme liittää MPU6050: n Arduinoon ja liittää moottorit moottorin ohjainmoduulin kautta. Koko kokoonpano saa virtansa 7,4 V: n litiumioniakusta. Saman kytkentäkaavio on esitetty alla.
Arduino- ja L298N Motor -ohjainmoduulit saavat virran suoraan Vin-nastasta ja 12 V -liittimestä. Arduino-kortin sisäinen säädin muuntaa tulon 7,4 V 5 V: ksi ja ATmega IC ja MPU6050 saavat siitä virran. DC-moottorit voivat toimia jännitteestä 5 V - 12 V. Mutta yhdistämme 7,4 V: n positiivisen johdon akusta 12 V: n tuloliittimeen moottorin ohjainmoduulissa. Tämä saa moottorit toimimaan 7,4 V: n jännitteellä. Seuraavassa taulukossa on lueteltu, kuinka MPU6050- ja L298N-moottoriohjainmoduulit on kytketty Arduinoon.
Komponenttineula |
Arduino Pin |
MPU6050 |
|
Vcc |
+ 5 V |
Maa |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
KOHDASSA 1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 on yhteydessä Arduinoon I2C-liitännän kautta, joten käytämme Arduinon SPI-nastoja A4 ja A5. DC-moottorit on kytketty PWM-nastoihin D6, D9 D10 ja D11. Meidän on liitettävä ne PWM-nastoihin, koska ohjaamme tasavirtamoottorin nopeutta vaihtelemalla PWM-signaalien työjaksoa. Jos et tunne näitä kahta komponenttia, on suositeltavaa lukea MPU6050 Interfacing- ja L298N Motor -ohjaimen oppaat.
Itsetasapainottava robottikoodi
Nyt meidän on ohjelmoitava Arduino UNO -kortti tasapainottamaan robotti. Täällä tapahtuu kaikki taika; sen takana oleva käsite on yksinkertainen. Meidän on tarkistettava, onko botti nojautunut eteenpäin tai taaksepäin MPU6050: n avulla ja sitten, jos se on nojautunut eteenpäin, meidän on pyöritettävä pyöriä eteenpäin ja jos se on kalteva taaksepäin, meidän on pyöritettävä pyöriä vastakkaiseen suuntaan.
Samaan aikaan meidän on myös kontrolloitava pyörien pyörimisnopeutta, jos botti on hieman vääristynyt keskiasennosta, pyörät pyörivät hitaasti ja nopeus kasvaa, kun se lähtee kauemmas keskiasennosta. Tämän logiikan saavuttamiseksi käytämme PID-algoritmia, jonka keskipiste on asetuspiste ja desorientaation taso lähtö.
Botin nykyisen sijainnin tuntemiseksi käytämme MPU6050: tä, joka on 6-akselinen kiihtyvyysanturi ja gyroskooppianturi yhdessä. Saadaksesi luotettavan sijaintiarvon anturilta meidän on käytettävä sekä kiihtyvyysmittarin että gyroskoopin arvoa, koska kiihtyvyysanturin arvoilla on meluhaitoja ja gyroskoopin arvot pyrkivät ajautumaan ajan myötä. Joten meidän on yhdistettävä molemmat ja saat robotin kallistuksen ja rullan arvon, josta käytämme vain kallistuksen arvoa.
Kuulostaa vähän pään kelaamiselta oikein? Mutta älä huoli, Arduino-yhteisön ansiosta meillä on helposti saatavilla kirjastoja, jotka voivat suorittaa PID-laskennan ja saada myös haaroituksen arvon MPU6050: stä. Kirjaston ovat kehittäneet br3ttb ja jrowberg. Ennen kuin jatkat, kirjastot muodostavat seuraavan linkin ja lisäävät ne Arduino lib -hakemistoon.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Nyt kun kirjastot on lisätty Arduino IDE -palveluumme. Aloitetaan ohjelmointi itsetasapainottavalle robotillemme. Kuten aina, MPU6050-tasapainotusrobotin täydellinen koodi annetaan tämän sivun lopussa, tässä selitän vain koodin tärkeimmät katkelmat. Aikaisemmin kerrottu koodi on rakennettu MPU6050-esimerkkikoodin päälle. Aiomme vain optimoida koodin tarkoituksellemme ja lisätä PID- ja ohjaustekniikan itsetasapainottavalle robotillemme.
Ensin lisätään kirjastot, joita tarvitaan tämän ohjelman toimimiseen. Ne sisältävät sisäänrakennetun I2C-kirjaston, PID-kirjaston ja MPU6050-kirjaston, jotka juuri lataimme.
#include "I2Cdev.h" #include
Sitten ilmoitetaan muuttujat, joita tarvitaan tietojen saamiseksi MPU6050-anturista. Luemme sekä painovoimavektori- että kvaternioniarvot ja laskemme sitten botin kallistuskulman ja rullan arvon. Float array YPR pitää lopullisen tuloksen.
// MPU-ohjaus / tila vaihtelee bool dmpReady = false; // aseta tosi, jos DMP-init onnistui uint8_t mpuIntStatus; // sisältää MPU: n todellisen keskeytystavan tavun uint8_t devStatus; // palautustila jokaisen laitetoiminnon jälkeen (0 = onnistuminen ,! 0 = virhe) uint16_t packetSize; // odotettu DMP-pakettikoko (oletus on 42 tavua) uint16_t fifoCount; // kaikkien FIFOn nykyisten tavujen määrä uint8_t fifoBuffer; // FIFO-tallennuspuskuri // suunta / liike muuttuu Quaternion q; // kvaternion kontti VectorFloat gravity; // painovoimavektorin kelluva ypr; // haaroitus / piki / rullasäiliö ja painovoimavektori
Seuraavaksi tulee koodin erittäin tärkeä osa, ja tässä vietät pitkään oikean arvojoukon virittämiseen. Jos robotti on rakennettu erittäin hyvällä painopisteellä ja komponentit on järjestetty symmetrisesti (mikä useimmiten ei ole), asetuspisteen arvo on 180. Muutoin liitä botti Arduino-sarjamonitoriin ja kallista sitä kunnes löydät hyvän tasapainotusasennon, lue sarjamonitorissa näkyvä arvo ja tämä on asetuspisteesi arvo. Kp: n, Kd: n ja Ki: n arvo on viritettävä botin mukaan. Kahdella identtisellä robotilla ei ole samoja arvoja Kp, Kd ja Ki, joten siitä ei pääse pakenemaan. Katso tämän sivun lopussa oleva video saadaksesi käsityksen näiden arvojen säätämisestä.
/ ********* Viritä nämä 4 arvoa BOT-laitteellesi ********* / kaksinkertainen asetuspiste = 176; // aseta arvo, kun botti on kohtisuorassa maahan, käyttämällä sarjamonitoria. // Lue projektidokumentaatio osoitteesta circuitdigest.com saadaksesi lisätietoja näiden arvojen asettamisesta kaksinkertaiseksi Kp = 21; // Aseta tämä ensimmäinen kaksinkertainen Kd = 0,8; // Aseta tämä toissijainen kaksinkertainen Ki = 140; // Aseta lopuksi tämä / ****** Arvojen lopetusasetuksen ********* /
Seuraavalla rivillä alustetaan PID-algoritmi välittämällä tulomuuttujat input, output, set point, Kp, Ki ja Kd. Näistä olemme jo asettaneet asetuspisteiden Kp, Ki ja Kd arvot yllä olevaan koodinpätkään. Tulon arvo on MPU6050-anturilta luettu kallistuksen nykyinen arvo ja ulostulon arvo on PID-algoritmin laskema arvo. Joten PID-algoritmi antaa meille lähtöarvon, jota tulisi käyttää tuloarvon korjaamiseen lähelle asetettua pistettä.
PID pid (& input, & output, & ohjearvo, Kp, Ki, Kd, DIRECT);
Void-asetustoiminnon sisällä alustamme MPU6050: n määrittämällä DMP (Digital Motion Processor). Tämä auttaa meitä yhdistämään kiihtyvyysmittarin ja gyroskooppidatan sekä antamaan luotettavan arvon kallistuksen, pituuden ja rullan. Emme mene tähän syvälle, koska se on paljon aiheen ulkopuolella. Joka tapauksessa yksi koodisegmentti, joka sinun on etsittävä asetustoiminnosta, on gyro-siirtymäarvot. Jokaisella MPU6050-anturilla on omat siirtymäarvonsa. Voit käyttää tätä Arduino-luonnosta anturin siirtymäarvon laskemiseksi ja päivittää seuraavat rivit vastaavasti ohjelmassa.
// toimittaa omat gyro-offsetisi tähän, skaalattu min herkkyydelle mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Meidän on myös alustettava digitaaliset PWM-nastat, joita käytämme moottoriemme liittämiseen. Meidän tapauksessamme se on D6, D9, D10 ja D11. Joten alustamme nämä nastat, koska lähtönastat tekevät niistä oletusarvoisesti MATALAT.
// Alusta Motor outpu nastat pinMode (6, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); // Sammuta oletusarvoisesti molemmat moottorit analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Sisällä tärkein lenkki toiminto voimme tarkistaa, jos tietoja MPU6050 on valmis luettavaksi. Jos kyllä, niin käytämme sitä PID-arvon laskemiseen ja sitten PID: n tulo- ja lähtöarvon näyttämiseen sarjavalvonnassa tarkistaaksemme, kuinka PID reagoi. Sitten tuotoksen arvon perusteella päätämme, onko botin siirryttävä eteenpäin vai taaksepäin vai pysyttävä paikallaan.
Koska oletamme, että MPU6050 palauttaa 180, kun botti on pystyssä. Saamme korjausarvot positiivisiksi, kun botti putoaa eteenpäin, ja saamme arvot negatiivisiksi, jos botti putoaa taaksepäin. Joten tarkistamme tämän ehdon ja kutsumme asianmukaiset toiminnot botin siirtämiseksi eteenpäin tai taaksepäin.
while (! mpuInterrupt && fifoCount <packetSize) { // ei mpu-tietoja - PID-laskelmien suorittaminen ja lähtö moottoreille pid.Compute (); // Tulosta tulon ja lähdön arvo sarjavalvontaan tarkistaaksesi sen toiminnan. Sarja.tulos (tulo); Sarjaprintti ("=>"); Sarja.println (lähtö); if (syöttö> 150 && tulo <200) {// Jos botti putoaa if (lähtö> 0) // putoaminen eteenpäin eteenpäin (); // Kierrä pyöriä eteenpäin, jos (lähtö <0) // putoaminen taaksepäin taaksepäin (); // Kierrä pyöriä taaksepäin } muu // Jos Bot ei putoa Pysäytä (); // Pidä pyöriä paikallaan }
PID lähtömuuttujaa myös päättää, kuinka nopeasti moottorin täytyy pyörittää. Jos botti on juuri putoamassa, teemme pienen korjauksen pyörittämällä pyörää hitaasti. Jos nämä pienet korjaukset toimivat ja silti jos botti putoaa alaspäin, nostamme moottorin nopeutta. PI-algoritmi päättää, kuinka nopeasti pyörät pyörivät. Huomaa, että Käänteinen-funktiolle olemme kertoneet lähdön arvon -1: llä, jotta voimme muuntaa negatiivisen arvon positiiviseksi.
void Forward () // Koodi pyörän pyörittämiseksi eteenpäin { analogWrite (6, lähtö); analoginen kirjoittaminen (9,0); analogWrite (10, lähtö); analogWrite (11,0); Sarjaprintti ("F"); // virheenkorjaustiedot } void Reverse () // Käännä pyörää taaksepäin { analogWrite (6,0); analoginen kirjoitus (9, lähtö * -1); analogWrite (10,0); analoginen kirjoitus (11, lähtö * -1); Sarjaprintti ("R"); } void Stop () // Molempien pyörien pysäyttämisen koodi { analogWrite (6,0); analoginen kirjoittaminen (9,0); analogWrite (10,0); analogWrite (11,0); Sarjaprintti ("S"); }
Arduino-itsetasapainorobotin toiminta
Kun olet valmis laitteistoon, voit ladata koodin Arduino-kortillesi. Varmista, että liitännät ovat kunnossa, koska käytämme litiumioniakkua. Tarkista siis oikosulku ja varmista, että päätelaitteet eivät ole yhteydessä toisiinsa, vaikka botti kokisi pieniä iskuja. Käynnistä moduuli ja avaa sarjamonitori, jos Arduino pystyy kommunikoimaan MPU6050: n kanssa onnistuneesti ja jos kaikki toimii odotetusti, sinun pitäisi nähdä seuraava näyttö.
Täällä näemme PID-algoritmin tulo- ja lähtöarvot muodossa input => output . Jos botti on täysin tasapainossa, tuotoksen arvo on 0. Tuloarvo on MPU6050-anturin nykyinen arvo. Aakkoset "F" edustavat sitä, että botti liikkuu eteenpäin ja "R" tarkoittaa, että botti on taaksepäin.
PID: n alkuvaiheessa suosittelen, että jätät Arduino-kaapelisi liitettyyn bottiin, jotta voit helposti seurata syötteen ja lähdön arvoja, ja myös ohjelmasi on helppo korjata ja ladata Kp-, Ki- ja Kd-arvoille. Alla oleva video osoittaa botin täydellisen toiminnan ja myös kuinka korjata PID-arvosi.
Toivottavasti tämä auttaa rakentamaan oman itsetasapainottavan robotin, jos sinulla on ongelmia saada se toimimaan, jätä sitten kysymyksesi alla olevaan kommenttiosioon tai käytä foorumeita teknisempiin kysymyksiin. Jos haluat enemmän hauskaa, voit myös käyttää samaa logiikkaa rakentaaksesi pallotasapainorobotin.