- Daļu izvēle pašbalansējošam robotam
- 3D drukāšana un mūsu pašbalansējošā robota montāža
- Ķēdes shēma
- Pašbalansējošs robotu kods
- Arduino pašbalansējošā robota darbība
Pēc iedvesmas no RYNO motoriem un citiem Segway pašbalansējošiem motorolleriem es vienmēr gribēju uzbūvēt kaut ko savu Arduino Segway robotu. Kādu laiku domājot, es nolēmu uzbūvēt pašbalansējošu robotu, izmantojot Arduino. Tādā veidā es varētu saprast visu šo motorolleru pamatā esošo koncepciju un arī uzzināt, kā darbojas PID algoritms.
Kad es sāku būvēt, es sapratu, ka šī bota izveidošana ir mazliet izaicinājums. Ir tik daudz iespēju, no kuriem izvēlēties, un tādējādi neskaidrības sākas pareizi, izvēloties motorus, un paliek līdz PID vērtību pielāgošanai. Jāņem vērā tik daudz lietu kā akumulatora tips, akumulatora novietojums, riteņa saķere, motora vadītāja tips, VC (smaguma centra) uzturēšana un daudz kas cits.
Bet ļaujiet man to jums izšķirt, tiklīdz jūs to izveidosit, jūs piekritīsit, ka tas nav tik grūti, kā izklausās. Atzīsim, ka šajā apmācībā es dokumentēšu savu pieredzi pašbalansējošā robota izveidē. Jūs, iespējams, esat absolūts iesācējs, kurš tikai sāk darbu vai, iespējams, esat šeit nokļuvis pēc ilgas neapmierinātības, kad jūsu robots nedarbojas. Šīs vietas mērķis ir būt jūsu galamērķim. Tātad sāksim……
Daļu izvēle pašbalansējošam robotam
Pirms es jums saku visas robota veidošanas iespējas, ļaujiet man uzskaitīt priekšmetus, kurus esmu izmantojis šajā pašbalansējošā robota projektā
- Arduino UNO
- Zobratu līdzstrāvas motori (dzeltenā krāsā) - 2Nos
- L298N motora draivera modulis
- MPU6050
- Riteņu pāris
- 7.4V litija jonu akumulators
- Savienojošie vadi
- 3D drukāts korpuss
Jūs varat sajaukt un izvēlēties kādu no iepriekš minētajiem komponentiem, pamatojoties uz pieejamību, lai izveidotu pats sev līdzsvarojošu robotu komplektu, tikai pārliecinieties, ka komponenti atbilst šādiem kritērijiem.
Kontrolieris: kontrolieris, kuru šeit esmu izmantojis, ir Arduino UNO, kāpēc tāpēc, ka to ir vienkārši viegli izmantot. Varat arī izmantot Arduino Nano vai Arduino mini, taču es iesaku jums palikt pie UNO, jo mēs to varam tieši ieprogrammēt bez ārējas aparatūras.
Motori: Labākā motora izvēle, ko varat izmantot pašbalansējošam robotam, bez šaubām būs Stepper motors. Bet, lai viss būtu vienkārši, esmu izmantojis līdzstrāvas pārnesumu motoru. Jā, nav obligāti jābūt steperim; robots darbojas labi arī ar šiem lētajiem, vispārpieejamajiem dzeltenās krāsas līdzstrāvas zobratu motoriem.
Motora draiveris: Ja esat izvēlējies līdzstrāvas pārnesumu motorus, piemēram, manējos, varat izmantot L298N draivera moduli tāpat kā es, vai pat L293D vajadzētu darboties lieliski. Uzziniet vairāk par līdzstrāvas motora vadību, izmantojot L293D un Arduino.
Riteņi: Nenovērtējiet par zemu šos puišus; Man bija grūti izdomāt, ka problēma ir saistīta ar maniem riteņiem. Tāpēc pārliecinieties, ka jūsu riteņiem ir laba saķere ar izmantoto grīdu. Uzmanīgi vērojiet, jūsu saķere nekad nedrīkst ļaut riteņiem slīdēt uz grīdas.
Akselerometrs un žiroskops: labākā akselerometra un žiroskopa izvēle jūsu robotam būs MPU6050. Tāpēc nemēģiniet to izveidot ar parastu akselerometru, piemēram, ADXL345 vai tamlīdzīgu, tas vienkārši nedarbosies. Kāpēc, jūs zināt šī raksta beigās. Varat arī pārbaudīt mūsu veltīto rakstu par MPU6050 izmantošanu ar Arduino.
Akumulators: Mums ir nepieciešama pēc iespējas vieglāka baterija, un darba spriegumam jābūt lielākam par 5 V, lai mēs varētu darbināt mūsu Arduino tieši bez papildmoduļa. Tāpēc ideāla izvēle būs 7,4 V litija polimēra akumulators. Tā kā man bija viegli pieejams 7,4 V litija jonu akumulators, es to izmantoju. Bet atcerieties, ka Li-po ir izdevīgāks nekā Li-ion.
Šasija: Vēl viena vieta, kur nevajadzētu piekāpties, ir jūsu robotu šasija. Jūs varat izmantot kartonu, koku, plastmasu jebko, kas jums ir labs. Bet tikai pārliecinieties, ka šasija ir izturīga un tai nevajadzētu vicināties, kad bots mēģina līdzsvarot. Esmu noformējis pats Solidworks šasiju, secinot no citiem robotprogrammatūrām, un 3D to izdrukājis. Ja jums ir printeris, varat arī izdrukāt dizainu, dizaina faili tiks pievienoti gaidāmajā virsrakstā.
3D drukāšana un mūsu pašbalansējošā robota montāža
Ja esat nolēmis 3D drukāt to pašu šasiju, kuru izmantoju, lai izveidotu robotu, tad STL failus var lejupielādēt no thingiverse. Esmu pievienojis arī dizaina failus kopā ar to, lai jūs tos varētu arī modificēt atbilstoši savām personāla vēlmēm.
Daļām nav pārkarējušu konstrukciju, tāpēc jūs varat tās viegli izdrukāt bez jebkādiem balstiem, un 25% piepildījums darbosies lieliski. Dizains ir diezgan vienkāršs, un jebkuram pamata printerim vajadzētu būt iespējai to viegli apstrādāt. Es izmantoju Cura programmatūru modeļa sagriešanai un drukāju, izmantojot manu Tevo Tarantula, iestatījums ir parādīts zemāk.
Jums vajadzētu izdrukāt ķermeņa daļu, kā arī četras motora stiprinājuma daļas. Montāža ir diezgan taisna uz priekšu; izmantojiet 3 mm uzgriežņus un skrūves, lai nostiprinātu motoru un dēļus. Pēc montāžas tam vajadzētu izskatīties apmēram tā, kā parādīts attēlā zemāk.
Faktiskais dizains tika plānots ar L298N piedziņas moduli Arduino apakšējā statīvā un akumulatoru virs tā, kā parādīts iepriekš. Ja ievērojat to pašu kārtību, varat tieši ieskrūvēt plāksni caur paredzētajām atverēm un izmantot Li-po akumulatora stieples uzlīmi. Šim izkārtojumam vajadzētu arī darboties, izņemot super vienkāršus riteņus, kuri man vēlāk bija jāmaina.
Savā botā esmu mainījis akumulatora un Arduino UNO dēļa pozīciju, lai atvieglotu programmēšanu, kā arī nācās ieviest perfu dēli savienojumu pabeigšanai. Tāpēc mans bots sākotnējā posmā neizskatījās tā, kā plānoju. Pabeidzis elektroinstalācijas programmēšanas testēšanu un visu, mans divu riteņu robots beidzot izskatās šādi
Ķēdes shēma
Savienojumu izveidošana šim Arduino balstītajam pašbalansējošajam robotam ir diezgan vienkārša. Tas ir pašbalansējošs robots, kurā tiek izmantoti Arduino un MPU6050, tāpēc mums ir jāsaskaņo MPU6050 ar Arduino un jāpievieno motori, izmantojot Motora draivera moduli. Visu iekārtu darbina 7,4 V litija jonu akumulators. Tā paša shēma ir parādīta zemāk.
Arduino un L298N Motor draivera modulis tiek tieši darbināts caur attiecīgi Vin tapu un 12V spaili. Arduino borta borta regulators pārveidos ieeju 7.4V par 5V, un ar to darbosies ATmega IC un MPU6050. Līdzstrāvas motori var darboties no 5V līdz 12V sprieguma. Bet mēs savienosim 7,4 V pozitīvo vadu no akumulatora ar motora vadītāja moduļa 12 V ieejas spaili. Tas liks motoriem darboties ar 7,4 V. Šajā tabulā būs uzskaitīts, kā MPU6050 un L298N motora draivera modulis ir savienots ar Arduino.
Komponenta tapa |
Arduino tapa |
MPU6050 |
|
Vcc |
+ 5V |
Zeme |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
IN1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 sazinās ar Arduino, izmantojot I2C saskarni, tāpēc mēs izmantojam Arduino SPI tapas A4 un A5. Līdzstrāvas motori ir pievienoti attiecīgi PWM tapām D6, D9 D10 un D11. Mums tie jāpievieno PWM tapām, jo mēs kontrolēsim līdzstrāvas motora ātrumu, mainot PWM signālu darba ciklu. Ja jums nav pazīstami šie divi komponenti, ieteicams izlasīt MPU6050 Interfacing un L298N Motor draivera apmācību.
Pašbalansējošs robotu kods
Tagad mums ir jāprogrammē mūsu Arduino UNO dēlis, lai līdzsvarotu robotu. Šeit notiek visa burvība; jēdziens aiz tā ir vienkāršs. Izmantojot MPU6050, mums jāpārbauda, vai bots ir noliecies uz priekšu vai uz aizmuguri, un tad, ja tas ir sliecies uz priekšu, mums jārotē riteņi uz priekšu un, ja tas ir noliecies uz aizmuguri, mums jārotē riteņi pretējā virzienā.
Tajā pašā laikā mums ir jākontrolē arī ātrums, kādā riteņi griežas, ja bots ir nedaudz dezorientēts no centra stāvokļa, riteņi lēnām griežas un ātrums palielinās, jo vairāk attālinās no centra stāvokļa. Lai sasniegtu šo loģiku, mēs izmantojam PID algoritmu, kura centrālais stāvoklis ir iestatītais punkts un dezorientācijas līmenis kā izeja.
Lai uzzinātu robota pašreizējo stāvokli, mēs izmantojam MPU6050, kas ir 6 asu akselerometrs un žiroskopa sensors kopā. Lai no sensora iegūtu ticamu pozīcijas vērtību, mums jāizmanto gan akselerometra, gan žiroskopa vērtība, jo akselerometra vērtībām ir trokšņa problēmas un žiroskopa vērtības ar laiku mēdz dreifēt. Tāpēc mums ir jāapvieno abi un jāiegūst robota šķībs solis un ruļļa vērtība, no kuras mēs izmantosim tikai līkuma vērtību.
Izklausās mazliet ar galvu? Bet neuztraucieties, pateicoties Arduino kopienai, mums ir viegli pieejamas bibliotēkas, kas var veikt PID aprēķinu, kā arī iegūt MPV6050 šķībuma vērtību. Bibliotēku izstrādā attiecīgi br3ttb un jrowberg. Pirms turpināt, lejupielādējiet to bibliotēkas no šīs saites un pievienojiet tās savam Arduino lib direktorijai.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Tagad, kad mūsu Arduino IDE ir pievienotas bibliotēkas. Sāksim programmēt mūsu pašbalansējošo robotu. Kā vienmēr pilns MPU6050 balansēšanas robota kods ir norādīts šīs lapas beigās, šeit es tikai izskaidroju svarīgākos koda fragmentus. Iepriekš teicis, ka kods tiek veidots virs MPU6050 koda piemēra, mēs vienkārši optimizēsim kodu savam mērķim un pievienosim PID un vadības paņēmienu mūsu pašbalansējošajam robotam.
Vispirms mēs iekļaujam bibliotēkas, kas nepieciešamas šīs programmas darbībai. Tie ietver iebūvēto I2C bibliotēku, PID bibliotēku un MPU6050 bibliotēku, ko tikko lejupielādējām.
#include "I2Cdev.h" #include
Tad mēs deklarējam mainīgos, kas nepieciešami, lai iegūtu datus no MPU6050 sensora. Mēs nolasām gan gravitācijas vektora, gan kvaterniona vērtības un pēc tam aprēķinām robota līkuma piķa un ripas vērtību. Pludiņš masīvs YPR rīkos gala rezultātu.
// MPU vadīkla / statuss vars bool dmpReady = false; // iestatiet taisnību, ja DMP init bija veiksmīgs uint8_t mpuIntStatus; // satur faktisko pārtraukuma statusa baitu no MPU uint8_t devStatus; // atgriešanās statuss pēc katras ierīces darbības (0 = panākumi,! 0 = kļūda) uint16_t packetSize; // paredzamais DMP pakešu lielums (noklusējums ir 42 baiti) uint16_t fifoCount; // visu FIFO pašlaik esošo baitu skaits uint8_t fifoBuffer; // FIFO atmiņas buferis // orientācija / kustības mainība Quaternion q; // kvartāra konteiners VectorFloat gravity; // gravitācijas vektora pludiņš ypr; // šķībs / piķis / ruļļa konteiners un gravitācijas vektors
Nākamais ir ļoti svarīgais koda segments, un šeit jūs pavadīsit ilgu laiku, noskaņojot pareizo vērtību kopu. Ja jūsu robots ir uzbūvēts ar ļoti labu smaguma centru un komponenti ir izvietoti simetriski (kas vairumā gadījumu tā nav), jūsu iestatītās vērtības vērtība būs 180. Citādi pievienojiet robotu Arduino sērijveida monitoram un noliekiet to līdz atrodat labu balansēšanas pozīciju, izlasiet sērijveida monitorā parādīto vērtību, un tā ir jūsu iestatītā vērtība. Kp, Kd un Ki vērtība ir jāpielāgo atbilstoši jūsu robotam. Nevienam diviem identiskiem robotiem nebūs vienādas Kp, Kd un Ki vērtības, tāpēc no tā nevar aizbēgt. Noskatieties video šīs lapas beigās, lai iegūtu priekšstatu par to, kā pielāgot šīs vērtības.
/ ********* Noregulējiet šīs 4 vērtības savai BOT ********* / dubultā iestatītā vērtība = 176; // iestatiet vērtību, kad robots ir perpendikulārs zemei, izmantojot sērijveida monitoru. // Izlasiet projekta dokumentāciju vietnē circuitdigest.com, lai uzzinātu, kā iestatīt šīs vērtības dubultā Kp = 21; // Iestatiet šo pirmo dubulto Kd = 0,8; // Iestatiet šo secīgo dubulto Ki = 140; // Visbeidzot iestatiet šo / ****** Vērtību iestatījuma beigas ********* /
Nākamajā rindiņā mēs inicializējam PID algoritmu, nododot ievades mainīgos lielumus input, output, set point, Kp, Ki un Kd. Iepriekšminētajā koda fragmentā mēs jau esam iestatījuši iestatīto punktu Kp, Ki un Kd vērtības. Ieejas vērtība būs pašreizējā leņķa vērtība, kas tiek nolasīta no MPU6050 sensora, un izejas vērtība būs tā vērtība, kuru aprēķina PID algoritms. Tātad būtībā PID algoritms dos mums izejas vērtību, kas jāizmanto, lai izlabotu ievades vērtību tā, lai tā būtu tuvu iestatītajam punktam.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, DIRECT);
Tukšās iestatīšanas funkcijas iekšpusē mēs inicializējam MPU6050, konfigurējot DMP (Digital Motion Processor). Tas mums palīdzēs apvienot akselerometra datus ar žiroskopa datiem un nodrošinās ticamu Yaw, Pitch and Roll vērtību. Mēs to daudz neiedziļināsimies, jo tas būs tālu ārpus tēmas. Jebkurā gadījumā viens koda segments, kas jums jāmeklē iestatīšanas funkcijā, ir žiroskopu nobīdes vērtības. Katram MPU6050 sensoram ir savas nobīdes vērtības. Jūs varat izmantot šo Arduino skici, lai aprēķinātu sensora nobīdes vērtību un atbilstoši atjauninātu šīs programmas savā programmā.
// šeit sniedziet savus žiroskopiskos nobīdes, mērogoti pēc minimālās jutības mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Mums arī ir jāinicializē digitālās PWM tapas, ar kurām mēs savienojam savus motorus. Mūsu gadījumā tas ir D6, D9, D10 un D11. Tāpēc mēs inicializējam šīs tapas, jo izejas tapas pēc noklusējuma padara tās ZEMAS.
// Inicializējiet Motor outpu pins pinMode (6, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); // Pēc noklusējuma izslēdziet abus motorus analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Galvenās cilpas funkcijas iekšpusē mēs pārbaudām, vai dati no MPU6050 ir gatavi lasīšanai. Ja jā, tad mēs to izmantojam, lai aprēķinātu PID vērtību un pēc tam sērijveida monitorā parādītu PID ieejas un izejas vērtību, lai pārbaudītu, kā PID reaģē. Tad, pamatojoties uz produkcijas vērtību, mēs izlemjam, vai robotam ir jāvirzās uz priekšu vai atpakaļ, vai jāstājas uz vietas.
Tā kā mēs pieņemam, ka MPU6050 atgriezīsies 180, kad bots būs taisns. Mēs saņemsim pozitīvas korekcijas vērtības, kad bots krīt uz priekšu, un mēs iegūsim negatīvas vērtības, ja bots krīt uz aizmuguri. Tāpēc mēs pārbaudām šo stāvokli un izsaucam atbilstošās funkcijas, lai botu pārvietotu uz priekšu vai aizmuguri.
while (! mpuInterrupt && fifoCount <packetSize) { // nav mpu datu - veicot PID aprēķinus un izvadi uz motoriem pid.Compute (); // Izdrukājiet ievades un izvades vērtību seriālajā monitorā, lai pārbaudītu, kā tas darbojas. Serial.print (ievade); Sērijas.druka ("=>"); Serial.println (izeja); if (ievade> 150 && ievade <200) {// Ja Bots krīt, ja (izeja> 0) // Kritiens uz priekšu Uz priekšu (); // Pagrieziet riteņus uz priekšu citādi, ja (izeja <0) // Kritiens uz aizmuguri Reverss (); // Pagrieziet riteņus atpakaļ } cits // Ja Bots nekrīt, apstājieties (); // Turiet riteņus nekustīgi }
PID izejas mainīgais arī izlemj, cik ātri motors ir jāpagriež. Ja robots tikko nokrīt, mēs veicam nelielu korekciju, lēnām pagriežot riteni. Ja šie nelielie labojumi darbojas un joprojām darbojas, ja robots krīt uz leju, mēs palielinām motora ātrumu. Vērtību par to, cik ātri rotē riteņi, izlems PI algoritms. Ņemiet vērā, ka funkcijai Reverss mēs reizinājām izejas vērtību ar -1, lai negatīvo vērtību varētu pārvērst par pozitīvu.
void Forward () // Kods, lai pagrieztu riteni uz priekšu { analogWrite (6, izeja); analogWrite (9,0); analogWrite (10, izeja); analogWrite (11,0); Sērijas.druka ("F"); // atkļūdošanas informācija } void Reverse () // Kods, lai pagrieztu riteni atpakaļ { analogWrite (6,0); analogWrite (9, izeja * -1); analogWrite (10,0); analogWrite (11, izeja * -1); Sērijas.druka ("R"); } void Stop () // Kods, lai apturētu abus riteņus { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Sērijas.druka ("S"); }
Arduino pašbalansējošā robota darbība
Kad esat gatavs aparatūrai, jūs varat augšupielādēt kodu savā Arduino dēlī. Pārliecinieties, vai savienojumi ir pareizi, jo mēs izmantojam litija jonu akumulatoru. Tāpēc vēlreiz pārbaudiet, vai nav īssavienojumu, un pārliecinieties, ka spailes nesaskaras, pat ja jūsu bots piedzīvo nelielu ietekmi. Ieslēdziet moduli un atveriet seriālo monitoru, ja jūsu Arduino varētu veiksmīgi sazināties ar MPU6050 un ja viss darbojas, kā paredzēts, jums vajadzētu redzēt šo ekrānu.
Šeit mēs redzam PID algoritma ievades un izvades vērtības formātā input => output . Ja robots ir pilnīgi līdzsvarots, izejas vērtība būs 0. Ieejas vērtība ir MPU6050 sensora pašreizējā vērtība. Alfabēts “F” apzīmē, ka robots virzās uz priekšu, bet “R” apzīmē, ka robots ir apgriezts.
Sākotnējā PID posmā es iesaku atstāt savu Arduino kabeli pievienotu robotam, lai jūs varētu viegli uzraudzīt ievades un izvades vērtības, kā arī to būs viegli labot un augšupielādēt programmu Kp, Ki un Kd vērtībām. Zemāk redzamajā videoklipā parādīts robota pilnīgs darbs, kā arī parādīts, kā labot PID vērtības.
Ceru, ka tas palīdz izveidot savu pašbalansējošu robotu, ja jums ir kādas problēmas ar tā darbību, pēc tam atstājiet savus jautājumus zemāk esošajā komentāru sadaļā vai izmantojiet forumus, lai iegūtu vairāk tehnisku jautājumu. Ja vēlaties vairāk jautrības, varat izmantot to pašu loģiku, lai izveidotu bumbu balansēšanas robotu.