Orodha ya maudhui:

Kujisawazisha Robot Kutoka Magicbit: 6 Hatua
Kujisawazisha Robot Kutoka Magicbit: 6 Hatua

Video: Kujisawazisha Robot Kutoka Magicbit: 6 Hatua

Video: Kujisawazisha Robot Kutoka Magicbit: 6 Hatua
Video: Сколько стоит ремонт в ХРУЩЕВКЕ? Обзор готовой квартиры. Переделка от А до Я #37 2024, Julai
Anonim

Mafunzo haya yanaonyesha jinsi ya kutengeneza roboti ya kusawazisha kwa kibinafsi ukitumia bodi ya Magicbit dev. Tunatumia magicbit kama bodi ya maendeleo katika mradi huu ambayo inategemea ESP32. Kwa hivyo bodi yoyote ya maendeleo ya ESP32 inaweza kutumika katika mradi huu.

Ugavi:

  • uchawi
  • Dereva wa gari mbili H-daraja L298
  • Mdhibiti wa Linear (7805)
  • Lipo 7.4V 700mah betri
  • Kitengo cha Upimaji wa Inertial (IMU) (digrii 6 za uhuru)
  • motors za gia 3V-6V DC

Hatua ya 1: Hadithi

Hadithi
Hadithi
Hadithi
Hadithi

Haya jamani, leo katika mafunzo haya tutajifunza juu ya kitu ngumu kidogo. Hiyo ni juu ya kujisawazisha roboti kutumia Magicbit na Arduino IDE. Basi lets kuanza.

Kwanza kabisa, hebu tuangalie ni nini kusawazisha robot. Self kusawazisha robot ni mbili tairi robot. Kipengele maalum ni kwamba robot inaweza kusawazisha yenyewe bila kutumia msaada wowote wa nje. Nguvu inapokuwa kwenye roboti itasimama na kisha ikawa sawa kila wakati kwa kutumia harakati za oscillation. Kwa hivyo sasa wote una wazo mbaya juu ya roboti ya kusawazisha ya kibinafsi.

Hatua ya 2: Nadharia na Mbinu

Nadharia na Mbinu
Nadharia na Mbinu

Ili kusawazisha roboti, kwanza tunapata data kutoka kwa sensorer fulani kupima angle ya robot kwa ndege wima. Kwa kusudi hilo tulitumia MPU6050. Baada ya kupata data kutoka kwa sensorer tunahesabu kuelekeza kwa ndege wima. Ikiwa robot katika nafasi sawa na usawa, basi pembe ya mwelekeo ni sifuri. Ikiwa sivyo, basi pembe ya mwelekeo ni thamani nzuri au hasi. Ikiwa roboti imeelekezwa upande wa mbele, basi roboti inapaswa kuhamia mwelekeo wa mbele. Pia ikiwa roboti imegeuzwa kugeuza upande basi roboti inapaswa kusonga kugeuza mwelekeo. Ikiwa pembe hii ya kuinama iko juu basi kasi ya majibu inapaswa kuwa juu. Kwa upande mwingine pembe ya kuinama iko chini basi kasi ya mmenyuko inapaswa kuwa ya chini. Kudhibiti mchakato huu tulitumia nadharia maalum inayoitwa PID. PID ni mfumo wa kudhibiti ambao ulidhibiti michakato mingi. PID inasimama kwa michakato 3.

  • P- sawia
  • I- muhimu
  • D- inayotokana

Kila mfumo una pembejeo na pato. Kwa njia hiyo hiyo mfumo huu wa kudhibiti pia una pembejeo. Katika mfumo huu wa kudhibiti ambayo ni kupotoka kutoka hali thabiti. Tuliita kama kosa. Katika roboti yetu, kosa ni pembe ya mwelekeo kutoka ndege ya wima. Ikiwa roboti ina usawa basi pembe ya mwelekeo ni sifuri. Kwa hivyo thamani ya kosa itakuwa sifuri. Kwa hivyo pato la mfumo wa PID ni sifuri. Mfumo huu unajumuisha michakato mitatu tofauti ya kihesabu.

Kwanza ni kuzidisha makosa kutoka kwa faida ya nambari. Faida hii kawaida huitwa kama Kp

P = kosa * Kp

Ya pili ni kutengeneza ujumuishaji wa kosa katika kikoa cha wakati na kuzidisha kutoka kwa faida. Faida hii inaitwa Ki

I = Jumuishi (kosa) * Ki

Tatu ni inayotokana na kosa katika kikoa cha wakati na kuzidisha kwa kiasi fulani cha faida. Faida hii inaitwa kama Kd

D = (d (kosa) / dt) * kd

Baada ya kuongeza shughuli hapo juu tunapata pato letu la mwisho

Pato = P + I + D

Kwa sababu ya sehemu ya P robot inaweza kupata msimamo thabiti ambao ni sawa na kupotoka. Mimi sehemu huhesabu eneo la makosa dhidi ya grafu ya wakati. Kwa hivyo inajaribu kumfanya roboti awe na msimamo thabiti kila wakati kwa usahihi. Sehemu ya D inapima mteremko kwa wakati dhidi ya grafu ya makosa. Ikiwa kosa linaongeza thamani hii ni chanya. Ikiwa hitilafu inapungua thamani hii ni hasi. Kwa sababu hiyo, wakati roboti inahamia kwenye msimamo thabiti basi kasi ya mwitikio itapungua na hii itasaidia kuondoa vivutio visivyo vya lazima. Unaweza kujifunza zaidi juu ya nadharia ya PID kutoka kwa kiunga hiki kilichoonyeshwa hapo chini.

www.arrow.com/en/search-and-events/articles/pid-controller-basics-and-tutorial-pid-implementation-in-arduino

Pato la kazi ya PID ni kikomo kwa anuwai ya 0-255 (8 bit resolution PWM) na ambayo italisha malori kama ishara ya PWM.

Hatua ya 3: Usanidi wa vifaa

Usanidi wa Vifaa
Usanidi wa Vifaa

Sasa hii ni sehemu ya usanidi wa vifaa. Ubunifu wa robot unategemea wewe. Wakati ulibuni mwili wa roboti lazima uzingatie ulinganifu juu ya mhimili wima ambao uko kwenye mhimili wa magari. Pakiti ya betri iko hapa chini. Kwa hivyo robot ni rahisi kusawazisha. Katika muundo wetu tunatengeneza bodi ya Magicbit kwa wima. Tulitumia motors mbili za gia 12V. Lakini unaweza kutumia aina yoyote ya motors za gia. hiyo inategemea vipimo vya robot yako.

Tunapojadili juu ya mzunguko inaendeshwa na betri ya 7.4V Lipo. Magicbit ilitumia 5V kwa umeme. Kwa hivyo tulitumia mdhibiti wa 7805 kudhibiti voltage ya betri kwa 5V. Katika matoleo ya baadaye ya Magicbit mdhibiti huyo haitaji. Kwa sababu inaongeza hadi 12V. Tunasambaza moja kwa moja 7.4V kwa dereva wa gari.

Unganisha vifaa vyote kulingana na mchoro hapa chini.

Hatua ya 4: Usanidi wa Programu

Katika nambari tulitumia maktaba ya PID kwa mahesabu ya pato la PID.

Nenda kwa kufuata kiungo ili kuipakua.

www.arduinolibraries.info/libraries/pid

Pakua toleo lake jipya.

Ili kupata usomaji bora wa sensa tulitumia maktaba ya DMP. DMP inasimama kwa mchakato wa mwendo wa dijiti. Hii ni sifa iliyojengwa ya MPU6050. Chip hii imejumuisha kitengo cha mchakato wa mwendo. Kwa hivyo inachukua kusoma na kuchambuliwa. Baada ya kutoa matokeo sahihi yasiyo na sauti kwa mdhibiti mdogo (katika kesi hii Magicbit (ESP32)). Lakini kuna kazi nyingi katika upande wa microcontroller kuchukua usomaji huo na kuhesabu pembe. Kwa hivyo kwa urahisi kwamba tulitumia maktaba ya MPU6050 DMP. Pakua kwa goint kufuata kiungo.

github.com/ElectronicCats/mpu6050

Ili kusanikisha maktaba, kwenye menyu ya Arduino nenda kwa zana-> ni pamoja na maktaba-> ongeza.zip maktaba na uchague faili ya maktaba ambayo umepakua.

Katika nambari lazima ubadilishe angle ya setpoint kwa usahihi. Thamani za kila wakati za PID ni tofauti na robot hadi robot. Kwa hivyo katika kurekebisha hiyo, kwanza weka Ki na Kd inathamini sifuri na kisha ongeza Kp hadi upate kasi bora ya majibu. Kp zaidi husababisha sababu nyingi zaidi. Kisha ongeza thamani ya Kd. Ongeza kwa kila wakati kwa kiwango kidogo sana. Thamani hii kwa ujumla iko chini kuliko maadili mengine. Sasa ongeza Ki mpaka uwe na utulivu mzuri sana.

Chagua bandari sahihi ya COM na andika bodi. pakia nambari. Sasa unaweza kucheza na robot yako ya DIY.

Hatua ya 5: Skematiki

Skimatiki
Skimatiki

Hatua ya 6: Kanuni

# pamoja

# pamoja na "I2Cdev.h" # pamoja na "MPU6050_6Mhimili_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE # pamoja na "Wire.h" #endif MPU6050 mpu; bool dmpReady = uongo; // weka kweli ikiwa init ya DMP ilifanikiwa uint8_t mpuIntStatus; // inashikilia hali halisi ya usumbufu kutoka kwa MPU uint8_t devStatus; // hali ya kurudi baada ya kila operesheni ya kifaa (0 = mafanikio,! 0 = kosa) uint16_t packetSize; // ukubwa wa pakiti ya DMP inayotarajiwa (chaguo-msingi ni ka 42) uint16_t fifoCount; // hesabu ya ka zote zilizo katika FIFO uint8_t fifoBuffer [64]; // bafa ya kuhifadhi FIFO Quaternion q; // [w, x, y, z] chombo cha quaternion mvuto wa VectorFloat; // [x, y, z] vector ya mvuto kuelea ypr [3]; // [yaw, lami, roll] yaw / lami / chombo cha roll na vector ya mvuto asili ya awaliSetpoint = 172.5; setpoint mara mbili = originalSetpoint; kusonga mara mbiliAngleOffset = 0.1; pembejeo mara mbili, pato; kusongaState = 0; mara mbili Kp = 23; // weka P kwanza mara mbili Kd = 0.8;, DIRECT); // pid kuanzisha int motL1 = 26; int motR1 = 27; int motR2 = 4; bool tete mpuInterrupt = uongo; // inaonyesha ikiwa pini ya kukatiza ya MPU imepita batili dmpDataReady () {mpuInterrupt = kweli; } kuanzisha batili () {ledcSetup (0, 20000, 8); // pwm kuanzisha ledcSetup (1, 20000, 8); ledcSetup (2, 20000, 8); ledcSetup (3, 20000, 8); // pinmode ya motors ledcAttachPin (motL2, 1); ledcAttachPin (motR1, 2); ledcAttachPin (motR2, 3); // jiunge na basi ya I2C (maktaba ya I2Cdev haifanyi hivi kiotomatiki) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // saa ya I2C ya 400kHz. Toa maoni kwenye mstari huu ikiwa na shida ya mkusanyiko #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: kuanzisha (400, kweli); #endif Serial.println (F ("Inazindua vifaa vya I2C…")); pinMode (14, INPUT); // anzisha mawasiliano ya serial // (115200 iliyochaguliwa kwa sababu inahitajika kwa pato la Demo ya Teapot, lakini ni // kweli kwako kulingana na mradi wako) Serial.begin (9600); wakati (! Serial); // subiri hesabu ya Leonardo, wengine wanaendelea mara moja // Anzisha kifaa Serial.println (F ("Kuanzisha vifaa vya I2C…")); mpu kuanzisha (); // thibitisha unganisho Serial.println (F ("Upimaji wa unganisho wa kifaa…")); Serial.println (mpu.testConnection () F? // mzigo na usanidi DMP Serial.println (F ("Inazindua DMP…")); devStatus = mpu.dmp Anzisha (); // usambazaji wa gyro yako mwenyewe hapa, iliyopunguzwa kwa unyeti wa dakika mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); // Chaguo-msingi cha kiwanda cha 1688 kwa chip yangu ya majaribio // hakikisha imefanya kazi (inarudi 0 ikiwa ni hivyo) ikiwa (devStatus == 0) {// washa DMP, sasa ikiwa iko tayari Serial.println (F ("kuwezesha DMP … ")); mpu.setDMPEnabled (kweli); // kuwezesha Arduino kukatiza kugundua Serial.println (F ("Kuwezesha kugundua kukatiza (Arduino nje kukatiza 0)…")); ambatishaKukatisha (14, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // weka bendera yetu iliyo tayari ya DMP kwa hivyo kitanzi kuu () kazi inajua ni sawa kuitumia Serial.println (F ("DMP iko tayari! Inangojea usumbufu wa kwanza…")); dmpReady = kweli; // pata ukubwa wa pakiti ya DMP inayotarajiwa kwa pakiti ya kulinganisha baadayeSize = mpu.dmpGetFIFOPacketSize (); // kuanzisha PID pid. SetMode (AUTOMATIC); pid. SetSampleTime (10); pid. SetOutputLimits (-255, 255); } mwingine {// KOSA! // 1 = mzigo wa kumbukumbu ya awali umeshindwa // 2 = sasisho za usanidi wa DMP zimeshindwa // (ikiwa itaenda kuvunjika, kawaida nambari itakuwa 1) Serial.print (F ("Uanzishaji wa DMP umeshindwa (nambari")); Serial. chapa (devStatus); Serial.println (F (")")); }} kitanzi batili () {// ikiwa programu imeshindwa, usijaribu kufanya chochote ikiwa (! dmpReady) inarudi; // subiri kukatizwa kwa MPU au pakiti (za) zaidi wakati (! mpuInterrupt && fifoCount <packetSize) {pid. Compute (); // kipindi hiki cha wakati kinatumiwa kupakia data, kwa hivyo unaweza kutumia hii kwa mahesabu mengine motorSpeed (pato); } // kuweka upya usumbue bendera na upate INT_STATUS byte mpuInterrupt = uongo; mpuIntStatus = mpu.getIntStatus (); // pata sasa hesabu ya FIFO fifoCount = mpu.getFIFOCount (); // angalia kufurika (hii haipaswi kamwe kutokea isipokuwa nambari yetu haina ufanisi sana) ikiwa ((mpuIntStatus & 0x10) || fifoCount == 1024) {// kuweka upya ili tuweze kuendelea safi mpu.resetFIFO (); Serial.println (F ("FIFO kufurika!")); // vinginevyo, angalia kukatizwa kwa data ya DMP tayari (hii inapaswa kutokea mara kwa mara)} mwingine ikiwa (mpuIntStatus & 0x02) {// subiri urefu sahihi wa data, inapaswa kuwa subira fupi SANA wakati (pakiti ya fifoCount 1 inapatikana // (hii inatuwezesha kusoma mara moja zaidi bila kusubiri usumbufu) fifoCount - = packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& mvuto, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & mvuto); #if LOG_INPUT Serial. chapa ("ypr / t"); Serial.print (ypr [0] * 180 / M_PI); // pembe za euler Serial.print ("\ t"); Serial.print (ypr [1] * 180 / M_PI); Serial.print ("\ t"); Serial.println (ypr [2] * 180 / M_PI); #endif pembejeo = ypr [1] * 180 / M_PI + 180;}} utupu motorSpeed (int PWM) {kuelea L1, L2, R1, R2; ikiwa (PWM> = 0) {// mwelekeo wa mbele L2 = 0; L1 = abs (PWM); R2 = 0; R1 = abs (PWM); ikiwa (L1> = 255) { L1 = R1 = 255;}} mwingine {// mwelekeo wa nyuma L1 = 0; L2 = abs (PWM); R1 = 0; R2 = abs (PWM); ikiwa (L2> = 255) {L2 = R2 = 255; }} // gari inayoongoza ledcWrite (0, L1); ledcWrite (1, L2); ledcWrite (2, R1 * 0.97); // 0.97 ni ukweli wa kasi au, kwa sababu motor ya kulia ina kasi kubwa kuliko ya kushoto, kwa hivyo tunaipunguza hadi mwendo wa gari ni sawa ledcWrite (3, R2 * 0.97);

}

Ilipendekeza: