- Savarankiško balansavimo roboto dalių pasirinkimas
- 3D spausdinimas ir mūsų balansuojančio roboto surinkimas
- Grandinės schema
- Savęs balansavimo roboto kodas
- „Arduino“ savęs balansavimo roboto darbas
Įkvėptas „RYNO“ variklių ir kitų savaime subalansuojančių „Segway“ motorolerių, aš visada norėjau sukurti ką nors savo „ Arduino Segway“ robotą. Galvodamas kurį laiką nusprendžiau sukurti „ Self Balancing Robot“ naudodamas „Arduino“. Tokiu būdu galėčiau suvokti visų šių motorolerių koncepciją ir sužinoti, kaip veikia PID algoritmas.
Pradėjęs kurti supratau, kad šį botą yra šioks toks iššūkis. Yra tiek daug variantų, iš kurių galima pasirinkti, todėl painiavos prasideda teisingai nuo variklių pasirinkimo ir lieka iki PID reikšmių nustatymo. Reikia atsižvelgti į daugybę dalykų, tokių kaip akumuliatoriaus tipas, akumuliatoriaus padėtis, rato sukibimas, variklio vairuotojo tipas, CoG (svorio centro) išlaikymas ir daug daugiau.
Bet leiskite man tai jums palaužti, kai tik sukursite, sutiksite, kad tai nėra taip sunku, kaip atrodo. Taigi pripažinkime, kad šioje pamokoje aš dokumentuosiu savo patirtį subalansuojant robotą. Galite būti absoliučiai pradedantysis, kuris dar tik pradeda arba galbūt nusileido čia po ilgo nusivylimo, kad jūsų botas neveikia. Ši vieta siekia būti jūsų galutinė paskirties vieta. Taigi pradėkime……
Savarankiško balansavimo roboto dalių pasirinkimas
Prieš pasakodamas visas roboto kūrimo galimybes, leisk man išvardyti daiktus, kuriuos naudojau šiame savaime subalansuoto roboto projekte
- „Arduino UNO“
- Pavaroti nuolatinės srovės varikliai (geltonos spalvos) - 2Nos
- L298N variklio tvarkyklės modulis
- MPU6050
- Pora ratų
- 7,4 V ličio jonų akumuliatorius
- Jungiamieji laidai
- 3D spausdintas korpusas
Galite maišyti ir pasirinkti bet kurį iš aukščiau išvardytų komponentų, atsižvelgdami į galimybes, kad galėtumėte sukurti savo savarankiško balansavimo roboto rinkinį, tiesiog įsitikinkite, kad komponentai atitinka šiuos kriterijus.
Valdiklis: Valdiklis, kurį čia naudojau, yra „Arduino UNO“, kodėl, nes juo paprasta naudotis. Taip pat galite naudoti „Arduino Nano“ arba „Arduino mini“, bet aš rekomenduočiau laikytis UNO, nes mes galime jį programuoti tiesiogiai be išorinės aparatūros.
Varikliai: geriausias variklio pasirinkimas, kurį galite naudoti savaiminio balansavimo robotui, be abejo, bus „Stepper“ variklis. Bet kad viskas būtų paprasta, aš naudoju nuolatinės srovės variklį. Taip, nebūtina turėti steperį; botas puikiai veikia ir su šiais pigiais įprastais geltonos spalvos nuolatinės pavaros varikliais.
Variklio vairuotojas: Jei pasirinkote nuolatinės srovės variklius, tokius kaip aš, galite naudoti L298N tvarkyklės modulį kaip aš, arba net L293D turėtų veikti puikiai. Sužinokite daugiau apie nuolatinės srovės variklio valdymą naudojant „L293D“ ir „Arduino“.
Ratai: Nenuvertinkite šių vaikinų; Man buvo sunku suprasti, kad problema yra mano ratuose. Taigi įsitikinkite, kad jūsų ratai gerai sukimba su jūsų naudojamomis grindimis. Atidžiai stebėkite, jūsų sukibimas niekada neturėtų leisti ratams slidinėti ant grindų.
Akselerometras ir giroskopas: geriausias jūsų boto akselerometro ir giroskopo pasirinkimas bus MPU6050. Taigi nebandykite sukurti tokio su įprastu akselerometru, kaip ADXL345 ar pan., Jis tiesiog neveiks. Kodėl, jūs sužinosite šio straipsnio pabaigoje. Taip pat galite patikrinti mūsų specialų straipsnį apie MPU6050 naudojimą su „Arduino“.
Baterija: Mums reikia kuo lengvesnės baterijos, o darbinė įtampa turėtų būti didesnė nei 5 V, kad galėtume tiesiogiai maitinti „Arduino“ be pakėlimo modulio. Taigi idealus pasirinkimas bus 7,4 V li-polimerinė baterija. Kadangi turėjau lengvai prieinamą 7,4 V ličio jonų akumuliatorių, aš jį naudojau. Tačiau atminkite, kad Li-po yra naudingesnis nei Li-ion.
Važiuoklė: Kita vieta, kur neturėtumėte eiti į kompromisą, yra jūsų važiuoklės važiuoklė. Kartoną, medieną, plastiką galite naudoti bet ką, kas jums tinka. Tačiau tiesiog įsitikinkite, kad važiuoklė yra tvirta ir neturėtų judėti, kai botas bando išlaikyti pusiausvyrą. Aš suprojektavau savo „Solidworks“ važiuokle, darydamas išvadą iš kitų robotų ir 3D ją atspausdinęs. Jei turite spausdintuvą, taip pat galite atsispausdinti dizainą, dizaino failai bus pridėti prie būsimos antraštės.
3D spausdinimas ir mūsų balansuojančio roboto surinkimas
Jei nusprendėte 3D spausdinti tą pačią važiuoklę, kurią naudoju kurdamas savo robotą, tada STL failus galite atsisiųsti iš „thingiverse“. Taip pat pridėjau dizaino failus kartu su jais, kad galėtumėte juos modifikuoti pagal savo personalo pageidavimus.
Dalys neturi išsikišusių konstrukcijų, todėl jas galite lengvai atspausdinti be jokių atramų, o 25% užpildas veiks puikiai. Dizainas yra gana paprastas ir bet kuris pagrindinis spausdintuvas turėtų sugebėti su juo elgtis lengvai. Aš panaudojau „Cura“ programinę įrangą, kad supjaustyčiau modelį, ir atspausdinau naudodamas savo „Tevo Tarantula“, nustatymas parodytas žemiau.
Turėtumėte atspausdinti kėbulo dalį ir keturias variklio tvirtinimo dalis. Surinkimas yra gana tiesus; 3 mm veržlėmis ir varžtais pritvirtinkite variklį ir lentas. Surinkus jis turėtų atrodyti panašiai, kaip parodyta paveikslėlyje žemiau.
Tikrasis dizainas buvo suplanuotas su „L298N“ pavaros moduliu apatinėje „Arduino“ lentynoje ir akumuliatoriumi viršuje, kaip parodyta aukščiau. Jei laikotės tos pačios tvarkos, galite tiesiogiai prisukti lentą per pateiktas skyles ir naudoti vielos etiketę Li-po akumuliatoriui. Šis išdėstymas taip pat turėtų veikti, išskyrus ypač paprastus ratus, kuriuos vėliau turėjau pakeisti.
Savo robote aš pakeičiau akumuliatoriaus ir „Arduino UNO“ plokštės padėtį, kad būtų lengviau programuoti, taip pat turėjau pristatyti tobulą plokštę, skirtą užbaigti ryšius. Taigi mano botas atrodė ne taip, kaip planavau pradiniame etape. Baigęs laidų programavimo testavimą ir viską, mano dviejų ratų robotas pagaliau atrodo taip
Grandinės schema
Užmegzti ryšius su šiuo „ Arduino“ pagrindu sukurtu savęs balansavimo robotu yra gana paprasta. Tai savaime balansuojantis robotas, naudojant „Arduino“ ir „MPU6050“, todėl mes turime susieti MPU6050 su „Arduino“ ir prijungti variklius per „Motor“ tvarkyklės modulį. Visą komplektaciją maitina 7,4 V ličio jonų baterija. To paties schema parodyta žemiau.
„Arduino“ ir „L298N Motor“ tvarkyklės modulis tiesiogiai maitinamas per „Vin“ kaištį ir 12 V terminalą. „Arduino“ plokštėje esantis reguliatorius konvertuos įvestį 7,4 V į 5 V, o „ATmega IC“ ir „MPU6050“ bus maitinamas. Nuolatinės srovės varikliai gali veikti nuo 5 V iki 12 V įtampos. Bet mes prijungsime 7,4 V teigiamą laidą iš akumuliatoriaus į 12 V variklio vairuotojo modulio įvesties gnybtą. Tai leis varikliams veikti su 7,4 V įtampa. Šioje lentelėje bus išvardyta, kaip MPU6050 ir L298N variklio tvarkyklės modulis yra sujungtas su „Arduino“.
Komponento kaištis |
Arduino kaištis |
MPU6050 |
|
Vcc |
+ 5 V |
Žemė |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
IN1 |
D6 |
IN2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
„MPU6050“ bendrauja su „Arduino“ per „I2C“ sąsają, todėl naudojame „Arduino“ SPI kaiščius A4 ir A5. Nuolatinės srovės varikliai yra prijungti prie PWM kaiščių D6, D9 D10 ir D11. Mes turime juos prijungti prie PWM kaiščių, nes mes kontroliuosime nuolatinės srovės variklio greitį keisdami PWM signalų darbo ciklą. Jei nesate susipažinę su šiais dviem komponentais, rekomenduojama perskaityti MPU6050 sąsają ir L298N variklio tvarkyklę.
Savęs balansavimo roboto kodas
Dabar turime užprogramuoti „Arduino UNO“ plokštę, kad subalansuotume robotą. Čia įvyksta visa magija; koncepcija yra paprasta. Naudodami MPU6050 turime patikrinti, ar botas linksta į priekį, ar į galą, o tada, jei jis linkęs į priekį, turime sukti ratus į priekį, o jei jis linkęs į galą, turime pasukti ratus atvirkštine kryptimi.
Tuo pačiu metu mes taip pat turime kontroliuoti ratų sukimosi greitį, jei botas yra šiek tiek nukreiptas nuo centrinės padėties, ratai lėtai sukasi, o greitis didėja, kai jis labiau nutolsta nuo centrinės padėties. Norėdami pasiekti šią logiką, mes naudojame PID algoritmą, kurio centrinė padėtis yra nustatytas taškas, o dezorientacijos lygis yra išėjimas.
Norėdami sužinoti dabartinę roboto padėtį, mes naudojame MPU6050, kuris yra 6 ašių akselerometras ir giroskopo jutiklis kartu. Norėdami gauti patikimą padėties vertę iš jutiklio, turime naudoti tiek akselerometro, tiek giroskopo vertę, nes akselerometro reikšmės turi triukšmo problemų, o giroskopo vertės laikui bėgant linksta. Taigi mes turime derinti abu dalykus ir gauti savo roboto lenkimo žingsnio ir riedėjimo vertę, iš kurios mes naudosime tik žiojo vertę.
Skamba šiek tiek galvos riestis? Tačiau nesijaudinkite, nes „Arduino“ bendruomenės dėka turime lengvai pasiekiamų bibliotekų, galinčių atlikti PID skaičiavimą ir gauti MPV6050 vertę. Biblioteką kuria atitinkamai br3ttb ir jrowberg. Prieš tęsdami atsisiųskite jų bibliotekas iš šios nuorodos ir pridėkite jas prie savo „Arduino lib“ katalogo.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Dabar bibliotekos pridėtos prie „Arduino IDE“. Pradėkime programuoti mūsų savęs balansavimo robotą. Kaip visada, visas balansavimo roboto MPU6050 kodas pateikiamas šio puslapio pabaigoje, čia aš tik paaiškinu svarbiausius kodo fragmentus. Anksčiau pasakyta, kad kodas yra sukurtas ant MPU6050 pavyzdžio kodo, mes tik ketiname optimizuoti kodą savo tikslams ir pridėti PID ir valdymo techniką mūsų savaiminio balansavimo robotui.
Pirmiausia įtraukiame bibliotekas, reikalingas šiai programai veikti. Jie apima įmontuotą „I2C“ biblioteką, PID biblioteką ir „MPU6050“ biblioteką, kurią ką tik atsisiuntėme.
#include "I2Cdev.h" #include
Tada mes deklaruojame kintamuosius, kurių reikia norint gauti duomenis iš MPU6050 jutiklio. Mes perskaitėme ir gravitacijos vektoriaus, ir kvaterniono vertes, tada apskaičiuojame roboto pakreipimo žingsnį ir ritinį. Plūdė masyvo YPR laikys galutinį rezultatą.
// MPU valdiklis / status vars bool dmpReady = false; // set true, jei DMP init buvo sėkmingas uint8_t mpuIntStatus; // turi faktinį pertraukimo būsenos baitą iš MPU uint8_t devStatus; // grąžinimo būsena po kiekvienos įrenginio operacijos (0 = sėkmė,! 0 = klaida) uint16_t packetSize; // numatomas DMP paketo dydis (numatytasis yra 42 baitai) uint16_t fifoCount; // visų šiuo metu FIFO baitų skaičius uint8_t fifoBuffer; // FIFO saugojimo buferis // orientacijos / judesio pokyčiai Quaternion q; // quaternion container VectorFloat gravity; // gravitacijos vektoriaus plūdės ypr; // yaw / pitch / roll container ir gravitacijos vektorius
Toliau pateikiamas labai svarbus kodo segmentas, kuriame jūs ilgai praleisite derindami teisingą verčių rinkinį. Jei jūsų robotas yra pastatytas su labai geru svorio centru ir komponentai yra išdėstyti simetriškai (o tai dažniausiai nėra), jūsų nustatyto taško vertė bus 180. Kitaip prijunkite savo robotą prie „Arduino“ serijinio monitoriaus ir pakreipkite jį iki rasite gerą balansavimo padėtį, perskaitykite serijiniame monitoriuje rodomą vertę ir tai yra jūsų nustatyto taško vertė. Kp, Kd ir Ki vertė turi būti sureguliuota pagal jūsų robotą. Nėra dviejų vienodų robotų, kurių Kp, Kd ir Ki reikšmės bus vienodos, todėl nuo jų nebus galima pabėgti. Žiūrėkite vaizdo įrašą šio puslapio pabaigoje, kad gautumėte idėją, kaip koreguoti šias vertes.
/ ********* Sureguliuokite šias 4 vertes savo BOT ********* / dvigubai nustatytai reikšmei = 176; // naudodami nuoseklųjį monitorių nustatykite vertę, kai robotas yra statmenas žemei . // Perskaitykite projekto dokumentaciją circuitdigest.com, kad sužinotumėte, kaip nustatyti šias reikšmes dvigubai Kp = 21; // Nustatykite šį pirmąjį dvigubą Kd = 0,8; // rinkinys šis secound dvigubo Ki = 140; // Pagaliau nustatykite tai / ****** Vertybių nustatymo pabaiga ********* /
Kitoje eilutėje inicijuojame PID algoritmą, įvesdami kintamuosius įvestį, išvestį, nustatytą tašką, Kp, Ki ir Kd. Iš jų mes jau nustatėme nustatytų taškų Kp, Ki ir Kd reikšmes aukščiau pateiktame kodo fragmente. Įvesties vertė bus dabartinė kampo vertė, nuskaityta iš MPU6050 jutiklio, o išvesties vertė bus apskaičiuota pagal PID algoritmą. Taigi iš esmės PID algoritmas suteiks mums išvesties vertę, kuri turėtų būti naudojama norint patikslinti įvesties vertę, kad ji būtų artima nustatytam taškui.
PID pid (& input, & output, & setpoint, Kp, Ki, Kd, DIRECT);
Viduje tuščia sąrankos funkcijai mes inicializuoti konfigūruodami DMP MPU6050 (Digital Pasiūlymas Processor). Tai padės mums sujungti akcelerometro duomenis su giroskopo duomenimis ir suteikti patikimą „Yaw“, „Pitch and Roll“ vertę. Mes nesigilinsime į tai, nes tai bus toli už temos ribų. Šiaip ar taip, vienas kodo segmentas, kurio turite ieškoti sąrankos funkcijoje, yra giroskopo poslinkio vertės. Kiekvienas MPU6050 jutiklis turi savo poslinkių vertes. Galite naudoti šį „Arduino“ eskizą, kad apskaičiuotumėte savo jutiklio poslinkio vertę ir atitinkamai atnaujintumėte šias eilutes savo programoje.
// čia pateikite savo giroskopinius poslinkius, pritaikytus min. jautrumui mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Taip pat turime inicijuoti skaitmeninius PWM kaiščius, kuriuos naudojame varikliams prijungti. Mūsų atveju tai yra D6, D9, D10 ir D11. Taigi mes inicializuojame šiuos kaiščius, nes išvesties kaiščiai pagal numatytuosius nustatymus daro juos mažus.
// inicializuoti Variklio Outpu kaiščiai pinMode (6, produkcija); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); // Pagal numatytuosius nustatymus išjunkite abu variklius analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Viduje pagrindinis kilpos funkcijos mes patikrinti, ar duomenys iš MPU6050 yra pasirengusi būti skaityti. Jei taip, tada mes naudojame jį PID reikšmei apskaičiuoti ir tada nuoseklaus monitoriaus ekrane rodome PID įvesties ir išvesties vertę, kad patikrintume, kaip PID reaguoja. Tada pagal išvesties vertę nusprendžiame, ar robotas turi judėti į priekį, ar atgal, ar stovėti vietoje.
Kadangi manome, kad MPU6050 grąžins 180, kai botas bus vertikalus. Korekcijos reikšmės bus teigiamos, kai botas kris priekio link, o neigiamas, jei botas kris atgal. Taigi patikriname, ar nėra šios būklės, ir iškviečiame atitinkamas funkcijas, kad botas būtų perkeltas į priekį ar atgal.
while (! mpuInterrupt && fifoCount <packetSize) { // nėra MPU duomenų - atliekami PID skaičiavimai ir išvestis į variklius pid.Compute (); // Nuspausdinkite įvesties ir išvesties reikšmę serijiniame monitoriuje, kad patikrintumėte, kaip jis veikia. Serial.print (įvestis); Serijinis spaudinys ("=>"); Serial.println (išvestis); if (įvestis> 150 && įvestis <200) {// Jei botas krinta, jei (išvestis> 0) // krenta priekio link Pirmyn (); // Pasukite ratus į priekį, jei (išvestis <0) // Krentant atgal atgal (); // Pasukite ratus atgal } else // Jei Botas nekrenta Stop (); // Laikykite ratus nejudėdami }
PID išėjimo kintamasis taip pat sprendžia, kaip greitai variklis turi būti pasukti. Jei botas tuoj kris, mes padarome nedidelę korekciją, lėtai sukdami ratą. Jei šie nedideli pataisymai veikia ir vis tiek, jei botas krinta žemyn, mes padidiname variklio greitį. Vertę, kaip greitai ratai sukasi, spręs PI algoritmas. Atkreipkite dėmesį, kad funkcijai Reverse mes padauginome išvesties vertę iš -1, kad galėtume neigiamą vertę paversti teigiama.
void Forward () // Kodas ratui pasukti į priekį { analogWrite (6, output); analogWrite (9,0); analogWrite (10, išvestis); analogWrite (11,0); Serijinis spaudinys („F“); // Derinimo informacija } void Reverse () // Kodas ratui pasukti atgal { analogWrite (6,0); analogWrite (9, išvestis * -1); analogWrite (10,0); analogWrite (11, išvestis * -1); Serijinis spaudinys („R“); } void Stop () // Kodas sustabdyti abu ratus { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serijinis spaudinys („S“); }
„Arduino“ savęs balansavimo roboto darbas
Kai būsite pasirengę naudoti aparatinę įrangą, galėsite įkelti kodą į savo „Arduino“ plokštę. Įsitikinkite, kad jungtys yra tinkamos, nes naudojame ličio jonų akumuliatorių. Taigi dar kartą patikrinkite, ar nėra trumpųjų jungimų, ir įsitikinkite, kad terminalai nesiliestų, net jei jūsų robotas patiria nedidelį poveikį. Įjunkite modulį ir atidarykite nuoseklųjį monitorių, jei „Arduino“ galėtų sėkmingai bendrauti su MPU6050 ir jei viskas veikia taip, kaip tikėtasi, turėtumėte pamatyti šį ekraną.
Čia mes matome PID algoritmo įvesties ir išvesties reikšmes formatu input => output . Jei robotas yra visiškai subalansuotas, išvesties vertė bus 0. Įvesties vertė yra dabartinė MPU6050 jutiklio vertė. Abėcėlė „F“ reiškia, kad botas juda į priekį, o „R“ reiškia, kad botas yra atvirkštinis.
Pradiniame PID etape rekomenduoju palikti „Arduino“ laidą prijungtą prie roboto, kad galėtumėte lengvai stebėti įvesties ir išvesties reikšmes, taip pat bus lengva pataisyti ir įkelti programą pagal Kp, Ki ir Kd reikšmes. Žemiau pateiktame vaizdo įraše parodytas visas roboto darbas ir parodyta, kaip ištaisyti PID reikšmes.
Tikimės, kad tai padės sukurti savo savarankiško balansavimo robotą, jei turite kokių nors problemų jį veikiant, palikite klausimus žemiau esančiame komentarų skyriuje arba naudokite forumus, jei norite daugiau techninių klausimų. Jei norite smagiau, taip pat galite naudoti tą pačią logiką, kad sukurtumėte rutulį balansuojantį robotą.