Cuprins:

Robotul cu unt: robotul Arduino cu criză existențială: 6 pași (cu imagini)
Robotul cu unt: robotul Arduino cu criză existențială: 6 pași (cu imagini)

Video: Robotul cu unt: robotul Arduino cu criză existențială: 6 pași (cu imagini)

Video: Robotul cu unt: robotul Arduino cu criză existențială: 6 pași (cu imagini)
Video: how to make Arduino finger print door lock #howto #science #diy 2024, Iulie
Anonim
Image
Image

Acest proiect se bazează pe seria animată „Rick și Morty”. Într-unul dintre episoade, Rick face un robot al cărui singur scop este să aducă unt. În calitate de studenți de la Bruface (Facultatea de Inginerie din Bruxelles), avem o sarcină pentru proiectul de mecatronică, care este de a construi un robot pe baza unui subiect sugerat. Misiunea pentru acest proiect este: Realizați un robot care să servească doar unt. Poate avea o criză existențială. Desigur, robotul din episodul lui Rick și Morty este un robot destul de complex și trebuie făcute câteva simplificări:

Deoarece singurul său scop este de a aduce unt, există alternative mai simple. În loc să facă robotul să arate și să apuce untul, înainte ca acesta să-l aducă persoanei potrivite, robotul poate purta untul tot timpul. Ideea principală este astfel de a face o căruță care transportă untul acolo unde trebuie.

În afară de transportul untului, robotul trebuie să știe unde trebuie să aducă untul. În episod, Rick își folosește vocea pentru a apela și comanda robotul. Acest lucru necesită un sistem scump de recunoaștere a vocii și ar fi la fel de complicat. În schimb, toți cei de la masă primesc un buton: odată ce acest buton este activat, robotul poate localiza acest buton și se poate deplasa spre el.

Pentru a recapitula, robotul trebuie să îndeplinească următoarele cerințe:

  • Trebuie să fie sigur: trebuie să evite obstacolele și să se împiedice să cadă de la masă;
  • Robotul trebuie să fie mic: spațiul de pe masă este limitat și nimeni nu și-ar dori un robot care să servească unt, dar care are jumătate din mărimea mesei;
  • Funcționarea robotului nu poate depinde de dimensiunea sau forma mesei, astfel poate fi folosit pe diferite mese;
  • Trebuie să aducă untul la persoana potrivită la masă.

Pasul 1: Conceptul principal

Cerințele menționate anterior pot fi îndeplinite folosind diferite tehnici. Deciziile despre proiectul principal care au fost luate sunt explicate în acest pas. Detalii despre modul în care sunt implementate aceste idei pot fi găsite în pașii următori.

Pentru a-și îndeplini datoria, robotul trebuie să se deplaseze până când se ajunge la destinație. Având în vedere aplicarea robotului, este simplu că folosirea roților în loc de o mișcare „de mers” este mai bine pentru a-l face să se miște. Deoarece o masă este o suprafață plană și robotul nu va atinge viteze foarte mari, două roți acționate și o bilă de rulare sunt soluția cea mai simplă și mai ușor de controlat. Roțile acționate trebuie alimentate de două motoare. Motoarele trebuie să aibă un cuplu mare, dar nu trebuie să atingă o viteză mare, de aceea vor fi utilizate servo motoare continue. Un alt avantaj al servomotorelor este simplitatea utilizării cu un Arduino.

Detectarea obstacolelor se poate face folosind un senzor cu ultrasunete care măsoară distanța, atașat la un servomotor pentru a alege direcția de măsurare. Marginile pot fi detectate folosind senzori LDR. Folosirea senzorilor LDR va necesita construirea unui dispozitiv care să conțină atât o lumină LED, cât și un senzor LDR. Un senzor LDR măsoară lumina reflectată și poate fi văzut ca un fel de senzor de distanță. Același principiu există și cu lumina infraroșie. Există câțiva senzori de proximitate în infraroșu care au o ieșire digitală: aproape sau nu aproape. Este exact ceea ce robotul are nevoie pentru a detecta marginile. Prin combinarea a 2 senzori de margine așezați ca două antene de insecte și un senzor cu ultrasunete acționat, robotul ar trebui să poată evita obstacolele și marginile.

Detectarea butoanelor poate fi realizată și prin utilizarea senzorilor și ledurilor IR. Avantajul IR este că este invizibil, ceea ce face ca utilizarea acestuia să nu fie deranjantă pentru oamenii de la masă. Lasere ar putea fi folosite, de asemenea, dar atunci lumina ar fi vizibilă și, de asemenea, periculoasă atunci când cineva îndreaptă laserul către ochiul altei persoane. De asemenea, utilizatorul ar trebui să vizeze senzorii de pe robot doar cu un fascicul laser subțire, ceea ce ar fi destul de enervant. Echipând robotul cu doi senzori IR și construind butonul cu un led IR, robotul știe în ce direcție trebuie să meargă urmărind intensitatea luminii IR. Când nu există buton, robotul se poate întoarce până când unul dintre leduri captează semnalul de pe unul dintre butoane.

Untul este pus într-un compartiment de pe partea superioară a robotului. Acest compartiment poate consta dintr-o cutie și un capac acționat pentru a deschide cutia. Pentru a deschide capacul și a muta senzorul cu ultrasunete pentru a scana și a detecta obstacolele, avem nevoie de două motoare și, în acest scop, servomotorele non-continue sunt mai adaptate, deoarece motoarele trebuie să meargă într-o anumită poziție și să mențină poziția respectivă.

O caracteristică suplimentară a proiectului a fost interacțiunea cu mediul extern cu o voce robot. Un buzzer este simplu și adaptat în acest scop, dar nu poate fi utilizat oricând, deoarece atragerea curentă este mare.

Principalele dificultăți ale proiectului se bazează pe codare, deoarece partea mecanică este destul de simplă. Trebuie luate în considerare multe cazuri pentru a evita blocarea robotului sau a face ceva nedorit. Principalele probleme pe care trebuie să le rezolvăm sunt pierderea semnalului IR din cauza unui obstacol și oprirea când ajunge la buton!

Pasul 2: Materiale

Componente mecanice

  • Imprimantă 3D și mașină de tăiat cu laser

    • PLA va fi utilizat pentru imprimarea 3D, dar puteți utiliza și ABS
    • O placă de placaj de mesteacăn de 3 mm va fi utilizată pentru tăierea cu laser, deoarece oferă posibilitatea de a face modificări ulterior cu ușurință, se poate utiliza și Plexiglas, dar este mai dificil să-l modificați după tăierea cu laser, fără a-l distruge
  • Șuruburi, piulițe, șaibe

    Majoritatea componentelor sunt ținute împreună folosind șuruburi, șaibe și piulițe M3, dar unele dintre ele necesită seturi de șuruburi M2 sau M4. Lungimea șuruburilor este cuprinsă între 8-12 mm

  • Distanțieri PCB, 25 mm și 15 mm
  • 2 servo-motoare cu roți compatibile
  • Unele sârme metalice groase cu diametrul de aproximativ 1-2 mm

Parți electronice

  • Microcontroler

    1 placa arduino UNO

  • Servomotoare

    • 2 servo motoare mari: Feetech continuu 6Kg 360 grade
    • 2 micro servo motoare: Feetech FS90
  • Senzori

    • 1 Senzor cu ultrasunete
    • 2 senzori de proximitate IR
    • 2 fotodioduri IR
  • Baterii

    • 1 suport baterie 9V + baterie
    • 1 suport baterie 4AA + baterii
    • 1 cutie baterie 9V + baterie
  • Componente suplimentare

    • Unele fire săritoare, fire și plăci de lipit
    • Unele rezistențe
    • 1 LED IR
    • 3 comutatoare
    • 1 buzzer
    • 1 buton
    • 1 conector baterie Arduino la 9V

Pasul 3: Testarea electronice

Testarea electronice
Testarea electronice
Testarea electronice
Testarea electronice

Crearea butonului:

Butonul este realizat pur și simplu printr-un comutator, un LED cu infraroșu și un rezistor de 220 Ohm în serie, alimentat de o baterie de 9V. Acesta este pus într-un pachet de baterii de 9V pentru un design compact și curat.

Crearea modulelor receptorului infraroșu:

Aceste module sunt realizate cu plăci de lipit prin găuri traversante, care ulterior vor fi atașate cu șuruburi la robot. Circuitele pentru aceste module sunt prezentate în schemele generale. Principiul este de a măsura intensitatea luminii în infraroșu. Pentru a îmbunătăți măsurătorile, colimatoarele (realizate cu tuburi termocontractibile) pot fi utilizate pentru a se concentra pe o anumită direcție de interes.

Diferite cerințe ale proiectului trebuie îndeplinite cu ajutorul dispozitivelor electronice. Numărul de dispozitive ar trebui să fie limitat pentru a menține o complexitate relativ scăzută. Acest pas conține schemele de cablare și fiecare cod pentru a testa separat toate părțile:

  • Servomotoare continue;
  • Senzor cu ultrasunete;
  • Servomotoare non continue;
  • Buzzer;
  • Detectarea direcției butonului IR;
  • Detectarea marginilor prin senzori de proximitate;

Aceste coduri pot ajuta la înțelegerea componentelor la început, dar sunt, de asemenea, foarte utile pentru depanare în etapele ulterioare. Dacă apare o anumită problemă, eroarea poate fi detectată mai ușor testând separat toate componentele.

Pasul 4: Proiectarea pieselor imprimate 3D și tăiate cu laser

Design de piese imprimate 3D și tăiate cu laser
Design de piese imprimate 3D și tăiate cu laser
Design de piese imprimate 3D și tăiate cu laser
Design de piese imprimate 3D și tăiate cu laser
Design de piese imprimate 3D și tăiate cu laser
Design de piese imprimate 3D și tăiate cu laser

Piese tăiate cu laser

Ansamblul este format din trei plăci orizontale principale ținute împreună de distanțieri PCB pentru a obține un design deschis care oferă acces ușor la electronică, dacă este necesar.

Aceste plăci trebuie să aibă găurile necesare tăiate pentru a înșuruba distanțierii și alte componente pentru asamblarea finală. În principal, toate cele trei plăci au găuri în aceeași locație pentru distanțiere și găuri specifice pentru electronica fixată respectiv pe fiecare placă. Observați că placa din mijloc are o gaură pentru trecerea firelor în mijloc.

Piesele mai mici sunt tăiate la dimensiunile servoului mare pentru a le fixa la ansamblu.

Piese imprimate 3D

Pe lângă tăierea cu laser, unele piese vor trebui imprimate 3D:

  • Suportul pentru senzorul cu ultrasunete, care îl conectează la un braț cu micro servomotor
  • Suport pentru roata și cei doi senzori de margine IR. Designul special al tipului de capete în formă de cutie a piesei pentru senzorii IR acționează ca un ecran pentru a evita interferențele dintre butonul care emite semnal IR și senzorii IR care trebuie să se concentreze doar pe ceea ce se întâmplă la sol
  • Suportul pentru micro servo motor care deschide capacul
  • Și, în cele din urmă, capacul în sine, format din două piese pentru a avea un unghi de funcționare mai mare, evitând coliziunea cu micro servomotorul care deschide capacul:

    • Cel de jos care va fi fixat pe placa superioară
    • Și partea superioară, care este legată de partea inferioară printr-o balama și acționată de servo folosind un fir metalic gros. Am decis să adăugăm un pic de personalitate robotului dându-i un cap.

Odată ce toate piesele sunt proiectate și fișierele exportate în formatul corect pentru mașinile utilizate, piesele pot fi efectiv realizate. Rețineți că imprimarea 3D necesită mult timp, mai ales cu dimensiunile piesei superioare a capacului. Este posibil să aveți nevoie de una sau două zile pentru a imprima toate piesele. Cu toate acestea, tăierea cu laser este doar o chestiune de minute.

Toate fișierele SOLIDWORKS pot fi găsite în folderul zip.

Pasul 5: Asamblare și cablare

Image
Image
Asamblare și cablare
Asamblare și cablare
Asamblare și cablare
Asamblare și cablare
Asamblare și cablare
Asamblare și cablare

Ansamblul va fi un amestec de cabluri și înșurubarea componentelor împreună, începând de jos până sus.

Placa de jos

Placa de jos este asamblată cu pachetul de baterii 4AA, servomotorele, partea imprimată (atașând rola cu bilă sub placă), cei doi senzori de margine și 6 distanțieri masculin-femel.

Placă de mijloc

Apoi, placa de mijloc poate fi montată, comprimând servo-motoarele între cele două plăci. Această placă poate fi apoi fixată prin punerea unui alt set de distanțieri deasupra ei. Unele cabluri pot fi trecute prin orificiul central.

Modulul cu ultrasunete poate fi atașat la un servo non-continuu, care este fixat pe placa de mijloc cu Arduino, pachetul de baterii de 9V (alimentarea arduino) și cele două module de recepție cu infraroșu din partea din față a robotului. Aceste module sunt realizate cu plăci de lipit prin găuri traversante și atașate cu șuruburi la placă. Circuitele pentru aceste module sunt prezentate în schemele generale.

Placă superioară

În această parte a ansamblului, comutatoarele nu sunt fixate, dar robotul poate face deja totul, cu excepția acțiunilor care necesită capacul, astfel ne permite să facem unele teste pentru a corecta pragul, pentru a adapta codul mișcării și pentru a avea o ușurință. acces la porturile arduino.

Când toate acestea sunt realizate, placa superioară poate fi fixată cu distanțiere. Ultimele componente care sunt cele două comutatoare, butonul, servo-ul, buzzer-ul și sistemul capacului pot fi în cele din urmă fixate pe placa superioară pentru a termina asamblarea.

Ultimul lucru de testat și corectat este unghiul servo pentru a deschide corect capacul.

Pragul senzorilor de margine trebuie adaptat cu potențiometrul inclus (cu ajutorul unei șurubelnițe plate) pentru diferite suprafețe de masă. O masă albă ar trebui să aibă un prag mai mic decât o masă maro, de exemplu. De asemenea, înălțimea senzorilor va influența pragul necesar.

La sfârșitul acestui pas, ansamblul este terminat, iar ultima parte rămasă este codurile lipsă.

Pasul 6: Codificare: A pune totul împreună

Toate codurile necesare pentru ca robotul să funcționeze se află în fișierul zip care poate fi descărcat. Cel mai important este codul „principal” care include configurarea și bucla funcțională a robotului. Majoritatea celorlalte funcții sunt scrise în sub-fișiere (de asemenea, în folderul zip). Aceste sub-fișiere ar trebui să fie salvate în același folder (denumit „principal”) ca scriptul principal înainte de a-l încărca pe Arduino

Mai întâi viteza generală a robotului este definită împreună cu variabila „amintește”. Această „amintire” este o valoare care amintește în ce direcție se întoarse robotul. Dacă „amintește = 1”, robotul se întoarce / se întoarce la stânga, dacă „amintește = 2”, robotul se întoarce / se întoarce la dreapta.

viteza int = 9; // Viteza generală a robotului

int remind = 1; // Direcția inițială

În configurarea robotului, sunt inițializate diferite sub-fișiere ale programului. În aceste sub-fișiere, sunt scrise funcțiile de bază privind controlul motoarelor, senzorilor … Inițializându-le în setare, funcțiile descrise în fiecare dintre aceste fișiere pot fi utilizate în bucla principală. Prin activarea funcției r2D2 (), robotul va face un zgomot ca robotul R2D2 din franciza filmului Star Wars când începe. Aici funcția r2D2 () este dezactivată pentru a împiedica soneria să atragă prea mult curent.

// Configurare @ reset // ----------------

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int remind = 1; // direcția inițială Starter (amintește); }

Funcția Starter (reamintire) este apelată mai întâi în configurare. Această funcție face ca robotul să se întoarcă și să caute semnalul IR al unuia dintre butoane. Odată ce a găsit butonul, programul va ieși din funcția Starter schimbând variabila „cond” la false. În timpul rotației robotului, trebuie să fie conștient de mediul său: trebuie să detecteze marginile și obstacolele. Acest lucru este verificat de fiecare dată înainte de a continua să se întoarcă. Odată ce robotul detectează un obstacol sau o margine, protocolul de evitare a acestor obstacole sau margini va fi executat. Aceste protocoale vor fi explicate mai târziu în acest pas. Funcția Starter are o variabilă care este variabila de reamintire care a fost discutată anterior. Prin acordarea valorii de reamintire funcției Starter, robotul știe în ce direcție trebuie să se întoarcă pentru a căuta butonul.

// Starter Loop: Întoarce-te și caută butonul // ------------------------------------ ----------------

void Starter (int remind) {if (isedgeleft () || isedgeright ()) {// Detectează marginile edgeDetected (remind); } else {bool cond = true; while (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } else {if (remind == 1) {// Ne întoarceam la stânga if (isobstacleleft ()) {stopspeed (); evita_obstacol (reaminteste); } else if (isedgeleft () || isedgeright ()) {// Detectează marginile edgeDetected (amintește); } else {turnleft (speed); }} else if (amintește == 2) {if (isobstacleright ()) {stopspeed (); evita_obstacol (reaminteste); } else if (isedgeleft () || isedgeright ()) {// Detectează marginile edgeDetected (amintește); } else {viraj (viteză); }}}}}}

Dacă robotul găsește butonul, atunci se închide prima buclă Starter și începe bucla principală funcțională a robotului. Această buclă principală este destul de complexă, deoarece de fiecare dată, robotul trebuie să detecteze dacă există sau nu un obstacol sau o margine în fața sa. Ideea principală este că robotul urmează butonul găsindu-l și pierzându-l de fiecare dată. Prin utilizarea a doi senzori IR, putem distinge trei situații:

  • diferența dintre lumina IR detectată de senzorul din stânga și din dreapta este mai mare decât un anumit prag și există un buton.
  • diferența de lumină IR este mai mică decât pragul și există un buton în fața robotului.
  • diferența de lumină IR este mai mică decât pragul și nu există niciun buton în fața robotului.

Modul în care funcționează rutina de urmărire este după cum urmează: când butonul este detectat, robotul se deplasează spre buton rotind în aceeași direcție în care se rotea (folosind variabila de reamintire) și în același timp se mișcă puțin înainte. Dacă robotul se întoarce prea departe, butonul se va pierde din nou și, în acest moment, robotul își amintește că trebuie să se întoarcă în cealaltă direcție. Acest lucru se face, de asemenea, în timp ce avansați puțin. Făcând acest lucru, robotul se întoarce constant la stânga și se întoarce la dreapta, dar în același timp avansează în continuare spre buton. De fiecare dată când robotul găsește butonul, continuă să se rotească până când îl pierde, caz în care începe să se deplaseze în cealaltă direcție. Observați diferența de funcții care sunt utilizate în bucla Starter și bucla principală: Bucla Starter utilizează „turnleft ()” sau „turnright ()”, în timp ce bucla principală folosește „moveleft ()” și „moveright ()”. Funcțiile de stânga / dreapta nu numai că fac robotul să se întoarcă, ci îl determină să avanseze în același timp.

/ * Buclă funcțională ---------------------------- Aici, există doar rutina pistei * /

int pierdut = 0; // Dacă s-a pierdut = 0 butonul este găsit, dacă s-a pierdut = 1 butonul este pierdut void loop () {if (isedgeleft () || isedgeright ()) {

if (! isobstacle ()) {

deplasare înainte (viteză); întârziere (5); } else {evita_obstacol (amintește); } else {if (remind == 1 && lost == 1) {// Întorceam viteza de stânga la stop (); if (! isobstacleright ()) {moveright (speed); // Întoarce-te pentru a găsi butonul} altceva {evita_obstacol (amintește); } amintește = 2; } else if (amintește == 2 && lost == 1) {stopspeed (); if (! isobstacleleft ()) {moveleft (speed); // Ne întoarceam la dreapta} altfel {evita_obstacol (amintește); } amintește = 1; } else if (lost == 0) {if (remind == 1) {// Am virat la stânga if (! isobstacleleft ()) {moveleft (speed); // Ne întoarcem la dreapta} else {stopspeed (); evita_obstacol (reaminteste); } //} else if (amintește == 2) {if (! isobstacleright ()) {moveright (speed); // Întoarce-te pentru a găsi butonul} else {stopspeed (); evita_obstacol (reaminteste); }}} întârziere (10); pierdut = 0; }} //}}

Acum, se oferă o mică explicație a celor mai complexe două rutine:

Evitați marginile

Protocolul pentru evitarea muchiilor este definit într-o funcție numită „edgeDetection ()” care este scrisă în sub-fișierul „mișcare”. Acest protocol se bazează pe faptul că robotul ar trebui să întâmpine o margine numai atunci când a ajuns la destinație: butonul. Odată ce robotul detectează o margine, primul lucru pe care îl face este să se miște puțin înapoi pentru a fi la o ditanță sigură de la margine. Odată ce acest lucru este făcut, robotul așteaptă 2 secunde. Dacă cineva apasă butonul din partea din față a robotului în acele două secunde, robotul știe că a ajuns la persoana care dorește untul și deschide compartimentul pentru unt și prezintă untul. În acest moment, cineva poate lua unt de la robot. După câteva secunde robotul se va sătura să aștepte și va închide doar capacul pentru unt. Odată ce capacul este închis, robotul va executa bucla Starter pentru a căuta un alt buton. Dacă se întâmplă ca robotul să întâlnească o margine înainte de a ajunge la destinație și butonul din partea din față a robotului nu este apăsat, robotul nu va deschide capacul pentru unt și va executa imediat bucla Starter.

Evitați obstacolele

Funcția avoid_obstacle () este, de asemenea, situată în sub-fișierul "mișcare". Partea dificilă a evitării obstacolelor este faptul că robotul are un punct mort destul de mare. Senzorul cu ultrasunete este plasat în partea din față a robotului, ceea ce înseamnă că poate detecta obstacolele, dar nu știe când este trecut. Pentru a rezolva acest lucru, se folosește următorul principiu: Odată ce robotul întâmpină un obstacol, folosește variabila reming pentru a se întoarce în cealaltă direcție. În acest fel, robotul evită să lovească obstacolul. Robotul continuă să se rotească până când senzorul cu ultrasunete nu mai detectează obstacolul. În timpul în care robotul se rotește, un contor crește până când obstacolul nu mai este detectat. Acest contor oferă apoi o aproximare a lungimii obstacolului. Miscând apoi înainte și în același timp scăzând contorul, obstacolul poate fi evitat. Odată ce contorul ajunge la 0, funcția Starter poate fi utilizată din nou pentru a muta butonul. Desigur, robotul îndeplinește funcția Starter rotind în direcția în care își amintea că merge înainte să întâmpine obstacolul (din nou folosind variabila de reamintire).

Acum că înțelegeți pe deplin codul, puteți începe să îl utilizați!

Asigurați-vă că adaptați pragurile la mediul dvs. (reflectarea IR este mai mare pe mesele albe, de exemplu) și că adaptați diferiții parametri la nevoile dvs. De asemenea, ar trebui acordată o atenție deosebită alimentării diferitelor module. Este important ca servomotorele să nu fie alimentate de portul Arduino 5V, deoarece consumă mult curent (acest lucru ar putea deteriora microcontrolerul). Dacă se utilizează aceeași sursă de energie pentru senzori ca cea pentru alimentarea servomotoarelor, ar putea apărea unele probleme de măsurare.

Recomandat: