Kazalo:

Robot za maslo: Arduino robot z eksistencialno krizo: 6 korakov (s slikami)
Robot za maslo: Arduino robot z eksistencialno krizo: 6 korakov (s slikami)

Video: Robot za maslo: Arduino robot z eksistencialno krizo: 6 korakov (s slikami)

Video: Robot za maslo: Arduino robot z eksistencialno krizo: 6 korakov (s slikami)
Video: Высокая плотность 2022 2024, Julij
Anonim
Image
Image

Ta projekt temelji na animirani seriji "Rick and Morty". V eni od epizod Rick naredi robota, katerega edini namen je prinesti maslo. Kot študenti Brufacea (bruseljska fakulteta za inženiring) imamo nalogo za projekt mehatronike, ki naj bi izdelal robota na podlagi predlagane teme. Naloga za ta projekt je: Naredite robota, ki služi samo maslu. Lahko pride do eksistencialne krize. Seveda je robot v epizodi Rick in Morty precej kompleksen robot, zato je treba narediti nekaj poenostavitev:

Ker je njegov edini namen prinesti maslo, obstajajo bolj preproste alternative. Namesto da bi robot pogledal in prijel maslo, lahko robot ves čas nosi maslo, preden ga prinese pravi osebi. Glavna ideja je torej narediti voziček, ki bo maslo prevažal tja, kjer mora biti.

Poleg transporta masla mora robot vedeti, kam mora prinesti maslo. V epizodi Rick s svojim glasom pokliče in ukaže robotu. To zahteva drag sistem za prepoznavanje glasu in bi bilo preveč zapleteno. Namesto tega vsi za mizo dobijo gumb: ko je ta gumb aktiviran, lahko robot poišče ta gumb in se premakne proti njemu.

Če povzamemo, mora robot izpolnjevati naslednje zahteve:

  • Biti mora varen: izogibati se mora oviram in preprečiti padca mize;
  • Robot mora biti majhen: prostor na mizi je omejen in nihče ne bi želel robota, ki služi maslu, vendar je za polovico manjši od mize;
  • Delovanje robota ne more biti odvisno od velikosti ali oblike mize, zato ga je mogoče uporabiti na različnih mizah;
  • Maslo mora prinesti pravi osebi za mizo.

1. korak: Glavni koncept

Prej omenjene zahteve je mogoče izpolniti z različnimi tehnikami. Odločitve o glavni zasnovi, ki so bile sprejete, so pojasnjene v tem koraku. Podrobnosti o tem, kako se te ideje izvajajo, najdete v naslednjih korakih.

Za izpolnitev svoje dolžnosti se mora robot premikati, dokler ni dosežen cilj. Glede na uporabo robota je jasno, da je bolje uporabiti kolesa namesto gibanja "hoja", da se premakne. Ker je miza ravna površina in robot ne bo dosegel zelo velikih hitrosti, sta dve aktivirani kolesi in ena kolesna žoga najpreprostejša in najlažja rešitev za nadzor. Aktivirana kolesa morajo poganjati dva motorja. Motorji morajo imeti velik navor, vendar jim ni treba doseči visoke hitrosti, zato se bodo uporabljali stalni servo motorji. Druga prednost servo motorjev je preprostost uporabe z Arduinom.

Odkrivanje ovir je mogoče z uporabo ultrazvočnega senzorja, ki meri razdaljo, pritrjeno na servo motor, da izbere smer merjenja. Robove je mogoče zaznati s senzorji LDR. Uporaba senzorjev LDR bo zahtevala izdelavo naprave, ki vsebuje tako LED diodo kot senzor LDR. Senzor LDR meri odbojno svetlobo in ga lahko vidimo kot nekakšen senzor razdalje. Enako načelo velja za infrardečo svetlobo. Obstaja nekaj infrardečih senzorjev bližine, ki imajo digitalni izhod: blizu ali ne. Ravno to potrebuje robot, da zazna robove. Z združevanjem dveh senzorjev robov, nameščenih kot dve anteni za žuželke in enega aktiviranega ultrazvočnega senzorja, bi se moral robot izogniti oviram in robovom.

Odkrivanje gumbov je mogoče doseči tudi z uporabo IR senzorjev in LED. Prednost IR je v tem, da je neviden, zaradi česar njegova uporaba ni moteča za ljudi za mizo. Lahko bi se uporabljali tudi laserji, toda potem bi bila svetloba vidna in tudi nevarna, ko bi nekdo usmeril laser v oko druge osebe. Prav tako bi moral uporabnik ciljati na senzorje na robotu le s tankim laserskim žarkom, kar bi bilo precej nadležno. Z opremljanjem robota z dvema IR-senzorjema in izdelavo gumba z IR-LED, robot ve, v katero smer mora iti, tako da sledi jakosti IR-svetlobe. Ko ni gumba, se lahko robot obrne, dokler ena od LED ne zajame signala z enega od gumbov.

Maslo damo v predal na vrhu robota. Ta predel je lahko sestavljen iz škatle in aktiviranega pokrova za odpiranje škatle. Če želite odpreti pokrov in premakniti ultrazvočni senzor, da skenira in zazna ovire, ki jih potrebujemo, sta dva motorja in v ta namen so neskončni servo motorji bolj prilagojeni, ker morajo motorji iti v določen položaj in vzdrževati ta položaj.

Dodatna značilnost projekta je bila interakcija z zunanjim okoljem z glasom robota. Brenčalnik je preprost in prilagojen za ta namen, vendar ga ne morete uporabiti kadar koli, ker je trenutni žreb velik.

Glavne težave projekta temeljijo na kodiranju, saj je mehanski del precej preprost. Upoštevati je treba veliko primerov, da se izognemo, da bi se robot zataknil ali naredil kaj nezaželenega. Glavne težave, ki jih moramo rešiti, so izguba IR signala zaradi ovire in ustavitev, ko pride do gumba!

2. korak: Materiali

Mehanski deli

  • 3D tiskalnik in stroj za lasersko rezanje

    • PLA bo uporabljen za 3D tiskanje, lahko pa uporabite tudi ABS
    • Plošča iz 3 mm brezove vezane plošče se bo uporabljala za lasersko rezanje, saj daje možnost poznejših preprostih sprememb, lahko se uporabi tudi pleksi steklo, vendar ga je težje spremeniti, ko je lasersko rezano, ne da bi ga uničili
  • Vijaki, matice, podložke

    Večina sestavnih delov je pritrjenih skupaj z vijaki, podložkami in maticami M3, nekateri pa zahtevajo nastavitev vijakov M2 ali M4. Dolžine vijakov so v območju 8-12 mm

  • Distančniki iz PCB, 25 mm in 15 mm
  • 2 servo motorja z združljivimi kolesi
  • Nekaj debele kovinske žice s premerom približno 1-2 mm

Elektronski deli

  • Mikrokrmilnik

    1 arduino UNO plošča

  • Servo motorji

    • 2 velika servo motorja: Feetech neprekinjeno 6 kg 360 stopinj
    • 2 mikro servo motorja: Feetech FS90
  • Senzorji

    • 1 Ultrazvočni senzor
    • 2 IR senzorja bližine
    • 2 IR fotodiode
  • Baterije

    • 1 9V držalo za baterijo + baterija
    • 1 držalo za baterije 4AA + baterije
    • 1 9V akumulatorska škatla + baterija
  • Dodatne komponente

    • Nekaj skakalnih žic, žic in spajkalnih plošč
    • Nekaj uporov
    • 1 IR LED
    • 3 stikala
    • 1 zvočni signal
    • 1 gumb
    • 1 Priključek za baterijo Arduino do 9V

3. korak: Preizkus elektronike

Testiranje elektronike
Testiranje elektronike
Testiranje elektronike
Testiranje elektronike

Ustvarjanje gumba:

Gumb je preprosto izdelan s stikalom, infrardečo LED in 220 ohmskim uporom zaporedoma, ki ga napaja 9V baterija. To je vstavljeno v 9V baterijo za kompaktno in čisto obliko.

Izdelava modulov infrardečega sprejemnika:

Ti moduli so izdelani s spajkajočimi ploščami, ki bodo pozneje pritrjene z vijaki na robota. Vezja za te module so prikazana v splošnih shemah. Načelo je meriti jakost infrardeče svetlobe. Za izboljšanje meritev se lahko uporabljajo kolimatorji (izdelani s skrčljivimi cevmi) za osredotočanje na določeno smer, ki nas zanima.

Z uporabo elektronskih naprav je treba izpolniti različne zahteve projekta. Število naprav je treba omejiti, da se ohrani relativno nizka kompleksnost. Ta korak vsebuje sheme ožičenja in vsako kodo za preizkus vseh delov ločeno:

  • Neprekinjeni servo motorji;
  • Ultrazvočni senzor;
  • Neprekinjeni servo motorji;
  • Zvočni signal;
  • Zaznavanje smeri IR gumba;
  • Zaznavanje robov s senzorji bližine;

Te kode lahko pomagajo razumeti komponente na začetku, vendar so zelo koristne tudi za odpravljanje napak v poznejših fazah. Če pride do določene težave, lahko hrošča lažje odkrijete tako, da ločeno preizkusite vse komponente.

4. korak: Oblikovanje kosov 3D natisnjenih in lasersko rezanih kosov

Oblikovanje 3D tiskanih in lasersko rezanih kosov
Oblikovanje 3D tiskanih in lasersko rezanih kosov
Oblikovanje 3D tiskanih in lasersko rezanih kosov
Oblikovanje 3D tiskanih in lasersko rezanih kosov
Oblikovanje 3D tiskanih in lasersko rezanih kosov
Oblikovanje 3D tiskanih in lasersko rezanih kosov

Laserski rezani kosi

Sestavljen je iz treh glavnih vodoravnih plošč, ki jih držijo distančniki za tiskane vezje, da dobijo odprto zasnovo, ki po potrebi omogoča enostaven dostop do elektronike.

Na teh ploščah morajo biti izrezane potrebne luknje za privijanje distančnikov in drugih sestavnih delov za končno montažo. V glavnem imajo vse tri plošče luknje na istem mestu za distančnike in posebne luknje za elektroniko, pritrjene na vsaki plošči. Upoštevajte, da ima srednja plošča luknjo za prehod žic na sredini.

Manjši kosi so narezani na dimenzije velikega servomotorja, da jih pritrdimo na sklop.

3D natisnjeni kosi

Poleg laserskega rezanja bo treba nekaj kosov 3D natisniti:

  • Podpora za ultrazvočni senzor, ki ga poveže z eno roko mikro servo motorja
  • Nosilec kolesca in dva senzorja IR roba. Posebna oblika kosov v obliki škatle za IR senzorje deluje kot zaslon, da se izogne motnjam med gumbom, ki oddaja IR signal, in IR senzorji, ki se morajo osredotočiti le na dogajanje na tleh
  • Podpora za mikro servo motor odpira pokrov
  • In na koncu sam pokrov, izdelan iz dveh kosov, ki ima večji kot delovanja, tako da se izogne trčenju z mikro servo motorjem, ki odpira pokrov:

    • Spodnji, ki bo pritrjen na zgornjo ploščo
    • Zgornji del, ki je s spodnjim delom povezan s tečaji, in ga aktivira servo z debelo kovinsko žico. Odločili smo se, da bomo robotu dodali malo osebnosti, tako da mu bomo dali glavo.

Ko so vsi kosi oblikovani in datoteke izvožene v pravilni obliki za uporabljene stroje, jih je mogoče dejansko narediti. Zavedajte se, da 3D tiskanje traja veliko časa, zlasti z dimenzijami zgornjega dela pokrova. Za tiskanje vseh kosov boste morda potrebovali en ali dva dni. Lasersko rezanje pa je le nekaj minut.

Vse datoteke SOLIDWORKS najdete v stisnjeni mapi.

5. korak: Montaža in ožičenje

Image
Image
Montaža in ožičenje
Montaža in ožičenje
Montaža in ožičenje
Montaža in ožičenje
Montaža in ožičenje
Montaža in ožičenje

Montaža bo sestavljena iz ožičenja in privijačenja komponent skupaj, od spodaj navzgor.

Spodnja plošča

Spodnja plošča je sestavljena iz baterije 4AA, servo motorjev, tiskanega dela (pritrjevanje krogličnega kolesca pod ploščo), dveh senzorjev za rob in 6 distančnikov za samce in samce.

Srednja plošča

Nato lahko namestite srednjo ploščo, ki stisne servo motorje med dvema ploščama. To ploščo lahko nato pritrdite tako, da nanjo postavite drug sklop distančnikov. Nekatere kable lahko speljemo skozi osrednjo luknjo.

Ultrazvočni modul lahko pritrdite na neprekinjeni servo, ki je pritrjen na srednjo ploščo z Arduinom, 9V baterijo (napaja arduino) in dvema infrardečima sprejemnikoma na sprednji strani robota. Ti moduli so izdelani s spajkajočimi ploščami skozi luknje in pritrjeni z vijaki na ploščo. Vezja za te module so prikazana v splošnih shemah.

Zgornja plošča

Na tem delu sklopa stikala niso pritrjena, vendar lahko robot že naredi vse, razen dejanj, ki zahtevajo pokrov, zato nam omogoča, da naredimo nekaj testov, da popravimo prag, prilagodimo kodo gibanja in imamo enostaven dostop do pristanišč arduina.

Ko je vse to doseženo, lahko zgornjo ploščo pritrdimo z distančniki. Zadnje komponente, ki sta dve stikali, gumb, servo, brenčalo in sistem pokrovov, lahko dokončno pritrdite na zgornjo ploščo, da zaključite montažo.

Zadnja stvar, ki jo morate preizkusiti in popraviti, je kot servomotorja za pravilno odpiranje pokrova.

Prag robnih senzorjev je treba prilagoditi s priloženim potenciometrom (z ravnim izvijačem) za različne površine mize. Bela miza mora imeti na primer nižji prag kot rjava miza. Tudi višina senzorjev bo vplivala na potreben prag.

Na koncu tega koraka je montaža končana in zadnji preostali del so manjkajoče kode.

6. korak: Kodiranje: Združevanje vsega skupaj

Vse potrebne kode za delovanje robota so v stisnjeni datoteki, ki jo je mogoče prenesti. Najpomembnejša je "glavna" koda, ki vključuje nastavitveno in funkcionalno zanko robota. Večina drugih funkcij je zapisanih v pod-datotekah (tudi v mapi z zadrgo). Te poddate je treba pred nalaganjem v Arduino shraniti v isto mapo (ki se imenuje "glavna") kot glavni skript

Najprej se skupaj s spremenljivko "spomni" določi splošna hitrost robota. Ta "opomnik" je vrednost, ki si zapomni, v katero smer se je obračal robot. Če je "opomin = 1", je robot zavijal levo, če je "opomin = 2", je robot zavijal desno.

int hitrost = 9; // Splošna hitrost robota

int opomni = 1; // Začetna smer

Pri nastavitvi robota se inicializirajo različne pod-datoteke programa. V teh pod-datotekah so zapisane osnovne funkcije za upravljanje motorjev, senzorjev … Če jih inicializirate v nastavitvah, lahko funkcije, opisane v vsaki od teh datotek, uporabite v glavni zanki. Z aktiviranjem funkcije r2D2 () bo robot povzročil hrup, podoben robotu R2D2 iz franšize filmov Star Wars, ko se zažene. Tu je funkcija r2D2 () onemogočena, da prepreči, da bi brenčevalnik potegnil prevelik tok.

// Setup @ reset // ----------------

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int opomni = 1; // začetna smer zaganjalnik (opomnik); }

Funkcija zaganjalnika (opomnik) se najprej pokliče v nastavitvah. Zaradi te funkcije se robot obrne in poišče IR signal enega od gumbov. Ko najde gumb, bo program zapustil funkcijo zaganjalnika, tako da spremenljivko "cond" spremeni v false. Med vrtenjem robota se mora zavedati svojega okolja: zaznati mora robove in ovire. To se vsakič preveri, preden se še naprej obrača. Ko robot zazna oviro ali rob, se izvede protokol za preprečitev teh ovir ali robov. Ti protokoli bodo razloženi kasneje v tem koraku. Začetna funkcija ima eno spremenljivko, ki je spominska spremenljivka, o kateri smo že govorili. Robot z opomnikom na funkcijo Starter ve, v katero smer se mora obrniti, da poišče gumb.

// Začetna zanka: Obrnite se in poiščite gumb // ------------------------------------ ----------------

void Starter (int opomin) {if (isedgeleft () || isedgeright ()) {// Zaznaj robove edgeDetected (spomni); } else {bool cond = true; medtem ko (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } else {if (spomnite se == 1) {// Zavili smo levo if (isobstacleleft ()) {stoppeed (); izogibaj se oviram (opomni); } else if (isedgeleft () || isedgeright ()) {// Zaznaj robove edgeDetected (spomni); } else {turnleft (hitrost); }} else if (spomni se == 2) {if (isobstacleright ()) {stoppeed (); izogibaj se oviram (opomni); } else if (isedgeleft () || isedgeright ()) {// Zaznaj robove edgeDetected (spomni); } else {turnright (hitrost); }}}}}}

Če robot najde gumb, izstopi iz prve zaganjalniške zanke in začne se glavna, funkcionalna zanka robota. Ta glavna zanka je precej zapletena, saj mora robot vsakič odkriti, ali je pred njim ovira ali rob. Glavna ideja je, da robot sledi gumbu, tako da ga najde in ga vsakič izgubi. Z uporabo dveh IR senzorjev lahko ločimo tri situacije:

  • razlika med IR svetlobo, ki jo zazna levi in desni senzor, je večja od določenega praga in obstaja gumb.
  • razlika v IR svetlobi je manjša od praga, pred robotom pa je gumb.
  • razlika v IR svetlobi je manjša od praga in pred robotom ni gumba NO.

Rutina sledenja deluje na naslednji način: ko je gumb zaznan, se robot premakne proti gumbu tako, da se obrne v isto smer, v kateri se je obračal (s pomočjo spremenljivke opomnik), in se hkrati premakne malo naprej. Če se robot obrne predaleč, se gumb spet izgubi in na tej točki se robot spomni, da se mora obrniti v drugo smer. To se naredi tudi pri nekoliko napredovanju. S tem se robot nenehno obrača levo in zavija desno, vmes pa še vedno napreduje proti gumbu. Vsakič, ko robot najde gumb, se le vrti, dokler ga ne izgubi, v tem primeru se začne premikati v drugo smer. Opazite razliko v funkcijah, ki se uporabljajo v zaganjalni zanki in glavni zanki: zaganjalniška zanka uporablja "turnleft ()" ali "turnright ()", medtem ko glavna zanka uporablja "moveleft ()" in "moveright ()". Funkcije premikanja levo/desno ne samo, da robota obrnejo, ampak ga hkrati tudi premikajo naprej.

/ * Funkcionalna zanka ---------------------------- Tukaj je samo rutina sledi */

int izgubljeno = 0; // Če je izgubljeno = 0, je gumb odkrit, če je izgubljen = 1, je gumb izgubljen void loop () {if (isedgeleft () || isedgeright ()) {

če (! isobstacle ()) {

premik naprej (hitrost); zamuda (5); } else {izogibaj se oviram (opomni); } else {if (spomnite se == 1 && lost == 1) {// Zavijali smo levo stopnjo hitrosti (); if (! isobstacleright ()) {moveright (hitrost); // Obrnite se in poiščite gumb} else {izogni se oviram (opomni); } opomni = 2; } else if (spomnite se == 2 && lost == 1) {stopspeed (); if (! isobstacleleft ()) {moveleft (hitrost); // Zavijali smo desno} else {izogni se oviram (spomni); } opomni = 1; } else if (lost == 0) {if (spomnite == 1) {// Zavili smo levo if (! isobstacleleft ()) {moveleft (hitrost); // Zavijali smo desno} else {stopspeed (); izogibaj se oviram (opomni); } //} else if (spomni se == 2) {if (! isobstacleright ()) {moveright (hitrost); // Obrnite se in poiščite gumb} else {Stoppeed (); izogibaj se oviram (opomni); }}} zakasnitev (10); izgubljeno = 0; }} //}}

Zdaj je podana kratka razlaga dveh najbolj zapletenih rutin:

Izogibajte se robovom

Protokol za izogibanje robov je opredeljen v funkciji, imenovani "edgeDetection ()", ki je zapisana v pod datoteki "motion". Ta protokol temelji na dejstvu, da bi se moral robot srečati šele, ko je dosegel cilj: gumb. Ko robot zazna rob, se najprej premakne malo nazaj, da bi bil na varni razdalji od roba. Ko je to storjeno, robot počaka 2 sekundi. Če nekdo v teh dveh sekundah pritisne gumb na sprednji strani robota, robot ve, da je prišel do osebe, ki želi maslo, in odpre predal za maslo ter predstavi maslo. Na tej točki lahko nekdo vzame maslo iz robota. Po nekaj sekundah se bo robot naveličal čakanja in bo zaprl pokrov masla. Ko je pokrov zaprt, bo robot izvedel zagonsko zanko in poiskal drug gumb. Če se zgodi, da robot naleti na rob, preden doseže cilj in gumb na sprednji strani robota ni pritisnjen, robot ne bo odprl pokrova za maslo in bo takoj izvedel zagonsko zanko.

Izogibajte se oviram

Funkcija escape_obstacle () se nahaja tudi v pod-datoteki "gibanje". Težji del izogibanja oviram je dejstvo, da ima robot precej veliko slepo točko. Ultrazvočni senzor je nameščen na sprednji strani robota, kar pomeni, da lahko zazna ovire, vendar ne ve, kdaj ga je mimo. Za rešitev tega se uporablja naslednje načelo: Ko robot naleti na oviro, se s spremenljivko reming obrne v drugo smer. Na ta način se robot izogne oviri. Robot se vrti, dokler ultrazvočni senzor ne zazna več ovire. Med obračanjem robota se števec poveča, dokler ovira ni več zaznana. Ta števec nato približa dolžino ovire. Če se nato pomaknete naprej in hkrati zmanjšate števec, se preprečite oviri. Ko števec doseže 0, lahko funkcijo zaganjalnika znova uporabite za premestitev gumba. Seveda robot deluje kot zaganjalnik tako, da zavije v smeri, za katero se je spomnil, da gre, še preden je naletel na oviro (spet s pomočjo spremenljivke opomnik).

Ko ste kodo popolnoma razumeli, jo lahko začnete uporabljati!

Mejne vrednosti prilagodite svojemu okolju (IR odboj je na primer večji na belih mizah) in različne parametre prilagodite svojim potrebam. Veliko pozornost je treba nameniti tudi napajanju različnih modulov. Zelo pomembno je, da servo motorji ne poganjajo vrata Arduino 5V, saj vzamejo veliko toka (to lahko poškoduje mikrokrmilnik). Če se za senzorje uporablja isti vir energije kot za napajanje servomotorjev, bi lahko prišlo do nekaterih težav pri merjenju.

Priporočena: