- Velge deler for selvbalanserende robot
- 3D-utskrift og montering av vår selvbalanserende robot
- Kretsdiagram
- Selvbalanserende robotkode
- Arbeid av Arduino Self Balancing Robot
Etter å ha blitt inspirert av RYNO-motorer og andre selvbalanserende scootere fra Segway, ønsket jeg alltid å bygge noe min egen Arduino Segway Robot. Tenker en stund bestemte jeg meg for å bygge en selvbalanserende robot ved hjelp av Arduino. På denne måten kunne jeg forstå det underliggende konseptet bak alle disse scooterne og også lære hvordan PID-algoritmen fungerer.
Når jeg begynte å bygge, skjønte jeg at denne boten er litt av en utfordring å bygge. Det er så mange alternativer å velge mellom, og dermed begynner forvirringene riktig fra valg av motorer og forblir til innstilling av PID-verdier. Og det er så mange ting å ta i betraktning som type batteri, posisjon av batteri, hjulgrep, type motorfører, vedlikehold av CoG (tyngdepunkt) og mye mer.
Men la meg bryte det til deg. Når du først har bygget det, vil du være enig i at det ikke er så vanskelig som det høres ut å være. Så la oss innse det, i denne opplæringen vil jeg dokumentere min erfaring med å bygge den selvbalanserende roboten. Du kan være en absolutt nybegynner som nettopp er i gang, eller kanskje har landet her etter en lang frustrasjon over å ikke få bot til å fungere. Dette stedet har som mål å være ditt endelige reisemål. Så la oss komme i gang……
Velge deler for selvbalanserende robot
Før jeg forteller deg alle alternativene for å bygge boten, la meg liste opp elementene jeg har brukt i dette selvbalanserende robotprosjektet
- Arduino UNO
- Gearede DC-motorer (gulfarget) - 2Nr
- L298N Motordrivermodul
- MPU6050
- Et par hjul
- 7.4V Li-ion-batteri
- Koble ledninger
- 3D-trykt kropp
Du kan blande og velge en av de ovennevnte komponentene basert på tilgjengeligheten for å lage ditt eget selvbalanserende robotsett, bare sørg for at komponentene oppfyller følgende kriterier.
Kontroller: Kontrolleren som jeg har brukt her er Arduino UNO, hvorfor fordi den rett og slett er enkel å bruke. Du kan også bruke en Arduino Nano eller Arduino mini, men jeg vil anbefale deg å holde deg til UNO siden vi kan programmere den direkte uten ekstern maskinvare.
Motorer: Det beste motorvalget du kan bruke til en selvbalanserende robot, vil uten tvil være Stepper motor. Men for å gjøre ting enkelt har jeg brukt en DC-girmotor. Ja, det er ikke obligatorisk å ha en stepper; bot fungerer også bra med disse billige, gult fargede DC-girmotorer.
Motordriver : Hvis du har valgt DC-girmotorer som min, kan du enten bruke L298N-drivermodulen som meg, eller til og med en L293D skal fungere fint. Lær mer om å kontrollere DC-motor ved hjelp av L293D og Arduino.
Hjul: Ikke undervurder disse gutta; Jeg hadde vanskelig for å finne ut at problemet var med hjulene mine. Så sørg for at hjulene dine har godt grep over gulvet du bruker. Følg nøye med, grepet ditt skal aldri tillate at hjulene dine glir på gulvet.
Akselerometer og gyroskop: Det beste valget av akselerometer og gyroskop for din bot vil være MPU6050. Så ikke prøv å bygge en med et normalt akselerometer som ADXL345 eller noe sånt, det vil bare ikke fungere. Du vil vite hvorfor på slutten av denne artikkelen. Du kan også sjekke vår dedikerte artikkel om bruk av MPU6050 med Arduino.
Batteri: Vi trenger et batteri som er så lett som mulig, og driftsspenningen skal være mer enn 5 V, slik at vi kan drive Arduino direkte uten en boost-modul. Så det ideelle valget vil være et 7,4V Li-polymer batteri. Her, siden jeg hadde et 7.4V Li-ion-batteri som er lett tilgjengelig, har jeg brukt det. Men husk at Li-po er fordelaktig enn Li-ion.
Chassis: Et annet sted hvor du ikke skal gå på akkord, er med robotchassiset ditt. Du kan bruke papp, tre, plast alt du er god med. Men bare sørg for at chassiset er solid og ikke skal vri seg når boten prøver å balansere. Jeg har designet med eget chassis på Solidworks som viser fra de andre robotene og 3D-skrevet det. Hvis du har en skriver, kan du også skrive ut motivet. Designfilene blir lagt ved i den kommende overskriften.
3D-utskrift og montering av vår selvbalanserende robot
Hvis du har bestemt deg for å 3D-skrive ut det samme chassiset som jeg bruker for å bygge min bot, kan STL-filene lastes ned fra thingiverse. Jeg har også lagt til designfilene sammen med den, slik at du også kan endre den i henhold til dine personalpreferanser.
Delene har ingen overhengende strukturer, slik at du enkelt kan skrive dem ut uten støtte, og en fylling på 25% vil fungere bra. Designene er ganske enkle, og enhver grunnleggende skriver skal kunne håndtere den med letthet. Jeg brukte Cura-programvaren til å skjære modellen og skrevet ut med Tevo Tarantula, innstillingen er vist nedenfor.
Du må skrive ut karosseridelen samt fire motormonteringsdeler. Montering er ganske rett frem; bruk 3 mm muttere og bolter for å feste motoren og platene på plass. Etter montering skal den se ut slik som vist på bildet nedenfor.
Den faktiske utformingen ble planlagt med L298N-stasjonsmodulen i bunnstativet Arduino og batteriet på toppen av den som vist ovenfor. Hvis du følger den samme ordren, kan du skru skruen direkte gjennom hullene som følger med, og bruke en ledningsmerke til Li-po-batteriet. Denne ordningen skal også fungere, bortsett fra de superglatte hjulene som jeg måtte bytte senere.
I min bot har jeg byttet posisjonen til batteri og Arduino UNO-kort for enkel programmering, og måtte også introdusere et perf-kort for å fullføre tilkoblingene. Så boten min så ikke ut som jeg planla i første fase. Etter å ha fullført testingen av ledningsprogrammeringen og alt, ser min tohjulsrobot endelig slik ut
Kretsdiagram
Å lage tilkoblinger for denne Arduino-baserte selvbalanserende roboten er ganske enkel. Dette er en selvbalanserende robot som bruker Arduino og MPU6050, så vi skal grensesnitt MPU6050 med Arduino og koble til motorene gjennom motordrivermodulen. Hele oppsettet drives av 7.4V li-ion-batteri. Kretsskjemaet for det samme er vist nedenfor.
Arduino- og L298N-motordrivermodulen drives direkte av henholdsvis Vin-pin og 12V-terminal. Innebygd regulator på Arduino-kortet vil konvertere inngangen 7.4V til 5V, og ATmega IC og MPU6050 vil bli drevet av den. DC-motorene kan gå fra spenning 5V til 12V. Men vi skal koble til 7,4 V positiv ledning fra batteri til 12 V inngangsterminal til motordrivermodulen. Dette vil få motorene til å operere med 7,4 V. Tabellen nedenfor viser hvordan motor drivermodulen MPU6050 og L298N er koblet til Arduino.
Komponentstift |
Arduino Pin |
MPU6050 |
|
Vcc |
+ 5V |
Bakke |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
IN1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 kommuniserer med Arduino gjennom I2C-grensesnitt, så vi bruker SPI-pinnene A4 og A5 på Arduino. DC-motorene er koblet til henholdsvis PWM-pinner D6, D9 D10 og D11. Vi må koble dem til PWM-pinner fordi vi skal kontrollere hastigheten på DC-motoren ved å variere PWM-signalens driftssyklus. Hvis du ikke er kjent med disse to komponentene, anbefales det å lese gjennom MPU6050 Interfacing og L298N Motor driver tutorial.
Selvbalanserende robotkode
Nå må vi programmere Arduino UNO-styret for å balansere roboten. Det er her all magien skjer; konseptet bak er enkelt. Vi må sjekke om bunnen lener seg foran eller bakover ved hjelp av MPU6050, og hvis den lener seg foran, må vi rotere hjulene fremover, og hvis den lener seg bakover, må vi rotere hjulene i motsatt retning.
Samtidig må vi også kontrollere hastigheten hjulene roterer med. Hvis boten er litt desorientert fra midtposisjon, roterer hjulene sakte og hastigheten øker når den kommer mer bort fra midtposisjonen. For å oppnå denne logikken bruker vi PID-algoritmen, som har midtposisjonen som settpunkt og desorienteringsnivået som utgang.
For å kjenne den nåværende posisjonen til bot bruker vi MPU6050, som er et 6-akset akselerometer og gyroskop sensor kombinert. For å få en pålitelig posisjonsverdi fra sensoren, må vi bruke verdien av både akselerometer og gyroskop, fordi verdiene fra akselerometer har støyproblemer og verdiene fra gyroskop har en tendens til å glide med tiden. Så vi må kombinere begge deler og få verdien av yaw pitch and roll av roboten vår, som vi kun vil bruke yaw-verdien av.
Høres litt av hodet ut? Men bekymre deg ikke, takket være Arduino-samfunnet har vi lett tilgjengelige biblioteker som kan utføre PID-beregningen og også få verdien av yaw fra MPU6050. Biblioteket er utviklet av henholdsvis br3ttb og jrowberg. Før du fortsetter, last ned bibliotekene deres ved å danne følgende lenke og legge dem til i Arduino lib-katalogen.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Nå som vi har lagt til bibliotekene i Arduino IDE. La oss begynne å programmere for vår selvbalanserende robot. Som alltid er den komplette koden for MPU6050 balanseringsrobot gitt på slutten av denne siden, her forklarer jeg bare de viktigste kodene. En tidligere fortalt koden er bygget på toppen av MPU6050 eksempelkoden, vi skal bare optimalisere koden for vårt formål og legge til PID og kontrollteknikk for vår selvbalanserende robot.
Først inkluderer vi bibliotekene som kreves for at dette programmet skal fungere. De inkluderer det innebygde I2C-biblioteket, PID-biblioteket og MPU6050-biblioteket som vi nettopp har lastet ned.
#include "I2Cdev.h" #include
Deretter erklærer vi variablene som kreves for å hente dataene fra MPU6050-sensoren. Vi leser både tyngdekraftsvektoren og kvaternionsverdiene og beregner deretter yaw pitch and roll-verdien til bot. Den flottør matrisen YPR vil holde det endelige resultatet.
// MPU-kontroll / status vars bool dmpReady = false; // sett sant hvis DMP init var vellykket uint8_t mpuIntStatus; // holder faktisk avbrytingsstatusbyte fra MPU uint8_t devStatus; // returner status etter hver enhetsoperasjon (0 = suksess ,! 0 = feil) uint16_t packetSize; // forventet DMP-pakkestørrelse (standard er 42 byte) uint16_t fifoCount; // antall alle byte som er i FIFO uint8_t fifoBuffer; // FIFO lagringsbuffer // orientering / bevegelse vars Quaternion q; // kvartærbeholder VectorFloat tyngdekraft; // tyngdekraftsvektor flyter ypr; // yaw / pitch / roll container og tyngdekraftsvektor
Deretter kommer det veldig viktige segmentet av koden, og det er her du vil bruke lang tid på å stille inn riktig verdisett. Hvis roboten din er bygget med et veldig godt tyngdepunkt og komponentene er ordnet symmetrisk (som i de fleste tilfeller ikke er det), vil verdien til settpunktet være 180. Ellers kobler du bot til Arduino seriell skjerm og vipper den til du finner en god balanseringsposisjon, les verdien som vises på seriell skjerm, og dette er din innstillingsverdi. Verdien av Kp, Kd og Ki må innstilles i henhold til bot. Ingen to identiske roboter vil ha de samme verdiene til Kp, Kd og Ki, så det er ikke mulig å unnslippe den. Se videoen på slutten av denne siden for å få en ide om hvordan du justerer disse verdiene.
/ ********* Still inn disse 4 verdiene for din BOT ********* / dobbelt settpunkt = 176; // angi verdien når bot er vinkelrett på bakken ved hjelp av seriell skjerm. // Les prosjektdokumentasjonen på circuitdigest.com for å lære hvordan du setter disse verdiene doble Kp = 21; // Sett denne første doble Kd = 0,8; // Sett denne sekundet doble Ki = 140; // Endelig sett dette / ****** Innstilling av sluttverdier ********* /
I neste linje initialiserer vi PID-algoritmen ved å sende inngangsvariablene input, output, set point, Kp, Ki og Kd. Ut av disse har vi allerede satt verdiene for settpunkt Kp, Ki og Kd i kodebiten ovenfor. Verdien av inngangen vil være den nåværende verdien av gjeng som blir lest fra MPU6050-sensoren, og verdien av utgangen vil være verdien som beregnes av PID-algoritmen. Så i utgangspunktet vil PID-algoritmen gi oss en utgangsverdi som skal brukes til å korrigere inngangsverdien til å være den nær innstillingspunktet.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, DIRECT);
Inne i tomrommet setup -funksjonen vi initialisere MPU6050 ved å konfigurere DMP (Digital Motion Processor). Dette vil hjelpe oss med å kombinere akselerometerdataene med gyroskopdata og gi en pålitelig verdi av Yaw, Pitch and Roll. Vi vil ikke gå mye dypt inn i dette siden det vil være langt utenfor temaet. Uansett er et kodesegment du må slå opp i oppsettfunksjonen gyroforskyvningsverdiene. Hver MPU6050-sensor har sine egne forskyvningsverdier. Du kan bruke denne Arduino-skissen til å beregne forskyvningsverdien til din sensor og oppdatere følgende linjer tilsvarende i programmet ditt.
// leverer dine egne gyroforskyvninger her, skalert for min følsomhet mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Vi må også initialisere de digitale PWM-pinnene vi bruker for å koble motorene våre til. I vårt tilfelle er det D6, D9, D10 og D11. Så vi initialiserer disse pinnene som utgangspinner som gjør dem lave som standard.
// Initialise den Motor outpu pinnene pinMode (6, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); // Slå av begge motorene analogWrite (6, LOW) som standard; analogWrite (9, LAV); analogWrite (10, LAV); analogWrite (11, LAV);
Inne i hovedsløyfefunksjonen vi sjekke om data fra MPU6050 er klar til å bli lest . Hvis ja, bruker vi den til å beregne PID-verdien og deretter vise inngangs- og utgangsverdien til PID på seriell skjerm bare for å sjekke hvordan PID reagerer. Så basert på verdien av produksjonen bestemmer vi oss om boten må bevege seg fremover eller bakover eller stå stille.
Siden vi antar at MPU6050 vil returnere 180 når bot er stående. Vi vil få korreksjonsverdier positive når boten faller mot fronten, og vi vil få verdier i negative hvis boten faller mot ryggen. Så vi ser etter denne tilstanden og kaller de aktuelle funksjonene for å flytte boten fremover eller tilbake.
while (! mpuInterrupt && fifoCount <packetSize) { // ingen mpu-data - utfører PID-beregninger og utgang til motorer pid.Compute (); // Skriv ut verdien av Input and Output på seriell skjerm for å sjekke hvordan den fungerer. Serial.print (input); Serial.print ("=>"); Serial.println (utgang); if (input> 150 && input <200) {// If the Bot is fall if (output> 0) // Falling front front Forward (); // Drei hjulene fremover hvis (output <0) // Falling back back Reverse (); // Drei hjulene bakover } ellers // Hvis Bot ikke faller Stopp (); // Hold hjulene stille }
Den PID utgang variabel bestemmer også hvor fort motoren må roteres. Hvis boten er i ferd med å falle, gjør vi mindre korreksjon ved å rotere hjulet sakte. Hvis disse mindre korreksjonene ikke fungerer, og fortsatt hvis boten faller ned, øker vi motorens hastighet. Verdien av hvor raskt hjulene roterer vil bli bestemt av PI-algoritmen. Merk at for reversfunksjonen har vi multiplisert verdien av utdata med -1 slik at vi kan konvertere den negative verdien til positiv.
void Forward () // Kode for å rotere hjulet fremover { analogWrite (6, output); analogWrite (9,0); analogWrite (10, utgang); analogWrite (11,0); Serial.print ("F"); // Feilsøkingsinformasjon } ugyldig Reverse () // Kode for å rotere hjulet bakover { analogWrite (6,0); analogWrite (9, utgang * -1); analogWrite (10,0); analogWrite (11, utgang * -1); Serial.print ("R"); } ugyldig Stop () // Kode for å stoppe begge hjulene { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Arbeid av Arduino Self Balancing Robot
Når du er klar med maskinvaren, kan du laste opp koden til Arduino-kortet. Forsikre deg om at tilkoblingene er riktige, siden vi bruker et Li-ion-batteri, er ekstrem forsiktighet nødvendig. Så sjekk om det er kortslutning, og sørg for at terminalene ikke kommer i kontakt selv om boten din opplever noen små påvirkninger. Slå på modulen og åpne seriell skjerm, hvis Arduino kunne kommunisere med MPU6050, og hvis alt fungerer som forventet, bør du se følgende skjermbilde.
Her ser vi inngangs- og utgangsverdiene til PID-algoritmen i formatet input => output . Hvis bot er perfekt balansert, vil verdien av utdata være 0. Inngangsverdien er den nåværende verdien fra MPU6050-sensoren. Alfabetet “F” representerer at boten beveger seg fremover, og “R” representerer at boten er i omvendt retning.
I de innledende stadiene av PID anbefaler jeg at du lar Arduino-kabelen være koblet til boten, slik at du enkelt kan overvåke verdiene for inngang og utgang, og det vil også være enkelt å korrigere og laste opp programmet ditt for Kp-, Ki- og Kd-verdier. Den videoen nedenfor viser den fullstendige arbeids av bot og viser også hvordan du kan korrigere PID verdier.
Håper dette hjelper deg med å bygge din egen selvbalanserende robot hvis du har noen problemer med å få den til å fungere, så la spørsmålene dine være i kommentarseksjonen nedenfor, eller bruk forumene til mer tekniske spørsmål. Hvis du vil ha mer moro, kan du også bruke den samme logikken til å bygge en ballbalanseringsrobot.