Kogume Arduinosse iseliikuvaid roboteid. Valmis Arduino robotid Kilbi valmistamiseks läheb vaja

Räägime sellest, kuidas saate Arduino abil luua roboti, mis tasakaalustab nagu Segway.

Segway inglise keelest. Segway on kaherattaline elektriajamiga seisev sõiduk. Neid nimetatakse ka güroskoopideks või elektrilisteks tõukeratasteks.

Kas olete kunagi mõelnud, kuidas Segway töötab? Selles õpetuses proovime teile näidata, kuidas teha Arduino robotit, mis tasakaalustab end täpselt nagu Segway.

Roboti tasakaalustamiseks peavad mootorid roboti kukkumise vastu võitlema. See toiming nõuab tagasisidet ja paranduselemente. Tagasisideelement - , mis tagab nii kiirenduse kui ka pöörlemise kõigil kolmel teljel (). Arduino kasutab seda roboti praeguse orientatsiooni teadasaamiseks. Korrigeeriv element on mootori ja ratta kombinatsioon.

Lõpptulemus peaks olema umbes selline:

Roboti skeem

L298N mootorijuhi moodul:

Alalisvoolu käigukast koos rattaga:

Isetasakaalustuv robot on sisuliselt ümberpööratud pendel. Seda saab paremini tasakaalustada, kui massikese on rattatelgedest kõrgemal. Kõrgem massikese tähendab suuremat massi inertsimomenti, mis vastab väiksemale nurkkiirendusele (aeglasem kukkumine). Sellepärast panime akuploki peale. Roboti kõrgus sai valitud aga materjalide saadavuse järgi 🙂

Isetasakaalustava roboti valminud versioon on näha ülaloleval joonisel. Ülaosas on toiteallikaks kuus Ni-Cd akut trükkplaat. Mootorite vahel kasutatakse mootorijuhi jaoks 9-voldist akut.

teooria

Juhtimisteoorias on mõne muutuja (antud juhul roboti asukoha) hoidmiseks vaja spetsiaalset kontrollerit, mida nimetatakse PID-ks (Proportsional Integral Derivative). Igal neist parameetritest on "võimendus", mida tavaliselt nimetatakse Kp, Ki ja Kd. PID annab paranduse soovitud väärtuse (või sisendi) ja tegeliku väärtuse (või väljundi) vahel. Sisendi ja väljundi erinevust nimetatakse "veaks".

PID-kontroller vähendab vea võimalikult väikese väärtuseni, reguleerides pidevalt väljundit. Meie isetasakaalustavas Arduino robotis määrab sisendi (mis on soovitud kalle kraadides) tarkvara. MPU6050 loeb roboti praeguse kaldenurga ja sisestab selle PID-algoritmi, mis teeb arvutusi mootori juhtimiseks ja roboti püsti hoidmiseks.

PID nõuab, et Kp, Ki ja Kd väärtused oleksid seatud optimaalsetele väärtustele. Insenerid kasutavad tarkvara, näiteks MATLAB, et need väärtused automaatselt arvutada. Kahjuks ei saa me oma puhul MATLAB-i kasutada, sest see muudab projekti veelgi keerulisemaks. Selle asemel häälestame PID väärtusi. Seda saab teha järgmiselt.

  1. Määra Kp, Ki ja Kd nulliks.
  2. Reguleerige Kp. Liiga väike Kp põhjustab roboti kukkumise, sest parandusest ei piisa. Liiga palju Kp ajab roboti edasi-tagasi metsikuks. Hea Kp paneb roboti üsna vähe edasi-tagasi kallutama (või natuke võnkuma).
  3. Kui Kp on määratud, reguleerige Kd. Hea Kd väärtus vähendab võnkumisi, kuni robot on peaaegu stabiilne. Samuti korralik Kd hoiab robotit ka lükates.
  4. Lõpuks installige Ki. Sisselülitamisel võngub robot isegi siis, kui Kp ja Kd on seatud, kuid aja jooksul stabiliseerub. Õige Ki väärtus lühendab roboti stabiliseerumiseks kuluvat aega.

Roboti käitumist saab näha allolevast videost:

Arduino kood isetasakaalustavale robotile

Roboti loomiseks vajasime nelja välist raamatukogu. PID teegi abil on lihtne arvutada P, I ja D väärtusi LMotorController teeki kasutatakse kahe mootori juhtimiseks L298N mooduliga. Teek I2Cdev ja MPU6050_6_Axis_MotionApps20 teek on loodud MPU6050 andmete lugemiseks. Koodi, sealhulgas selles hoidlas olevad teegid, saate alla laadida.

#kaasa #kaasa #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 juhtimine/olek vars bool dmpReady = false; // määrake tõeseks, kui DMP init oli edukas uint8_t mpuIntStatus; // hoiab tegelikku katkestuse oleku baiti MPU-st uint8_t devStatus; // tagastab oleku pärast iga seadme toimingut (0 = õnnestumine, !0 = viga) uint16_t packetSize; // eeldatav DMP paketi suurus (vaikimisi on 42 baiti) uint16_t fifoCount; // kõigi hetkel FIFO-s olevate baitide arv uint8_t fifoBuffer; // FIFO salvestuspuhver // orientation/motion vars Quaternion q; // kvaternion konteiner VectorFloat gravitatsioon; // gravitatsioonivektor float ypr; // pöörde/piku/rulli konteiner ja gravitatsioonivektor //PID topelt originaalSeadistuspunkt = 173; topeltseade = originaalSätepunkt; topeltliikumineAngleOffset = 0,1; topeltsisend, väljund; //kohandage neid väärtusi, et need sobiksid teie enda disainiga topelt Kp = 50; kahekordne Kd = 1,4; kahekordne Ki = 60; PID pid(&sisend, &väljund, &seadepunkt, Kp, Ki, Kd, ​​​​DIRECT); topeltmootor SpeedFactor Left = 0,6; topeltmootor SpeedFactorRight = 0,5; //MOOTORIKONTROLL int ENA = 5; int IN1 = 6; int IN2 = 7; int IN3 = 8; int IN4 = 9; int ENB = 10; LMotorController mootorikontroller(ENA, IN1, IN2, ENB, IN3, IN4, mootorSpeedFactorLeft, motorSpeedFactorRight); volatile bool mpuInterrupt = false; // näitab, kas MPU katkestuse viik on tõusnud kõrgele void dmpDataReady() ( mpuInterrupt = true; ) void setup() ( // liitu I2C siiniga (I2Cdev teek ei tee seda automaatselt) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin( ); TWBR = 24; // 400 kHz I2C kell (200 kHz, kui protsessor on 8 MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, tõsi); #endif mpu.devSdtatus = mizepu.devStamptus(); // sisestage siia oma güroskoopide nihked, mis on skaleeritud minimaalse tundlikkuse jaoks mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // minu testi tehase vaikeväärtus 1688 kiip // veenduge, et see töötas (tagastab 0, kui jah) if (devStatus == 0) ( // lülita DMP sisse, nüüd, kui see on valmis mpu.setDMPEnabled(true); // lubage Arduino katkestuse tuvastamine attachInterrupt(0 , dmpDataReady , RISING); mpuIntStatus = mpu.getIntStatus(); // määrake meie DMP Ready lipp, et funktsioon main loop() teaks, et seda on okei kasutada dmpReady = true; // hankige eeldatav DMP paketi suurus hilisemaks võrdluseks packetSize = mpu.dmpGetFIFOPacketSize(); //PID seadistamine pid.SetMode(AUTOMATIC); pid.SetSampleTime(10); pid. SetOutputLimits(-255, 255); ) else ( // VIGA! // 1 = esialgne mälu laadimine nurjus // 2 = DMP konfiguratsiooni värskendamine nurjus // (kui see läheb katki, on tavaliselt kood 1) Serial.print(F("DMP initsialiseerimine nurjus (kood ")); Serial.print(devStatus); Serial.println(F(")")); ) ) void loop() ( // kui programmeerimine ebaõnnestus, ärge proovige midagi teha, kui (!dmpReady ) return; // oodake, kuni (!mpuInterrupt && fifoCount) on saadaval MPU katkestus või lisapakett(id)< 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 >Saadaval on 1 pakett // (see võimaldab meil katkestust ootamata kohe rohkem lugeda) fifoCount -= packetSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravitatsioon); sisend = ypr * 180/M_PI + 180; ) )

Kp, Ki, Kd väärtused võivad töötada või mitte. Kui nad seda ei tee, järgige ülaltoodud samme. Pange tähele, et koodi kaldenurk on 173 kraadi. Soovi korral saate seda väärtust muuta, kuid pange tähele, et see on nurk, mida robot peab toetama. Samuti, kui teie mootorid on liiga kiired, saate reguleerida motorSpeedFactorFactorLeft ja motorSpeedFactorRight väärtusi.

Praeguseks kõik. Näeme.

Selles artiklis ehitame oma roboti nullist üles. Mida me saame, vaadake allolevat fotot. Robot hakkab sõitma nii iseseisvalt kui ka nutitelefoni juhtimise all. Vaatame ka oma mobiilse roboti ehitamist nullist.

3 DPrinter

Kui tahan robotit ehitada, pean otsustama, millisele platvormile paigaldan mootorid, plaadid, akud. Muidugi võin osta ka valmis versiooni, aga huvitavam on platvorm ise teha. Selline platvorm vastab kindlasti teie nõuetele. Platvormi saab teha org. Klaas, vineer ja ma teen selle plastikust.

Võib öelda, et platvormi ise valmistamine on ebamugav ja vaja läheb palju tööriistu, alates kesklöögist kuni lihvimis masin. Ja ma ütlen, et meil on vaja kujutlusvõimet ja 3D-printerit.

3D printer? Tõenäoliselt on kõigile tuttav tavaline kontoriprinter, mis suudab meile vajaliku teksti printida A4-le. Seega on 3D-printer printer, mis suudab soovitud osa printida. 3D-printereid on erinevaid. Mul on FDM-tehnoloogiaga (kiht-kihilt sadestamine) printer. Milliseid teisi 3D-printimise tehnoloogiaid on saadaval, leiate Internetist.

Paljud 3D-printerid töötavad Arduino peal. Soovi korral saate ehitada oma 3D-printeri. 3D-printeri põhiidee on see, et printida saab absoluutselt kõike, aga meie prindime robotile keha.

Esiteks määratleme platvormi kirjelduse. Ma tahan, et platvorm oleks 2 rattaga ja peaks sobima Arduino, toite, mootorite ja mõne anduriga.

Nüüd peate paberile joonistama platvormi paigutuse ja asetama sellele vajalikud komponendid. Näiteks niimoodi.

Kui paigutus on valmis, peate tegema platvormi 3D-mudeli. Selleks on palju programme. Tavaliselt kasutan. Kompassiga töötamist ma ei õpeta, kuid huvi korral võite vaadata Internetist või küsida kommentaarides kompassi õpetust.

See on platvorm, mille ma välja mõtlesin.

Pärast seda peate teisendama 3D-mudeli 3D-printerile arusaadavaks G-koodiks. Selleks on spetsiaalsed programmid - viilutajad. Kasutan koos Sli3eri viilutajaga programmi Repetier-Host. See osa näeb välja printimiseks valmis.

Ja siin on trükitud mudel.

Alles hiljuti tekkis meil idee ja valmis osa on juba ees. 3D-printeri abil saate luua ainulaadseid asju üksikute koopiatena. 3D-printer on suurepärane. Soovitan kõigile!

Mootorid

Nüüd peame mõtlema, kuidas meie mobiilne robot liigub. Esimene asi, mis meelde tuleb, on rattad. Nii et teeme ära.

Kui keegi mäletab, siis oleme juba proovinud mootorit Arduinoga ühendada. Kes ei mäleta, ei tea või pole lugenud - vaadake. Mootori ühendamisel MOSFET-iga on olulisi puudusi - kiirust ja pöörlemissuunda pole võimalik kiiresti muuta. On aeg õpetada Arduinole, kuidas mootoreid päriselt juhtida!

Selleks saate kasutada L293D kiipi. L293D võimaldab juhtida kahte mootorit korraga, vooluga 600 mA kanali kohta ja tippvooluga kuni 1000 mA ning kui kanaleid kombineerida, siis kuni 1200 mA ja 2000 mA tippvooluga. Allpool räägin ühendusest.

Alustuseks, nagu alati, peaksite vaatama andmelehte, et aru saada, kuhu ja mida ühendada. Kui te ei tea mikroskeemidest, siis tasub artikkel läbi lugeda.

Alustame. Koostame ühe mootoriga lihtsa skeemi ja juhime seda. Pöörake tähelepanu montaažiskeemile.

Kui te ei oska inglise keelt või lihtsalt ei saa andmelehest aru, siis siin on ühenduse kirjeldus. Loodan, et kõik teavad mikroskeemide nummerdamist või õppisid mikroskeeme käsitlevast artiklist.

  • Pin 1 – vastutab mootori pöörlemiskiiruse eest. Sarnane on viigul 9. See võtab väärtusi vahemikus 0 kuni 255, mida saab hõlpsasti korraldada PWM-i abil. Ühendasin EN-i Arduino viienda viiguga, mis toetab PWM-i.
  • Tihvtid 2 ja 7 – vastutavad mootori liikumissuuna eest. Sarnased on tihvtidel 10 ja 15. Loogilise ühe rakendamine ühele neist kontaktidest paneb mootori pöörlema ​​ühes suunas (olenevalt mootori ühendusest), loogika rakendamine teisele paneb mootori pöörlema. vastassuunas.
  • Tihvtid 3 ja 6 – peate mootori nendega ühendama. Polaarsus pole oluline, ühendusest sõltub ainult pöörlemissuund. Sarnane - tihvtidel 11 ja 14.
  • Tihvtid 4 ja 5 on maandatud. Ma arvan, et see ei vaja selgitust. Sarnased - 12 ja 13.
  • Pin 8 – mootorite võimsus. See peab saama toite vahemikus 4,5 kuni 36 volti.
  • Pin 16 - sellele tarnitakse Arduinost loogiline üksus. 5 volti, kui üldse.

Suurepärane! Mootor on ühendatud. Nüüd saate kodeerida.

#define FRW_BUT 7 //Edasi nupp #define BCW_BUT 6 //Tagasi nupp #define SPD 5 //Pöörlemiskiiruse juhtimine... #define FRW 4 //...pöörlemissuund (edasi)... # define BCW 3 / /...pöörlemise suund (tagasi) #define SPD_POT A5 int xspeed = 0; //Muutuja mootori pöörlemiskiiruse määramiseks int frw_move = 0; //Muutuja "edasi" käsu jaoks int bcw_move = 0; //Käsu "tagasi" muutuja void setup() ( //Kujunda tihvtid 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() ( //Lugege potentsiomeetri näidud //ja viige need soovitud vahemikku - 0 kuni 255 //Pärast - edastage see kiiruse reguleerimise viigule xspeed = analoogRead(SPD_POT); constrain(xspeed, 0, 1023); xspeed = map(xspeed, 0, 1023, 0, 255); //Määrake edasi-nupu vajutus if(!digitalRead(FRW_BUT)) ( frw_move = 1; ) else ( frw_move = 0; ) //Määrake "tagasi" nupu vajutamine if(!digitalRead(BCW_BUT)) ( bcw_move = 1; ) else ( bcw_move = 0; ) //Kutsuge funktsioon andmete saatmiseks L293D-le motor(); ) void motor() ( //Saada andmed L293D analoogWrite(SPD, xspeed); digitalWrite(FRW, frw_move); digitalWrite(BCW,bcw_move); )

Kuidas see töötab? See toimib lihtsalt. Kui vajutate vasakut nuppu, pöörleb ratas ühes suunas ja kui vajutate paremat nuppu, siis teises suunas. Potentsiomeetri nuppu keerates saate reguleerida mootori pöörlemiskiirust. Meie mootori testimisseadme töö on näidatud videos.

Z.Y. Jah, ma tean, et video kvaliteet pole ülihea, aga püüan võimalikult kiiresti leida korraliku kaamera ja korraldada pildistamiskoha.

Nüüd L293 kanalite ühendamisest. Kui soovite ühendada võimsama mootori, saate kanaleid kombineerida.

Esimene võimalus on ühendada paralleelselt mikrolülituse analoogväljundid, mis suurendavad maksimaalset voolutugevust kaks korda. Miinus - ühe mikroskeemiga saab ühendada ainult ühe mootori.

Teine võimalus on jootma L293 peale veel üks L293. Võtame ja jootme tihvti 1 tihvti 1, tihvti 2 tihvti 2 ja nii edasi. See meetod suurendab ka voolutugevust kaks korda, kuid erinevalt esimesest jätab see võimaluse juhtida kahte mootorit korraga. Teil võib olla idee - kas ma peaksin veel paar L293 jootma? Kahjuks ei too hilisem mikroskeemide jootmine kaasa voolutugevuse suurenemist veel 600 mA võrra. Kasv saab olema väike.

"Eh, ma pean oma 12-voldise mootori ära puhastama..." Ärge ärrituge. Võimsamate mootorite jaoks sobib vanem vend L293 - L298, kuid nüüd me seda ei arvesta. Teeme seda veidi hiljem.

Mootor Kilp

Nõus, et sellise juhtmekimbuga ei tundu see kõik väga hea. Sellest vabanemiseks võite jootmiseks jootma vooluringi L293-ga trükkplaadil või jootmiseks, aga mis siis, kui te ei soovi jootma või ei tea, kuidas? Selleks on olemas võtmed kätte lahendused näiteks Arduino jaoks mõeldud kilpide näol. Räägin neist ühest - Motor Shield V1 firmalt DK Electronics.

Siin on tegelikult kilbi foto.

Sellel kilbil on kaks L293D-d, mis võimaldab juhtida nelja mootorit korraga. Servomootorite jaoks on ka kaks kontakti. Toide antakse kas klemmiplokki või, kui hüppaja on paigaldatud, Arduino toiteallikast. Samuti võimaldab hüppaja kilbilt Arduino jaoks toidet võtta. Selle kilbiga töötamiseks on olemas spetsiaalne raamatukogu. Saate selle alla laadida.

Juhatuse miinusteks. Varjestusega töötamiseks kasutatakse peaaegu kõiki digitaalseid kontakte, välja arvatud 0, 1, 2, 13. Nagu me teame, kasutab Arduino tihvte 0 ja 1 püsivara jaoks, seega on parem neid mitte kasutada.

On ka hea pool. Kui te ei ühenda näiteks servosid, siis vabastatakse viigid 9 ja 10 ning kui te ei kasuta ühtegi mootorit, siis vabastatakse viigid 3, 5, 6, 11, olenevalt kasutamata mootorist. Ja edasi. Meil on veel saadaval kuus analoogväljundit, mida saab soovi korral kasutada digitaalsetena.

Alustame mootorite ühendamist. Eksperimendi huvides teeme roboti, mis liigub edasi, tagasi ja ka pöörleb ümber oma telje. Platvormina võtsin enda arenduse, mida eespool kirjeldatud. Võid võtta mida hing ihkab, peaasi, et omadustelt sobiks.

Meil läheb vaja

  • Arduino UNO – kasutada saab mis tahes muud Arduino UNO vormitegurit. Leonardo või Iskra näiteks.
  • Mootorikilp – selle kilbi muud versioonid töötavad.
  • 6 V mootorid - võite võtta kõik, mis sobivad mootorikilbi omadustega.
  • 42 mm rattad – mootorite ja platvormi jaoks sobivad rattad
  • Mootori kinnitused – mootorid peavad olema platvormi külge kinnitatud. Võtke see, mis teile sobib.
  • Toide - võtsin akupaki ja sain umbes 5 volti välja, millest mootorite ja Arduino toiteks ei piisa, nii et ühendasin DC/DC muunduri ja tõstsin pinge 9V peale. Kui muundurit pole, saate kasutada tavalist krooni, ühendades selle Arduino toiteallikaga.

On aeg meie robot kokku panna.

Samm 1

Ühendame Arduino ja Motor Shieldi.

2. samm

Panime kokku mootorid ja kinnitame need platvormile.

3. samm

Toidet kogume võimendusmuunduri kaudu.

Neile, kellel on Crona. Ärge unustage hüppajat!

4. samm

Mootorid kinnitame Arduinoga Motor Shieldi külge.

5. samm

Lisame toitu.

6. samm (valikuline)

Kinnitage kaas - esteetika jaoks.

Meil on valmis robot. Nüüd on aeg see programmeerida. Vaatame koodi.

//Kaasake teek Motor Shieldiga töötamiseks #include //Määrake klemmiploki number 2 vasakpoolne mootor AF_DCMotor l_motor(2); //Määrake õige mootor klemmiploki number 3 AF_DCMotor r_motor(3); //Muutujad kiiruse //ja liikumisaja määramiseks int spd = 50; inttime(1000); void setup() ( //Seadistage algkiirus ja lülitage mootorid välja l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(100); r_motor.run(RELEASE); ) void loop() ( // Sõit edasi l_motor.run(FORWARD); r_motor.run(FORWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); viivitus(aeg); // Sõitke tagasi l_motor.run(BACKWARD); r_motor. run(TAGASI ); l_mootor.setSpeed(spd); r_mootor.setSpeed(spd); viivitus(aeg); // Pöörlemine vastupäeva l_motor.run(FORWARD); r_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor . setSpeed(spd); delay(time); // Pöörlemine päripäeva r_motor.run(FORWARD); l_motor.run(TAGASI); l_motor.setSpeed(spd); r_motor.setSpeed(spd); viivitus(aeg); )

Suurepärane! Aeg kontrollida. Siin on video minu testist. Aga sina?

"Kas sa rääkisid midagi robootikalaudade kohta?" - võivad öelda need, kes loevad kursuse 2. osa sissejuhatavat tundi. Jah, selliseid tasusid on. Mõelge Strela robotplatvormile.

Robootika unistus. (Peaaegu). Kirjeldasin tahvli eeliseid. Otse asja juurde.

Sellele on paigaldatud vanem vend L293 - L298. Ning tihvtid kuvatakse kolmekordselt, mis sobib just paljude andurite ühendamiseks.

Selle plaadi saab ühendada Arduino UNO ja Motor Shieldi asemel. Lisaks kirjutasid Amperka kutid Noolega töötamiseks raamatukogu, mis muudab mootorite juhtimise üsna triviaalseks ülesandeks.

Neile, kes ei tea, las ma ütlen teile. Igal tavalisel teegil on selle kasutamise näited ja nooleteek pole erand. Nende leidmiseks minge vahekaardile Fail -> Näited -> Strela. Seal valime StrelaMotorsi näite, kus tehakse sketš, mis sarnaneb sketšiga, kasutades Motor Shieldi. Muide, Motor Shieldi kohta on ka näiteid. Huvi korral viska pilk peale.

Mida noolega veel teha saab – vaata allpool Ja liigume edasi Bluetoothi ​​kaudu juhtmevaba side juurde.

Bluetooth

Robot, mis ise mööda tuba ringi sõidab, on muidugi hea, aga tahaks ise robotit juhtida. Selleks tuleb organiseerida ühendus Arduino ja juhtseadme vahel.

Juhtseadmeks valisin nutitelefoni. Korraldame suhtlust Bluetooth protokolli kasutades, seega on aeg tutvuda.

See on HC-06 moodul. Ma ei hakka liiga palju detailidesse laskuma, aga kui olete huvitatud, siis jätkame. Meie eesmärk on juhtida robotit nutitelefonist. Alustame ehk.

Kõigepealt peate ühendama HC-06 Arduinoga. Ühendame tarkvara jadatarkvara abil. See teek võimaldab teil emuleerida jadaporti vajalikel kontaktidel. Katse huvides proovime seda teha kontaktidega A0(RX) ja A1(TX). Milleks? Pidage meeles, mida ma Motor Shieldi kohta ütlesin.

Ühendame nii:

  • Vcc - kuni 5 V
  • GND kuni GND
  • RX kuni TX
  • TX kuni RX

Ühendan HC-06 ülaltoodud robotiga. Selleks kasutame kolme triipu Motor Shieldil.

Robot on valmis. Jääb programmeerida.

Enne koodi lugemist peate teadma mõnda asja. Mootorid pole täiuslikud, nagu kõik muu siin maailmas. Isegi kaks teineteisele järgnevat sama partii mootorit on veidi erinevad, mis mõjutab pöörete arvu erinevust sama pinge juures. Kui mootorid on lihtsalt mootorikilbi külge ühendatud ja neile rakendatakse sama kiirust ja see on sama pinge, siis ei lähe robot otse, vaid natuke või palju kõrvale. Seda saab näha ülaltoodud videost.

Selle vältimiseks rakendame korrigeerimistegureid. Minu vasak ratas pöörleb palju kiiremini kui parem, seega panin kompenseerimiseks koefitsiendi 0,62. Koefitsiendi väärtus valitakse eksperimentaalselt.

// Kaasake teegid Motor Shieldi ja tarkvaraga töötamiseks #include #kaasa //Määrake SoftwareSerial emulatsiooni kontaktid mySerial(A0, A1); // RX, TX //Määrake vasakpoolne mootor klemmi numbrile 2 AF_DCMotor l_motor(2); //Määrake õige mootor klemmiploki number 3 AF_DCMotor r_motor(3); //Muutujad kiiruse määramiseks //ja rotatsiooni ujuki reguleerimiseks spd = 70,0; float corr_l = 0,62; float corr_r = 1; floatrot = 50,0; void setup() ( //Määrake algkiirus ja lülitage mootorid välja l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(spd); r_motor.run(RELEASE); //Looge ühendus HC-06-ga mySerial .begin(9600); ) void loop() ( //Kui on andmeid, //kutsuge juhtfunktsiooni if ​​(mySerial.available()) ( drive(); ) ) void drive() ( //Variable for sissetulevad andmed char control = mySerial.read(); //Määrake esmalt kiirus if (((kontroll - "0") >= 0) && ((kontroll - "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); } }

Roboti käest küsiti. Võtame nüüd nutitelefoni.

RC kontroller

Arduino ja nutitelefoni ühendamiseks Bluetoothi ​​kaudu on palju erinevaid rakendusi. Otsingus on märksõnad: Arduino, Bluetooth, RC.

Valisin rakenduse nimega Bluetooth RC Controller. See sobib meie eesmärgile suurepäraselt. Kui nuppu vajutada, saadab rakendus HC-06-le char väärtuse, mis omakorda edastab sissetuleva väärtuse Arduinole. Nupu klõpsamisel saadetav väärtus määratakse ise.

Robotiga ühenduse loomiseks tuleb klõpsata hammasrattal ja valida üksus “Seaded” “Seadetes” tuleb veenduda, et nupud vastavad neile saadetud tähemärkidele, või muuta Arduino koodi.

Pärast märkide seadistamist saate luua ühenduse HC-06-ga. Klõpsake hammasrattal ja minge jaotisse "Ühenda autoga". Avaneb aken seotud seadmetega. Selles valime HC-06. Kui seda seal pole, otsime seda "Seadmete otsimise" abil. Kui seade leitakse, kuid ei soovi siduda, avage oma nutitelefonis Bluetooth ja siduge nagu tavaliselt. Vaikimisi parool on 1234. Pärast seda minge jaotisse "Otsi seadmeid" ja looge ühendus.

Kui ühendus on loodud, süttib üleval olev roheline tuli ja HC-06 lõpetab vilkumise. Võid sõitma hakata. Liikumiskiiruse eest vastutab peal olev riba.

Lähme tagasi Noole juurde. Noole eeliseks on ka Bluetooth XBee formaadi installimise võimalus ja hea on see, et teised kontaktid jäävad vabaks. Ja kuna Noole jaoks on valmis teek, mis aitab vähendada mootorite juhtimise koodi, siis tasub vägagi Noolt kasutada roboti juhtimiseks Bluetoothi ​​kaudu.

Selleks peate ühendama XBee Strelaga, välgutama seda näidete sketšiga "ArduinoBluetoothRCCarOnStrela" ja ühendama XBee'ga RC-kontrolleri kaudu.

nõu

Minu robot on valmis ja sõidab isegi nutitelefonist käsu peale. Kuid kõik ei saa minna libedalt. Räägin mõnest probleemist ja nende lahendustest, samuti annan nõu algajatele robootikutele.

Rattad pöörlevad vales suunas- see probleem on kergesti kõrvaldatav juhtmete ümberpaigutamise teel klemmliistudes või programmiliselt.

Bluetooth moodul ei tööta- peate kontrollima põleva punase LED-i olemasolu moodulil. Kui see ei põle, kontrollige, kas Bluetooth-moodul on õigesti ühendatud. Kui LED põleb, kuid ühendus on loodud, peate veenduma, et mooduli RX on ühendatud plaadi TX-ga ja vastupidi, ning proovige ka meetodit mooduli sidumiseks Arduinoga standardi kaudu Bluetoothi ​​liides.

Robot ei sõida otse- Ma kirjeldasin seda probleemi veidi kõrgemalt, kui rääkisin Bluetoothist ja Motor Shieldist.

Sõidu ajal peatub robot ootamatult ja kaotab ühenduseHC-06- Probleem toiteallikaga. Teame, et Arduino vajab stabiilseks tööks vähemalt 7V pinget ja teame ka, et mootorid söövad väga hästi. Kui viite multimeetri sondid pingetoite klemmidele ja mõõdate pinget väljalülitatud mootoritega ning seejärel lülitate need sisse, näete, et multimeetri pinge langeb. Pealegi võib pinge langeda erineval viisil.

Kui on ühendatud toiteallikas, mis ei suuda mootoritele piisavalt voolu anda, siis võib pinge kõvasti langeda, näiteks 9-lt 5-le ja Arduino jaoks ei piisa enam 5V-st ja see käivitub uuesti. Lahenduseks on võimsama toiteallika ühendamine. Kuidas arvutada, räägin allpool.

Kui ühendate võimsama toiteallika, võib pingelangus olla vaid paar millisekundit, kuid kontrolleri taaskäivitamiseks võib neist piisata. Lahenduseks on paigaldada paralleelselt toitejuhtmetega vähemalt 1000 uF kondensaator, mahtuvust saab katseliselt määrata. Panin kondensaatori 3300 uF ja 16 V peale. Ärge unustage vaadata kondensaatori maksimaalset pinget.

Kui toiteallikas on piisavalt võimas, ei ole pingelangus suurem kui 0,2 V.

Mõned näpunäited algajale robootikale

Alustades roboti paigutust, tuleb esimese asjana hoolitseda jõuallika võimsuse arvutamise ja sobiva toiteallika valiku eest. On kahju, kui 4 AAA patareid ei toita teie 4 6 V mootorit ja pole ruumi rohkema toiteallika jaoks.

Võimsuse arvutamiseks otsime mootorite, plaatide, andurite omadusi. Füüsika kursusest teame, et võimsust saab arvutada valemiga P = IU, kus I on voolutugevus, U on pinge. Selle valemi ja karakteristikute abil on lihtne arvutada valmis seadme voolutarbimist ning teades toite voolutarbimist ja tööpinget, saate teada seadme tööks vajaliku optimaalse voolutugevuse, teades voolutugevust. tugevus, saate valitud aku järgi määrata vajaliku aku mahutavuse ja seadme tööaja.

Nagu öeldud, tuleb alati seada konkreetne eesmärk, mille saavutamisel võib projekti lõppenuks lugeda. Sellel mõttel on nüansse. Kui projekt on piisavalt mahukas, siis eesmärgini jõudmine polegi nii lihtne, eriti koodi kirjutamisel. Kui ma kirjutasin suure koodi, mõtlesin: "Nüüd kirjutan kõik ja kontrollin seda! Kui proovisin koodi kompileerida, ei kompileerunud see kohe, kuna esines mitmeid vigu. Eemaldasin vead, kuid ainult kood ei töötanud nii, nagu ma tahtsin. Pidin kõik peaaegu nullist ümber kirjutama, lisades järk-järgult koodi ja kontrollides saadud koodi toimivust. Seega soovitan teil sama teha.

Kui on eesmärk teha kolmest märgist koosnev "parool", siis ei tohiks kõiki kolme korraga programmeerida. Parem on teha parool ühest märgist, kontrollida seda, seejärel kahest ja pärast kinnitamist kolmest. See aitab mind.

Robot luuakse katse-eksituse meetodil. Üks kord ei saa programmeerida, et toiming oleks täiuslik. Samad häälestuskoefitsiendid on ratastel, seega ei tasu alla anda, kui midagi ei õnnestu ja kui üldse ei õnnestu, siis võib foorumites lahkete inimeste poole pöörduda või mulle kirjutada, me kindlasti aitab!

Järeldus

Robootika on suurepärane! Ma arvan, et varsti võtavad robotid inimeste eludesse ja on isegi juba toimunud. Tegime kõige lihtsama nutitelefonist juhitava robot-auto, hiljem tegeleme juba tõsisemate projektidega, aga praegu - peatse kohtumiseni!

Nad alustavad arduino õppimist lihtsate robotite loomisega. Täna räägin arduino uno kõige lihtsamast robotist, mis nagu koer järgib teie kätt või muud infrapunavalgust peegeldavat objekti. Samuti lõbustab see robot lapsi. Minu 3-aastane õepoeg mängis meeleldi robotiga :)

Alustan osade loetlemisest, mida ehitamisel vaja läheb - Arduino UNO;

Infrapuna kaugusmõõdikud;

- 3-voldised mootorid koos käigukastide ja ratastega;

- pistikud 3A akude jaoks;

-aku (kui akusid pole piisavalt);

- Relee mootorite juhtimiseks;

Noh, ja muud materjalid, mida loomisprotsessis vaja läheb.
Kõigepealt valmistame aluse. Otsustasin teha selle puidust. Puuplangu saagisin nii, et mootorid istuvad ideaalselt piludesse


Seejärel kinnitan mootorid puidust lauaga, kruvides selle lati

Korpuse peale paigutasin arduino, relee, ajulaua, kaugusmõõturid ja šassii aluse alla pöörleva

Nüüd ühendame kõik vastavalt skeemile

Lõpus laadime arduinosse järgmise visandi:

Const int R = 13; //kontaktid, mille külge on ühendatud IR kaugusmõõturid const int L = 12; sisemootor L = 9; //kontaktid, millega relee on ühendatud in motorR = 11; int buttonState = 0; void setup() ( pinMode(R,INPUT); pinMode(L,INPUT); pinMode(mootorR,OUTPUT); pinMode(mootorL,VÄLJUND); ) void loop() ( ( nupuOlek = digitaalne lugemine(L); if (nupu olek) == HIGH)( digitalWrite(mootorR,HIGH); ) else ( digitalWrite(mootorR,LOW); ) ) (( nupuOlek = digitaalneRead(R); if (nupuOlek == HIGH)( digitalWrite(mootorL,HIGH); ) else ( digitalWrite(mootorL,LOW); ) ) )

Toimimispõhimõte on väga lihtne. Vasakpoolne kaugusmõõtur vastutab parema ratta eest ja parempoolne vasaku ratta eest

Et asi selgem oleks, saab vaadata videot, mis näitab loomisprotsessi ja roboti tegevust

See robot on väga lihtne ja sellega saab hakkama igaüks. See aitab teil mõista, kuidas moodulid, nagu releed ja IR-kaugusmõõturid, töötavad ja kuidas neid kõige paremini kasutada.

Loodan, et teile meeldis see käsitöö, pidage meeles, et käsitöö on lahe!

Artikli viimane osa räägib väikesest robotist, mille paneme kokku šassiile - plastikust toidunõu kaanele. Meie roboti aju on Arduino UNO plaat, Driver Motor Shield plaat juhib mootoreid ja servoajamit, takistuse andur - Ultrasonic sonar - silmad nagu Wally (multist) - "HC-SR04 Ultrasonic Sensor". , . Kuidas luua Arduinosse robotit?

9. Aku ja mootorite ühendamine

Aku ühendamisel peate olema täiesti kindel, et polaarsus on õige, nagu öeldakse, mõõtke 7 korda, ühendage üks kord. Proovige seda reeglit järgida - punane juhe on alati + võimsusel, must juhe on maandatud, see on miinus, see on GND. Tootjad püüavad järgida samu reegleid. Seetõttu ühendame akupesast tulevad juhtmed + M ja GND plokiga, mootori juhtplaadil. Ajamimootorite juhtmed ühendame mootori juhtplaadi plokkidega M1, M2. Vasak pool sõidusuunas on ühendatud plokiga M1, parem pool plokiga M2. Mootorite polaarsuse pärast ei tasu veel muretseda, seda saab muuta, kui testi käigus midagi valesti läheb.

10. Kontrollige moodulite polaarsust ja õiget ühendust

Väga oluline ja otsustav hetk mikroroboti kokkupanemisel on kontrollida plokkskeemi järgi õiget paigaldust, ühendusi, mooduleid, vaadata plaatidel olevaid märgistusi, kontrollida testriga, toite polaarsust, kellel on tester.

11. Arduino programmeerimise etapp

Programm laaditakse arvutist Arduino mikrokontrollerisse, kasutades selleks USB-kaablit ja spetsiaalset programmi – visandite (programmide) programmeerimis- ja redigeerimiskeskkonda – Arduino IDE-d. Programmi saate alla laadida arduino.cc veebisaidilt, kust saate alati alla laadida programmi uusima versiooni. Pärast programmeerimiskeskkonna installimist jääb üle vaid valida draiveriprogrammi menüüst, millist plaati soovite kasutada - meie puhul Arduino UNO ja COM-port, mille kaudu Arduino on USB-emulatsiooni kaudu ühendatud. Selle teema kohta on palju igasuguseid käsiraamatuid, nii et jätame selle etapi vahele (igaks juhuks - menüü Tööriistad > Jadaport).

Mikroroboti programm on saadaval meie veebisaidil, kuid alles pärast registreerimist on Arduino naljakas Mini Robot. Programmi töötamiseks on vaja täiendavaid teeke - AFMotor.h, Sevo.h, NewPing.h, need on kõik arhiivis, peate arhiivi kausta lahti pakkima installitud programm Arduino IDE. Minu jaoks on see c: Program Files (x86) Arduino kataloog, raamatukogud tuleb paigutada kausta c: Program Files (x86) Arduino libraries. Seejärel minge kataloogi c:Program Files (x86)ArduinolibrariesAPC_4_ROBOT ja topeltklõpsake APC_4_ROBOT.ino see on sketš ise, seejärel käivitub programmeerimiskeskkond. Ühendame palja Arduino Uno plaadi (see tähendab ilma ühendatud mooduliteta) USB kaabli kaudu arvutiga, vajuta noolega nuppu paremale, programm hakkab kontrollerisse laadima. Kogu protsess võtab paar sekundit ja kui kõik on õigesti ühendatud, ei tohiks ükski punane silt süttida ja paremas alanurgas olev indikaator lõpetab liikumise 100%. Arduino programm on installitud Atmega328 kontrollerisse.

12. Roboti käivitamine

Minirobot Arduino peal – valmis liikuma. Robot Wally

Võimalik on läbi viia meie roboti esimene, veel proovitöö. Meie robot ei läinud õigesti, üks ratas pöörles õigesti ja teine ​​vastupidises suunas. Pidin plokil M2 mootori juhtmete polaarsust muutma. Aga siis sai meie väike robot kõigi toanurkade ja takistustega aukalt toime.

Pühendan selle artikli kõigile algajatele, kes otsustavad õppida Arduinot. Edasist õppimist saab jätkata esimesest õppetunnist – LED-i vilkumisest. Materjal koos robotiga on väga huvitav ja selleks, et teid huvitaks, otsustasin alustada sellest, kuidas täpselt ehitada robotit, mis läheb mööda takistusi. Ülejäänu on palju lihtsam ja läheb nagu kellavärk. See robot tõesti töötab. Edu kõigile!

P.S. See oli üsna vaba tõlge kunagi ammu Interneti avarustest leitud artiklist, rohkem muidugi gag, sest kõik oli uutmoodi tehtud, joonised viimistletud, viiteid allikale polnud. , kuna dokument oli Wordi dokument.

Üles