Sakupljamo samohodne robote na Arduinu. Gotovi Arduino roboti Da biste napravili štit, trebat će vam

Razgovarajmo o tome kako možete koristiti Arduino za stvaranje robota koji održava ravnotežu poput Segwaya.

Segway s engleskog. Segway je stojeće vozilo na dva kotača opremljeno električnim pogonom. Nazivaju ih još i žiroskuterima ili električnim romobilima.

Jeste li se ikada zapitali kako radi Segway? U ovom tutorialu pokušat ćemo vam pokazati kako napraviti Arduino robota koji se sam balansira kao Segway.

Kako bi uravnotežili robota, motori moraju spriječiti pad robota. Ova radnja zahtijeva povratne informacije i korektivne elemente. Element povratne veze - , koji osigurava i ubrzanje i rotaciju u sve tri osi (). Arduino to koristi da zna trenutnu orijentaciju robota. Korektivni element je kombinacija motora i kotača.

Konačni rezultat trebao bi biti nešto poput ovoga:

Shema robota

L298N pogonski modul motora:

DC motor zupčanika s kotačem:

Samobalansirajući robot je u biti obrnuto njihalo. Može biti bolje uravnotežen ako je središte mase više u odnosu na osovine kotača. Više središte mase znači veći moment tromosti mase, što odgovara manjoj kutnoj akceleraciji (sporiji pad). Zato smo stavili bateriju na vrh. Međutim, visina robota odabrana je na temelju dostupnosti materijala 🙂

Dovršena verzija samobalansirajućeg robota može se vidjeti na gornjoj slici. Na vrhu je šest Ni-Cd baterija za napajanje isprintana matična ploča. Između motora, 9-voltna baterija koristi se za pogon motora.

Teorija

U teoriji upravljanja, držanje neke varijable (u ovom slučaju položaja robota) zahtijeva poseban regulator koji se naziva PID (Proportional Integral Derivative). Svaki od ovih parametara ima "dobitak", koji se obično naziva Kp, Ki i Kd. PID osigurava korekciju između željene vrijednosti (ili ulaza) i stvarne vrijednosti (ili izlaza). Razlika između ulaza i izlaza naziva se "greška".

PID regulator smanjuje pogrešku na najmanju moguću vrijednost kontinuiranim podešavanjem izlaza. U našem samobalansirajućem Arduino robotu, ulaz (što je željeni nagib u stupnjevima) postavlja softver. MPU6050 očitava trenutni nagib robota i ubacuje ga u PID algoritam koji izvodi izračune za kontrolu motora i održavanje robota u uspravnom položaju.

PID zahtijeva da vrijednosti Kp, Ki i Kd budu postavljene na optimalne vrijednosti. Inženjeri koriste softver, kao što je MATLAB, za automatski izračun ovih vrijednosti. Nažalost, u našem slučaju ne možemo koristiti MATLAB jer će to još više zakomplicirati projekt. Umjesto toga, prilagodit ćemo PID vrijednosti. Evo kako to učiniti:

  1. Postavite Kp, Ki i Kd na nulu.
  2. Podesite Kp. Premalo Kp uzrokovat će pad robota jer popravak nije dovoljan. Previše Kp tjera robota da divlja naprijed-natrag. Dobar Kp natjerat će robota da se prilično naginje naprijed-natrag (ili malo oscilira).
  3. Nakon što je Kp postavljen, podesite Kd. Dobra Kd vrijednost smanjit će oscilacije sve dok robot ne postane gotovo stabilan. Također, pravilan Kd će zadržati robota čak i ako bude gurnut.
  4. Na kraju instalirajte Ki. Kada je uključen, robot će oscilirati čak i ako su postavljeni Kp i Kd, ali će se s vremenom stabilizirati. Ispravna vrijednost Ki skratit će vrijeme potrebno da se robot stabilizira.

Ponašanje robota možete vidjeti ispod u videu:

Arduino kod za samobalansirajućeg robota

Za izradu našeg robota bile su nam potrebne četiri vanjske knjižnice. PID biblioteka olakšava izračunavanje vrijednosti P, I i D. Biblioteka LMotorController koristi se za upravljanje dvaju motora s modulom L298N. Biblioteka I2Cdev i biblioteka MPU6050_6_Axis_MotionApps20 dizajnirane su za čitanje podataka s MPU6050. Možete preuzeti kod uključujući biblioteke u ovom repozitoriju.

#uključi #uključi #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #define MIN_ABS_SPEED 20 MPU6050 mpu; // MPU kontrola/status vars bool dmpReady = false; // postavi true ako je init DMP-a bio uspješan uint8_t mpuIntStatus; // drži stvarni bajt statusa prekida iz MPU-a uint8_t devStatus; // vrati status nakon svake operacije uređaja (0 = uspjeh, !0 = pogreška) uint16_t packetSize; // očekivana veličina DMP paketa (zadano je 42 bajta) uint16_t fifoCount; // broj svih bajtova trenutno u FIFO uint8_t fifoBuffer; // FIFO međuspremnik // orijentacija/gibanje vars Quaternion q; // spremnik kvaterniona VectorFloat gravity; // vektor gravitacije float ypr; // posuda skretanja/nagiba/kotrljanja i vektor gravitacije //PID dvostruka originalna postavljena točka = 173; dvostruka zadana vrijednost = originalna zadana vrijednost; dvostruko pomicanje AngleOffset = 0,1; dvostruki ulaz, izlaz; //prilagodite ove vrijednosti kako bi odgovarale vašem dizajnu double Kp = 50; dvostruko Kd = 1,4; dvostruki Ki = 60; PID pid(&input, &output, &setpoint, Kp, Ki, Kd, ​​​​DIRECT); dvostruki motorSpeedFactorLeft = 0,6; dvostruki motorSpeedFactorRight = 0,5; //KONTROLER MOTORA int ENA = 5; int IN1 = 6; int IN2 = 7; int IN3 = 8; int IN4 = 9; int ENB = 10; LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight); volatile bool mpuInterrupt = false; // pokazuje da li je MPU prekidni pin prešao visok void dmpDataReady() ( mpuInterrupt = true; ) void setup() ( // pridruži se I2C sabirnici (I2Cdev biblioteka to ne čini automatski) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin( ); TWBR = 24; // 400kHz I2C takt (200kHz ako je CPU 8MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif mpu.initialize(); devStatus = mpu.dmpInitialize(); // ovdje navedite vlastite pomake žiroskopa, skalirane za minimalnu osjetljivost mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 tvornički zadano za moj test čip // provjeri radi li (vraća 0 ako je tako) if (devStatus == 0) ( // uključi DMP, sada kada je spreman mpu.setDMPEnabled(true); // omogući otkrivanje Arduino prekida attachInterrupt(0 , dmpDataReady , RISING); mpuIntStatus = mpu.getIntStatus(); // postavite našu oznaku DMP Ready tako da funkcija main loop() zna da je u redu koristiti je dmpReady = true; // dobivanje očekivane veličine DMP paketa za kasniju usporedbu packetSize = mpu.dmpGetFIFOPacketSize(); //postavlja PID pid.SetMode(AUTOMATIC); pid.SetSampleTime(10); pid. PostaviOutputLimits(-255, 255); ) else ( // POGREŠKA! // 1 = početno učitavanje memorije nije uspjelo // 2 = ažuriranje DMP konfiguracije nije uspjelo // (ako će se pokvariti, obično će kod biti 1) Serial.print(F("DMP Inicijalizacija neuspješno (kod ")); Serial.print(devStatus); Serial.println(F(")")); ) ) void loop() ( // ako programiranje nije uspjelo, ne pokušavajte učiniti ništa ako (!dmpReady ) return; // čekati MPU prekid ili dodatne pakete koji su dostupni dok (!mpuInterrupt && fifoCount< packetSize) { //no mpu data - performing PID calculations and output to motors pid.Compute(); motorController.move(output, MIN_ABS_SPEED); } // reset interrupt flag and get INT_STATUS byte mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus(); // get current FIFO count fifoCount = mpu.getFIFOCount(); // check for overflow (this should never happen unless our code is too inefficient) if ((mpuIntStatus & 0x10) || fifoCount == 1024) { // reset so we can continue cleanly mpu.resetFIFO(); Serial.println(F("FIFO overflow!")); // otherwise, check for DMP data ready interrupt (this should happen frequently) } else if (mpuIntStatus & 0x02) { // wait for correct available data length, should be a VERY short wait while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // read a packet from FIFO mpu.getFIFOBytes(fifoBuffer, packetSize); // track FIFO count here in case there is >1 paket dostupan // (ovo nam omogućuje da odmah pročitamo više bez čekanja na prekid) fifoCount -= veličina paketa; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); ulaz = ypr * 180/M_PI + 180; ) )

Vrijednosti Kp, Ki, Kd mogu, ali ne moraju funkcionirati. Ako ne, slijedite gore navedene korake. Imajte na umu da je nagib u kodu postavljen na 173 stupnja. Možete promijeniti ovu vrijednost ako želite, ali imajte na umu da je to kut koji robot mora podržavati. Također, ako su vaši motori prebrzi, možete prilagoditi vrijednosti motorSpeedFactorLeft i motorSpeedFactorRight.

To je sve za sada. Vidimo se.

U ovom članku izgradit ćemo našeg robota od nule. Što smo dobili, pogledajte na fotografiji ispod. Robot će voziti i samostalno i pod kontrolom pametnog telefona. Također ćemo pogledati izradu vlastitog mobilnog robota od nule.

3 DPrinter

Ako želim napraviti robota, moram odlučiti o platformi na koju ću instalirati motore, ploče, baterije. Naravno, mogu kupiti gotovu verziju, ali je zanimljivije sami napraviti platformu. Takva platforma će sigurno zadovoljiti vaše zahtjeve. Platforma se može napraviti od org. Staklo, šperploča, a ja ću to napraviti od plastike.

Možete reći da je nezgodno sami izraditi platformu i trebat će vam puno alata, od središnjeg udarca do Stroj za mljevenje. A ja kažem da nam treba mašta i 3D printer.

3D printer? Svatko je vjerojatno upoznat s običnim uredskim pisačem koji može ispisati tekst koji nam treba na A4. Dakle, 3D printer je printer koji može isprintati željeni dio. Postoje različiti 3d printeri. Imam printer s FDM tehnologijom (taloženje sloj po sloj). Koje su još dostupne tehnologije 3d printanja možete pronaći na internetu.

Mnogi 3D pisači rade na Arduinu. Ako želite, možete izraditi vlastiti 3D printer. Glavna ideja 3D pisača je da možete ispisati apsolutno sve, ali mi ćemo ispisati tijelo za robota.

Prvo, definirajmo opis platforme. Želim da platforma bude s 2 kotača i da mora stati Arduino, napajanje, motori i neki senzori.

Sada morate nacrtati izgled platforme na papiru i postaviti potrebne komponente na njega. Na primjer, ovako.

Kada je izgled spreman, morat ćete napraviti 3D model platforme. Za to postoji mnogo programa. Obično koristim. Neću podučavati kako raditi s kompasom, ali ako vas zanima, možete pogledati na internetu ili zatražiti u komentarima da napravite lekciju o kompasu.

Ovo je platforma koju sam smislio.

Nakon toga trebate pretvoriti 3D model u G-kod razumljiv 3D pisaču. Za to postoje posebni programi - rezači. Koristim program Repetier-Host sa rezačem Sli3er. Evo kako dio izgleda spreman za ispis.

A evo i printanog modela.

Tek nedavno smo dobili ideju, a gotov dio je već pred nama. Uz pomoć 3D pisača možete izraditi jedinstvene stvari u pojedinačnim primjercima. 3D printer je sjajan. Savjetujem svima!

Motori

Sada moramo razmisliti o tome kako će se naš mobilni robot kretati. Prvo što pada na pamet su kotači. Pa učinimo to.

Ako se netko sjeća, već smo pokušali spojiti motor na Arduino. Tko se ne sjeća, ne zna ili nije čitao - pogledajte. Postoje značajni nedostaci u povezivanju motora pomoću MOSFET-a - nemoguće je brzo promijeniti brzinu i smjer vrtnje. Vrijeme je da Arduino naučimo kako stvarno kontrolirati motore!

Da biste to učinili, možete koristiti L293D čip. L293D omogućuje kontrolu dva motora odjednom, sa strujom od 600 mA po kanalu i vršnom strujom do 1000 mA, a ako spojite kanale, onda do 1200 mA i 2000 mA vršne struje. U nastavku ću govoriti o udruzi.

Za početak, kao i uvijek, trebali biste pogledati podatkovnu tablicu kako biste saznali gdje i što spojiti. Ako ne znate o mikro krugovima, vrijedi pročitati članak.

Započnimo. Sastavimo jednostavnu shemu s jednim motorom i upravljajmo njime. Obratite pozornost na dijagram montaže.

Ako ne znate engleski ili jednostavno ne razumijete podatkovnu tablicu, ovdje je opis veze. Nadam se da svi znaju numeriranje mikro krugova ili su naučili iz članka o mikro krugovima.

  • Pin 1 - Odgovoran za brzinu rotacije motora. Sličan je na pinu 9. Uzima vrijednosti od 0 do 255, koje se lako mogu organizirati pomoću PWM-a. EN sam spojio na peti pin Arduina koji podržava PWM.
  • Pinovi 2 i 7 - Odgovorni za smjer kretanja motora. Slični su na pinovima 10 i 15. Primjenom logičke jedinice na jedan od ovih pinova motor će se vrtjeti u jednom smjeru (ovisno o spoju motora), primjenom logičke jedinice na drugi motor će se vrtjeti u suprotan smjer.
  • Pinovi 3 i 6 - morate spojiti motor na njih. Polaritet nije bitan, samo će smjer vrtnje ovisiti o spoju. Slično - na pinovima 11 i 14.
  • Pinovi 4 i 5 su uzemljeni. Mislim da ne treba objašnjenje. Slično - 12 i 13.
  • Pin 8 - Napajanje za motore. Treba ga napajati u rasponu od 4,5 do 36 volti.
  • Pin 16 - na njega se napaja logička jedinica iz Arduina. 5 volti, ako ništa.

Sjajno! Motor je spojen. Sada možete kodirati.

#define FRW_BUT 7 //Gumb Naprijed #define BCW_BUT 6 //Gumb Natrag #define SPD 5 //Kontrola brzine vrtnje... #define FRW 4 //...smjer vrtnje (naprijed)... # definiraj BCW 3 / /...smjer rotacije (natrag) #define SPD_POT A5 int xspeed = 0; //Varijabla za određivanje brzine vrtnje motora int frw_move = 0; //Varijabla za naredbu "naprijed" int bcw_move = 0; //Varijabla za naredbu "back" void setup() ( //Pinovi dizajna pinMode(SPD, OUTPUT); pinMode(FRW, OUTPUT); pinMode(BCW, OUTPUT); pinMode(SPD_POT, INPUT); pinMode(FRW_BUT, INPUT_PULLUP); pinMode(BCW_BUT, INPUT_PULLUP); ) void loop() ( //Očitajte očitanja s potenciometra //i dovedite ih do željenog raspona - od 0 do 255 //Nakon toga - proslijedite na pin za kontrolu brzine xspeed = analogRead(SPD_POT); constrain(xspeed, 0, 1023); xspeed = map(xspeed, 0, 1023, 0, 255); //Odredite pritisak gumba naprijed if(!digitalRead(FRW_BUT)) ( frw_move = 1; ) else ( frw_move = 0; ) //Odredite pritisak na tipku "back" if(!digitalRead(BCW_BUT)) ( bcw_move = 1; ) else ( bcw_move = 0; ) //Pozovite funkciju za slanje podataka na L293D motor(); ) void motor() ( //Pošalji podatke na L293D analogWrite(SPD, xspeed); digitalWrite(FRW, frw_move); digitalWrite(BCW,bcw_move); )

Kako radi? Djeluje jednostavno. Kada pritisnete lijevu tipku, kotač se okreće u jednom smjeru, a kada pritisnete desnu tipku, vrti se u drugom smjeru. Okretanjem gumba potenciometra možete podešavati brzinu vrtnje motora. Rad našeg uređaja za ispitivanje motora prikazan je u videu.

Z.Y. Da, znam da kvaliteta videa nije dobra, ali pokušat ću što prije pronaći pristojnu kameru i dogovoriti mjesto snimanja.

Sada o povezivanju L293 kanala. Ako želite spojiti jači motor, možete kombinirati kanale.

Prvi način je paralelno povezivanje analognih izlaza mikro kruga, što će povećati maksimalnu snagu struje za faktor dva. Minus - samo jedan motor može se spojiti na jedan mikro krug.

Drugi način je lemiti još jedan L293 na vrh L293. Uzimamo i lemimo pin 1 na pin 1, pin 2 na pin 2 i tako dalje. Ova metoda također daje dvostruko povećanje struje, ali, za razliku od prve, ostavlja mogućnost upravljanja dvama motorima odjednom. Možda imate ideju - trebam li zalemiti još par L293? Nažalost, naknadno lemljenje mikro krugova neće dovesti do povećanja struje za još 600 mA. Povećanje će biti malo.

“Eh, morat ću očistiti svoj 12-voltni motor…” Nemojte se uzrujavati. Za snažnije motore prikladan je stariji brat L293 - L298, ali sada ga nećemo razmatrati. To ćemo učiniti malo kasnije.

Motor Štit

Slažem se da s takvim snopom žica sve ne izgleda baš dobro. Da biste ga se riješili, možete zalemiti krug s L293 na tiskani krug ili matičnu ploču za lemljenje, ali što ako ne želite lemiti ili ne znate kako? Za ovo postoje rješenja ključ u ruke u obliku štitova za Arduino, na primjer. Govorit ću o jednom od njih - Motor Shield V1 iz DK Electronics.

Evo, zapravo, fotografije štita.

Ovaj štit ima dva L293D, što vam omogućuje upravljanje četirima motorima odjednom. Tu su i dva kontakta za servomotore. Napajanje se napaja ili na terminalni blok ili, s instaliranim kratkospojnikom, iz Arduino napajanja. Skakač vam također omogućuje preuzimanje napajanja za Arduino sa štita. Za rad s ovim štitom postoji posebna biblioteka. Možete ga preuzeti.

Do minusa ploče. Za rad sa štitom koriste se gotovo svi digitalni pinovi, osim 0, 1, 2, 13. Kao što znamo, pinove 0 i 1 koristi Arduino za firmware, pa ih je bolje ne koristiti.

Postoji i dobra strana. Ako ne spojite servo, na primjer, pinovi 9 i 10 se oslobađaju, a ako ne koristite niti jedan motor, tada će se pinovi 3, 5, 6, 11 osloboditi, ovisno o neiskorištenom motoru. I dalje. Na raspolaganju imamo još šest analognih izlaza, koji se po želji mogu koristiti kao digitalni.

Počnimo spajati motore. Eksperimenta radi, napravit ćemo robota koji putuje naprijed, nazad, a također se okreće oko svoje osi. Kao platformu uzeo sam vlastiti razvoj, gore opisan. Možete uzeti što god vam srce želi, glavna stvar je da je prikladno u pogledu karakteristika.

Mi ćemo trebati

  • Arduino UNO - Može se koristiti bilo koji drugi Arduino UNO oblik. Leonardo ili Iskra, na primjer.
  • Motor Shield - Ostale verzije ovog štita će raditi.
  • Motori za 6V - Možete uzeti bilo koji koji odgovara karakteristikama Motor Shielda.
  • Kotači od 42 mm – Kotači koji odgovaraju motorima i platformi
  • Nosači motora - Motori moraju biti pričvršćeni na platformu. Uzmi onu koja ti odgovara.
  • Napajanje - Uzeo sam baterijski paket i izvukao oko 5 volti, što nije dovoljno za napajanje motora i Arduina, pa sam spojio DC/DC pretvarač i digao napon na 9V. Ako nema pretvarača, tada možete koristiti uobičajenu krunu spajanjem na Arduino napajanje.

Vrijeme je da sastavite našeg robota.

Korak 1

Spajamo Arduino i Motor Shield.

Korak 2

Sastavljamo motore i pričvršćujemo ih na platformu.

3. korak

Snagu prikupljamo preko pretvarača pojačanja.

Za one koji imaju Cronu. Ne zaboravite džemper!

Korak 4

Motore pričvršćujemo na Motor Shield pomoću Arduina.

Korak 5

Dodamo hranu.

Korak 6 (izborno)

Pričvrstite poklopac - za estetiku.

Imamo gotovog robota. Sada je vrijeme da ga programirate. Pogledajmo kod.

//Uključi biblioteku za rad s Motor Shieldom #include //Odredite lijevi motor na terminalnom bloku broj 2 AF_DCMotor l_motor(2); //Definirajte desni motor na stezaljku broj 3 AF_DCMotor r_motor(3); //Varijable za određivanje brzine //i vremena kretanja int spd = 50; inttime(1000); void setup() ( //Postavite početnu brzinu i isključite motore l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(100); r_motor.run(RELEASE); ) void loop() ( // Vozi naprijed l_motor.run(NAPRIJED); r_motor.run(NAPRIJED); l_motor.setSpeed(spd); r_motor.setSpeed(spd); kašnjenje(vrijeme); // Vozi unatrag l_motor.run(NATRAG); r_motor. run(NATRAG); l_motor.setSpeed(spd); r_motor.setSpeed(spd); kašnjenje(vrijeme); // Okretanje u smjeru suprotnom od kazaljke na satu l_motor.run(NAPRIJED); r_motor.run(NATRAG); l_motor.setSpeed(spd); r_motor . setSpeed(spd); delay(time); // Okretanje u smjeru kazaljke na satu r_motor.run(FORWARD); l_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); )

Sjajno! Vrijeme je za provjeru. Evo videa s mog testa. A ti?

"Jeste li rekli nešto o robotskim pločama?" - mogu reći oni koji čitaju uvodnu lekciju 2. dijela tečaja. Da, postoje takve naknade. Razmotrite robotsku platformu Strela.

San o robotici. (Skoro). Opisao sam prednosti ploče. Ravno na bit.

Na njemu je instaliran stariji brat L293 - L298. I pinovi su prikazani u trostrukom obliku, što je upravo za spajanje mnogih senzora.

Ova se ploča može spojiti umjesto Arduino UNO i Motor Shielda. Osim toga, dečki iz Amperke napisali su biblioteku za rad sa Arrowom, što upravljanje motorima čini prilično trivijalnim zadatkom.

Za one koji ne znaju, da vam kažem. Svaka normalna knjižnica ima primjere kako je koristiti, a knjižnica Arrow nije iznimka. Da biste ih pronašli, idite na karticu Datoteka -> Primjeri -> Strela. Tamo odabiremo primjer StrelaMotors, gdje se izvodi skica koja je slična skici pomoću Motor Shielda. Usput, postoje i primjeri za Motor Shield. Ako vas zanima, pogledajte.

Što još možete učiniti sa Arrowom - pogledajte dolje. A mi prelazimo na bežičnu komunikaciju putem Bluetootha.

Bluetooth

Robot koji se sam vozi po sobi je, naravno, dobar, ali volio bih sam upravljati robotom. Da biste to učinili, morate organizirati vezu između Arduina i upravljačkog uređaja.

Kao kontrolni uređaj odabrao sam pametni telefon. Organizirati ćemo komunikaciju putem Bluetooth protokola, pa je vrijeme za upoznavanje.

Ovo je HC-06 modul. Neću ići previše u detalje, ali ako vas zanima, idemo dalje. Naš cilj je upravljati robotom sa pametnog telefona. Počnimo, možda.

Prvo morate spojiti HC-06 na Arduino. Povezat ćemo se pomoću Software Serial-a. Ova biblioteka vam omogućuje da emulirate serijski port na pinovima koji su nam potrebni. Eksperimenta radi, pokušajmo to učiniti na pinovima A0(RX) i A1(TX). Za što? Zapamtite što sam rekao o Motor Shieldu.

Spajamo se ovako:

  • Vcc - do 5V
  • GND na GND
  • RX u TX
  • TX u RX

Povezat ću HC-06 s robotom kojeg smo napravili iznad. Da bismo to učinili, koristit ćemo tri pruge na motornom štitu.

Robot je spreman. Ostalo je programirati.

Prije čitanja koda morate znati nekoliko stvari. Motori nisu savršeni, kao ni sve na ovom svijetu. Čak će se i dva motora iz iste serije koji slijede jedan za drugim malo razlikovati, što će utjecati na razliku u broju okretaja pri istom naponu. Ako su motori jednostavno spojeni na motor Shield i na njih se primijeni ista brzina, a ovo je isti napon, tada robot neće ići ravno, već malo, ili puno, u stranu. To se može vidjeti u videu iznad.

Kako bismo to izbjegli, primijenit ćemo faktore prilagodbe. Lijevi kotač mi se okreće puno brže od desnog, pa sam za kompenzaciju stavio faktor 0,62. Vrijednost koeficijenta odabire se eksperimentalno.

// Uključite biblioteke za rad s Motor Shield i Software Serial #include #uključi //Određivanje pinova za SoftwareSerial emulaciju mySerial(A0, A1); // RX, TX //Definirajte lijevi motor na priključak broj 2 AF_DCMotor l_motor(2); //Definirajte desni motor na stezaljku broj 3 AF_DCMotor r_motor(3); //Varijable za određivanje brzine //i podešavanje rotacije float spd = 70.0; float corr_l = 0,62; float corr_r = 1; floatrot = 50,0; void setup() ( //Postavi početnu brzinu i isključi motore l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(spd); r_motor.run(RELEASE); //Uspostavi vezu s HC-06 mySerial .begin(9600); ) void loop() ( //Ako ima podataka, //pozovi kontrolnu funkciju if (mySerial.available()) ( drive(); ) ) void drive() ( //Varijabla za dolazni podaci char control = mySerial.read(); //Prvo postavite brzinu if (((control - "0") >= 0) && ((control - "0")<= 9)) { spd = (control - "0") * 25.0; //сохраняем новое значение скорости } else if (control == "q") { spd = 255.0; } //Сравниваем команды, пришедшие со смартфона else if (control == "S") //Если пришла команда "S", стоим { l_motor.run(RELEASE); r_motor. run(RELEASE); } else if (control == "F") //Если пришла команда "F", едем вперед { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "B") //Если пришла команда "B", едем назад { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "I") //Если пришла команда "I", едем вперёд и направо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r + rot); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "J")//Если пришла команда "J", едем назад и направо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r + rot); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "G") //Если пришла команда "G", едем вперёд и налево { l_motor.setSpeed(spd * corr_l + rot); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "H") //Если пришла команда "H", едем назад и налево { l_motor.setSpeed(spd * corr_l + rot); r_motor.setSpeed(spd * corr_r); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "R") //Если пришла команда "R", крутимся вправо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(BACKWARD); } else if (control = "L") //Если пришла команда "L", крутимся влево { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); l_motor.run(FORWARD); r_motor.run(BACKWARD); } }

Robot je upitan. Sada uzmimo pametni telefon.

RC kontroler

Postoji mnogo različitih aplikacija za povezivanje Arduina i pametnog telefona putem Bluetootha. U pretrazi će ključne riječi biti: Arduino, Bluetooth, RC.

Odabrao sam aplikaciju pod nazivom Bluetooth RC Controller. Savršen je za našu svrhu. Kada se pritisne gumb, aplikacija šalje vrijednost char u HC-06, koji zauzvrat prosljeđuje dolaznu vrijednost u Arduino. Vrijednost poslana kada se klikne na gumb je sama postavljena.

Za uspostavljanje veze s robotom potrebno je kliknuti na zupčanik i odabrati stavku “Postavke” U “Postavke” morate provjeriti odgovaraju li gumbi ovim poslanim znakovima ili promijeniti Arduino kod.

Nakon postavljanja znakova, možete uspostaviti vezu s HC-06. Pritisnite zupčanik i idite na "Poveži se s automobilom" Otvara se prozor s uparenim uređajima. U njemu odabiremo HC-06. Ako ga nema, tražimo ga pomoću "Skeniraj uređaje". Ako je uređaj pronađen, ali se ne želi upariti, idite na Bluetooth na svom pametnom telefonu i uparite ga kao i obično. Zadana lozinka je 1234. Nakon toga idite na “Skeniraj uređaje” i povežite se.

Kada se veza uspostavi, zeleno svjetlo na vrhu će se upaliti, a HC-06 će prestati treptati. Možete početi voziti. Traka na vrhu odgovorna je za brzinu kretanja.

Vratimo se Arrowu. Još jedna prednost Arrowa je mogućnost instaliranja Bluetooth XBee formata, a dobra stvar je što ostali pinovi ostaju slobodni. A budući da postoji gotova biblioteka za Arrow koja pomaže smanjiti kod za upravljanje motorima, vrlo je vrijedno koristiti Arrow za upravljanje robotom putem Bluetootha.

Da biste to učinili, trebate spojiti XBee na Strelu, flashati ga skicom iz primjera pod nazivom “ArduinoBluetoothRCCarOnStrela” i spojiti se na XBee preko RC kontrolera.

Savjet

Moj robot je spreman i čak vozi na naredbu s pametnog telefona. Ali ne može sve ići glatko. Govorit ću o nekim problemima i njihovim rješenjima, kao i dati nekoliko savjeta robotičarima početnicima.

Kotači se vrte u pogrešnom smjeru- ovaj problem se lako uklanja preuređivanjem žica u stezaljkama ili programski.

Bluetooth modul ne radi- trebate provjeriti prisutnost gorućeg crvenog LED-a na modulu. Ako ne svijetli, provjerite je li Bluetooth modul ispravno spojen. Ako LED svijetli, ali je veza uspostavljena, morate provjeriti je li RX modula spojen na TX ploče i obrnuto, te isprobati metodu uparivanja modula s Arduinom preko standardnog Bluetooth sučelje.

Robot ne vozi ravno- Opisao sam ovaj problem malo više kada sam govorio o Bluetoothu i Motor Shieldu.

Tijekom vožnje robot se iznenada zaustavlja i gubi vezu sHC-06- Postoji problem s napajanjem. Znamo da Arduinu treba najmanje 7V za stabilan rad, a znamo i da motori jako dobro jedu. Ako sonde multimetra prinesete stezaljkama napajanja i izmjerite napon s isključenim motorima, a zatim ih uključite, možete vidjeti da će napon na multimetru pasti. Štoviše, napon može pasti na različite načine.

Ako se spoji napajanje koje ne može dati dovoljno struje za motore, onda napon može jako pasti, sa 9 na 5 volti, na primjer, i 5V više neće biti dovoljno za Arduino i on će se ponovno pokrenuti. Rješenje je spojiti jače napajanje. Kako izračunati, reći ću u nastavku.

Ako spojite jači izvor napajanja, tada pad napona može biti samo nekoliko milisekundi, ali oni mogu biti dovoljni za ponovno pokretanje kontrolera. Rješenje je ugraditi kondenzator od najmanje 1000 uF paralelno s strujnim žicama, kapacitet se može odrediti eksperimentalno. Stavio sam kondenzator na 3300 uF i na 16V. Ne zaboravite pogledati maksimalni napon kondenzatora.

Kada je napajanje dovoljno snažno, pad napona nije veći od 0,2 V.

Nekoliko savjeta za početnike u robotici

Započinjući raspored robota, prvo što treba učiniti je voditi računa o izračunu snage pogonske jedinice i odabiru odgovarajućeg izvora napajanja. Bit će šteta ako 4 AAA baterije ne napajaju vaša 4 motora od 6V, a nema mjesta za dodatno napajanje.

Za izračun snage tražimo karakteristike motora, ploča, senzora. Iz tijeka fizike znamo da se snaga može izračunati formulom P = IU, gdje je I trenutna snaga, U je napon. Koristeći ovu formulu i karakteristike, lako je izračunati potrošnju energije gotovog uređaja, a znajući potrošnju energije i radni napon napajanja, možete saznati optimalnu snagu struje potrebnu za rad uređaja, znajući struju snagu, iz odabrane baterije možete odrediti potreban kapacitet baterije i vrijeme rada uređaja.

Kao što sam rekao, uvijek treba postaviti određeni cilj, nakon čijeg se postizanja projekt može smatrati završenim. Postoje nijanse ove misli. Ako je projekt dovoljno velik, onda doći do cilja nije tako lako, pogotovo kada pišete kod. Jednom kada sam napisao veliki kod, pomislio sam - “Sad ću sve napisati i provjeriti! ' prilikom pokušaja prevođenja koda, nije se odmah preveo jer je bilo nekoliko pogrešaka. Uklonio sam greške, ali jedino kod nije radio kako sam htio. Morao sam sve prepisati gotovo od nule, postupno dodajući kod i provjeravajući operativnost rezultirajućeg koda. Stoga vam savjetujem da učinite isto.

Ako postoji cilj napraviti "lozinku" od tri znaka, tada ne biste trebali programirati sva tri odjednom. Bolje je napraviti lozinku od jednog znaka, provjeriti je, zatim od dva, a nakon provjere - od tri. Pomaže mi.

Robot je stvoren metodom pokušaja i pogreške. Neće biti moguće programirati jednom tako da se radnja izvede savršeno. Isti tuning koeficijenti su na kotačima, tako da ne treba odustajati ako nešto ne ide, a ako nikako ne ide, onda se možete obratiti ljubaznim ljudima na forumima ili mi pisati, mi sigurno će pomoći!

Zaključak

Robotika je sjajna! Uskoro će, mislim, roboti zauzeti, pa čak i već zauzeti mjesto u životima ljudi. Napravili smo najjednostavniji robot-auto upravljan s pametnog telefona, kasnije ćemo se pozabaviti ozbiljnijim projektima, ali za sada – vidimo se!

Počinju učiti arduino stvaranjem jednostavnih robota. Danas ću govoriti o najjednostavnijem robotu na arduino uno, koji će poput psa pratiti vašu ruku ili bilo koji drugi objekt koji reflektira infracrveno svjetlo. Također, ovaj robot će zabaviti djecu. Moj trogodišnji nećak rado se igrao s robotom :)

Počet ću s popisom dijelova koji će biti potrebni prilikom izgradnje - Arduino UNO;

Infracrveni daljinomjeri;

- 3-voltni motori s mjenjačem i kotačima;

- konektori za 3A baterije;

-baterija (ako nema dovoljno baterija);

- Relej za kontrolu motora;

Pa, i drugi materijali koji će biti potrebni u procesu stvaranja.
Prvo napravimo bazu. Odlučio sam ga napraviti od drveta. Ispilio sam drvenu dasku na takav način da motori savršeno sjede u utorima


Zatim stežem motore drvenom daskom, zavrtajući ovu šipku

Dalje na kućište stavio sam arduino, relej, brainboard, daljinomjere, a ispod baze šasije rotirajući

Sada povezujemo sve prema shemi

Na kraju u arduino učitavamo sljedeću skicu:

Const int R = 13; //pinovi na koje su spojeni IC daljinomjeri const int L = 12; int motor L = 9; //pinovi na koje je spojen relej int motorR = 11; int buttonState = 0; void setup() ( pinMode(R,INPUT); pinMode(L,INPUT); pinMode(motorR,OUTPUT); pinMode(motorL,OUTPUT); ) void loop() ( ( buttonState = digitalRead(L); if (buttonState == HIGH)( digitalWrite(motorR,HIGH); ) else ( digitalWrite(motorR,LOW); ) ) (( buttonState = digitalRead(R); if (buttonState == HIGH)( digitalWrite(motorL,HIGH); ) else ( digitalWrite(motorL,LOW); ) ) )

Princip rada je vrlo jednostavan. Lijevi daljinomjer odgovoran je za desni kotač, a desni za lijevi

Da bi bilo jasnije, možete pogledati video koji prikazuje proces stvaranja i djelovanje robota

Ovaj robot je vrlo jednostavan i svatko ga može napraviti. Pomoći će vam da razumijete kako rade moduli kao što su releji i IR daljinomjeri i kako ih najbolje koristiti.

Nadam se da ste uživali u ovoj rukotvorini, zapamtite da je rukotvorina cool!

Završni dio članka je o malom robotu kojeg sastavljamo na šasiju - poklopac od plastične posude za hranu. Mozak našeg robota je Arduino UNO ploča, Driver Motor Shield ploča upravlja motorima i servo pogonom, senzor prepreka - Ultrasonic sonar - oči kao Wally (iz crtića) - "HC-SR04 Ultrasonic Sensor". , . Kako napraviti robota na Arduinu?

9. Spajanje baterije i motora

Kada spajate bateriju, morate biti potpuno sigurni da je polaritet ispravan, kako kažu, 7 puta mjeri, jednom priključi. Pokušajte slijediti ovo pravilo - crvena žica je uvijek na + napajanje, crna žica je uzemljena, to je minus, to je GND. Proizvođači pokušavaju slijediti ista pravila. Stoga spajamo žice koje dolaze iz odjeljka za baterije na + M i GND blok, na kontrolnoj ploči motora. Spojimo žice od pogonskih motora na blokove M1, M2 upravljačke ploče motora. Lijeva strana u smjeru vožnje je spojena na blok M1, desna na blok M2. O polaritetu motora još ne biste trebali brinuti, on se može promijeniti ako nešto pođe po zlu tijekom testa.

10. Provjerite polaritet i ispravno spajanje modula

Vrlo bitan i ključan trenutak kod sastavljanja mikrorobota je provjeriti ispravnu instalaciju, spojeve, module prema blok shemi, pogledati oznake na pločama, provjeriti testerom, polaritet napajanja, tko ima tester.

11. Arduino programski korak

Program se na Arduino mikrokontroler učitava s računala, pomoću USB kabela i posebnog programa - okruženja za programiranje i uređivanje skica (programa) - Arduino IDE. Program možete preuzeti na web stranici arduino.cc, odjeljak Download, gdje uvijek možete preuzeti najnoviju, najnoviju verziju programa. Nakon što je okruženje za programiranje instalirano, ostaje samo da iz izbornika driver programa odaberete za koju ploču želite koristiti - u našem slučaju Arduino UNO, te COM port preko kojeg je Arduino spojen putem USB emulacije. Postoji mnogo raznih priručnika o ovoj temi, pa preskačemo ovu fazu (za svaki slučaj - izbornik Alati > Serijski priključak).

Program za mikro robota dostupan je na našoj web stranici, ali tek nakon registracije, šala Mini Robot na Arduinu. Da bi program radio, potrebne su dodatne biblioteke - AFMotor.h, Sevo.h, NewPing.h, sve su u arhivi, potrebno je raspakirati arhivu u mapu instalirani program Arduino IDE. Za mene je ovo direktorij c: Program Files (x86) Arduino, biblioteke se moraju smjestiti u mapu c: Program Files (x86) Arduino libraries. Zatim idite u direktorij c:Program Files (x86)ArduinolibrariesAPC_4_ROBOT i dvaput kliknite na APC_4_ROBOT.ino ovo je sama skica, tada će se pokrenuti okruženje za programiranje. Spojimo golu Arduino Uno ploču (što znači bez spojenih modula) putem USB kabela na računalo, pritisnemo gumb sa strelicom desno, program će se početi učitavati na kontroler. Cijeli proces traje nekoliko sekundi, a ako je sve ispravno spojeno, crveni natpisi ne bi trebali svijetliti, a indikator u donjem desnom kutu dovršit će svoje kretanje 100%. Program za Arduino instaliran je u Atmega328 kontroleru.

12. Pokretanje robota

Mini robot na Arduinu - spreman za pokret. Robot Wally

Moguće je izvesti prvi, ali još uvijek probni rad našeg robota. Naš robot nije išao kako treba, jedan kotač se vrtio pravilno, a drugi u suprotnom smjeru. Morao sam promijeniti polaritet žica motora na bloku M2. Ali tada se naš mali robot časno nosio sa svim kutovima i preprekama u sobi.

Ovaj članak posvećujem svim početnicima koji odluče naučiti Arduino. Daljnje učenje može se nastaviti od prve lekcije - treptanje LED-a. Gradivo s robotom je vrlo zanimljivo, a kako bih vas zainteresirao, odlučio sam započeti s tim kako točno napraviti robota koji obilazi prepreke. Ostalo će biti puno lakše, i ići će kao podmazano. Ovaj robot stvarno radi. Sretno svima!

p.s. Bio je to prilično slobodan prijevod članka pronađenog, nekada davno, na beskrajnim prostranstvima interneta, više naravno geg, jer je sve rađeno na novi način, crteži su dorađeni, nije bilo referenci na izvor , jer je dokument bio Word dokument.

Gore