Pogovorimo se o tem, kako lahko z Arduinom ustvarite robota, ki uravnoteži kot Segway.

Segway iz angl. Segway je dvokolesno stoječe vozilo, opremljeno z električnim pogonom. Imenujejo jih tudi žiroskuterji ali električni skiroji.

Ste se kdaj vprašali, kako deluje Segway? V tej vadnici vam bomo poskušali pokazati, kako narediti robota Arduino, ki se uravnoteži tako kot Segway.

Za uravnoteženje robota morajo motorji preprečiti padec robota. Ta ukrep zahteva povratne informacije in korektivne elemente. Povratni element - , ki zagotavlja pospešek in vrtenje v vseh treh oseh (). Arduino to uporablja, da pozna trenutno orientacijo robota. Korektivni element je kombinacija motorja in kolesa.

Končni rezultat bi moral biti nekaj takega:

Shema robota

L298N modul gonilnika motorja:

Motor z enosmernim menjalnikom s kolesom:

Samouravnoteženi robot je v bistvu obrnjeno nihalo. Lahko je bolje uravnotežen, če je središče mase višje glede na osi koles. Višje središče mase pomeni večji masni vztrajnostni moment, kar ustreza manjšemu kotnemu pospešku (počasnejšemu padcu). Zato smo baterijo postavili na vrh. Vendar je bila višina robota izbrana glede na razpoložljivost materialov 🙂

Končana različica samouravnoteženega robota je vidna na zgornji sliki. Na vrhu je šest Ni-Cd baterij za napajanje tiskano vezje. Med motorji se za pogon motorja uporablja 9-voltna baterija.

Teorija

V teoriji krmiljenja je za držanje neke spremenljivke (v tem primeru položaja robota) potreben poseben krmilnik, imenovan PID (Proportional Integral Derivative). Vsak od teh parametrov ima "dobitek", ki se običajno imenuje Kp, Ki in Kd. PID zagotavlja korekcijo med želeno vrednostjo (ali vhodom) in dejansko vrednostjo (ali izhodom). Razlika med vhodom in izhodom se imenuje "napaka".

PID regulator zmanjša napako na najmanjšo možno vrednost z zveznim prilagajanjem izhoda. V našem robotu Arduino s samouravnoteženjem vhod (ki je želeni naklon v stopinjah) nastavi programska oprema. MPU6050 prebere trenutni nagib robota in ga vnese v algoritem PID, ki izvaja izračune za nadzor motorja in ohranjanje robota v pokončnem položaju.

PID zahteva, da so vrednosti Kp, Ki in Kd nastavljene na optimalne vrednosti. Inženirji uporabljajo programsko opremo, kot je MATLAB, za samodejni izračun teh vrednosti. MATLAB-a v našem primeru žal ne moremo uporabiti, ker bo projekt še bolj zapletel. Namesto tega bomo prilagodili vrednosti PID. To storite tako:

  1. Nastavite Kp, Ki in Kd na nič.
  2. Prilagodite Kp. Premalo Kp bo povzročilo padec robota, ker popravek ni dovolj. Zaradi preveč Kp robot divja naprej in nazaj. Zaradi dobrega Kp se bo robot precej nagnil naprej in nazaj (ali nekoliko zanihal).
  3. Ko je Kp nastavljen, prilagodite Kd. Dobra vrednost Kd bo zmanjšala nihanja, dokler robot ni skoraj stabilen. Prav tako bo ustrezen Kd obdržal robota, tudi če ga potisnete.
  4. Končno namestite Ki. Ko je vklopljen, bo robot nihal, tudi če sta Kp in Kd nastavljena, vendar se bo sčasoma stabiliziral. Pravilna vrednost Ki bo skrajšala čas, potreben za stabilizacijo robota.

Obnašanje robota si lahko ogledate spodaj v videu:

Koda Arduino za robota, ki se sam uravnava

Za izdelavo našega robota smo potrebovali štiri zunanje knjižnice. Knjižnica PID olajša izračun vrednosti P, I in D. Knjižnica LMotorController se uporablja za krmiljenje dveh motorjev z modulom L298N. Knjižnici I2Cdev in knjižnici MPU6050_6_Axis_MotionApps20 sta zasnovani za branje podatkov iz MPU6050. V tem repozitoriju lahko prenesete kodo, vključno s knjižnicami.

#vključi #vključi #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #define MIN_ABS_SPEED 20 MPU6050 mpu; // nadzor/status MPU vars bool dmpReady = false; // nastavi na true, če je bila inicializacija DMP uspešna uint8_t mpuIntStatus; // vsebuje dejanski bajt statusa prekinitve iz MPU uint8_t devStatus; // vrni status po vsaki operaciji naprave (0 = uspeh, !0 = napaka) uint16_t packetSize; // pričakovana velikost paketa DMP (privzeto je 42 bajtov) uint16_t fifoCount; // število vseh bajtov, ki so trenutno v FIFO uint8_t fifoBuffer; // vmesni pomnilnik FIFO // orientacija/gibanje vars Quaternion q; // kvaternionski vsebnik VectorFloat gravity; // gravitacijski vektor float ypr; // posoda za obračanje/naklon/zvijanje in gravitacijski vektor //PID dvojna originalSetpoint = 173; dvojna nastavljena točka = originalna nastavljena točka; dvojni premični odmik kota = 0,1; dvojni vhod, izhod; //prilagodite te vrednosti tako, da ustrezajo vaši zasnovi dvojni Kp = 50; dvojni Kd = 1,4; dvojni Ki = 60; PID pid(&vhod, &izhod, &nastavljena točka, Kp, Ki, Kd, ​​​​DIREKT); dvojni motorSpeedFactorLeft = 0,6; dvojni motorSpeedFactorRight = 0,5; //KRMILNIK MOTORJA 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; // označuje, ali je prekinitveni pin MPU dosegel visoko vrednost void dmpDataReady() ( mpuInterrupt = true; ) void setup() ( // pridruži se vodilu I2C (knjižnica I2Cdev tega ne naredi samodejno) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin( ); TWBR = 24; // 400kHz I2C takt (200kHz, če je CPE 8MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif mpu.initialize(); devStatus = mpu.dmpInitialize(); // tukaj navedite lastne odmike žiroskopa, prilagojene za najmanjšo občutljivost mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 tovarniško privzeto za moj test čip // poskrbi, da deluje (vrne 0, če je) if (devStatus == 0) ( // vklopi DMP, zdaj ko je pripravljen mpu.setDMPEnabled(true); // omogoči zaznavanje prekinitev Arduino attachInterrupt(0, dmpDataReady , RISING); mpuIntStatus = mpu.getIntStatus(); // nastavite našo zastavico DMP Ready, tako da funkcija main loop() ve, da je v redu, da jo uporabite dmpReady = true; // pridobite pričakovani DM velikost paketa P za poznejšo primerjavo packetSize = mpu.dmpGetFIFOPacketSize(); //nastavitev PID pid.SetMode(AUTOMATIC); pid.SetSampleTime(10); pid. SetOutputLimits(-255, 255); ) else ( // NAPAKA! // 1 = začetno nalaganje pomnilnika ni uspelo // 2 = posodobitve konfiguracije DMP niso uspele // (če se bo pokvarilo, bo običajno koda 1) Serial.print(F("Inicializacija DMP neuspešno (koda ")); Serial.print(devStatus); Serial.println(F(")")); ) ) void loop() ( // če programiranje ni uspelo, ne poskušajte storiti ničesar, če (!dmpReady ) return; // počakajte na prekinitev MPU ali dodatne pakete, ki so na voljo, medtem ko (!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 na voljo // (to nam omogoča takojšnje branje več brez čakanja na prekinitev) fifoCount -= packetSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); vnos = ypr * 180/M_PI + 180; ) )

Vrednosti Kp, Ki, Kd lahko delujejo ali pa tudi ne. Če ne, sledite zgornjim korakom. Upoštevajte, da je nagib v kodi nastavljen na 173 stopinj. To vrednost lahko spremenite, če želite, vendar upoštevajte, da je to kot, ki ga mora podpirati robot. Če so vaši motorji prehitri, lahko prilagodite vrednosti motorSpeedFactorLeft in motorSpeedFactorRight.

To je vse za zdaj. Se vidiva.

Zadnji del prispevka je o majhnem robotu, ki ga sestavljamo na šasijo - pokrov iz plastične posode za hrano. Možgani našega robota so plošča Arduino UNO, plošča Driver Motor Shield krmili motorje in servo, senzor za ovire - Ultrasonic sonar - oči kot Wally (iz risanke) - "HC-SR04 Ultrasonic Sensor". , . Kako ustvariti robota na Arduinu?

9. Priključitev baterije in motorjev

Ko priključite baterijo, morate biti popolnoma prepričani, da je polarnost pravilna, kot pravijo, izmerite 7-krat, enkrat priključite. Poskusite slediti temu pravilu - rdeča žica je vedno na + moč, črna žica je ozemljena, je minus, je GND. Proizvajalci poskušajo upoštevati enaka pravila. Zato priključimo žice, ki prihajajo iz prostora za baterije, na blok + M in GND na krmilni plošči motorja. Žice iz pogonskih motorjev priključimo na bloke M1, M2 krmilne plošče motorja. Leva stran v smeri vožnje se navezuje na blok M1, desna na blok M2. Za polarnost motorjev naj vas še ne skrbi, lahko jo spremenite, če gre med testom kaj narobe.

10. Preverite polarnost in pravilno povezavo modulov

Zelo pomemben in ključen trenutek pri sestavljanju mikrorobota je preveriti pravilno namestitev, povezave, module po blokovni shemi, pogledati oznake na ploščah, preveriti s testerjem, polarnost napajalnika, kdo ima tester.

11. Korak programiranja Arduino

Program se na mikrokrmilnik Arduino naloži iz računalnika, s pomočjo USB kabla in posebnega programa - okolja za programiranje in urejanje skic (programov) - Arduino IDE. Program lahko dobite na spletni strani arduino.cc, razdelek za prenos, kjer lahko vedno prenesete najnovejšo, najnovejšo različico programa. Ko je programsko okolje nameščeno, ostane le še, da iz menija gonilnika izberete, za katero ploščo želite uporabiti - v našem primeru Arduino UNO in COM vrata, preko katerih je Arduino povezan preko USB emulacije. Na to temo je veliko najrazličnejših priročnikov, zato to fazo preskočimo (za vsak slučaj - meni Orodja > Serijska vrata).

Program za mikro robota je na voljo na naši spletni strani, vendar šele po registraciji, hec Mini Robot na Arduinu. Da bi program deloval, so potrebne dodatne knjižnice - AFMotor.h, Sevo.h, NewPing.h, vse so v arhivu, arhiv morate razpakirati v mapo nameščenega programa Arduino IDE. Zame je to imenik c: Program Files (x86) Arduino, knjižnice je treba postaviti v mapo knjižnic Arduino c: Program Files (x86). Nato pojdite v imenik c:Program Files (x86)ArduinolibrariesAPC_4_ROBOT in dvakrat kliknite na APC_4_ROBOT.ino, to je sama skica, nato pa se bo zagnalo programsko okolje. Golo Arduino Uno ploščo (to pomeni brez priključenih modulov) preko USB kabla povežemo z računalnikom, pritisnemo gumb s puščico desno, program se začne nalagati na krmilnik. Celoten postopek traja nekaj sekund, in če je vse pravilno povezano, ne smejo zasvetiti nobeni rdeči napisi, indikator v spodnjem desnem kotu pa bo dokončal svoje gibanje 100%. Program za Arduino je nameščen v krmilniku Atmega328.

12. Zagon robota

Mini robot na Arduinu - pripravljen na selitev. Robot Wally

Možna je izvedba prvega, še poskusnega zagona našega robota. Naš robot ni šel pravilno, eno kolo se je vrtelo pravilno, drugo pa v nasprotno smer. Moral sem spremeniti polarnost žic motorja na bloku M2. Potem pa je naš robotček častno opravil z vsemi vogali in ovirami v sobi.

Ta članek posvečam vsem začetnikom, ki se odločijo spoznati Arduino. Nadaljnji študij se lahko nadaljuje od prve lekcije - utripa LED. Gradivo z robotom je zelo zanimivo in da bi vas zanimalo, sem se odločil, da začnem s tem, kako točno zgraditi robota, ki obvozi ovire. Ostalo bo veliko lažje in bo šlo kot po maslu. Ta robot res deluje. Srečno vsem!

P.S. Šlo je za dokaj svoboden prevod članka, ki so ga nekoč našli na prostranstvih interneta, bolj seveda gaga, ker je bilo vse narejeno na nov način, risbe so bile dodelane, ni bilo sklicevanja na vir. , ker je bil dokument Wordov dokument.

Ampak tudi z nakupom že pripravljenega polnopravnega robota, ki temelji na tej plošči. Za otroke osnovna šola ali predšolska starost končanih projektov Arduino je še bolje, ker. "Neživa" plošča izgleda dolgočasno. Na ta način primeren za tiste, ki jih električna vezja ne privlačijo posebej.

Z nakupom delujočega modela robota, t.j. dejansko dokončana visokotehnološka igrača, lahko prebudite zanimanje za neodvisno oblikovanje in ustvarjanje robotov. Ko se dovolj igrate s tako igračo in ugotovite, kako deluje, lahko začnete izboljševati model, vse razstavite in začnete sestavljati nove projekte na Arduinu z uporabo osvobojene plošče, pogonov in senzorjev. Odprtost platforme Arduino omogoča isto sestavnih delov naredi nove igrače.

Ponujamo majhen pregled že pripravljenih robotov na plošči Arduino.

Arduino krmiljen avto prek Bluetootha

Bluetooth voden avto, ki stane nekaj manj kot 100 dolarjev. Dobavljeno razstavljeno. Poleg ohišja, motorja, koles, litijeve baterije in polnilnika dobimo ploščo Arduino UNO328, krmilnik motorja, adapter Bluetooth, daljinski upravljalnik in še več.

Videoposnetek tega in še enega robota:

več natančen opis igrač in možnost nakupa na spletni strani spletne trgovine DealExtreme.

Robot želva Arduino

Komplet robotske želve vreden približno 90 $. Manjka samo lupina, vse ostalo, kar je potrebno za življenje tega junaka, je priloženo: plošča Arduino Uno, servomotorji, senzorji, sledilni moduli, IR sprejemnik in daljinski upravljalnik, baterija.

Turtle lahko kupite pri DealExtreme, podobnem cenejšem robotu na Aliexpressu.

Sleden avto na Arduinu, nadzorovan z mobilnega telefona

Sledeno vozilo, nadzorovano prek Bluetootha iz mobilnega telefona, stane 94 $. Poleg caterpillar baze dobimo ploščo Arduino Uno in razširitveno ploščo, Bluetooth ploščo, baterijo in polnilec.

Gosenično vozilo je mogoče kupiti tudi na spletni strani DealExtreme, tam je tudi podroben opis. Mogoče bolj zanimivo železo arduino rezervoar na Aliexpressu.

Arduino avto, ki se vozi skozi labirinte

Vožnja avtomobila skozi labirinte, ki stane 83 dolarjev. Poleg motorjev, plošče Arduino Uno in drugih potrebnih stvari vsebuje module za sledenje in module za izogibanje oviram.

Končan robot ali okvir robota

Poleg možnosti uporabe že pripravljenih kompletov za ustvarjanje robotov Arduino, obravnavanih v pregledu, lahko kupite ločen okvir (telo) robota - lahko je platforma na kolesih ali gosenica, humanoid, pajek , in drugi modeli. V tem primeru bo treba polnjenje robota opraviti neodvisno. Pregled takih primerov je podan v našem.

Kje drugje kupiti že pripravljene robote

V pregledu smo izbrali najcenejše in po našem mnenju najbolj zanimive že pripravljene robote Arduino iz kitajskih spletnih trgovin. Če ni časa čakati na paket iz Kitajske, je v spletnih trgovinah Amperka in DESSY velika izbira že pripravljenih robotov. Spletna trgovina ROBstore ponuja nizke cene in hitro dostavo. Seznam priporočenih trgovin.

Morda vas bodo zanimali tudi naši pregledi projektov Arduino:


Arduino usposabljanje

Niste prepričani, kje začeti učiti Arduino? Pomislite, kaj vam je bližje - sestavljanje lastnih preprostih modelov in postopno povečevanje njihove kompleksnosti ali spoznavanje bolj zapletenih, a že pripravljenih rešitev?

Dober dan! Pred vami, dragi moji, je umetniški robot, ki lahko barva različne kroglaste ali jajčaste predmete velikosti od 4 do 9 cm.

Za izdelavo potrebujete 3D tiskalnik, nabor standardnih orodij + Arduino.

Opomba: Ne obupajte nad projekti, ki uporabljajo 3D tiskalnik. Če želite, lahko vedno najdete kraj ali način, kjer lahko naročite tiskanje podrobnosti, potrebnih za projekt.

1. korak: Nekaj ​​o robotu

Art robot - dvoosni domače, ki lahko tiska na večino sferičnih površin. Robot je konfiguriran za določeno vrsto predmeta (ping-pong žogice, božični okraski, žarnice in jajca (raca, gos, kokoš ...).

Visoko natančni koračni motorji z visokim navorom se uporabljajo za vrtenje sferičnega predmeta in premikanje manipulatorja, tih in zanesljiv servo pogon SG90 pa za dvig mehanizma ročaja.

2. korak: Zahtevani deli

Narediti naredi sam obrt potrebovali bomo:

  • 2x ležaji 623;
  • Lasnica s premerom 3 mm in dolžino 80-90 mm;
  • 1x vzmet (dolžina 10 mm in premer 4,5 mm);
  • 2x NEMA 17 koračna motorja (navor 4,4 kg/cm);
  • Kabli za motorje (dolžine 14 + 70 cm);
  • USB kabel;
  • 1x servo SG90;
  • Arduino Leonardo;
  • ščit JJRobots;

  • 2xA4988 gonilnika koračnih motorjev;
  • Napajanje 12V / 2A;
  • 11x vijaki M3 6 mm;
  • 4x M3 16 mm vijaki;
  • 4x matice M3;
  • 2x 20 mm priseski;
  • 1x krilata matica M3;
  • 1x marker;

3. korak: Splošna shema

Kot "goljufanje" lahko uporabite to shemo.

4. korak: Začnimo!

Robot premika manipulator s pritrjenim markerjem, ki ga poganja koračni motor. Drugi koračni motor je odgovoren za vrtenje predmeta, na katerega je nanešena risba (jajce, žoga ...). Za držanje predmeta na mestu se uporabljata dve priseski, ena je pritrjena na koračni motor, druga pa na nasprotni strani predmeta. Majhna vzmet bo pritisnila na prisesek, da bo držala predmet. Servo SG90 se uporablja za dviganje/spuščanje markerja.

5. korak: Manipulator

Namestite matico v zanjo pripravljeno luknjo in privijte 16 mm vijak. Naredimo enako za držalo predmeta (desno na zgornji sliki). Pri izdelavi tečaja za manipulator smo uporabili 2 vijaka 16 mm. Ta tečaj se mora po privijanju vijakov prosto vrteti.

6. korak: sesalci

Eno od priseskov namestite v luknjo v držalu predmeta.

7. korak: Pritrditev koračnih motorjev

Oba koračna motorja pritrdite na glavni okvir z 8 vijaki.

8. korak: vrtilna os

Postavimo vse elemente, kot je prikazano na zgornji sliki.

  • sesalec;
  • vijak;
  • Zgornji del;
  • pomlad;
  • Ležaj 623 (mora biti vgrajen v levo skodelico);
  • Leva skodelica;
  • Prosti prostor za glavni okvir;
  • Desna skodelica;
  • Ležaj 623;
  • Ločilni obroč;
  • Krilata matica (M3).

9. korak: Postavite vse na svoje mesto

Sestavljen manipulator vstavite na os koračnega motorja.

Namestite levo oporo na os koračnega motorja.

Marker in jajce sta postavljena kot primer (ni vam ju treba postaviti zdaj).

OPOMBA: Servo bo zahteval prilagoditve. Med postopkom umerjanja boste morali znova nastaviti njegov kot.

10. korak: Elektronika

Pritrdite elektroniko na zadnjo stran glavnega okvirja z vijaki (2 bosta dovolj).

Povežimo kable.

Če pri priklopu koračnih motorjev obrnete polariteto, se bodo ti preprosto vrteli v nasprotni smeri, pri servu pa situacija ni tako neškodljiva! Zato pred priključitvijo še enkrat preverite polariteto!

Korak 11: Programiranje Arduino Leonardo

Programirajmo Arduino Leonardo z uporabo programskega okolja Arduino IDE (v 1.8.1).

  • Prenesite Arduino IDE (v 1.8.1) in namestite program;
  • Zaženimo programsko opremo. Izberite ploščo Arduino Leonardo in ustrezen COM-PORT v meniju "tools->board";
  • Odprimo in prenesimo kodo Sphere-O-Bot. Razpakirajmo vse datoteke znotraj ene mape in jo poimenujmo "Ejjduino_ARDUINO".

12. korak: Art Robot je pripravljen za ustvarjanje umetniškega dela

13. korak: Nadzor robota

Programska oprema inkscape. Prenesite in namestite programsko opremo Inkscape (priporočam stabilno različico 0.91).

Prenesite in namestite razširitev EggBot Control (različica 2.4.0 je bila v celoti preizkušena).

Razširitev EggBot Control za Inkscape je orodje, ki se uporablja pri testiranju in umerjanju EggBot ter prenosu risb v jajce. Najprej morate zagnati Inkscape. Po zagonu Inkscapea se prikaže meni »Razširitve«, v njem pa že morate izbrati podmeni »Eggbot«. Če ne vidite podmenija Eggbot, potem niste pravilno namestili razširitev. Popolna rezerva in natančno sledite navodilom za namestitev razširitev.

To je vse, hvala za vašo pozornost!)

Na Arduinu je zelo enostavno narediti različne avtomobile daljinec, preprosti senzorji in logika. Zato je ta linija izjemno priljubljena. Prodanih je veliko združljivih senzorjev in razširitvenih plošč. Internet je poln že pripravljenih programskih knjižnic in odprtokodnih projektov za vse priložnosti. Skoraj vsa vprašanja, ki se vam bodo pojavila v procesu obvladovanja Arduina, je nekdo že zastavil in vedno boste našli odgovor.

Začnimo z nečim, kajne? Glavna težava je izbira krmilnika. Obstaja veliko revizij Arduina, pa tudi klonov tretjih oseb, zgrajenih iz teh revizij. Tukaj sta morda dva najbolj zanimiva razreda za nas:

  • Arduino Uno- najboljša izbira začetnik, najpreprostejša, proračunska in običajna plošča. Temelji na čipu ATmega328 s taktno frekvenco 16 MHz, 32 KB flash pomnilnika, 2 KB RAM-a in 1 KB EEPROM-a. Uno ima 14 digitalnih vhodov/izhodov, ki se lahko uporabljajo za krmiljenje senzorjev in servomotorjev ter drugih naprav;
  • Arduino Mega / Mega 2560 je plošča, ki vam bo prišla prav, ko že vnaprej veste, da bo projekt težak. Glavna razlika je več vhodov/izhodov (48 v Mega, 54 v Mega 2560). Tukaj je tudi veliko več pomnilnika: 8 KB RAM-a, 4 KB EEPROM-a in bliskovni pomnilnik 128 oziroma 256 KB (v Mega oziroma Mega 2560). Med seboj se plošče razlikujejo tudi po čipu, hitrosti USB in nekaterih drugih lastnostih.

Seveda so tu še Arduino Pro, Arduino LilyPad in številni drugi. Zdaj pa se osredotočimo na prva dva modela. V našem primeru je vse precej preprosto: Mega je potreben za robota z veliko nogami.

Prva koda

Najprej namestimo Arduino IDE (arduino.cc) – to je brezplačno razvojno okolje za več platform. Zdaj, če povežemo naš Arduino, lahko poskusimo napisati prvo kodo na najpreprostejšem primeru: utripajočem LED programu. Večina krmilnikov Arduino ga ima in so povezani na pin 13. Mimogrede, v svetu Arduino se programi običajno imenujejo skice. Tukaj je besedilo skice s komentarji:

// Dajte temu zatiču ime LED: const int LED = 13; void setup() ( // Inicializiraj digitalni pin // za izhod: pinMode(LED, OUTPUT); ) void loop() ( // Nastavi nivo logične ena // na pin 13 (sveti LED): digitalWrite(LED, HIGH ) ; // Zaustavi skico // za sekundo: delay(1000); // Uporabi raven logične ničle // na pin 13 (izklopi LED): digitalWrite(LED, LOW); // Ponovno začasno zaustavi skico za sekundo: zamuda (1000); )

Upoštevajte nastavitve in funkcije zanke. Prisotni morajo biti v kateri koli skici Arduino. Nastavitev se pokliče enkrat, ko je krmilnik vklopljen ali po ponovnem zagonu krmilnika. Če želite, da se koda izvede samo enkrat, jo postavite tukaj. Najpogosteje so to vse vrste inicializacijskih postopkov za nekaj. Naša skica ni izjema: digitalni zatiči Arduino lahko delujejo kot vhodi in izhodi. V funkciji nastavitve povemo, da bo pin 13 deloval kot digitalni izhod krmilnika.

Ko nastavitvena funkcija konča svoje delo, se samodejno zažene zaprta zanka, znotraj katere bo poklicana funkcija zanke. Tam moramo napisati, kaj želimo početi. In želimo uporabiti nivo logične ena (5 V) za pin 13, to je prižgati LED, nato počakati eno sekundo (1000 v milisekundah), nato uporabiti nivo logične ničle (0 V) in spet počakati eno sekundo. Naslednji klic zanke bo ponovil vse.

Zdaj našo skico »naložimo« v krmilnik. Ne, ne potrebujemo programerja. Krmilniki Arduino poleg naših skic vsebujejo poseben program - bootloader, ki predvsem nadzoruje nalaganje kode iz računalnika. Za nalaganje skice potrebujemo le kabel USB in menijsko postavko Datoteka → Naloži (Ctrl + U) v Arduino IDE.

ključno vprašanje

Koliko nog pravzaprav potrebujemo? Opredelimo se v različnih konfiguracijah hodečih robotov. Po številu nog:

  • dvonožni - dvonožni (prototip - človek);
  • štirinožni - štirinožni (prototip - večina sesalcev);
  • heksapod - šesteronožni (prototip - večina žuželk);
  • hobotnica - osemkraki (prototip - pajki, škorpijoni, raki in drugi členonožci).

Poleg števila nog je pomembna tudi konfiguracija vsake. Glavna značilnost legs je število prostostnih stopinj ali dimenzij svobode (DOF). Stopnja svobode je zmožnost vrtenja ali upogibanja okoli ene osi (redkeje premikanje naprej vzdolž nje). Očitno, če je samo ena stopnja svobode, potem na taki nogi ne boste prišli daleč. Noge z dvema stopnjama svobode (2DOF) že omogočajo premikanje večnožnih robotov, čeprav 2DOF omogoča prosto gibanje konice noge le v eni ravnini. In noga 3DOF premika "nogo" v 3D prostoru (če seveda niso vse tri osi vzporedne). Obstajajo tudi noge 4DOF, ki preprosto povečajo fleksibilnost in obseg gibanja noge. Žuželke imajo najpogosteje noge 4DOF.

Kaj to pomeni za nas? Pri poceni amaterskih robotih vsako stopnjo svobode izvaja en motor, natančneje servo pogon ali serv. Konfiguracija nog enolično določa, koliko teh servomotorjev je potrebnih. Torej bi heksapod 3DOF zahteval 18 servomotorjev, pajek s 4DOF pa 32. Naj vas ne prestrašijo številke, majhni servomotorji, ki se uporabljajo v amaterskih modelih RC, so zelo poceni. V spletnih trgovinah jih je mogoče najti po naročilu mikro servo.

Za programiranje servomotorjev je dovolj vedeti, da že imajo krmilnik, ki opravlja glavno delo. In vse kar je potrebno je napajanje in digitalni signal, ki krmilniku pove, v kateri položaj želimo obrniti pogonsko gred. Informacije o njihovi zasnovi je enostavno najti. Njihov protokol je najpreprostejši izmed vseh digitalnih komunikacijskih protokolov: impulzno-širinska modulacija - PWM (v angleščini PWM). Vsi enostavni servo motorji imajo tripolni konektor: ozemljitev, +5 V (napetost se lahko razlikuje glede na velikost in moč) in vhodni signal. Krmilniki Arduino lahko različne poti ustvariti tak signal. Prvi je strojni PWM, ki ga lahko sam čip izpiše na več svojih digitalnih V/I zatičih. Drugi je programska oprema. Programska oprema omogoča sprejem več različnih signalov PWM hkrati kot strojna oprema. Priročen ovoj je zagotovljen pod Arduino - knjižnico Servo. Omogoča vam uporabo 12 servomotorjev hkrati na večini majhnih krmilnikov (Uno, Due, Nano) in 48 servomotorjev na Arduino Mega in podobnih. Signalni pin servo je povezan z digitalnim pin-om Arduina. Ozemljitev in napajanje - očitno si lahko vsi servo motorji delijo z ozemljitvijo in napajanjem. V trižičnih servo zankah je črna ali rjava ozemljitev, običajno rdeča +5 V na sredini in končno bela ali rumena je signal. S programskega vidika je nadzor nadvse preprost:

Servo myservo; // Servo na Arduino pinu 9 myservo.attach(9); // Zasukaj na položaj 90º myservo.write(90);

Večina servomotorjev lahko zavrti gred za 180°, pri njih pa je 90° srednji položaj. Za poenostavitev povezave servomotorjev s ploščo Arduino obstaja več rešitev. Najbolj kanoničen je Sensors Shield. Če ga namestite na Uno in napajate priključke za servomotorje, lahko njihove konektorje priključite neposredno nanj.

Baterija

Drugo pomembno vprašanje je prehrana. Če imate napredno ploščo, ki vam omogoča napajanje celotnega sistema prek enega napajalnega voda (in servo motorji ne bodo motili delovanja krmilnika), potem lahko dobite z enim virom. Izbira je ogromna, najboljši od vseh, seveda, Li-Ion / Li-Po briketi za radijske modele. Potrebujejo pa tudi ustrezne polnilce. Če imate enostavnejši krmilnik (Uno / Due / Nano), ga lahko napajate ločeno, na primer z 9-voltno Krono, in servomotorje priključite na glavno močno baterijo. Tako bodo servo motorji zagotovo imeli dovolj moči. Kdaj litijeve baterije napetost morate spremljati še bolj natančno kot običajno, da ne pride do prekomernega praznjenja (dovoljene napetosti je treba pojasniti za določeno vrsto baterije). Da bi to naredili, je na robota Sleipnir privit tudi majhen digitalni voltmeter, o katerem bomo še razpravljali.

Robobug naredi sam

Komplet

  • Krmilnik Arduino Uno: 1150 rubljev
  • Trije servomotorji. Uporabil sem HXT500, 200 r. košček
  • Baterijski prostor za "Krona" s stikalom: 50 rubljev.
  • Baterija "Krona": 145 rubljev.
  • IR sprejemnik: 90 $
  • Jeklena žica s premerom približno 1,5 mm. Na primer, uporabil sem zlomljen stepalnik za jajca

Skupaj: 2035 str.

DmitryDzz:Želim vas povabiti k izdelavi majhnega daljinsko vodenega šestnožnega robotskega hrošča na osnovi krmilnika Arduino Uno. Tace bodo imele eno stopnjo svobode, upravljanje bo potekalo s pomočjo običajnega TV daljinskega upravljalnika.

Moram reči, da so to cene dragih moskovskih trgovin. V kitajskih spletnih trgovinah bo vse to stalo dvakrat cenejše. Glede na pošiljanje. Res je, po mojih izkušnjah boste morali počakati od dveh tednov do treh mesecev.

Enostavnejši način je, da vzamete konstruktorski set, ker v prvih korakih en krmilnik ne bo dovolj. Zdaj številne trgovine ponujajo takšne komplete. Na primer, obstaja čudovita spletna trgovina "Amperka". Tukaj vam bo na voljo več podobnih oblikovalcev, ki se razlikujejo po polnosti in seveda po ceni. Dovolj mi je bila najpreprostejša stvar - "Matrjoška X". Vključuje krmilnik Arduino Uno, USB kabel za povezavo z računalnikom, prototipno ploščo (nepogrešljiva stvar!), Komplet mostičkov, LED, uporov in drugih malenkosti.

V isti trgovini je razdelek "Wiki", kjer boste našli celo čudovite kratke video vadnice, prevedene v ruščino. Vsekakor jih preverite. In seveda obstaja forum, kjer vam bodo verjetno poskušali pomagati.

Kaj potrebujete od orodja:

  • spajkalnik in vse, kar potrebujete za spajkanje. Ni vam treba veliko spajkati in ne potrebujete veliko spretnosti;
  • pištola za vroče lepilo in palice zanjo;
  • klešče za delo z žico.

Če imate vse, začnimo!

Nadzor

Preidimo na prvi korak: naučiti se moramo komunicirati z daljinskim upravljalnikom in poiskati kode za pritisk nekaterih njegovih gumbov. Te kode bodo nato koristne za skico krmiljenja robota.

Na tej stopnji boste potrebovali tudi IR sprejemnik in lepo bi bilo imeti prototipno ploščo. Velika večina IR daljinskih upravljalnikov deluje na nosilnih frekvencah 36 kHz, 38 kHz ali 40 kHz (Panasonic, Sony). Izjema so Sharp (56 kHz), Bang & Olufsen (455 kHz) in morda še kdo bolj eksotičen. Zato je za nas povsem primeren vsak IR sprejemnik na 36, ​​38 ali 40 kHz. Frekvenca morda ne ustreza natančno nosilni frekvenci signala. V tem primeru se bo občutljivost sprejemnika zmanjšala, vendar v praksi nisem opazil nobenega neugodja pri uporabi IR sprejemnika TSOP2136 (36 kHz - zadnji dve števki - frekvenca) in daljinskega upravljalnika Sony (40 kHz).

Tako so IR sprejemniki TSOP21xx, TSOP22xx, TSOP312xx primerni za večino daljincev. Zadnji dve števki sta lahko 36, 37, 38 ali 40. Preden vklopite IR sprejemnik, preverite pinout njegovih nožic - le trije so: + 5V (napajanje), GND (ozemljitev), Vs (izhod) . Sestavimo vezje, kot je na sliki (ožičenje za TSOP2136).


Kot lahko vidite, smo izhod IR sprejemnika povezali z analognim vhodom krmilnika A0.

Tukaj je videti koda skice:

#include "IRremote.h" // Analogni vhod krmilnika // na katerega je priključen IR sprejemnik: const int IR_PIN = A0; // Ustvari objekt IR sprejemnika: IRrecv irrecv(IR_PIN); void setup() ( Serial.begin(9600); Serial.println("ready"); // Začnite poslušati IR signale: irrecv.enableIRIn(); ) void loop() ( // Opišite rezultate strukture, / / kjer // prejeti in dekodirani // ukazi IR bodo nameščeni: rezultati decode_results; // Če je ukaz IR sprejet in // uspešno dekodiran, nato // izda prejeto kodo v // serijska vrata krmilnika: if ( irrecv.decode (&results)) ( Serial.println(results.value); irrecv.resume(); ) )

Skica uporablja posebno knjižnico IRremote.h, ki dekodira signale različnih IR daljincev. Ta knjižnica je odprt projekt, prenesete jo lahko s https://github.com/shirriff/Arduino-IRremote. In da ga povežete z našim projektom, morate izvesti tri korake:

  • kopirajte imenik knjižnice v imenik knjižnic, ki se nahaja v namestitvenem imeniku Arduino IDE;
  • znova zaženite IDE;
  • dodajte vrstico #include "IRremote.h" na začetek naše skice.

Zdaj bodo funkcije IR dekodiranja na voljo v skici. Toda za ogled nastalih kod bomo še vedno uporabljali objekt Serial. Z njegovo pomočjo bomo preko serijskega priključka (isti USB kabel) prenesli kode na računalnik. V funkciji nastavitve inicializiramo objekt Serial. "9600" je 9600 baud - hitrost, ki bo uporabljena za prenos podatkov. Po inicializaciji lahko pišemo v serijska vrata s funkcijo println. Če si želite ogledati rezultat tega izhoda na računalniku v Arduino IDE, izberite menijsko postavko Orodja → Serijski monitor (Ctrl + Shift + M). Prepričajte se, da je nastavljena na 9600 baudov.

Torej krmilnik prejema napajanje prek kabla USB in preko njega prenaša podatke. Naložimo skico, zaženemo Serial Monitor in začnemo pritiskati gumbe na daljinskem upravljalniku. Kode bi se morale prikazati v oknu Serial Monitor. Protokoli daljinskega upravljanja so različni, včasih je lahko ena koda, včasih več. V vsakem primeru lahko vsakemu gumbu na daljinskem upravljalniku vedno dodelite edinstvene kode.

Potrebujemo 13 gumbov za daljinsko upravljanje. Uporabil sem naslednje:

  • 1 - gladek zavoj v levo;
  • 2 - premikanje naprej;
  • 3 - gladek zavoj v desno;
  • 4 - na mestu zavijte levo;
  • 5 - stop;
  • 6 - zavijte desno na mestu;
  • 7 - gibanje nazaj z zavojem v desno;
  • 8 - gibanje nazaj;
  • 9 - gibanje nazaj z zavojem v levo;
  • modri gumb - zelo počasen;
  • rumeno - počasi;
  • zelena - hitro;
  • rdeča - zelo hitro.

Zapišite si kode za te gumbe, pozneje jih boste potrebovali za skico krmiljenja robota.

Algoritem gibanja

Skica krmiljenja robota je na voljo na naši projektni strani (bit.ly/1dEwNDC). Ne pozabite spremeniti vrednosti konstant kod pritisnjenih gumbov daljinskega upravljalnika na kode vašega daljinskega upravljalnika (konstante IR_COMMAND_XXX_CODES v datoteki ir_command_codes.h).

Ne bomo podrobno analizirali skice, menim, da so komentarji v kodi dovolj, vendar je eno vprašanje vseeno vredno razmisliti.

Premiki žuželk so zelo zanimivi. In čeprav vsi ti hrošči padejo zelo blizu tal, so iz nekega razloga vedno stabilni: v vsakem trenutku na površini stojijo vsaj tri noge (dve na eni strani in ena na drugi). In medtem ko te noge vlečejo hrošča proti eni od njegovih gnanih tarč, se druge tri potegnejo navzgor, da ponovijo to gibanje. Naš cilj je narediti nekaj podobnega.

Naš robot hrošč ima tri servomotorje, ki so postavljeni pravokotno na gibanje. Pri levem in desnem servomotorju je os gredi usmerjena navzgor, pri sredinskem pa naprej. Naloga, na primer, levega servo je, da črpa dve nogi hkrati: levo spredaj in levo zadaj. Mimogrede, med seboj so togo povezani in prilepljeni na rocker tega servo. Naloga centralnega servo je dvigniti levo stran hrošča, nato desno. Zato sta na zibalniku tega motorja pritrjena sredinska leva in desna noga, ki sta en sam del v obliki črke U.

Skica mora zagotoviti, da se robot premika naprej, nazaj, gladko obrača v gibanju in se obrača na mestu. In rad bi tudi nadzoroval hitrost hrošča. Za programski opis teh gibanj potrebujemo matematiko. Poglej diagram.


Modri ​​krogi označujejo noge hrošča robota, ki stojijo na površini, beli krogi pa noge v zraku. Upoštevajte, da se morata levi in ​​desni servomotor pri premikanju naprej ali nazaj premikati popolnoma enako. In pri obračanju na mestu se morajo motorji vrteti v različnih smereh (simetrično). Zanimivo je tudi, da se gibanje naprej in nazaj razlikuje le v fazi centralnega servomotorja.

Kako se torej izvaja? Spomnimo se, da krmilnik nenehno kliče funkcijo zanke. Torej, v to funkcijo moramo postaviti kodo, ki določa trenutni položaj servomotorjev in jih nastavi na ta položaj. Vsak servomotor mora delovati oscilatorna gibanja. Položaj servomotorja v času t lahko izračunamo z naslednjo formulo:

X = A sin(2πt/T),

kjer je X želeni položaj servomotorja, A je amplituda nihanja, T je nihajna doba.

Torej, odvisno od trenutka t, bomo dobili spremembo vrednosti X v območju od -A do +A. Servomotorji lahko zavzamejo položaj v območju od 0 do 180°. Zato je bolje, da nihamo okoli "ničelnega" položaja pri 90 °. In če želimo zagotoviti nihanje s periodo 1 s okoli položaja 90 ° z amplitudo 30 °, potem se formula pretvori v naslednjo obliko:

X = 90 + 30 sin(2πt/1000),

kjer je t čas v milisekundah od začetka nihanja. Za nadzor hitrosti robotskega klica lahko spremenimo obdobje nihanja. Večja kot je, manjša je hitrost.

In zdaj se spet vrnimo k naši shemi, ker zgoraj zapisana formula še ni dokončana. Kako zagotoviti sinhrono, nato nasprotno gibanje levega in desnega servomotorja? Kako spremeniti fazo centralnega servomotorja? Naši formuli moramo dodati fazo nihanja. Če argument sinusa premaknemo za π za na primer desni motor, bo ta deloval v protifazi proti levemu, to je tako, kot se moramo obrniti na mestu. Tako bo zdaj videti naša formula:

X = 90 + 30 sin(2πt/1000 + Φ),

kjer je Φ faza nihanj, vrednost je od 0 do 2π.

Poglejte tabelo, da boste razumeli, kakšne bi morale biti faze nihanja servomotorjev za vsako vrsto gibanja.

Montaža

Zdaj pa sestavimo robota na prototipno ploščo in izpolnimo kontrolno skico.

To je zelo pomemben korak pred montažo. Poskusite odklopiti kabel USB in napajati postavitev iz baterije Krona. Preverite vse faze gibanja in se prepričajte, da vse deluje. Po sestavi robota bo težje spremeniti karkoli (na primer zamenjati pokvarjen servomotor).


Zdaj pa preidimo na samo montažo. Glavni nosilni element je predal za baterije. Svetujem vam, da uporabite predelek zaprtega tipa In seveda s stikalom.

Najlažji način za pritrditev detajlov hrošča je vroče lepilo. Začnite s servomotorji. Odstranite nepotrebna pritrdilna ušesa in povežite avtomobile skupaj. Nato prilepite ta sklop treh "servov" na pokrov baterije. Ne pozabite, da se mora predal za baterije prosto odpreti, če želite zamenjati baterijo.

Najlažji način je, da krmilnik prilepite na ležišče, vendar mi ta možnost ni ravno všeč, saj bom moral Arduino Uno za vedno dati hrošču. Zato si lahko zakomplicirate življenje in uporabite priključke Arduino za pritrditev prostora za baterije. Prilepite pin konektor na dno predelka z razmikom 2,54 mm med nožicami. Postavljen mora biti tako, da vstopi v vtičnico krmilnika v območju digitalnih izhodov 8-11. Še vedno jih ne potrebujemo. Če konektorja ni pri roki, bo zadostovala ukrivljena sponka za papir v obliki črke U.

Žice, ki prihajajo iz prostora za baterije, morajo biti priključene na priključke Vin in GND poleg njega. Ne zamenjajte polarnosti! Plus "Krona" na Vin, minus na GND. Da bi zagotovili zanesljiv stik žic z Arduino konektorji, lahko konico žice preprosto debeleje pokositrite, jaz pa sem kot čep uporabil kratko sponko. In mesto spajkanja je bilo zaprto s toplokrčno cevjo.


Konektorje servo kablov je treba odrezati, napajalne žice (+5 V - navadno rdeče in GND - črne ali rjave) združiti in priključiti na 5V priključke in sosednji GND na krmilniku. Povezali se bomo malo kasneje. Žice krmilnega signala (običajno rumene) so izhodne na digitalne izhode krmilnika: levi servomotor je na pin 2, srednji je na pin 4, desni je na pin 7.

"+" in "-" IR sprejemnika lahko preprosto priključite na Arduino konektor (5V in sosednji GND). Res je, upogibanje na pol, podvojitev njihove debeline. Prej priključene napajalne žice na servomotorje spajkamo na iste napajalne noge IR sprejemnika. Izhod signala IR sprejemnika verjetno ne bo dosegel analognega vhoda krmilnika A0 in ga boste morali povečati z žico.

Nekaj ​​nasvetov za izdelavo nog. Najprej pripravite levo in desno "spredaj-zadaj" nogo. Prepričajte se, da so simetrični (bodite pozorni na dolžine in kote zavojev). Noge začnite lepiti šele, ko se prepričate, da so servomotorji nastavljeni na položaj "nul" (90°).

Srednji par nog postavite nazadnje. Svetujem vam, da najprej naredite srednje noge daljše, nato pa jih po namestitvi odrežete na želeno dolžino. V položaju "nič" mora biti vseh šest stopal na površini. Valjanje srednjih nog z amplitudo 15° ne sme ovirati zavojev spredaj-nazaj.

Kaj je naslednje?

Robobug je že pripravljena mobilna platforma, ki temelji na enem najbolj priljubljenih in cenovno dostopnih krmilnikov. Projekt je odprt: https://github.com/beetle-ringo/arduino. Naredite fork (vejo) v GitHubu in dodajte svojo funkcionalnost. Pustite domišljiji prosto pot – dodajte IR LED in robot je pripravljen na robotsko bitko. Priključite daljinomere, taktilne senzorje, žiroskop ... Naučite robota obiti ovire ali hoditi po črti, poskusite nanj namestiti spletno kamero. Idej je lahko milijon in vedno lahko izberete najbolj zanimivo.

Robot Sleipnir

Komplet

  • Krmilnik robota Arduino Uno Dagu Spider: 2530 USD
  • Servo pogoni SG90 9g (16 kosov) 1150 r.
  • LiPo baterija, 7,4 V, 1800 mAh 4,99 USD
  • Radijski modul 4 Pin Bluetooth RF sprejemnik 270 r.
  • Indikator napetosti (neobvezno) DC 3,3–30 V rdeči LED panelni merilnik 100 USD
  • Aluminijasti kotiček. Na najbližjem gradbenem trgu 135 rubljev.
  • Vijaki in matice. Na najbližjem bolšjem trgu 35 rubljev.

Skupaj: 4710 r.

*Komponente so bile kupljene ob različnih časih in številne pozicije je mogoče optimizirati

poconoco: Poskusimo sestaviti nestandardno konfiguracijo - osemnožni robot 2DOF. 2DOF noge je veliko lažje programirati, poleg tega imam na zalogi kup neuporabljenih servomotorjev. In kar je najpomembneje, mogoče ga bo poimenovati v čast osemnogega konja boga Odina Sleipnirja (o katerem smo vedno sanjali!).

Naš Sleipnir bo imel štiri noge z dvema tečajoma na vsaki strani. Vsak sklep je servo, torej osem servo na vsako stran. Zaradi poenostavitve se bo vseh osem tečajev na eni strani konja vrtelo v isti ravnini. Čeprav to sploh ni potrebno. Še bolje, če noge na eni strani postavite malo v "šah", tako da se dve sosednji nogi ne moreta dotikati, bo še bolje, saj boste lahko naredili širši korak in galop.


Čedna in funkcionalna, a daleč od najcenejša rešitev je uporaba nestandardne krmilne plošče, optimizirane za povezovanje servomotorjev v v velikem številu. Naletel sem na robotski krmilnik Dagu Spider - to je isti Arduino Mega, vendar na plošči z vnaprej spajkanimi 3-pinskimi konektorji, kamor lahko takoj povežete teh istih 48 servomotorjev brez kakršnih koli ščitov. Idealno za robote Arduino z več nogami.

Nadzor

Upravljali se bomo preko Bluetootha. Za to obstajajo različne strojne rešitve. To so ščitniki in ločeni šali s serijskim vmesnikom UART (kot navadna com vrata, le z nivoji signala 5 V). Najbolj praktičen se mi je zdel majhen šal z vmesnikom UART. Povezuje se z ustreznimi zatiči UART/Serial na vratih Arduino. Opažamo dve niansi: na Uno / Due / Nano in podobnih je samo ena taka vrata, uporablja pa se tudi za utripanje prek USB-ja. Zato boste med vdelano programsko opremo morda morali izklopiti modul Bluetooth. In drugi odtenek - ne pozabite, da je RX-pin modula povezan s TX-pinom Arduino in TX - z RX. Takšne stvari so v UART.

Bluetooth programiranje ni nič težje od servomotorjev, podatke lahko beremo bajt za bajtom, kar bomo uporabili:

Charcmd; Serial.begin(9600); if (Serial.available()) cmd = Serial.read();

Če se uporablja Arduino Mega in je Bluetooth povezan z drugimi vrati, potem je Serial1 napisan namesto Serial. Omeniti velja, da ne morete uporabljati Bluetootha, ampak upravljate robota neposredno prek USB-ja. In nič se ne bo spremenilo v zgornji kodi! Deluje samo s serijskim portom in ali tam visi BT oddajnik ali USB Serial converter - za nas je vseeno.

Druga stran Bluetootha

Najprimernejši način povezovanja je s standardnimi pripomočki za Linux. Za delo potrebujemo pripomočke sdptool, rfcomm (vključeni v paket bluez v repozitorijih Ubuntu), pa tudi minicom (paket se tako imenuje). Navodila za uporabo teh pripomočkov najdete na spletu.

Algoritem gibanja


Za heksapod bo najpreprostejša hoja: noge so razdeljene v dve skupini s tremi nogami in ena od skupin je popolnoma na tleh, druga je v zraku, preurejena naprej. To še zdaleč ni edina možna hoja. V zraku lahko držite samo dve taci ali celo eno, preostalih štiri ali pet pa na tleh. Za osmeronožca je tudi veliko hodov. Vzeli bomo najpreprostejšega, tudi z dvema skupinama štirih nog.

Kaj torej moramo storiti, da bomo delali s 16 servomotorji in izbrano hojo? Pravilen odgovor je branje o inverzni kinematiki (IK). Obseg članka ne omogoča širše razširitve teme, vendar je na internetu veliko gradiva. Skratka, IR rešuje problem iskanja potrebnih krmilnih signalov, da sistem zavzame želeno lego v prostoru. Za nogo to pomeni, da je treba glede na koordinate točke, kamor naj udari noga, določiti kote servomotorjev, ki jih je treba za to nastaviti. In z nadzorom koordinat stopal lahko nadzorujete položaj telesa. Imamo 2DOF noge, osi sta vzporedni, zato se noga vedno giblje v isti ravnini. Problem IR je v tem primeru reduciran na 2D prostor, kar ga močno poenostavi.

Naj bo za vsako nogo lokalno izhodišče O gred zgornjega servo, to je stegno. In imamo koordinate točke A, kamor mora zadeti noga. Potem je enostavno videti, da je treba rešiti problem iskanja presečišč dveh krogov (glej diagram krakov ene strani, to je prikazano tam na skrajnem desnem kraku). Ko najdete točko B presečišča krogov (izberete katerega koli od njih), je enostavno izračunati želene kote s pretvorbo iz kartezičnih koordinat v polarne. V kodi je rešitev te težave videti takole:

Float A = -2*x; float B = -2 * y; float C = sqr(x) + sqr(y) + sqr(dolžina bokov) - sqr(dolžina goleni); float X0 = -A * C / (sqr(A) + sqr(B)); float Y0 = -B * C / (sqr(A) + sqr(B)); float D = sqrt(sqr(hipLength) - (sqr(C) / (sqr(A) + sqr(B)))); float mult = sqrt(sqr(D) / (sqr(A) + sqr(B))); float ax, ay, bx, by; ax = X0 + B*mult; bx = X0 - B*mult; ay = Y0 - A*mult; po = Y0 + A*mult; // ali bx za drugo točko presečišča float jointLocalX = ax; // ali z za drugo presečišče float jointLocalY = ay; float hipPrimaryAngle = polarAngle(jointLocalX, jointLocalY); float hipAngle = hipPrimaryAngle - hipStartAngle; float shinPrimaryAngle = polarAngle(x - jointLocalX, y - jointLocalY); float shinAngle = (shinPrimaryAngle - hipAngle) - shinStartAngle;

kjer sta x in y koordinati točke, ki jo morate doseči z nogo; hipStartAngle - kot, za katerega je "kolk" prvotno obrnjen (s servo v srednjem položaju), podobno - shinStartAngle. Mimogrede, v teh izračunih so koti očitno v radianih in jih je treba prenesti na objekte Servo že v stopinjah. Celotna delovna koda vdelane programske opreme, vključno s tem delom, je objavljena na GitHubu, glejte povezavo na koncu članka. To je del IC, a poleg tega potrebujete precej preprosto kodo za uporabo tega IC na vseh nogah (glejte funkcije legsReachTo(), legWrite(). Potrebovali boste tudi kodo, ki dejansko izvaja hojo - gibanje ene skupine nog "nazaj" (tako da se robot premakne naprej), medtem ko se druga skupina nog dvigne in premakne naprej za naslednji korak, glejte stepForward () funkcijo. Z danimi parametri naredi en korak. Ti parametri, mimogrede, lahko naredijo korak nazaj, kljub imenu funkcije. Če je ta funkcija poklicana v zanki, bo robot stopil naprej.

Zdaj prejema ukaze in njihovo razlago. Programu dodamo stanje:

Enum State (STOP, NAPREJ, NAZAJ, NAPREJ_DESNO, NAPREJ_LEVO);

In v glavni izvršilni zanki loop() bomo pogledali trenutno stanje (spremenljivko stanja) in potegnili stepForward(), če se premikamo naprej (z vrtenjem ali brez), in ponovno stepForward(), vendar z negativnim argumentom xamp , če se moramo premakniti nazaj. Zavoji bodo nato obravnavani v legWrite(), pri zavoju v desno pa bodo noge na desni strani mirovale (medtem ko bodo leve vrstice). Tukaj je tak konjski rezervoar. Brutalno, a zelo preprosto in deluje. Gladko obračanje je možno samo z nogami 3DOF, primer tega lahko vidite v repo-ju buggybug.

Preklop (stanje) ( case FORWARD: case FORWARD_RIGHT: case FORWARD_LEFT: stepForward(h, dh, xamp, xshift); break; case BACKWARD: stepForward(h, dh, - xamp, xshift); break; )

Char ukaz; medtem ko (Serial1.available()) ukaz = Serial1.read(); preklop (ukaz) ( case "w": stanje = NAPREJ; break; case "s": state = BACKWARD; break; case "d": state = NAPREJ_DESNO; break; case "a": state = FORWARD_LEFT; break; privzeto : stanje = STOP; )

Na tem so glavne točke vdelane programske opreme končane, ostalo so malenkosti. Čeprav obstaja še ena, morda pomembna točka - možnost natančne nastavitve servomotorjev. Tudi pri najbolj previdni montaži, če se vsem servo motorjem ukaže, da se obrnejo za 90°, se bodo nekateri še vedno izkazali za rahlo zamaknjene. Zato ga morate znati prilagoditi. Vidite lahko, kako sem to naredil v metodah hipsWrite() in shinsWrite() ter v nizih za fino nastavitev hipsTune in shinsTune.

Montaža

Za takšne strukture ni potrebno nič posebnega: list pleksi stekla ustrezne debeline (z najbližjega gospodinjskega bolšjega trga) in vbodna žaga ali žaga za kovino bosta izrezala podrobnosti. In seveda, sveder za vrtanje lukenj. Namesto pleksi stekla lahko uporabiš vezane plošče (takrat še lahko z gorilnikom narediš spominski napis na končnem dizajnu). Uporabite lahko tudi aluminijaste plošče ali vogale. Pri Sleipnirju sem šel ravno tako, da sem uporabil aluminijasti vogal z rebri 1 cm (kupil sem ga nekje v supermarketu strojne opreme).


Osnova bo pravokoten okvir. Okončine - 4-centimetrske črte. Prav tako se je vredno založiti z veliko majhnimi vijaki, maticami. Vogal odrežemo na potrebne dele, izrežemo utore za servomotorje, izvrtamo luknje za pritrdilne vijake in vijake. Dizajn je bolje prikazati kot opisati. Velikosti so lahko poljubne, roboti naj bodo različni. Vendar ne pozabite: daljše kot so noge, več vzvoda bo moral potisniti servo in večja je obremenitev na njem. Do nezmožnosti obračanja in celo zloma. Ampak 4–5 cm ni problem.

Pri proračunskih lahkih robotih se pogosto ne trudijo z ločenim vrtenjem okončin in celotna obremenitev v celoti pade na servo gred. Z majhno težo to sploh ni kritično. In z večjo težo bi morali razmišljati o servo motorjih s kovinskimi zobniki in gredjo s krogličnimi ležaji.

Vsak servo je običajno opremljen z nekaj vijaki in kompletom nastavkov, ki jih je mogoče priviti na gred za različne namene. Za nas je najbolj primeren enojni "rog" (ali hupa), ki omogoča pritrditev palice na servo. Torej sta osi dveh servomotorjev pritrjeni na eno palico in palica postane "stegno". V tem primeru je en servis pritrjen na telo, drugi pa postane del spodnjega dela noge. Nanj je vredno priviti še eno palico, samo da podaljšate ali naredite ud bolj zanimiv. Malo trdega dela - in ploščad je pripravljena (priročni kompleti izvijačev, ključev, pincet, rezil za žice itd. zelo pospešijo postopek).

Kaj je naslednje?

Celoten projekt je na voljo na https://github.com/poconoco/sleipnir. Opisal sem eno najbolj nepraktičnih konfiguracij - veliko 2DOF nog, visokih, ozkih, zlahka pade na bok. Poskusite narediti boljšega robota s 3DOF nogami. Z nogami 4DOF. S kremplji ali čeljustmi. Kot primer inverzne kinematike 3DOF se lahko sklicujete na repozitorij buggybug - tam je vdelana programska oprema hexapod. Izdelate lahko tudi ne nadzorovane, ampak inteligentne robote, namesto Bluetootha postavite senzorje razdalje in naučite robota, da obide stene in ovire. Če tak senzor postavite na servo in ga zavrtite, potem lahko skenirate območje, skoraj kot sonar.

Ta članek je na voljo tudi v naslednjih jezikih: tajska

  • Naslednji

    Najlepša hvala za zelo koristne informacije v članku. Vse je zelo jasno. Zdi se, da je bilo z analizo delovanja trgovine eBay vloženega veliko dela.

    • Hvala vam in ostalim rednim bralcem mojega bloga. Brez vas ne bi bil dovolj motiviran, da bi veliko svojega časa posvetil vodenju te strani. Moji možgani so urejeni takole: rad se poglabljam, sistematiziram raznovrstne podatke, poskušam nekaj, česar še nihče ni naredil pred menoj ali na to nisem gledal s takega zornega kota. Škoda, da le našim rojakom zaradi krize v Rusiji nikakor ni do nakupovanja na eBayu. Na Aliexpressu kupujejo iz Kitajske, saj je velikokrat cenejše blago (pogosto na račun kakovosti). Toda spletne dražbe eBay, Amazon, ETSY bodo Kitajcem zlahka dale prednost pri ponudbi blagovnih znamk, vintage predmetov, ročnih izdelkov in različnih etničnih izdelkov.

      • Naslednji

        V vaših člankih je dragocen vaš osebni odnos in analiza teme. Ne zapustite tega bloga, pogosto pogledam sem. Veliko bi nas moralo biti. Pošlji mi email Pred kratkim sem po pošti prejel predlog, da bi me naučili trgovati na Amazonu in eBayu. In spomnil sem se vaših podrobnih člankov o teh dražbah. območje Še enkrat sem vse prebral in ugotovil, da so tečaji prevara. Ničesar še nisem kupil na eBayu. Nisem iz Rusije, ampak iz Kazahstana (Almaty). Vendar nam tudi ni treba dodatno porabiti. Želim vam veliko sreče in pazite nase v azijskih deželah.

  • Lepo je tudi, da so poskusi eBaya, da rusificira vmesnik za uporabnike iz Rusije in držav CIS, začeli obroditi sadove. Navsezadnje velika večina državljanov držav nekdanje ZSSR ni močna v znanju tujih jezikov. Angleščino ne govori več kot 5% prebivalstva. Več med mladimi. Zato je vsaj vmesnik v ruskem jeziku v veliko pomoč pri spletnem nakupovanju na tej trgovalni platformi. Ebey ni šel po poti kitajskega kolega Aliexpressa, kjer se izvaja strojno (zelo okorno in nerazumljivo, mestoma vzbujajoče smeha) prevajanje opisa izdelka. Upam, da bo na naprednejši stopnji razvoja umetne inteligence visokokakovostno strojno prevajanje iz katerega koli jezika v kateregakoli postalo resničnost v nekaj delčkih sekunde. Zaenkrat imamo tole (profil enega od prodajalcev na ebayu z ruskim vmesnikom, a angleškim opisom):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png