- Selecció de les peces per al robot d’equilibri automàtic
- Impressió 3D i muntatge del nostre robot d’equilibri automàtic
- Esquema de connexions
- Codi de robot d'equilibri automàtic
- Funcionament del robot Arduino Self Balancing
Després d’haver-me inspirat en els motors RYNO i altres scooters d’equilibri automàtic de Segway, sempre he volgut construir alguna cosa el meu propi robot Arduino Segway. Pensant durant un temps, vaig decidir construir un robot d’equilibri personal mitjançant Arduino. D'aquesta manera, seria capaç de comprendre el concepte subjacent darrere de tots aquests scooters i també aprendre com funciona l' algorisme PID.
Un cop vaig començar a construir, em vaig adonar que aquest robot és un repte de construir. Hi ha tantes opcions per triar i, per tant, les confusions comencen correctament en seleccionar els motors i es mantenen fins a sintonitzar els valors PID. I hi ha tantes coses a tenir en compte com el tipus de bateria, la posició de la bateria, l’adherència de la roda, el tipus de conductor del motor, el manteniment del CoG (Centre de gravetat) i molt més.
Però permeteu-me que us ho expliqui, un cop el construireu, acceptareu que no és tan dur com sembla. De manera que siguem sincers, en aquest tutorial documentaré la meva experiència en la construcció del robot d’equilibri personal. És possible que sigueu un principiant absolut que tot just comença o que pugui aterrar aquí després d’una llarga frustració per no fer funcionar el vostre bot. Aquest lloc vol ser el vostre destí final. Comencem doncs……
Selecció de les peces per al robot d’equilibri automàtic
Abans de dir-vos totes les opcions per construir el bot, deixeu-me enumerar els elements que he utilitzat en aquest projecte de robot d'equilibri automàtic
- Arduino UNO
- Motors de corrent continu engranats (de color groc) - 2Nos
- Mòdul de controlador de motor L298N
- MPU6050
- Un parell de rodes
- Bateria de ions de Li de 7,4 V
- Connexió de cables
- Cos imprès en 3D
Podeu barrejar i triar qualsevol dels components anteriors en funció de la disponibilitat per fabricar el vostre propi kit de robot d’equilibri automàtic, només cal que us assegureu que els components s’ajusten als criteris següents.
Controlador: el controlador que he utilitzat aquí és Arduino UNO, per què és senzill d’utilitzar. També podeu utilitzar un Arduino Nano o un Arduino mini, però us recomanaria que us quedeu amb UNO, ja que el podem programar directament sense maquinari extern.
Motors: la millor opció de motor que podeu utilitzar per a un robot d’equilibri automàtic, sens dubte, serà el motor pas a pas. Però, per simplificar-ho, he utilitzat un motor d'engranatges de corrent continu. Sí, no és obligatori tenir un pas a pas; el bot funciona bé amb aquests motors d’engranatges de CC de color groc, disponibles normalment i barats.
Controlador de motor: si heu seleccionat motors d'engranatges de CC com el meu, podeu utilitzar el mòdul de controlador L298N com jo, o fins i tot un L293D hauria de funcionar bé. Obteniu més informació sobre com controlar el motor de corrent continu mitjançant L293D i Arduino.
Rodes: no estimeu aquests nois; Em va costar molt esbrinar que el problema era amb les meves rodes. Assegureu-vos que les rodes tinguin una bona adherència sobre el terra que utilitzeu. Vigileu amb atenció, l’adherència mai no hauria de permetre que les rodes puguin patinar a terra.
Acceleròmetre i giroscopi: la millor opció d'acceleròmetre i giroscopi per al vostre bot serà el MPU6050. Per tant, no intenteu construir-ne un amb un acceleròmetre normal com ADXL345 o alguna cosa semblant, simplement no funcionarà. Sabreu per què al final d’aquest article. També podeu consultar el nostre article dedicat sobre l’ús de MPU6050 amb Arduino.
Bateria: necessitem una bateria el més lleugera possible i el voltatge de funcionament hauria de ser superior a 5V per poder alimentar el nostre Arduino directament sense un mòdul d’augment. Per tant, l’elecció ideal serà una bateria de polímer Li de 7,4 V. Aquí, ja que tenia una bateria de ions de Li de 7.4V fàcilment disponible, l'he utilitzat. Però recordeu que un Li-po és avantatjós que el Li-ion.
Xassís: un altre lloc on no us heu de comprometre és amb el xassís dels vostres robots. Podeu utilitzar cartró, fusta, plàstic amb qualsevol cosa que us convingui. Però assegureu-vos que el xassís és robust i que no s’ha de moure quan el robot intenta equilibrar-se. He dissenyat un xassís propi a Solidworks inferint dels altres robots i l'he imprès en 3D. Si teniu una impressora, també podeu imprimir el disseny; els fitxers de disseny s'adjuntaran a la propera capçalera.
Impressió 3D i muntatge del nostre robot d’equilibri automàtic
Si heu decidit imprimir en 3D el mateix xassís que estic fent servir per construir el meu bot, els fitxers STL es poden descarregar des de thingiverse. També he afegit els fitxers de disseny perquè pugueu modificar-lo segons les vostres preferències de personal.
Les peces no tenen cap estructura sobresortint, de manera que podeu imprimir-les fàcilment sense cap suport i un 25% d’ompliment funcionarà bé. Els dissenys són força senzills i qualsevol impressora bàsica hauria de ser capaç de manejar-lo amb facilitat. He utilitzat el programari Cura per tallar el model i he imprès amb la meva Tarantula Tevo, la configuració es mostra a continuació.

Hauríeu d'imprimir la part del cos, així com quatre parts de muntatge del motor. El muntatge és força senzill; utilitzeu cargols i femelles de 3 mm per fixar el motor i les taules al seu lloc. Després del muntatge, hauria de tenir un aspecte semblant a aquest que es mostra a la imatge següent.

El disseny real es va planejar amb el mòdul de la unitat L298N al bastidor inferior de l’Arduino i la bateria a la part superior, tal com es mostra més amunt. Si seguiu el mateix ordre, podeu cargolar directament la placa mitjançant els forats proporcionats i utilitzar una etiqueta de filferro per a la bateria Li-po. Aquesta disposició també hauria de funcionar, a excepció de les rodes súper planes que vaig haver de canviar més endavant.
Al meu bot he canviat la posició de la bateria i la placa UNO d'Arduino per facilitar la programació i també he hagut d'introduir una placa perfecta per completar les connexions. Per tant, el meu robot no va semblar com tenia previst en la fase inicial. Després de completar les proves de programació de cablejat i tot, el meu robot de dues rodes finalment té aquest aspecte

Esquema de connexions
Establir les connexions d’aquest robot d’equilibri automàtic basat en Arduino és bastant senzill. Es tracta d’un robot d’equilibri automàtic que utilitza Arduino i MPU6050, de manera que hem de connectar el MPU6050 amb Arduino i connectar els motors mitjançant el mòdul controlador del motor. Tota la configuració està alimentada per la bateria de ions de li de 7,4 V. El diagrama del circuit per al mateix es mostra a continuació.

El mòdul del controlador del motor Arduino i L298N s’alimenta directament a través del pin Vin i del terminal de 12V respectivament. El regulador integrat a la placa Arduino convertirà l’entrada de 7,4 V a 5 V i l’ATmega IC i el MPU6050 seran alimentats per ella. Els motors de corrent continu poden funcionar des de la tensió 5V fins a 12V. Però connectarem el cable positiu de 7,4 V de la bateria al terminal d’entrada de 12 V del mòdul del controlador del motor. Això farà que els motors funcionin amb 7.4V. A la taula següent es mostrarà com es connecta el mòdul de controlador de motor MPU6050 i L298N amb Arduino.
|
Pin de component |
Pin Arduino |
|
MPU6050 |
|
|
Vcc |
+ 5V |
|
Terra |
Gnd |
|
SCL |
A5 |
|
SDA |
A4 |
|
INT |
D2 |
|
L298N |
|
|
IN1 |
D6 |
|
IN2 |
D9 |
|
IN3 |
D10 |
|
IN4 |
D11 |
El MPU6050 es comunica amb Arduino mitjançant la interfície I2C, de manera que fem servir els pins SPI A4 i A5 d’Arduino. Els motors CC estan connectats als pins PWM D6, D9 D10 i D11 respectivament. Els hem de connectar als pins PWM perquè controlarem la velocitat del motor de CC variant el cicle de treball dels senyals PWM. Si no esteu familiaritzats amb aquests dos components, es recomana llegir el tutorial del controlador del motor L298N Interfacing i MPU6050.
Codi de robot d'equilibri automàtic
Ara hem de programar la nostra placa Arduino UNO per equilibrar el robot. Aquí és on passa tota la màgia; el concepte que hi ha al darrere és senzill. Hem de comprovar si el bot està inclinat cap a la part davantera o cap a la part posterior amb la MPU6050 i, després, si està inclinat cap a la part davantera, hem de girar les rodes en direcció endavant i, si està inclinat cap a la part posterior, hem de girar les rodes. en sentit invers.
Al mateix temps , també hem de controlar la velocitat a la qual giren les rodes, si el bot està lleugerament desorientat de la posició central, les rodes giren lentament i la velocitat augmenta a mesura que s’allunya més de la posició central. Per aconseguir aquesta lògica utilitzem l'algorisme PID, que té la posició central com a punt de consigna i el nivell de desorientació com a sortida.
Per conèixer la posició actual del bot fem servir el MPU6050, que és un acceleròmetre de 6 eixos i un sensor de giroscopi combinats. Per obtenir un valor fiable de la posició del sensor, hem d’utilitzar el valor de l’acceleròmetre i del giroscopi, perquè els valors de l’acceleròmetre tenen problemes de soroll i els valors del giroscopi tendeixen a la deriva amb el temps. Per tant, hem de combinar tots dos i obtenir el valor del pas i la rotació del desviament del nostre robot, del qual utilitzarem només el valor del desviament.
Sona una mica de cap, no? Però no us preocupeu, gràcies a la comunitat Arduino, tenim biblioteques fàcilment disponibles que poden realitzar el càlcul PID i també obtenir el valor del desgast del MPU6050. La biblioteca està desenvolupada per br3ttb i jrowberg respectivament. Abans de continuar descarregueu les seves biblioteques, formeu el següent enllaç i afegiu-les al directori Arduino lib.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Ara, ja tenim les biblioteques afegides al nostre IDE Arduino. Comencem a programar el nostre robot d’equilibri automàtic. Com sempre, el codi complet del robot d’equilibri MPU6050 es dóna al final d’aquesta pàgina, aquí només explico els fragments més importants del codi. Es va dir anteriorment que el codi es basa en l'exemple del codi MPU6050, simplement optimitzarem el codi per al nostre propòsit i afegirem la tècnica de control i PID per al nostre robot d'equilibri automàtic.
En primer lloc, incloem les biblioteques necessàries perquè aquest programa funcioni. Inclouen la biblioteca I2C integrada, la biblioteca PID i la biblioteca MPU6050 que acabem de descarregar.
#include "I2Cdev.h" #include
A continuació, declarem les variables necessàries per obtenir les dades del sensor MPU6050. Llegim el vector de gravetat i els valors de quaternió i, a continuació, calculem el valor de pas i rotació del bot. La matriu flotant ypr contindrà el resultat final.
// MPU control / status vars bool dmpReady = false; // defineix true si DMP init va tenir èxit uint8_t mpuIntStatus; // manté el byte d'estat de la interrupció real de la MPU uint8_t devStatus; // torna l'estat després de cada operació del dispositiu (0 = èxit ,! 0 = error) uint16_t packetSize; // mida prevista del paquet DMP (per defecte és de 42 bytes) uint16_t fifoCount; // recompte de tots els bytes actualment a FIFO uint8_t fifoBuffer; // Buffer d’emmagatzematge FIFO // orientació / moviment vars Quaternion q; // contenidor de quaternió gravetat VectorFloat; // gravetat vector flotant ypr; // contenidor de yaw / pitch / roll i vector de gravetat
A continuació ve el segment molt important del codi, i aquí és on passareu molt de temps ajustant el conjunt de valors adequat. Si el robot està construït amb un centre de gravetat molt bo i els components estan disposats simètricament (cosa que en la majoria dels casos no ho és), el valor del vostre punt de consigna serà de 180. Altrament, connecteu el bot al monitor sèrie Arduino i inclineu-lo fins que trobareu una bona posició d’equilibri, llegiu el valor que es mostra al monitor sèrie i aquest és el vostre valor de consigna. El valor de Kp, Kd i Ki s’ha d’afinar segons el vostre bot. No hi ha dos robots idèntics que tinguin els mateixos valors de Kp, Kd i Ki, de manera que no se’n pot escapar. Mireu el vídeo al final d'aquesta pàgina per obtenir una idea de com ajustar aquests valors.
/ ********* Sintonitzeu aquests 4 valors per al vostre BOT ********* / consigna doble = 176; // definiu el valor quan el bot sigui perpendicular a terra mitjançant el monitor sèrie. // Llegiu la documentació del projecte a circuitdigest.com per aprendre a establir aquests valors dobles Kp = 21; // Estableix aquest primer doble Kd = 0,8; // Estableix aquest doble secundari Ki = 140; // Finalment, configureu aquesta opció / ****** Finalització dels valors ********* /
A la següent línia inicialitzem l'algorisme PID passant les variables d'entrada d'entrada, sortida, set point, Kp, Ki i Kd. D’aquests, ja hem definit els valors del punt de configuració Kp, Ki i Kd al fragment de codi anterior. El valor d’entrada serà el valor actual de guiñada que es llegeix des del sensor MPU6050 i el valor de sortida serà el valor que es calcula amb l’algorisme PID. Així doncs, bàsicament l'algorisme PID ens donarà un valor de sortida que hauria d'utilitzar-se per corregir el valor d'entrada perquè sigui a prop del punt establert.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, DIRECT);
Dins de la funció de configuració del buit , inicialitzem el MPU6050 configurant el DMP (Digital Motion Processor). Això ens ajudarà a combinar les dades de l’acceleròmetre amb les dades del giroscopi i proporcionarà un valor fiable de Yaw, Pitch and Roll. No aprofundirem molt en això, ja que estarà molt més enllà del tema. De tota manera, un segment de codi que heu de buscar a la funció de configuració són els valors de desplaçament giroscòpic. Cada sensor MPU6050 té els seus propis valors de desplaçaments. Podeu utilitzar aquest esbós Arduino per calcular el valor de desplaçament del sensor i actualitzar les línies següents en conseqüència al vostre programa.
// proporcioneu aquí les vostres pròpies compensacions giroscòpiques, ajustades per a una sensibilitat mínima mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
També hem d’ inicialitzar els pins digitals PWM que utilitzem per connectar els nostres motors. En el nostre cas es tracta de D6, D9, D10 i D11. Per tant, inicialitzem aquests pins perquè els pins de sortida els fan BAIXOS per defecte.
// Inicialitzar el Motor Outpu passadors pinMode (6, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); // Per defecte, apagueu els motors analogWrite (6, LOW); analogWrite (9, BAIX); analogWrite (10, BAIX); analogWrite (11, BAIX);
Dins de la funció de bucle principal comprovem si les dades del MPU6050 estan preparades per llegir . Si és així, l’utilitzem per calcular el valor PID i, a continuació, mostrem el valor d’entrada i sortida del PID al monitor sèrie només per comprovar com respon el PID. A continuació, en funció del valor de la sortida, decidim si el bot ha de moure's cap endavant o cap enrere o quedar-se quiet.
Ja que suposem que el MPU6050 tornarà 180 quan el bot estigui en posició vertical. Obtenirem valors de correcció positius quan el bot caigui cap a davant i obtindrem valors negatius si el bot cau cap enrere. Per tant, comprovem aquesta condició i trucem a les funcions adequades per moure el bot cap endavant o cap enrere.
while (! mpuInterrupt && fifoCount <packetSize) { // no hi ha dades mpu: realització de càlculs PID i sortida als motors pid.Compute (); // Imprimiu el valor d'entrada i sortida al monitor sèrie per comprovar el seu funcionament. Serial.print (entrada); Serial.print ("=>"); Serial.println (sortida); if (entrada> 150 && entrada <200) {// Si el bot està caient if (sortida> 0) // Caiguda cap a davant Endavant (); // Gireu les rodes cap endavant si (sortida <0) // Caient cap a enrere Reverse (); // Gireu les rodes cap enrere } else // Si el bot no cau Stop (); // Mantenir les rodes quietes }
La variable de sortida PID també decideix la velocitat amb què s’ha de girar el motor. Si el bot està a punt de caure, fem una correcció menor girant la roda lentament. Si aquestes petites forces de correcció funcionen i encara si el bot cau, augmentem la velocitat del motor. El valor de la velocitat de rotació de les rodes el decidirà l’algorisme PI. Tingueu en compte que per a la funció Invertir hem multiplicat el valor de la sortida per -1 de manera que podem convertir el valor negatiu en positiu.
void Endavant () // Codi per girar la roda cap endavant { analogWrite (6, sortida); analogWrite (9,0); analogWrite (10, sortida); analogWrite (11,0); Serial.print ("F"); // Informació de depuració } void Reverse () // Codi per girar la roda cap enrere { analogWrite (6,0); analogWrite (9, sortida * -1); analogWrite (10,0); analogWrite (11, sortida * -1); Serial.print ("R"); } void Stop () // Codi per aturar les dues rodes { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Funcionament del robot Arduino Self Balancing

Un cop estigueu preparat amb el maquinari, podeu penjar el codi a la vostra placa Arduino. Assegureu-vos que les connexions siguin adequades, ja que estem fent servir una bateria de ions de Li i cal extremar la precaució. Per tant, comproveu si hi ha curtcircuits i assegureu-vos que els terminals no entraran en contacte fins i tot si el vostre robot experimenta alguns impactes petits. Enceneu el mòdul i obriu el vostre monitor sèrie, si el vostre Arduino podria comunicar-se amb MPU6050 amb èxit i si tot funciona com s’esperava, hauríeu de veure la pantalla següent.

Aquí veiem els valors d'entrada i sortida de l'algorisme PID en el format input => output . Si el bot està perfectament equilibrat, el valor de sortida serà 0. El valor d’entrada és el valor actual del sensor MPU6050. L'alfabet "F" representa que el robot es mou cap endavant i "R" representa que el bot al revés.
Durant les fases inicials de PID, recomano deixar el cable Arduino connectat al bot perquè pugueu controlar fàcilment els valors d’entrada i sortida i, a més, serà fàcil corregir i carregar el vostre programa per als valors de Kp, Ki i Kd. El vídeo següent mostra el funcionament complet del bot i també mostra com es corregeixen els valors PID.
Espero que això us ajudi a construir el vostre propi robot d’equilibri automàtic si teniu algun problema per fer-lo funcionar, deixeu les vostres preguntes a la secció de comentaris a continuació o utilitzeu els fòrums per obtenir preguntes més tècniques. Si voleu més diversió, també podeu utilitzar la mateixa lògica per construir un robot d'equilibri de boles.
