Indholdsfortegnelse:

Smørrobotten: Arduino -robotten med eksistentiel krise: 6 trin (med billeder)
Smørrobotten: Arduino -robotten med eksistentiel krise: 6 trin (med billeder)

Video: Smørrobotten: Arduino -robotten med eksistentiel krise: 6 trin (med billeder)

Video: Smørrobotten: Arduino -robotten med eksistentiel krise: 6 trin (med billeder)
Video: Когда У NPC В ИГРЕ ПОЯВИЛСЯ СПОНСОР - EPIC NPC MAN на Русском 2024, Juli
Anonim
Image
Image

Dette projekt er baseret på den animerede serie "Rick and Morty". I et af afsnittene laver Rick en robot, hvis eneste formål er at bringe smør. Som studerende fra Bruface (Bruxelles Tekniske Fakultet) har vi en opgave for mekatronikprojektet, som er at bygge en robot baseret på et foreslået emne. Opgaven til dette projekt er: Lav en robot, der kun serverer smør. Det kan have en eksistentiel krise. Selvfølgelig er robotten i afsnittet af Rick og Morty en ret kompleks robot, og der skal foretages nogle forenklinger:

Da det eneste formål er at bringe smør, er der mere ligetil alternativer. I stedet for at få robotten til at se ud og få fat i smørret, før den bringer den til den rigtige person, kan robotten bære smørret hele tiden. Hovedideen er således at lave en vogn, der transporterer smørret derhen, hvor det skal være.

Bortset fra at transportere smørret, skal robotten vide, hvor han skal bringe smørret. I afsnittet bruger Rick sin stemme til at ringe og kommandere robotten. Dette kræver et dyrt stemmegenkendelsessystem og ville være for kompliceret. I stedet får alle ved bordet en knap: Når denne knap er aktiveret, kan robotten lokalisere denne knap og bevæge sig mod den.

For at opsummere skal robotten opfylde følgende krav:

  • Det skal være sikkert: det skal undgå forhindringer og forhindre sig i at falde af bordet;
  • Robotten skal være lille: Pladsen på bordet er begrænset, og ingen vil have en robot, der serverer smør, men er halvt så stor som bordet;
  • Robotens funktion kan ikke afhænge af bordets størrelse eller form, på den måde kan den bruges på forskellige borde;
  • Det skal bringe smørret til den rigtige person ved bordet.

Trin 1: Hovedkoncept

De tidligere nævnte krav kan opfyldes ved hjælp af forskellige teknikker. Beslutningerne om hoveddesignet, der blev truffet, forklares i dette trin. Detaljer om, hvordan disse ideer implementeres, findes i de følgende trin.

For at udføre sin pligt skal robotten bevæge sig, indtil destinationen er nået. I betragtning af anvendelsen af robotten er det ligetil, at brug af hjul i stedet for en "gående" bevægelse er bedre at få den til at bevæge sig. Da et bord er en flad overflade, og robotten ikke når meget høje hastigheder, er to aktiverede hjul og en hjulkugle den enkleste og mest lette at kontrollere. De aktiverede hjul skal drives af to motorer. Motorerne skal have et stort drejningsmoment, men de behøver ikke at nå en høj hastighed, derfor vil der blive brugt kontinuerlige servomotorer. En anden fordel ved servomotorer er enkelheden ved brug af en Arduino.

Påvisning af forhindringer kan udføres ved hjælp af en ultralydssensor, der måler afstanden, fastgjort til en servomotor for at vælge måleretningen. Kanterne kan detekteres ved hjælp af LDR -sensorer. Brug af LDR -sensorer kræver konstruktion af en enhed, der indeholder både et LED -lys og en LDR -sensor. En LDR -sensor måler det reflekterede lys og kan ses som en slags afstandssensor. Det samme princip eksisterer med infrarødt lys. Der findes nogle infrarøde nærhedssensorer, der har en digital udgang: tæt eller ikke tæt. Det er præcis, hvad robotten har brug for for at opdage kanterne. Ved at kombinere 2 kantfølere placeret som to insektantenner og en aktiveret ultralydssensor, skal robotten kunne undgå forhindringer og kanter.

Knappedetekteringen kan også opnås ved hjælp af IR -sensorer og lysdioder. Fordelen ved IR er, at den er usynlig, hvilket gør brugen af den ikke forstyrrende for folkene ved bordet. Lasere kunne også bruges, men så ville lyset være synligt og også farligt, når nogen peger laseren ind i en anden persons øje. Brugeren skulle også målrette sensorer på robotten med kun en tynd laserstråle, hvilket ville være ret irriterende. Ved at udstyre robotten med to IR-sensorer og konstruere knappen med en IR-led, ved robotten, hvilken retning han skal gå ved at følge intensiteten af IR-lyset. Når der ikke er en knap, kan robotten dreje rundt, indtil en af lysdioderne fanger signalet fra en af knapperne.

Smørret lægges i et rum på toppen af robotten. Dette rum kan bestå af en kasse og et aktiveret låg til åbning af kassen. For at åbne låget og flytte ultralydssensoren til at scanne og detektere de forhindringer, vi har brug for to motorer, og til dette formål er ikke -kontinuerlige servomotorer mere tilpasset, fordi motorerne skal gå i en bestemt position og opretholde denne position.

En ekstra funktion ved projektet var at interagere med det ydre miljø med en robotstemme. En summer er enkel og tilpasset til dette formål, men den kan ikke bruges når som helst, fordi strømmen er høj.

Projektets største vanskeligheder afhænger af kodningen, da den mekaniske del er ret ligetil. Mange tilfælde skal tages i betragtning for at undgå, at robotten sidder fast eller gør noget uønsket. De største problemer, vi skal løse, er at miste IR -signalet på grund af en forhindring og stoppe, når det kommer til knappen!

Trin 2: Materialer

Mekaniske dele

  • 3D -printer og laserskæremaskine

    • PLA bruges til 3D -udskrivning, men du kan også bruge ABS
    • En plade med 3 mm birkekrydsfiner vil blive brugt til laserskæring, da det let kan foretages ændringer senere, plexiglas kan også bruges, men det er vanskeligere at ændre det, når det først er laserskåret uden at ødelægge det
  • Bolte, møtrikker, skiver

    De fleste komponenter holdes sammen ved hjælp af M3 knaphovedbolte, skiver og møtrikker, men nogle af dem kræver M2 eller M4 bolte. Boltenes længde er i området 8-12 mm

  • PCB -afstandsstykker, 25 mm og 15 mm
  • 2 servomotorer med kompatible hjul
  • Nogle tyk metaltråd omkring 1-2 mm i diameter

Elektroniske dele

  • Mikrokontroller

    1 arduino UNO board

  • Servomotorer

    • 2 store servomotorer: Feetech kontinuerlig 6 kg 360 grader
    • 2 mikro servomotorer: Feetech FS90
  • Sensorer

    • 1 ultralydssensor
    • 2 IR nærhedssensorer
    • 2 IR fotodioder
  • Batterier

    • 1 9V batteriholder + batteri
    • 1 4AA batteriholder + batterier
    • 1 9V batteriboks + batteri
  • Yderligere komponenter

    • Nogle springtråde, tråde og loddeplader
    • Nogle modstande
    • 1 IR LED
    • 3 kontakter
    • 1 summer
    • 1 knap
    • 1 Arduino til 9V batteristik

Trin 3: Test af elektronikken

Test af elektronikken
Test af elektronikken
Test af elektronikken
Test af elektronikken

Oprettelse af knappen:

Knappen er simpelthen lavet af en switch, en infrarød LED og en 220 Ohm modstand i serie, drevet af et 9V batteri. Dette er sat i en 9V batteripakke til et kompakt og rent design.

Oprettelse af de infrarøde modtagermoduler:

Disse moduler er lavet med loddebrædder med gennemgående huller, som senere vil blive fastgjort med skruer til robotten. Kredsløbene for disse moduler er afbildet i det generelle skema. Princippet er at måle intensiteten af det infrarøde lys. For at forbedre målingerne kan kollimatorer (fremstillet med krympeslanger) bruges til at fokusere på en bestemt interesseretning.

Forskellige krav til projektet skal udføres ved hjælp af elektroniske enheder. Antallet af enheder bør begrænses for at holde en relativ lav kompleksitet. Dette trin indeholder ledningsskemaerne og hver kode for at teste alle delene separat:

  • Kontinuerlige servomotorer;
  • Ultralydssensor;
  • Ikke -kontinuerlige servomotorer;
  • Summer;
  • IR -knap retning detektion;
  • Kantdetektering af nærhedssensorer;

Disse koder kan hjælpe med at forstå komponenterne i begyndelsen, men det er også meget nyttigt til fejlfinding på senere stadier. Hvis der opstår et bestemt problem, kan fejlen lettere opdages ved at teste alle komponenterne separat.

Trin 4: 3D -printet og laserskåret design

3D -printet og laserskåret stykker Design
3D -printet og laserskåret stykker Design
3D -printet og laserskåret stykker Design
3D -printet og laserskåret stykker Design
3D -printet og laserskåret dele
3D -printet og laserskåret dele

Laserskårne stykker

Samlingen er lavet af tre vandrette hovedplader, der holdes sammen af PCB -afstandsstykker for at få et åbent design, der giver let adgang til elektronikken, hvis det er nødvendigt.

Disse plader skal have de nødvendige huller skåret for at skrue afstandsstykkerne og andre komponenter til den endelige samling. Hovedsageligt har alle tre plader huller på samme sted for afstandsstykkerne og specifikke huller til elektronikken, der er fastgjort på henholdsvis hver plade. Bemærk, at midterpladen har et hul til at føre ledninger i midten.

Mindre stykker skæres til dimensionerne på den store servo for at fastgøre dem til samlingen.

3D -trykte stykker

Ud over laserskæring skal nogle stykker 3D -printes:

  • Understøttelse af ultralydssensoren, der forbinder den med en mikro servomotorarm
  • Understøttelse af hjulet og de to IR -kantsensorer. Det særlige design af den type boksformede ender af stykket til IR -sensorerne fungerer som en skærm for at undgå forstyrrelser mellem knappen, der udsender IR -signal og IR -sensorerne, som kun skal fokusere på, hvad der sker på jorden
  • Støtten til mikroservomotoren åbner låget
  • Og endelig selve låget, der er lavet af to stykker for at have en større betjeningsvinkel ved at undgå kollision med mikroservomotoren, der åbner låget:

    • Den nederste, der fastgøres til toppladen
    • Og toppen, der er forbundet til bunden af et hængsel, og aktiveret af servoen ved hjælp af en tyk metaltråd. Vi besluttede at tilføje en lille smule personlighed til robotten ved at give den et hoved.

Når alle brikkerne er designet og filerne eksporteres i det korrekte format til de anvendte maskiner, kan stykkerne faktisk laves. Vær opmærksom på, at 3D -udskrivning tager meget tid, især med dimensionerne på det øverste stykke af låget. Du skal muligvis bruge en eller to dage til at udskrive alle stykker. Laserskæring er dog kun et spørgsmål om minutter.

Alle SOLIDWORKS-filerne findes i den zip-mappe.

Trin 5: Montering og ledninger

Image
Image
Montering og ledninger
Montering og ledninger
Montering og ledninger
Montering og ledninger
Montering og ledninger
Montering og ledninger

Samlingen vil være en blanding af ledninger og skrue komponenterne sammen, startende fra bunden til toppen.

Nederste tallerken

Bundpladen er samlet med 4AA batteripakken, servomotorer, den trykte del (fastgørelse af kuglehjulet under pladen), de to kantfølere og 6 afstandsstykker til hun-hun-hun.

Mellemplade

Dernæst kan midterpladen monteres og komprimere servomotorer mellem de to plader. Denne plade kan derefter rettes ved at lægge et andet sæt afstandsstykker oven på den. Nogle kabler kan føres gennem centerhullet.

Ultralydsmodulet kan fastgøres til en ikke-kontinuerlig servo, som er fastgjort på midterpladen med Arduino, 9V batteripakken (der driver arduinoen) og de to infrarøde modtagermoduler foran på robotten. Disse moduler er fremstillet med loddebrædder med gennemgående hul og fastgjort med skruer til pladen. Kredsløbene for disse moduler er afbildet i det generelle skema.

Topplade

I denne del af samlingen er kontakterne ikke fastgjort, men robotten kan allerede gøre alt undtagen handlinger, der kræver låget, og det giver os derfor mulighed for at foretage nogle test for at korrigere grænseværdien, tilpasse bevægelseskoden og have en let adgang til havnene på arduinoen.

Når alt dette er opnået, kan toppladen fastgøres med afstandsstykker. De sidste komponenter, som er de to kontakter, knappen, servoen, summeren og låsesystemet kan endelig fastgøres til toppladen for at afslutte samlingen.

Det sidste, der skal testes og korrigeres, er vinklen på servoen for korrekt åbning af låget.

Kantsensorernes tærskelværdi skal tilpasses med det medfølgende potentiometer (ved hjælp af en flad skruetrækker) til forskellige bordoverflader. Et hvidt bord skal f.eks. Have en lavere tærskel end et brunt bord. Også sensorernes højde vil påvirke den nødvendige tærskel.

I slutningen af dette trin er samlingen færdig, og den sidste resterende del er de manglende koder.

Trin 6: Kodning: Sætter alt sammen

Al den nødvendige kode for at få robotten til at fungere er i den zip -fil, der kan downloades. Den vigtigste er den "vigtigste" kode, der inkluderer opsætning og funktionel sløjfe af robotten. De fleste andre funktioner er skrevet i underfiler (også i zip-mappen). Disse underfiler skal gemmes i den samme mappe (som hedder "main") som hovedscriptet, før de uploades til Arduino

Først defineres robotens generelle hastighed sammen med variablen "påmind". Denne "påmindelse" er en værdi, der husker i hvilken retning robotten drejede. Hvis "påmind = 1", var/var robotten ved at dreje til venstre, hvis "minde = 2", var/drejer robotten til højre.

int hastighed = 9; // Robotens generelle hastighed

int påmindelse = 1; // Indledende retning

I opsætningen af robotten initialiseres de forskellige underfiler i programmet. I disse underfiler er de grundlæggende funktioner for styring af motorer, sensorer, … skrevet. Ved at initialisere dem i opsætningen kan de funktioner, der er beskrevet i hver af disse filer, bruges i hovedsløjfen. Ved at aktivere funktionen r2D2 () vil robotten lave en lyd som R2D2 -robotten fra Star Wars -filmfranchisen, når det starter op. Her er funktionen r2D2 () deaktiveret for at forhindre summeren i at trække for meget strøm.

// Opsætning @ nulstilling // ----------------

ugyldig opsætning () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int påmindelse = 1; // startretning Starter (husk); }

Starteren (husk) -funktionen kaldes først på i opsætningen. Denne funktion får robotten til at vende om og lede efter IR -signalet på en af knapperne. Når det har fundet knappen, forlader programmet Starter -funktionen ved at ændre variablen 'kond' til falsk. Under robotens rotation skal det være opmærksom på sit miljø: det skal registrere kanter og forhindringer. Dette kontrolleres hver gang, før det fortsætter med at vende. Når robotten opdager en forhindring eller en kant, vil protokollen for at undgå disse forhindringer eller kanter blive udført. Disse protokoller vil blive forklaret senere i dette trin. Starter -funktionen har en variabel, som er den påmindelsesvariabel, der blev diskuteret før. Ved at give påmindelsesværdien til Starter -funktionen ved robotten i hvilken retning den skal dreje for at lede efter knappen.

// Starter Loop: Vend om og søg efter knappen // ------------------------------------ ----------------

void Starter (int reminder) {if (isedgeleft () || isedgeright ()) {// Detect the edge edgeDetected (reminder); } ellers {bool cond = true; mens (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } ellers {if (påmind == 1) {// Vi drejede til venstre, hvis (isobstacleleft ()) {stopspeed (); undgå_hindring (minde); } ellers hvis (isedgeleft () || isedgeright ()) {// Registrer kanter edgeDetected (påmind); } andet {drej til venstre (hastighed); }} ellers hvis (påmind == 2) {hvis (isobstacleright ()) {stopspeed (); undgå_hindring (minde); } ellers hvis (isedgeleft () || isedgeright ()) {// Registrer kanter edgeDetected (påmind); } ellers {drej til højre (hastighed); }}}}}}}

Hvis robotten finder knappen, forlades den første startsløjfe, og robotens vigtigste, funktionelle sløjfe begynder. Denne hovedsløjfe er ret kompleks, da robotten hver gang skal registrere, om der er en forhindring eller en kant foran den. Hovedideen er, at robotten følger knappen ved at finde den og miste den hver gang. Ved at bruge to IR -sensorer kan vi skelne mellem tre situationer:

  • forskellen mellem IR -lyset opdaget af venstre og højre sensor er større end en bestemt tærskel, og der er en knap.
  • forskellen i IR -lys er mindre end tærsklen, og der er en knap foran robotten.
  • forskellen i IR -lys er mindre end tærsklen, og der er INGEN knap foran robotten.

Sporutinens måde er som følger: Når knappen registreres, bevæger robotten sig mod knappen ved at dreje i samme retning, som den drejede (ved hjælp af påmindelsesvariablen) og samtidig bevæge sig lidt fremad. Hvis robotten drejer for langt, vil knappen gå tabt igen, og på dette tidspunkt husker robotten, at han skal dreje i den anden retning. Dette gøres også, mens man går lidt fremad. Ved at gøre dette drejer robotten konstant til venstre og drejer til højre, men går i mellemtiden stadig frem mod knappen. Hver gang robotten finder knappen, bliver den ved med at dreje, indtil den har mistet den, i hvilket tilfælde den begynder at bevæge sig i den anden retning. Bemærk forskellen i funktioner, der bruges i Starter loop og hoved loop: Starter loop bruger "turnleft ()" eller "turnright ()", mens hovedsløjfen bruger "moveleft ()" og "moveright ()". De moveleft/højre funktioner får ikke kun robotten til at dreje, men får ham også til at gå fremad på samme tid.

/ * Funktionel loop ---------------------------- Her er der kun sporrutinen */

int tabt = 0; // Hvis tabt = 0 findes knappen, hvis tabt = 1 er knappen tabt tomrumsløjfe () {hvis (isedgeleft () || isedgeright ()) {

hvis (! isobstacle ()) {

fremad (hastighed); forsinkelse (5); } ellers {undgå_hindring (minde); } ellers {if (påmind == 1 && lost == 1) {// Vi drejede til venstre stophastighed (); hvis (! isobstacleright ()) {moveright (hastighed); // Vend om for at finde knappen} else {undgå_obstacle (husk); } husk = 2; } ellers hvis (husk == 2 && lost == 1) {stopspeed (); hvis (! isobstacleleft ()) {moveleft (hastighed); // Vi drejede til højre} else {avoid_obstacle (mind); } husk = 1; } ellers hvis (tabt == 0) {hvis (påmind == 1) {// Vi drejede til venstre, hvis (! isobstacleleft ()) {moveleft (hastighed); // Vi drejede til højre} else {stopspeed (); undgå_hindring (minde); } //} ellers hvis (påmind == 2) {hvis (! isobstacleright ()) {moveright (hastighed); // Vend dig om for at finde knappen} else {stopspeed (); undgå_hindring (minde); }}} forsinkelse (10); tabt = 0; }} //}}

Nu gives en lille forklaring på de to mest komplekse rutiner:

Undgå kanter

Protokollen for at undgå kanter er defineret i en funktion kaldet "edgeDetection ()", der er skrevet i "bevægelse" -fil. Denne protokol er afhængig af, at robotten kun skal støde på en kant, når den har nået sin destination: knappen. Når robotten først opdager en kant, er det første, den gør, at flytte lidt tilbage for at være i sikker afstand fra kanten. Når dette er gjort, venter robotten i 2 sekunder. Hvis nogen trykker på knappen på forsiden af robotten i de to sekunder, ved robotten, at den har nået den person, der ønsker smørret, og åbner smørrummet og præsenterer smørret. På dette tidspunkt kan nogen tage smør fra robotten. Efter et par sekunder bliver robotten træt af at vente og lukker bare smørlåget. Når låget er lukket, vil robotten udføre Starter loop for at lede efter en anden knap. Hvis det sker, at robotten støder på en kant, før den når sin destination, og der ikke trykkes på knappen på robotens forside, åbner robotten ikke smørlåget og vil straks udføre startsløjfen.

Undgå forhindringer

Avoid_obstacle () -funktionen er også placeret i underfilen "bevægelse". Den svære del ved at undgå forhindringer er, at robotten har en temmelig stor blind plet. Ultralydssensoren er placeret foran på robotten, hvilket betyder, at den kan registrere forhindringer, men ikke ved, hvornår han bliver passeret den. For at løse dette bruges følgende princip: Når robotten støder på en forhindring, bruger den remingvariablen til at dreje i den anden retning. På denne måde undgår robotten at ramme forhindringen. Robotten bliver ved med at dreje, indtil ultralydssensoren ikke længere registrerer forhindringen. I løbet af den tid, robotten drejer, øges en tæller, indtil forhindringen ikke længere opdages. Denne tæller giver derefter en tilnærmelse af forhindringens længde. Ved at bevæge sig derefter fremad og samtidig reducere tælleren kan forhindringen undgås. Når tælleren når 0, kan Starter -funktionen bruges igen til at flytte knappen. Selvfølgelig gør robotten Starter -funktionen ved at dreje i den retning, den huskede, den gik, før han stødte på forhindringen (igen ved hjælp af påmindelsesvariablen).

Nu hvor du fuldt ud forstår koden, kan du begynde at bruge den!

Sørg for at tilpasse tærsklerne til dit miljø (IR -refleksion er f.eks. Højere på hvide borde) og tilpas de forskellige parametre til dine behov. Der bør også lægges stor vægt på strømforsyningen til de forskellige moduler. Det er af største betydning, at servomotorerne ikke drives af Arduino 5V -porten, da de tager meget strøm (dette kan beskadige mikrokontrolleren). Hvis den samme strømkilde bruges til sensorerne som den til at drive servoerne, kan der opstå nogle måleproblemer.

Anbefalede: