05.03.2020

Surenkame savaeigius robotus naudodami Arduino. „Pasidaryk pats“ Arduino robotas Kokius robotus galima surinkti iš arduino


Pakalbėkime apie tai, kaip galite naudoti „Arduino“, kad sukurtumėte robotą, kuris balansuoja kaip „Segway“.

Segway iš anglų kalbos. Segway yra dviratė stovi transporto priemonė su elektrine pavara. Jie taip pat vadinami skraidančiomis lentomis arba elektriniais paspirtukais.

Ar kada susimąstėte, kaip veikia Segway? Šioje pamokoje pabandysime jums parodyti, kaip sukurti Arduino robotą, kuris subalansuotų save kaip Segway.

Norėdami subalansuoti robotą, varikliai turi atsispirti roboto kritimui. Šiam veiksmui reikia grįžtamojo ryšio ir korekcinių elementų. Grįžtamojo ryšio elementas – užtikrina pagreitį ir sukimąsi visomis trimis ašimis (). Arduino tai naudoja norėdami sužinoti dabartinę roboto orientaciją. Korekcinis elementas yra variklio ir rato derinys.

Galutinis rezultatas turėtų būti maždaug toks:

Roboto diagrama

L298N variklio vairuotojo modulis:

Nuolatinės srovės pavarų variklis su ratu:

Savaime balansuojantis robotas iš esmės yra apversta švytuoklė. Jis gali būti geriau subalansuotas, jei masės centras yra aukščiau ratų ašių atžvilgiu. Aukštesnis masės centras reiškia didesnį masės inercijos momentą, kuris atitinka mažesnį kampinį pagreitį (lėtesnį kritimą). Štai kodėl mes įdėjome akumuliatorių į viršų. Tačiau roboto aukštis buvo pasirinktas pagal turimas medžiagas :)

Užbaigtą savaiminio balansavimo roboto versiją galite pamatyti aukščiau esančiame paveikslėlyje. Viršuje yra šešios Ni-Cd baterijos, kurios maitina PCB. Tarp variklių variklio vairuotojui naudojama 9 voltų baterija.

Teorija

Valdymo teorijoje, norint išlaikyti tam tikrą kintamąjį (šiuo atveju roboto padėtį), reikalingas specialus valdiklis, vadinamas PID (proporcinė integralinė išvestinė). Kiekvienas iš šių parametrų turi „prieaugį“, paprastai vadinamą Kp, Ki ir Kd. PID suteikia pataisą tarp norimos vertės (arba įvesties) ir tikrosios vertės (arba išvesties). Skirtumas tarp įvesties ir išvesties vadinamas „klaida“.

PID valdiklis sumažina paklaidą iki mažiausios įmanomos vertės, nuolat reguliuodamas išėjimą. Mūsų Arduino savaime balansuojančiame robote įvestis (tai yra norimas pakreipimas laipsniais) nustatoma programine įranga. MPU6050 nuskaito dabartinį roboto posvyrį ir perduoda jį PID algoritmui, kuris atlieka skaičiavimus, kad valdytų variklį ir išlaikytų robotą vertikaliai.

PID reikia, kad Kp, Ki ir Kd vertės būtų sureguliuotos iki optimalių verčių. Inžinieriai naudoja programinę įrangą, pvz., MATLAB, kad automatiškai apskaičiuotų šias vertes. Deja, šiuo atveju negalime naudoti MATLAB, nes tai dar labiau apsunkins projektą. Vietoj to mes pakoreguosime PID reikšmes. Štai kaip tai padaryti:

  1. Padarykite, kad Kp, Ki ir Kd būtų lygūs nuliui.
  2. Sureguliuokite Kp. Per mažas Kp robotas nukris, nes korekcijos nepakanka. Per daug Kp priverčia robotą pašėlusiai judėti pirmyn ir atgal. Geras Kp privers robotą šiek tiek judėti pirmyn ir atgal (arba šiek tiek svyruoti).
  3. Nustačius Kp, sureguliuokite Kd. Gera Kd vertė sumažins svyravimus tol, kol robotas taps beveik stabilus. Be to, tinkamas Kd laikys robotą, net jei jis bus stumiamas.
  4. Galiausiai įdiekite Ki. Įjungtas robotas svyruos net jei nustatyti Kp ir Kd, bet laikui bėgant stabilizuosis. Teisinga Ki reikšmė sumažins laiką, reikalingą robotui stabilizuoti.

Roboto elgesį galite pamatyti žemiau esančiame vaizdo įraše:

Arduino kodas savaime balansuojančiam robotui

Mums reikėjo keturių išorinių bibliotekų, kad sukurtume savo robotą. PID biblioteka supaprastina P, I ir D reikšmių skaičiavimą LMotorController biblioteka naudojama valdyti du variklius su L298N moduliu. I2Cdev biblioteka ir MPU6050_6_Axis_MotionApps20 biblioteka yra skirtos duomenims nuskaityti iš MPU6050. Šioje saugykloje galite atsisiųsti kodą, įskaitant bibliotekas.

#įtraukti #įtraukti #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #apibrėžti MIN_ABS_SPEED 20 MPU6050 mpu; // MPU valdymas/būsena vars bool dmpReady = false; // nustatyti true, jei DMP inicijavimas buvo sėkmingas uint8_t mpuIntStatus; // saugo faktinę pertraukimo būsenos baitą iš MPU uint8_t devStatus; // grąžinti būseną po kiekvienos įrenginio operacijos (0 = sėkminga, !0 = klaida) uint16_t packetSize; // numatomas DMP paketo dydis (numatytasis yra 42 baitai) uint16_t fifoCount; // visų baitų skaičius šiuo metu FIFO uint8_t fifoBuffer; // FIFO saugojimo buferis // orientacija/judesio vars Quaternion q; // ketvirtinis konteineris VectorFloat gravity; // gravitacijos vektorius float ypr; //pokrypis/pitch/roll konteineris ir gravitacijos vektorius //PID double originalSetpoint = 173; double setpoint = originalSetpoint; dvigubas judantisKampinis poslinkis = 0,1; dvigubas įėjimas, išėjimas; //koreguokite šias reikšmes, kad jos atitiktų jūsų dizainą dvigubai Kp = 50; dvigubas Kd = 1,4; dvigubas Ki = 60; PID pid(&įvestis, &išvestis, &nustatymas, Kp, Ki, Kd, ​​​​DIRECT); dvigubas variklisSpeedFactorLeft = 0,6; dvigubas variklisSpeedFactorRight = 0,5; //VARIKLIŲ VALDIKLIS 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; // nurodo, ar MPU pertraukimo kaištis pakilo aukštai void dmpDataReady() ( mpuInterrupt = true; ) void setup() ( // prisijungti prie I2C magistralės (I2Cdev biblioteka to nedaro automatiškai) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin( ); , mastelis pagal minimalų jautrumą mpu.setXGyroOffset(-85) mpu.setZAccelOffset(1788) // įsitikinkite, kad jis veikė (jei taip, grąžina 0) ( //); įjunkite DMP, dabar, kai jis paruoštas mpu.setDMPEnabled(true); // įgalinkite Arduino pertraukimų aptikimą Interrupt(0 , dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); // nustatykite DMP Ready vėliavėlę, kad Funkcija main loop() žino, kad galima ją naudoti dmpReady = true; // gauti numatomą DMP paketo dydį, kad vėliau būtų galima palyginti packetSize = mpu.dmpGetFIFOPacketSize(); //nustatyti PID pid.SetMode(AUTOMATIC); pid.SetSampleTime(10); pid. SetOutputLimits(-255, 255); ) else ( // KLAIDA! // 1 = nepavyko įkelti pradinės atminties // 2 = nepavyko atnaujinti DMP konfigūracijos // (jei jis suges, paprastai kodas bus 1) Serial.print(F("DMP inicijavimas nepavyko (kodas ")); Serial.print(devStatus); Serial.println(F()")); return // laukti MPU pertraukimo arba papildomo (-ų) paketo (-ų), kol (!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 >Galimas 1 paketas // (tai leidžia iš karto perskaityti daugiau, nelaukiant pertraukimo) fifoCount -= packetSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravitacija, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravitacija); įvestis = ypr * 180/M_PI + 180; ) )

Kp, Ki, Kd reikšmės gali veikti arba neveikti. Jei ne, atlikite anksčiau nurodytus veiksmus. Atminkite, kad kode pasvirimas nustatytas į 173 laipsnius. Jei norite, galite pakeisti šią reikšmę, tačiau atkreipkite dėmesį, kad tai yra pasvirimo kampas, kurį robotas turi išlaikyti. Be to, jei jūsų varikliai yra per greiti, galite reguliuoti motorSpeedFactorLeft ir motorSpeedFactorRight reikšmes.

Tai kol kas viskas. Iki.

Paskutinė straipsnio dalis yra apie nedidelį robotą, kurį surenkame ant važiuoklės – dangčio iš plastikinio maisto indo. Mūsų roboto smegenys yra Arduino UNO plokštė, variklius ir servo pavarą valdo Driver Motor Shield plokštė, kliūčių jutiklis yra Ultrasonic Sonar - akys kaip Valli (iš animacinio filmo) - "HC-SR04 Ultrasonic Sensor". , . Kaip sukurti robotą „Arduino“?

9. Akumuliatoriaus ir variklių prijungimas

Jungdami bateriją turite būti visiškai tikri, kad poliškumas yra teisingas, kaip sakoma, matuokite 7 kartus, junkite vieną kartą. Pabandykite laikytis šios taisyklės – raudonas laidas visada yra į + galią, juodas laidas yra įžemintas, taip pat žinomas kaip minusas, taip pat žinomas kaip GND. Gamintojai stengiasi laikytis tų pačių taisyklių. Todėl iš akumuliatoriaus skyriaus ateinančius laidus sujungiame su +M ir GND bloku variklio valdymo plokštėje. Sujungiame laidus nuo veikiančių variklių prie variklio valdymo plokštės M1, M2 blokų. Kairė pusė važiavimo kryptimi yra prijungta prie bloko M1, dešinė - su bloku M2. Dar nereikia jaudintis dėl variklių poliškumo, jei bandymo metu kas nors sugenda.

10. Patikrinkite modulių poliškumą ir teisingą prijungimą

Labai svarbus ir lemtingas momentas renkant mikrorobotą yra teisingo montavimo, jungčių, modulių patikrinimas pagal blokinę schemą, pažiūrėti į lentelių žymėjimus, patikrinti su testeriu, maitinimo šaltinio poliškumą, kas turi testerį.

11. Arduino programavimo etapas

Programa į Arduino mikrovaldiklį įkeliama iš kompiuterio naudojant USB laidą ir specialią programą – programavimo ir eskizų redagavimo aplinką (programas) – Arduino IDE. Programą galite gauti iš arduino.cc svetainės atsisiuntimo skilties, kur visada galite atsisiųsti naujausią, naujausią programos versiją. Įdiegus programavimo aplinką, belieka iš tvarkyklės programos meniu pasirinkti, kuriai plokštei norite naudoti – mūsų atveju Arduino UNO ir COM prievadą, per kurį USB emuliacija jungiasi Arduino. Yra daug įvairių vadovų šia tema, todėl šį veiksmą praleidžiame (tik tuo atveju – meniu Įrankiai > Serialus prievadas).

Programą mikro robotui galite rasti mūsų svetainėje, nors tik užsiregistravę, juokaukite Mini robotas Arduino. Kad programa veiktų, reikia papildomų bibliotekų - AFMotor.h, Sevo.h, NewPing.h, visos jos yra archyve, archyvą reikia išpakuoti į įdiegtos Arduino IDE programos aplanką. Man tai yra c:Program Files (x86)Arduino katalogas, bibliotekas reikia įdėti į aplanką c:Program Files (x86)Arduinolibraries. Tada įeikite į katalogą c:Program Files (x86)ArduinolibrariesAPC_4_ROBOT ir dukart spustelėkite APC_4_ROBOT.ino – tai pats eskizas, tada prasidės programavimo aplinka. USB laidu sujungiame pliką Arduino Uno plokštę (tai reiškia be prijungtų modulių) prie kompiuterio, paspauskite mygtuką su rodykle į dešinę, programa bus įkelta į valdiklį. Visas procesas trunka keletą sekundžių, o jei viskas prijungta teisingai, jokie raudoni ženklai neturėtų užsidegti, o apatiniame dešiniajame kampe esantis indikatorius užbaigs judėjimą 100%. „Arduino“ programa įdiegta „Atmega328“ valdiklyje.

12. Roboto paleidimas

Mini robotas ant Arduino - paruoštas judėti. Robotas Wally

Galite atlikti pirmąjį, vis dar bandomąjį mūsų roboto paleidimą. Mūsų robotas važiavo neteisingai, vienas ratas sukasi taisyklingai, o kitas į priešingą pusę. Turėjau pakeisti M2 bloko variklio laidų poliškumą. Bet tada mūsų mažasis robotas garbingai susidorojo su visais kambario kampais ir kliūtimis.

Šį straipsnį skiriu visiems pradedantiesiems, kurie nusprendė išmokti Arduino. Tolesnis tyrimas gali būti tęsiamas nuo pirmos pamokos – mirksi LED. Medžiaga su robotu yra labai įdomi, o norėdamas jus sudominti, nusprendžiau pradėti nuo to, kaip sukurti robotą, kuris apeina kliūtis. Tai, kas nutiks toliau, bus daug lengviau ir eisis kaip iš laikrodžio. Šis robotas tikrai veikia. Sėkmės visiems!

P.S. Tai buvo gana laisvas straipsnio, seniai rasto plačiose interneto platybėse, vertimas, žinoma, daugiau kamštelio, nes viskas buvo padaryta nauja, brėžiniai modifikuoti, nuorodų į šaltinį nebuvo, nes dokumentas buvo Word.

Šiek tiek apie robotą. Visų pirma, projektas turėjo būti kuo nebrangesnis. Kėbulas buvo sukurtas be jokių skaičiavimų ir balansavimo, pagrindinis reikalavimas kėbului buvo minimalūs matmenys. Taigi pradėkime surinkti šį robotą.

Dalių sąrašas:
1. Kūno dalių ir letenėlių rinkinys iš 1,5 mm organinio stiklo.
2. Arduino Mega arba Uno (naudojama Mega) - 1 vnt.
3. Mikro servo pavara (naudojama TowerPro SG90) - 8 vnt.
4. Ultragarsinis nuotolio matuoklis HC-SR04 - 1 vnt.
5. Baterijos dydis 18560, 3,7V (naudojamas TrustFire 2400 mAh) - 2 vnt.
6. Akumuliatoriaus laikiklis 18560 dydžio (naudojant konvertuotą konteinerį - pakuotę) - 1 vnt.
7. 25 mm PCB stovas. (tokie stovai naudojami) - 4 vnt.
8. Duonos lentos dalis.
9. Jungiklio laidai.
10. Varžtas DIN 7985 M2, 8 mm. - 18 vnt.
11. Veržlė DIN 934 M2 - 18 vnt.

Roboto Z-RoboDog surinkimas:

1. Roboto korpusas pagamintas iš skaidraus 1,5 mm storio organinio stiklo. Visos dalys yra pjaustomos lazeriu pagal CorelDraw brėžinį:

2. Suklijuokite korpusą antraisiais klijais. Klijuoto korpuso tvirtumo visiškai pakaks. Surinkdami atsižvelkite į skylučių padėtį apatiniame dangtelyje (žiūrėkite nuotrauką), o dar geriau – pritvirtinkite lentą ir įsitikinkite, kad viskas sutampa. Pritvirtinkite šonines sieneles taip, kad laidų angos būtų arčiau galinės sienelės. Platesnė anga galinėje sienelėje skirta USB kabeliui, atminkite tai surinkdami.


3. Pažymėkite ir išgręžkite skyles (2 mm grąžtas). Pritvirtinkite servo sistemas prie korpuso varžtais ir veržlėmis (sąrašo 10, 11 punktai). Priekiniai servo velenai turi būti arčiau priekinės sienelės. Galiniai servo pavaros velenai yra arčiau galinės sienelės.




4.1. Surinkite letenas. Paimkite viršutines letenų dalis (su dviem skylutėmis). Pažymėkite dalies vidurį. Įdėję servo pavaros svirtį, varžtais pažymėkite tvirtinimo taškus ir išgręžkite skylutes (1,5 mm grąžtu). Pritvirtinkite svirties taip, kad varžtų galvutės būtų sėdynių šonuose. Pritvirtinkite svirties iš skirtingų pusių, o velenų lizdai buvo priešinga kryptimi.


4.2. Pažymėkite ir išgręžkite skyles servo (2 mm grąžto) montavimui. Pritvirtintų servo velenai turi būti arčiau siaurojo letenos krašto.


4.3. Kad letenos neslystų, priklijuokite ant jų, pavyzdžiui, gumos. Tačiau neturėtumėte klijuoti priekinės letenos dalies, kai šuo žengia, jis gali užstrigti ir įstrigti. Priklijavau lipnaus kilimėlio juosteles iš automobilio.

5. Pažymėkite ir išgręžkite skyles ultragarsinio nuotolio ieškiklio tvirtinimui (2 mm grąžtas). Sumontuokite nuotolio ieškiklį taip, kad kontaktinės kojos būtų nukreiptos į viršų.

6. Įdėkite akumuliatoriaus laikiklį taip, kad jis būtų korpuso viduryje. Pritvirtinkite Arduino plokštę ir prijunkite visus komponentus. Dalis duonos lentos buvo panaudota elektros paskirstymui.

Z-RoboDog roboto nustatymas ir paleidimas:

Šiuo metu kojeles turėsite sumontuoti patys, kad būtų galima sukalibruoti žingsnius. Pagrindinė problema – rokeriai, kurie prie velenų tvirtinami tik tam tikrose padėtyse. Taip pat patys servosai gali skirtis veikimo laipsniais.

Taip atrodo mano šuns letenėlės kraštutiniuose servo kampų taškuose (kintamieji zs1, zs2, zs3 ir kt.). Pabandykite išdėstyti letenas taip, kaip parodyta nuotraukoje. Vizualiai letenos turi būti tose pačiose padėtyse.

Pagrindinėje pozicijoje taip pat galite ištiesti letenas. Tada nepamirškite prisukti svirties prie servo velenų.


„Z-RoboDog“ programinės įrangos dalis:

Kodas labai paprastas, visur pridedami komentarai. Visi judesiai yra masyve, kad nesusipainiočiau su skaičiais, kiekvienai servo pavarai naudojau kintamuosius. Pavyzdžiui, s1 yra servo 1, s2 yra servo 2 ir pan. Kad būtų lengviau suprasti, siūlau jums šią diagramą.

Diagramoje letenos sunumeruotos; kiekviena letenos dalis yra susieta su servo pavara, kuri ją judina. Taip pat kiekvienai letenai nurodomos judėjimo kryptys pliuso ir minuso ženklai rodo, kur judės letenėlė padidėjus arba mažėjant kampui. Pradiniai kampai buvo pagrindinio stulpo kampai (s1, s2, s3 ir kt.). Pavyzdžiui, jei reikia išplėsti 2 leteną, turite padidinti kampą s3 ir s4, masyve jis atrodys taip (s1, s2, s3+100, s4+50, s5, s6, s7, s8) . Štai visas eskizas. Kodas parašytas remiantis mano žiniomis. Praneškite, jei pasirinkau netinkamą diegimo kelią.

Vaizdo įrašas:


Eskizas archyve: Jūs neturite prieigos atsisiųsti failus iš mūsų serverio

Mieli mūsų skaitytojai, pradedame straipsnių seriją, skirtą roboto kūrimui Arduino pagrindu. Daroma prielaida, kad skaitytojas yra pradedantysis ir turi tik pagrindines temos žinias. Stengsimės viską pateikti kuo išsamiau ir aiškiau.

Taigi, įvadas į problemą:

Pradėkime nuo koncepcijos: norime roboto, kuris galėtų savarankiškai judėti kambaryje, išvengdamas visų kelyje pasitaikančių kliūčių. Užduotis buvo nustatyta.

Dabar išsiaiškinkime, ko mums reikia:

  1. Platforma (kėbulas). Čia yra variantų: viską daryti patiems, pirkti detales ir jas surinkti arba pirkti jau paruoštas. Pasirinkite, ko norite

Į komplektą dažniausiai įeina platforma ir vienas variklis dviems varomiesiems ratams (vikšras) ir skyrius akumuliatoriams. Yra visų varančiųjų ratų variantų - su varikliu 4 ratams. Pradedantiesiems rekomenduojame pasiimti tanko tipo platformas

Du varomieji ratai ir trečias atraminis ratas.

  1. Toliau mums reikia nuotolio ieškiklio. Sonaras (dar žinomas kaip nuotolio ieškiklis, dar žinomas kaip Ultragarsinis modulis) Kaip nuotolio ieškiklis, iš pradžių buvo pasirinktas ultragarsinis ir infraraudonųjų spindulių. Kadangi ultragarso charakteristikos yra žymiai geresnės (maksimalus diapazonas yra apie 4-5 metrai, palyginti su 30-60 cm), o kaina yra maždaug tokia pati, pasirinkimas krito į Ultrasonic. Labiausiai paplitęs modelis yra HC-SR04.

  1. Variklio vairuotojas.

Ką turėčiau daryti? Pirmas dalykas, kuris ateina į galvą, yra įdėti tranzistorių į mikrovaldiklio išvestį ir iš jo maitinti variklius. Tai, žinoma, gerai, bet neveiks, jei norime pasukti variklį kita kryptimi... Tačiau H tiltelis, kuris yra šiek tiek sudėtingesnė grandinė nei tranzistorių pora, puikiai susidoros su šią užduotį. Tačiau šiuo atveju jų yra daug paruoštų integrinių grandynų pavidalu, todėl manau, kad nereikia išradinėti dviračio iš naujo - nusipirksime gatavą. Be to, kaina 2-3 doleriai... Einam toliau. Šiems tikslams pirksime L293D lustą arba, dar geriau, jo pagrindu sukurtą Motor Shield.

Variklio skydas ant L298N lusto

  1. Garso generavimas – pjezo skleidėjas

Paprasčiausias garso generavimo variantas yra naudoti pjezo emiterį.

Pjezokeraminiai emiteriai (pjezo emiteriai) yra elektroakustiniai garso atkūrimo įrenginiai, naudojantys pjezoelektrinį efektą. (dielektriko poliarizacijos poveikis veikiant mechaniniams įtempimams (tiesioginis pjezoelektrinis efektas). Taip pat yra atvirkštinis pjezoelektrinis efektas – mechaninių deformacijų atsiradimas veikiant elektriniam laukui.

Tiesioginis pjezoelektrinis efektas: pjezo žiebtuvėliuose, kad būtų gauta aukšta įtampa per kibirkšties tarpą;

Atvirkštinis pjezoelektrinis efektas: pjezo emitteriuose (veiksmingas esant aukštiems dažniams ir mažų matmenų);)

Pjezo emiteriai plačiai naudojami įvairiuose elektroniniuose įrenginiuose – žadintuvuose, telefonuose, elektroniniuose žaisluose, buitinėje technikoje. Pjezokeraminis emiteris susideda iš metalinės plokštės, ant kurios yra padengtas pjezoelektrinės keramikos sluoksnis, kurio išorėje yra laidžioji danga. Plokštelė ir purškiklis yra du kontaktai. Pjezo emiteris taip pat gali būti naudojamas kaip pjezoelektrinis mikrofonas arba jutiklis.

Tai viskas, ko mums iš pradžių reikia. Pirmiausia pažiūrėkime, kaip atskiras pamokas surinkti ir padaryti, kad šios dalys veiktų atskirai.

2 pamoka. Darbas su ultragarsiniu atstumo matavimo jutikliu (atstumo ieškiklis)

3 pamoka. „Arduino“ ir „Motor Shield“ L298N pagrindu

4 pamoka. Garso atkūrimas – pjezo skleidėjas

5 pamoka. Roboto surinkimas ir programos derinimas

Šiandienos straipsnyje aš jums pasakysiu, kaip savo rankomis sukurti „Arduino“ mikrovaldiklio pagrindu robotą, kuris išvengia kliūčių.



Norėdami pasigaminti robotą namuose, jums reikės pačios mikrovaldiklio plokštės ir ultragarsinio jutiklio. Jei jutiklis aptiks kliūtį, servo leis jam apeiti kliūtį. Skenuodamas erdvę į dešinę ir į kairę, robotas pasirinks tinkamiausią kelią kliūties išvengti.

„Codebender“ yra naršyklės IDE, lengviausias būdas programuoti robotą iš naršyklės. Turite spustelėti mygtuką „Vykdyti Arduino“ ir viskas, tai negali būti paprasčiau.

Įdėkite bateriją į skyrių ir vieną kartą paspauskite funkcinį mygtuką ir robotas pradės judėti pirmyn. Norėdami sustabdyti judėjimą, dar kartą paspauskite mygtuką.

/* Arduino kliūčių vengiantis robotas su servo varikliu ir ultragarsiniu jutikliu HC-SR04 LED ir garsiniu signalu */ //Bibliotekos #include #include "Ultrasonic.h" //Constants const int mygtukas = 2; //Mygtuko kaištis į kaištį 2 const int led = 3; //LED kaištis (per rezistorių) prie kaiščio 3 const int buzzer = 4; //Tweeter kaištis į kaištį 4 const int motorA1= 6; //teigiamas (+) variklio A kontaktas iki 6 kaiščio (PWM) (iš modulio L298!) const int motorA2= 9; //neigiamas variklio A kontaktas (-) iki 9 kaiščio (PWM) const int motorB1=10; // teigiamas (+) variklio B kontaktas su 10 kaiščiu (PWM) const int motorB2=11; // neigiamas variklio B kaištis (-) iki 11 kaiščio (PWM) Ultragarsinis ultragarsas (A4 ,A5); //Sukurti objektą ultrasonic(trig pin,echo pin) Servo myservo; //Sukurti servo objektą servo valdymui //Kintamieji int atstumas; //Kintamasis atstumo iki objekto saugojimui int checkRight; int checkKairėje; int funkcija=0; //Kintamasis roboto funkcijai saugoti: „1“ – judėjimas arba „0“ – sustabdytas. Sustabdytas pagal nutylėjimą int buttonState=0; //Kintamasis mygtuko būsenai išsaugoti. Numatytasis "0" int poz=90; //kintamasis servo pozicijai išsaugoti. Pagal numatytuosius nustatymus 90 laipsnių – jutiklis žiūrės į priekį int flag=0; //naudinga vėliavėlė, skirta išsaugoti mygtuko būseną, kai mygtukas atleidžiamas void setup() ( myservo.attach(5); //Servo kaištis prijungtas prie 5 kaiščio myservo.write(pos); // nurodo servo eiti į padėtį kintamajame " pos " pinMode (mygtukas, INPUT_PULLUP) pinMode(bzzer, OUTPUT) pinMode(motorA2, OUTPUT); OUTPUT); sustoja/juda) kai paspaudžiamas mygtukas if (buttonState = = LOW) (//Jei mygtukas paspaudžiamas vieną kartą... delay(500); if (vėliava == 0)(funkcija = 1; vėliavėlė=1; / /pakeisti vėliavėlės kintamąjį) else if (vėliava == 1)( / /Jei mygtukas paspaustas du kartus funkcija = 0; vėliavėlė=0; //vėl keisti vėliavėlės kintamąjį dar kartą ) ) if (funkcija == 0)( // Jei mygtukas atleidžiamas arba paspaudžiamas du kartus, tada: myservo.write(90) //set for servo 90 laipsnių – jutiklis žiūrės į priekį stop(); //robotas lieka nejudantis noTone(buzzer); //pypsėjimas išjungtas digitalWrite(led, HIGH);// ir diodas įjungtas ) else if (funkcija == 1)(//Jei mygtukas paspaustas, tada: //Nuskaitykite atstumą... atstumą = ultrasonic.Ranging(CM) //Patarimas: naudokite "CM" centimetrams ir "INC" coliams //Patikrinkite objektus. .. if (atstumas > 10)( pirmyn(); //Viskas aišku, judėkime pirmyn! noTone(buzzer); digitalWrite(led,LOW); ) else if (atstumas<=10){ stop(); //Обнаружен объект! Останавливаемся и проверяем слева и справа лучший способ обхода! tone(buzzer,500); // издаём звук digitalWrite(led,HIGH); // включаем светодиод //Начинаем сканировать... for(pos = 0; pos =0; pos-=1){ //идём от 180 градусов к 0 myservo.write(pos); // говорим серво пройти на позицию в переменной "pos" delay(10); // ждём 10 мс, пока сервопривод достигнет нужной позиции } checkRight= ultrasonic.Ranging(CM); myservo.write(90); // Датчик снова смотрит вперёд //Принимаем решение – двигаться влево или вправо? if (checkLeft checkRight){ right(); delay(400); // задержка, меняем значение при необходимости, чтобы заставить робота повернуться. } else if (checkLeft <=10 && checkRight <=10){ backward(); //Дорога перекрыта... возвращаемся и идём налево;) left(); } } } } void forward(){ digitalWrite(motorA1, HIGH); digitalWrite(motorA2, LOW); digitalWrite(motorB1, HIGH); digitalWrite(motorB2, LOW); } void backward(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, HIGH); digitalWrite(motorB1, LOW); digitalWrite(motorB2, HIGH); } void left(){ digitalWrite(motorA1, HIGH); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, HIGH); } void right(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, HIGH); digitalWrite(motorB1, HIGH); digitalWrite(motorB2, LOW); } void stop(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, LOW); }

Spustelėję mygtuką „Redaguoti“, galite redaguoti eskizą pagal savo poreikius.

Pavyzdžiui, pakeitę išmatuoto atstumo iki kliūties reikšmę „10“ cm, sumažinsite arba padidinsite atstumą, kurį robotas Arduino nuskaitys ieškodamas kliūties.

Jei robotas nejuda, jis gali pakeisti elektros variklių (motorA1 ir motorA2 arba motorB1 ir motorB2) kontaktus.

7 veiksmas: baigtas robotas

Jūsų namų kliūčių vengiantis robotas, pagrįstas Arduino mikrovaldikliu, yra paruoštas.