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

Hajde da razgovaramo o tome kako možete koristiti Arduino za kreiranje robota koji balansira kao Segway.

Segway sa engleskog. Segway je stajaće vozilo na dva točka opremljeno električnim pogonom. Nazivaju se i žiroskuteri ili električni skuteri.

Jeste li se ikada zapitali kako funkcionira Segway? U ovom tutorijalu pokušaćemo da vam pokažemo kako da napravite Arduino robota koji se balansira baš kao Segway.

Kako bi uravnotežili robota, motori moraju spriječiti pad robota. Ova akcija zahtijeva povratne informacije i korektivne elemente. Element povratne sprege - , koji obezbeđuje i ubrzanje i rotaciju u sve tri ose (). Arduino to koristi da zna trenutnu orijentaciju robota. Korektivni element je kombinacija motora i točka.

Krajnji rezultat bi trebao biti otprilike ovako:

Šema robota

L298N modul pokretača motora:

DC zupčasti motor sa kotačem:

Samobalansirajući robot je u suštini obrnuto klatno. Može se bolje izbalansirati ako je centar mase viši u odnosu na osovine kotača. Viši centar mase znači veći maseni moment inercije, što odgovara nižem kutnom ubrzanju (sporiji pad). Zato smo stavili bateriju na vrh. Međutim, visina robota je odabrana na osnovu dostupnosti materijala 🙂

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

Teorija

U teoriji upravljanja, držanje neke varijable (u ovom slučaju pozicije robota) zahtijeva poseban kontroler nazvan PID (proporcionalni integralni derivat). Svaki od ovih parametara ima "pojačanje", koje se obično naziva Kp, Ki i Kd. PID obezbeđuje korekciju između željene vrednosti (ili ulaza) i stvarne vrednosti (ili izlaza). Razlika između ulaza i izlaza naziva se "greška".

PID regulator smanjuje grešku na najmanju moguću vrijednost kontinuiranim podešavanjem izlaza. U našem samobalansirajućem Arduino robotu, ulaz (koji je željeni nagib u stupnjevima) postavlja softver. MPU6050 očitava trenutni nagib robota i uvodi ga u PID algoritam koji izvodi proračune za kontrolu motora i držanje 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 automatsko izračunavanje ovih vrijednosti. Nažalost, u našem slučaju ne možemo koristiti MATLAB jer će to dodatno zakomplikovati projekat. Umjesto toga, mi ćemo podesiti PID vrijednosti. Evo kako to učiniti:

  1. Postavite Kp, Ki i Kd na nulu.
  2. Podesite Kp. Premalo Kp će uzrokovati pad robota jer popravak nije dovoljan. Previše Kp tjera robota da podivlja naprijed-nazad. Dobar Kp će natjerati robota da se prilično naginje naprijed-nazad (ili malo oscilira).
  3. Kada je Kp podešen, podesite Kd. Dobra Kd vrijednost će smanjiti oscilacije sve dok robot ne bude gotovo stabilan. Također, odgovarajući Kd će zadržati robota čak i ako ga gurnete.
  4. Konačno, instalirajte Ki. Kada je uključen, robot će oscilirati čak i ako su Kp i Kd podešeni, ali će se vremenom stabilizirati. Ispravna vrijednost Ki će skratiti vrijeme potrebno za stabilizaciju robota.

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

Arduino kod za samobalansirajućeg robota

Trebale su nam četiri eksterne biblioteke za kreiranje našeg robota. PID biblioteka olakšava izračunavanje vrednosti P, I i D. Biblioteka LMotorController se koristi za kontrolu dva motora sa L298N modulom. Biblioteka I2Cdev i biblioteka MPU6050_6_Axis_MotionApps20 dizajnirane su za čitanje podataka sa MPU6050. Možete preuzeti kod uključujući biblioteke u ovom spremištu.

#include #include #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 kontrola/status vars bool dmpReady = false; // postavi na istinito ako je DMP init bio uspješan uint8_t mpuIntStatus; // sadrži stvarni bajt statusa prekida iz MPU uint8_t devStatus; // vraća status nakon svake operacije uređaja (0 = uspjeh, !0 = greška) uint16_t packetSize; // očekivana veličina DMP paketa (podrazumevana je 42 bajta) uint16_t fifoCount; // broj svih bajtova trenutno u FIFO uint8_t fifoBuffer; // FIFO memorijski bafer // orijentacija/pokret vars Quaternion q; // kvaternion kontejner VectorFloat gravity; // vektor gravitacije float ypr; // yaw/pitch/roll kontejner i gravitacijski vektor //PID double originalSetpoint = 173; dvostruka zadana vrijednost = originalna zadana vrijednost; dvostruki pokretniAngleOffset = 0,1; dvostruki ulaz, izlaz; //prilagodite ove vrijednosti tako da odgovaraju vašem vlastitom dizajnu double Kp = 50; dvostruki 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 pin za prekid MPU-a otišao visoko void dmpDataReady() ( mpuInterrupt = true; ) void setup() ( // pridruži se I2C sabirnici (I2Cdev biblioteka to ne radi 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(); devize.initialize(); devizeStatus); // ovdje dostavite vlastite žiroskopske pomake, skalirane za minimalnu osjetljivost mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 tvornički zadani za moj test čip // provjeri da li radi (vraća 0 ako je tako) if (devStatus == 0) ( // uključite DMP, sada kada je spreman mpu.setDMPEnabled(true); // omogući detekciju Arduino prekida attachInterrupt(0 , dmpDataReady) , RISING); mpuIntStatus = mpu.getIntStatus(); // postavite našu oznaku DMP Ready tako da glavna funkcija loop() zna da je u redu koristiti je dmpReady = true; // dobijete očekivanu veličinu DMP paketa za kasnije poređenje packetSize = mpu.dmpGetFIFOPacketSize(); //podešavanje PID pid.SetMode(AUTOMATIC); pid.SetSampleTime(10); pid. SetOutputLimits(-255, 255); ) else ( // GREŠ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 nije uspio (kod ")); Serial.print(devStatus); Serial.println(F(")")); ) ) void loop() ( // ako programiranje nije uspjelo, ne pokušavajte ništa učiniti ako (!dmpReady ) return; // čekanje MPU prekida ili dodatnih paketa dostupnih 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ćava da odmah pročitamo više bez čekanja na prekid) fifoCount -= packetSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); ulaz = ypr * 180/M_PI + 180; ) )

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

To je sve za sada. Vidimo se.

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

3 DŠtampač

Ako želim da napravim robota, moram da se odlučim za platformu na koju ću ugraditi motore, ploče, baterije. Naravno, mogu kupiti gotovu verziju, ali zanimljivije je napraviti platformu sami. Takva platforma će definitivno zadovoljiti vaše zahtjeve. Platforma se može napraviti od org. Staklo, šperploča, a ja ću ga napraviti od plastike.

Možete reći da je nezgodno sami napraviti platformu i trebat će vam puno alata, od centralnog udarca do mašina za mlevenje. A ja kažem da nam je potrebna mašta i 3D štampač.

3D štampač? Vjerovatno je svima poznat običan uredski štampač koji može odštampati tekst koji nam je potreban na A4 formatu. Dakle, 3D štampač je štampač koji može da odštampa željeni deo. Postoje različiti 3D štampači. Imam štampač sa FDM tehnologijom (nanošenje sloja po sloj). Koje su druge tehnologije 3D štampanja dostupne možete pronaći na internetu.

Mnogi 3D štampači rade na Arduinu. Ako želite, možete napraviti svoj vlastiti 3D štampač. Glavna ideja 3D štampača je da možete ispisati apsolutno bilo koju stvar, ali mi ćemo odštampati tijelo za robota.

Prvo, definirajmo opis platforme. Želim da platforma bude na 2 kotača i da mora stati na Arduino, napajanje, motore i neke senzore.

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

Kada je raspored spreman, moraćete da napravite 3D model platforme. Postoji mnogo programa za ovo. Obično koristim. Neću podučavati kako se radi sa Kompasom, ali ako ste zainteresovani, možete pogledati na internetu ili pitati u komentarima da napravite lekciju o Kompasu.

Ovo je platforma koju sam smislio.

Nakon toga, potrebno je da konvertujete 3D model u G-kod razumljiv 3D štampaču. Za to postoje posebni programi - rezači. Koristim program Repetier-Host sa Sli3er rezačom. Evo kako izgleda dio spreman za štampanje.

A evo i štampanog modela.

Tek nedavno smo dobili ideju, a gotovi dio je već pred nama. Uz pomoć 3D štampača možete kreirati jedinstvene stvari u pojedinačnim kopijama. 3D štampač je odličan. Savjetujem svima!

Motori

Sada moramo razmisliti o tome kako će se naš mobilni robot kretati. Prvo što mi pada na pamet su točkovi. Pa hajde da to uradimo.

Ako se neko sjeća, već smo pokušali spojiti motor na Arduino. Ko 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 rotacije. Vrijeme je da naučite Arduino kako stvarno kontrolirati motore!

Da biste to učinili, možete koristiti L293D čip. L293D vam omogućava da istovremeno kontrolišete dva motora, sa strujom od 600 mA po kanalu i vršnom strujom do 1000 mA, a ako kombinujete kanale, onda do 1200 mA i 2000 mA vršne struje. O asocijaciji ću govoriti u nastavku.

Za početak, kao i uvijek, trebali biste pogledati Datasheet kako biste shvatili gdje i šta da povežete. Ako ne znate o mikro krugovima, onda je vrijedno pročitati članak.

Hajde da počnemo. Hajde da sastavimo jednostavnu šemu s jednim motorom i upravljamo njime. Obratite pažnju na dijagram montaže.

Ako ne znate engleski ili jednostavno ne razumijete Datasheet, evo opisa veze. Nadam se da svi znaju numeraciju mikro krugova ili su naučili iz članka o mikro krugovima.

  • Pin 1 - Odgovoran za brzinu rotacije motora. Sličan je i na pinu 9. Uzima vrijednosti od 0 do 255, što se lako može organizirati pomoću PWM-a. Povezao sam EN na peti pin Arduina, koji podržava PWM.
  • Pinovi 2 i 7 - Odgovorni su za smjer kretanja motora. Slične su na pinovima 10 i 15. Primjena logičke na jedan od ovih pinova učinit će da se motor okreće u jednom smjeru (u zavisnosti od priključka motora), primjena jedne logičke na drugi će dovesti do okretanja motora u suprotan smjer.
  • Pinovi 3 i 6 - Morate spojiti motor na njih. Polaritet nije važan, samo će smjer rotacije ovisiti o priključku. Slično - na pinovima 11 i 14.
  • Pinovi 4 i 5 su brušeni. Mislim da nije potrebno objašnjenje. Slično - 12 i 13.
  • Pin 8 - Snaga za motore. Potrebno ga je napajati u rasponu od 4,5 do 36 volti.
  • Pin 16 - logička jedinica mu se napaja iz Arduina. 5 volti, ako ništa.

Odlično! Motor je spojen. Sada možete kodirati.

#define FRW_BUT 7 //dugme naprijed #define BCW_BUT 6 //dugme za povratak #define SPD 5 //Kontrola brzine rotacije... #define FRW 4 //...smjer rotacije (naprijed)... # definiraj BCW 3 / /...smjer rotacije (unazad) #define SPD_POT A5 int xspeed = 0; //Varijabla za određivanje brzine rotacije motora int frw_move = 0; //Varijabla za naredbu "naprijed" int bcw_move = 0; //Varijabla za naredbu "nazad" void setup() ( //Dizajn postavlja 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 u željeni raspon - od 0 do 255 //Nakon - proslijedite na pin za kontrolu brzine xspeed = analogRead(SPD_POT); constrain(xspeed, 0, 1023); xspeed = map(xspeed, 0, 1023, 0, 255); //Odredite dugme za naprijed pritisnite if(!digitalRead(FRW_BUT)) ( frw_move = 1; ) else ( frw_move = 0; ) //Odredite pritisak na dugme "nazad" if(!digitalRead(BCW_BUT)) ( bcw_move = 1; ) else ( bcw_move = 0; ) //Pozovite funkciju za slanje podataka na L293D motor(); ) void motor() ( //Šalji podatke na L293D analogWrite(SPD, xspeed); digitalWrite(FRW, frw_move); digitalWrite(BCW,bcw_move); )

Kako to radi? Radi jednostavno. Kada pritisnete lijevo dugme, kotač se okreće u jednom smjeru, a kada pritisnete desno dugme, okreće se u drugom smjeru. Okretanjem dugmeta potenciometra možete podesiti brzinu rotacije motora. Rad naše opreme za testiranje motora prikazan je u videu.

Z.Y. Da, znam da kvalitet videa nije sjajan, ali pokušaću da nađem pristojnu kameru i uredim mesto za snimanje što pre.

Sada o povezivanju L293 kanala. Ako želite spojiti snažniji motor, možete kombinirati kanale.

Prvi način je paralelno povezivanje analognih izlaza mikrokola, što će povećati maksimalnu jačinu struje za faktor dva. Minus - samo jedan motor može biti spojen na jedno mikrokolo.

Drugi način je da zalemite još jedan L293 na 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 jačine struje, ali, za razliku od prve, ostavlja mogućnost upravljanja dva motora odjednom. Možda imate ideju - da zalemim još par L293? Nažalost, naknadno lemljenje mikro krugova neće dovesti do povećanja jačine struje za još 600 mA. Povećanje će biti malo.

„Eh, moraću da počistim svoj 12-voltni motor...“ Ne uzrujavajte se. Za snažnije motore prikladan je stariji brat L293 - L298, ali sada ga nećemo razmatrati. To ćemo uraditi malo kasnije.

Motor Štit

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

Evo, zapravo, fotografije štita.

Ovaj štit ima dva L293D, što vam omogućava da istovremeno kontrolišete četiri motora. Postoje i dva kontakta za servomotore. Napajanje se napaja ili do terminalnog bloka ili, sa instaliranim kratkospojnikom, iz Arduino napajanja. Džamper vam takođe omogućava da preuzmete napajanje za Arduino sa štita. Postoji posebna biblioteka za rad sa ovim štitom. Možete ga preuzeti.

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

Postoji i dobra strana. Ako ne povežete servos, na primjer, pinovi 9 i 10 se oslobađaju, a ako ne koristite nijedan od motora, tada će pinovi 3, 5, 6, 11 biti otpušteni, ovisno o neiskorištenom motoru. I dalje. Još uvijek imamo na raspolaganju šest analognih izlaza, koji se po želji mogu koristiti kao digitalni.

Počnimo spajati motore. Radi eksperimenta napravićemo robota koji putuje napred, nazad, a takođe rotira oko svoje ose. Kao platformu, uzeo sam svoj razvoj, gore opisan. Možete uzeti sve što vam srce poželi, najvažnije je da je prikladno po karakteristikama.

Trebaće nam

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

Vrijeme je da sastavimo našeg robota.

Korak 1

Povezujemo Arduino i Motor Shield.

Korak 2

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

Korak 3

Snagu prikupljamo preko pojačivača.

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

Korak 4

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

Korak 5

Dodamo hranu.

Korak 6 (opciono)

Pričvrstite poklopac - za estetiku.

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

//Uključi biblioteku za rad sa motornim štitom #include //Odredite lijevi motor na terminalu broj 2 AF_DCMotor l_motor(2); //Definirajte desni motor na terminalu broj 3 AF_DCMotor r_motor(3); //Varijable za određivanje brzine //i vremena kretanja int spd = 50; inttime(1000); void setup() ( //Podesite 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() ( // Vožnja 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(BACKWARD); r_motor. run(NAZAD ); 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(NAZAD); l_motor.setSpeed(spd); r_motor setSpeed(spd); kašnjenje(vrijeme); // Okretanje u smjeru kazaljke na satu r_motor.run(FORWARD); l_motor.run(NAZAD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); kašnjenje(vrijeme); )

Odlično! Vrijeme je za provjeru. Evo video s mog testa. sta je sa tobom?

"Jeste li rekli nešto o robotskim pločama?" - mogu reći oni koji su pročitali uvodnu lekciju 2. dijela kursa. Da, postoje takve naknade. Uzmite u obzir robotsku platformu Strela.

Robotics dream. (Skoro). Opisao sam prednosti ploče. Pravo na stvar.

Na njemu je instaliran stariji brat L293 - L298. I igle su prikazane trostruko, što je taman za povezivanje mnogih senzora.

Ova ploča se može spojiti umjesto Arduino UNO i Motor Shield-a. Osim toga, momci iz Amperke su napisali biblioteku za rad sa Arrow-om, zbog čega je upravljanje motorima prilično trivijalan zadatak.

Za one koji ne znaju, da vam kažem. Svaka normalna biblioteka ima primjere kako je koristiti, a Arrow biblioteka nije izuzetak. Da biste ih pronašli, idite na File -> Examples -> Strela tab. Tamo biramo primjer StrelaMotors, gdje se izvodi skica koja je slična skici koristeći Motor Shield. Inače, postoje i primjeri za Motor Shield. Ako ste zainteresovani, pogledajte.

Šta još možete da uradite sa strelicom - pogledajte u nastavku.I prelazimo na bežičnu komunikaciju putem Bluetooth-a.

bluetooth

Robot koji se sam vozi po prostoriji je, naravno, dobar, ali ja bih volio da sam upravljam robotom. Da biste to učinili, trebate organizirati vezu između Arduina i kontrolnog uređaja.

Kao kontrolni uređaj odabrao sam pametni telefon. Komunikaciju ćemo organizirati putem Bluetooth protokola, tako da je vrijeme da se upoznamo.

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

Prvo morate spojiti HC-06 na Arduino. Povezićemo se koristeći serijski softver. Ova biblioteka vam omogućava da emulirate serijski port na pinovima koji su nam potrebni. Radi eksperimenta, pokušajmo to učiniti na pinovima A0(RX) i A1(TX). Za što? Zapamtite šta sam rekao o Motor Shield-u.

Povezujemo se ovako:

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

Povezaću HC-06 sa robotom koji smo napravili iznad. Da bismo to učinili, koristit ćemo tri trake na motornom štitu.

Robot je spreman. Ostaje da se programira.

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

Kako bismo to izbjegli, primijenit ćemo faktore prilagođavanja. Moj lijevi kotač se okreće mnogo brže od desnog, pa sam stavio faktor 0,62 da kompenzujem. Vrijednost koeficijenta odabire se eksperimentalno.

// Uključi biblioteke za rad sa motornim štitom i softverom Serial #include #include //Odredite pinove za SoftwareSerial emulaciju mySerial(A0, A1); // RX, TX //Definiraj lijevi motor na terminal broj 2 AF_DCMotor l_motor(2); //Definirajte desni motor na terminalu 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() ( //Podesite početnu brzinu i isključite motore l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(spd); r_motor.run(RELEASE); //Uspostavite vezu sa HC-06 mySerial .begin(9600); ) void loop() ( //Ako postoje podaci, //pozovite kontrolnu funkciju if (mySerial.available()) ( drive(); ) ) void drive() ( //Varijabla za ulazni podaci char control = mySerial.read(); //Prvo postavite brzinu ako (((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 Bluetooth-a. U pretrazi, ključne riječi će biti: Arduino, Bluetooth, RC.

Odabrao sam aplikaciju pod nazivom Bluetooth RC Controller. Savršen je za našu svrhu. Kada se pritisne dugme, aplikacija šalje vrednost char na HC-06, koji, zauzvrat, prosleđuje dolaznu vrednost Arduinu. Vrijednost koja se šalje kada se klikne na dugme sama se postavlja.

Da biste uspostavili vezu 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 sa HC-06. Kliknite na zupčanik i idite na “Poveži se s automobilom” Otvara se prozor sa uparenim uređajima. U njemu biramo HC-06. Ako ga nema, tražimo ga pomoću “Skeniraj uređaje”. Ako je uređaj pronađen, ali ne želi da se upari, idite na Bluetooth na svom pametnom telefonu i uparite 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 da treperi. Možete početi voziti. Traka na vrhu je odgovorna za brzinu kretanja.

Vratimo se na Arrow. Još jedna prednost Arrow-a 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 u smanjenju koda za upravljanje motorima, vrlo je vrijedno koristiti Arrow za upravljanje robotom putem Bluetooth-a.

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

Savjet

Moj robot je spreman i čak vozi na komandu sa 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.

Točkovi se okreću u pogrešnom smjeru- ovaj problem se lako eliminira preuređivanjem žica u terminalnim blokovima ili programskim putem.

Bluetooth modul ne radi- potrebno je provjeriti prisustvo goruće crvene LED diode na modulu. Ako ne svijetli, provjerite da li je Bluetooth modul ispravno povezan. Ako je LED dioda uključena, ali je veza uspostavljena, potrebno je osigurati da je RX modula spojen na TX ploče i obrnuto, a također isprobati metodu uparivanja modula sa Arduinom putem standarda Bluetooth interfejs.

Robot ne vozi pravo- Ovaj problem sam opisao malo više kada sam govorio o Bluetooth-u i Motor Shield-u.

Tokom vožnje, robot se iznenada zaustavlja i gubi vezu saHC-06- Postoji problem sa napajanjem. Znamo da je Arduinu potrebno najmanje 7V za stabilan rad, a znamo i da motori jako dobro jedu. Ako sonde multimetra dovedete do priključaka za napajanje i izmjerite napon sa isključenim motorima, a zatim ih uključite, možete vidjeti da će napon na multimetru pasti. Štaviše, napon može pasti na različite načine.

Ako je priključeno napajanje koje ne može osigurati dovoljnu struju za motore, tada napon može jako pasti, sa 9 na 5 volti, na primjer, a 5V više neće biti dovoljno za Arduino i on će se ponovo pokrenuti. Rješenje je povezivanje snažnijeg napajanja. Kako izračunati, reći ću u nastavku.

Ako povežete 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 ugradnja kondenzatora od najmanje 1000 uF paralelno sa strujnim žicama, kapacitivnost 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,2V.

Nekoliko savjeta za početnike u robotici

Počevši sa rasporedom robota, prvo što treba učiniti je voditi računa o izračunavanju snage jedinice za napajanje i odabiru odgovarajućeg izvora napajanja. Biće šteta ako 4 AAA baterije ne napajaju vaša 4 6V motora, a nema mesta za više napajanja.

Za izračunavanje snage tražimo karakteristike motora, ploča, senzora. Iz kursa fizike znamo da se snaga može izračunati po formuli P = IU, gdje je I jačina struje, U 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 jačine, možete odrediti potreban kapacitet baterije i vrijeme rada uređaja iz odabrane baterije.

Kao što sam rekao, uvijek treba postaviti konkretan cilj, nakon kojeg se projekat može smatrati završenim. Postoje nijanse u ovoj misli. Ako je projekat dovoljno velik, onda doći do cilja nije tako lako, posebno kada se piše kod. Jednom kada sam napisao veliki kod, pomislio sam – „Sada ću sve napisati i provjeriti! ' prilikom pokušaja kompajliranja koda, nije se kompajlirao odmah jer je bilo nekoliko grešaka. Uklonio sam greške, ali samo kod nije radio kako sam želio. Morao sam sve prepisati gotovo ispočetka, postupno dodajući kod i provjeravajući rezultirajući kod na operativnost. Zato savjetujem i vama da učinite isto.

Ako postoji cilj da napravite "lozinku" od tri znaka, onda 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 pokušajima i greškama. Neće biti moguće programirati jednom tako da se radnja izvrši savršeno. Isti koeficijenti podešavanja su na točkovima, tako da ne treba odustajati ako nešto ne uspije, a ako nikako ne uspije, onda se možete obratiti ljubaznim ljudima na forumima ili mi pisati, mi sigurno će pomoći!

Zaključak

Robotika je fenomenalna! Uskoro će, mislim, roboti zauzeti, a čak su se već i dogodili u životima ljudi. Napravili smo najjednostavniji robot-auto upravljan sa pametnog telefona, kasnije ćemo se baviti 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 predmet koji reflektira infracrveno svjetlo. Također, ovaj robot će zabaviti djecu. Moj trogodišnji nećak se rado igrao sa robotom :)

Počeću nabrajanjem delova koji će biti potrebni prilikom izgradnje - Arduino UNO;

Infracrveni daljinomjeri;

- 3-voltni motori sa mjenjačima i kotačima;

- konektori za 3A baterije;

-baterija (ako nema dovoljno baterija);

- Relej za upravljanje motorima;

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


Zatim stegnem motore drvenom daskom, zavrtajući ovu šipku

Dalje na kućište postavio sam arduino, relej, moždanu ploču, daljinomjere, a ispod baze šasije rotirajući

Sada sve povezujemo prema shemi

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

Const int R = 13; //pinovi na koje su spojeni IR 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 je odgovoran za desni kotač, a desni za lijevi

Da vam bude jasnije, možete pogledati video koji prikazuje proces kreiranja i radnju robota

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

Nadam se da ste uživali u ovom zanatu, zapamtite da su zanati cool!

Završni dio članka govori o malom robotu kojeg sklapamo na šasiju - poklopac od plastične posude za hranu. Mozak našeg robota je Arduino UNO ploča, Driver Motor Shield ploča kontrolira motore i servo pogon, senzor prepreka - ultrazvučni sonar - oči poput Wallyja (iz crtanog filma) - "HC-SR04 ultrazvučni senzor". , . Kako napraviti robota na Arduinu?

9. Spajanje baterije i motora

Kada spajate bateriju, morate biti potpuno sigurni da je polaritet ispravan, kako kažu mjerite 7 puta, uključite jednom. 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 povezujemo žice koje dolaze iz odjeljka za baterije na + M i GND blok, na upravljačkoj ploči motora. Povezujemo žice od pogonskih motora na blokove M1, M2 upravljačke ploče motora. Lijeva strana je u smjeru vožnje spojena na blok M1, desna na blok M2. Još ne treba da brinete o polaritetu motora, može se promeniti ako nešto pođe po zlu tokom testa.

10. Provjerite polaritet i ispravno povezivanje modula

Vrlo važan i presudan momenat u montaži mikrorobota je provjeriti ispravnu instalaciju, priključke, module prema blok dijagramu, pogledati oznake na pločama, provjeriti testerom, polaritet napajanja, ko ima tester.

11. Korak Arduino programiranja

Program se učitava na Arduino mikrokontroler sa računara, koristeći USB kabl i poseban program - okruženje za programiranje i uređivanje skica (programa) - Arduino IDE. Program možete preuzeti sa web stranice arduino.cc, odjeljka Download, gdje uvijek možete preuzeti najnoviju, najnoviju verziju programa. Nakon što je programsko okruženje instalirano, ostaje samo da iz menija drajverskog programa izaberete za koju ploču želite da koristite - u našem slučaju Arduino UNO i COM port preko kojeg je Arduino povezan preko USB emulacije. Postoji mnogo raznih priručnika na ovu temu, pa preskačemo ovu fazu (za svaki slučaj - meni Alati > Serijski port).

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 da raspakujete arhivu u folder instalirani program Arduino IDE. Za mene, ovo je c: Program Files (x86) Arduino direktorij, biblioteke treba staviti u c: Program Files (x86) Arduino biblioteke. Zatim idite na direktorij c:Program Files (x86)ArduinolibrariesAPC_4_ROBOT i dvaput kliknite na APC_4_ROBOT.ino ovo je sama skica, tada će se pokrenuti programsko okruženje. Povežemo golu Arduino Uno ploču (što znači bez povezanih modula) preko USB kabla na računar, pritisnemo dugme sa strelicom udesno, program će početi da se učitava na kontroler. Cijeli proces traje nekoliko sekundi, a ako je sve ispravno spojeno, tada ne bi trebali svijetliti crveni natpisi, a indikator u donjem desnom kutu će završiti svoje kretanje 100%. Program za Arduino je instaliran u Atmega328 kontroleru.

12. Pokretanje robota

Mini robot na Arduinu - spreman za pokret. Robot Wally

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

Ovaj članak posvećujem svim početnicima koji se odluče naučiti Arduino. Dalje učenje se može nastaviti od prve lekcije - treptanje LED-a. Materijal sa robotom je veoma interesantan, a da bih vas zainteresovao, odlučio sam da počnem sa tačno kako da napravim robota koji zaobilazi prepreke. Ostalo će biti mnogo lakše i ići će kao po satu. Ovaj robot zaista radi. Sretno svima!

P.S. Bio je to prilično besplatan prijevod članka pronađenog, nekada davno, na ogromnim prostranstvima interneta, više naravno geg, jer je sve urađeno na nov način, crteži su dorađeni, nije bilo referenci na izvor , jer je dokument bio Word dokument.

Gore