Innholdsfortegnelse:

Smørroboten: Arduino -roboten med eksistensiell krise: 6 trinn (med bilder)
Smørroboten: Arduino -roboten med eksistensiell krise: 6 trinn (med bilder)

Video: Smørroboten: Arduino -roboten med eksistensiell krise: 6 trinn (med bilder)

Video: Smørroboten: Arduino -roboten med eksistensiell krise: 6 trinn (med bilder)
Video: Голубая стрела (1958) фильм 2024, Juli
Anonim
Image
Image

Dette prosjektet er basert på den animerte serien "Rick and Morty". I en av episodene lager Rick en robot hvis eneste formål er å bringe smør. Som studenter fra Bruface (Brussel ingeniørfakultet) har vi et oppdrag for mekatronikkprosjektet som er å bygge en robot basert på et foreslått tema. Oppgaven for dette prosjektet er: Lag en robot som bare serverer smør. Det kan ha en eksistensiell krise. Selvfølgelig er roboten i episoden av Rick and Morty en ganske kompleks robot, og noen forenklinger må gjøres:

Siden det eneste formålet er å bringe smør, er det mer enkle alternativer. I stedet for å få roboten til å se ut og ta tak i smøret, før den bringer den til riktig person, kan roboten bære smøret hele tiden. Hovedideen er dermed å lage en vogn som transporterer smøret til der det må være.

Bortsett fra å transportere smøret, må roboten vite hvor han trenger å bringe smøret. I episoden bruker Rick stemmen sin til å ringe og kommandere roboten. Dette krever et dyrt talegjenkjenningssystem og vil være for komplisert. I stedet får alle ved bordet en knapp: Når denne knappen er aktivert, kan roboten finne denne knappen og bevege seg mot den.

For å oppsummere må roboten oppfylle følgende krav:

  • Det må være trygt: det må unngå hindringer og hindre seg i å falle av bordet;
  • Roboten må være liten: Plassen på bordet er begrenset, og ingen vil ha en robot som serverer smør, men er halvparten så stor som bordet;
  • Robotens arbeid kan ikke avhenge av bordets størrelse eller form, på den måten kan den brukes på forskjellige bord;
  • Det må bringe smøret til rett person ved bordet.

Trinn 1: Hovedkonsept

De tidligere nevnte kravene kan oppfylles ved hjelp av forskjellige teknikker. Beslutningene om hoveddesignet som ble tatt forklares i dette trinnet. Du finner detaljer om hvordan disse ideene blir implementert i de følgende trinnene.

For å oppfylle sin plikt må roboten bevege seg til destinasjonen er nådd. Med tanke på anvendelsen av roboten er det enkelt at det er bedre å bruke hjul i stedet for en "gående" bevegelse. Siden et bord er en flat overflate og roboten ikke når særlig høye hastigheter, er to betjente hjul og en hjulkule den enkleste og enkleste kontrollen. De aktiverte hjulene må drives av to motorer. Motorene må ha et stort dreiemoment, men de trenger ikke å nå høy hastighet, derfor vil kontinuerlige servomotorer bli brukt. En annen fordel med servomotorer er enkelheten i bruk med en Arduino.

Deteksjon av hindringer kan gjøres ved hjelp av en ultralydsensor som måler avstanden, festet til en servomotor for å velge måleretning. Kantene kan detekteres ved hjelp av LDR -sensorer. Bruk av LDR -sensorer krever konstruksjon av en enhet som inneholder både et LED -lys og en LDR -sensor. En LDR -sensor måler det reflekterte lyset og kan sees på som en slags avstandssensor. Det samme prinsippet eksisterer med infrarødt lys. Det finnes noen infrarøde nærhetssensorer som har en digital utgang: Lukk eller ikke lukk. Dette er akkurat det roboten trenger for å oppdage kantene. Ved å kombinere 2 kantsensorer plassert som to insektantenner og en aktivert ultralydssensor, bør roboten kunne unngå hindringer og kanter.

Knappdeteksjonen kan også oppnås ved bruk av IR -sensorer og lysdioder. Fordelen med IR er at den er usynlig, noe som gjør bruken av den ikke forstyrrende for menneskene ved bordet. Lasere kan også brukes, men da vil lyset være synlig og også farlig når noen peker laseren inn i en annens øye. Brukeren må også målrette sensorene på roboten med bare en tynn laserstråle, noe som ville være ganske irriterende. Ved å utstyre roboten med to IR-sensorer og konstruere knappen med en IR-ledning, vet roboten hvilken retning han trenger å gå ved å følge intensiteten til IR-lyset. Når det ikke er noen knapp kan roboten snu seg til en av lysdiodene fanger signalet fra en av knappene.

Smøret legges i et rom på toppen av roboten. Dette rommet kan bestå av en eske og et aktivert lokk for å åpne boksen. For å åpne lokket og flytte ultralydsensoren for å skanne og oppdage hindringene vi trenger to motorer, og for dette formålet er ikke -kontinuerlige servomotorer mer tilpasset fordi motorene må gå i en bestemt posisjon og opprettholde stillingen.

En ekstra funksjon i prosjektet var å samhandle med det ytre miljøet med en robotstemme. En summer er enkel og tilpasset dette formålet, men den kan ikke brukes når som helst fordi den nåværende tegningen er høy.

De viktigste problemene med prosjektet er avhengig av kodingen, ettersom den mekaniske delen er ganske grei. Mange saker må tas i betraktning for å unngå at roboten sitter fast eller gjør noe uønsket. Hovedproblemene vi må løse er å miste IR -signalet på grunn av en hindring og stoppe når det kommer til knappen!

Trinn 2: Materialer

Mekaniske deler

  • 3D -skriver og laserskjæremaskin

    • PLA vil bli brukt til 3D -utskrift, men du kan også bruke ABS
    • En tallerken med 3 mm bjørkfiner vil bli brukt til laserskjæring, da det gir muligheten til å gjøre endringer senere, plexiglas kan også brukes, men det er vanskeligere å endre det når det er laserskåret uten å ødelegge det
  • Bolter, muttere, skiver

    De fleste komponentene holdes sammen ved hjelp av M3 knapphodeskruer, skiver og muttere, men noen av dem krever M2 eller M4 bolter. Lengden på boltene er i området 8-12 mm

  • PCB -avstandsstykker, 25 mm og 15 mm
  • 2 servomotorer med kompatible hjul
  • Noen tykk metalltråd rundt 1-2 mm i diameter

Elektroniske deler

  • Mikrokontroller

    1 arduino UNO -brett

  • Servomotorer

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

    • 1 ultralydsensor
    • 2 IR -nærhetssensorer
    • 2 IR fotodioder
  • Batterier

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

    • Noen hoppetråder, ledninger og loddeplater
    • Noen motstander
    • 1 IR LED
    • 3 brytere
    • 1 summer
    • 1 knapp
    • 1 Arduino til 9V batterikontakt

Trinn 3: Testing av elektronikken

Testing av elektronikk
Testing av elektronikk
Testing av elektronikk
Testing av elektronikk

Opprettelse av knappen:

Knappen er ganske enkelt laget av en bryter, en infrarød LED og en 220 Ohm motstand i serie, drevet av et 9V batteri. Dette er satt i en 9V batteripakke for en kompakt og ren design.

Opprettelse av de infrarøde mottakermodulene:

Disse modulene er laget med loddebrett for gjennomgående hull, som senere vil festes med skruer til roboten. Kretsene for disse modulene er avbildet i det generelle skjemaet. Prinsippet er å måle intensiteten til det infrarøde lyset. For å forbedre målingene kan kollimatorer (laget med krympeslanger) brukes til å fokusere på en bestemt interesseretning.

Ulike krav til prosjektet må oppnås ved bruk av elektroniske enheter. Antall enheter bør begrenses for å beholde en relativt lav kompleksitet. Dette trinnet inneholder ledningsskjemaene og hver kode for å teste alle delene separat:

  • Kontinuerlige Servomotorer;
  • Ultralyd sensor;
  • Ikke kontinuerlige Servomotorer;
  • Summer;
  • IR -knappretning deteksjon;
  • Kantdeteksjon av nærhetssensorer;

Disse kodene kan hjelpe til med å forstå komponentene i begynnelsen, men det er også veldig nyttig for feilsøking på senere stadier. Hvis det oppstår et bestemt problem, kan feilen lettere oppdages ved å teste alle komponentene separat.

Trinn 4: 3D -utskrevet og laserskåret design

3D -trykt og laserskåret brikke
3D -trykt og laserskåret brikke
3D -trykt og laserskåret brikke
3D -trykt og laserskåret brikke
3D -trykt og laserskjæret design
3D -trykt og laserskjæret design

Laserskårede stykker

Samlingen er laget av tre hoved horisontale plater som holdes sammen av PCB -avstandsstykker for å få en åpen design som gir enkel tilgang til elektronikken om nødvendig.

Disse platene må ha de nødvendige hullene kuttet for å skru avstandsstykkene og andre komponenter for den siste monteringen. Hovedsakelig har alle tre platene hull på samme sted for avstandsstykkene, og spesifikke hull for elektronikken festet på henholdsvis hver plate. Legg merke til at midtplaten har et hull for ledninger i midten.

Mindre biter kuttes til dimensjonene til den store servoen for å feste dem til enheten.

3D -trykte stykker

I tillegg til laserskjæring må noen stykker 3D -skrives ut:

  • Støtten for den ultralydssensoren, som kobler den til en mikro -servomotorarm
  • Støtten for hjulet og de to IR -kantsensorene. Den spesielle utformingen av den type boksformede ender av stykket for IR -sensorene fungerer som en skjerm for å unngå forstyrrelser mellom knappen som sender ut IR -signal og IR -sensorene som bare trenger å fokusere på det som skjer på bakken
  • Støtten for mikroservomotoren som åpner lokket
  • Og til slutt selve lokket, laget av to deler for å ha en større betjeningsvinkel ved å unngå kollisjon med mikroservomotoren som åpner lokket:

    • Den nederste som festes til topplaten
    • Og toppen som er knyttet til bunnen av et hengsel, og aktiveres av servoen ved hjelp av en tykk metalltråd. Vi bestemte oss for å tilføre roboten litt personlighet ved å gi den et hode.

Når alle brikkene er designet og filene eksporteres i riktig format for maskinene som brukes, kan brikkene faktisk lages. Vær oppmerksom på at 3D -utskrift tar mye tid, spesielt med dimensjonene på toppstykket på lokket. Du kan trenge en eller to dager for å skrive ut alle bitene. Laserskjæring er imidlertid bare et spørsmål om minutter.

Alle SOLIDWORKS-filene finnes i zip-mappen.

Trinn 5: Montering og ledninger

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

Monteringen vil være en blanding av ledninger og skru sammen komponentene, fra bunnen til toppen.

Bunnplate

Bunnplaten er montert med 4AA-batteripakken, servomotorene, den trykte delen (festing av kulelasten under platen), de to kantfølerne og 6 avstandsstykker for hunn-femal.

Mellomplate

Deretter kan midtplaten monteres og komprimere servomotorene mellom de to platene. Denne tallerkenen kan deretter fikses ved å sette et annet sett med avstandsstykker på toppen av den. Noen kabler kan føres gjennom senterhullet.

Ultralydsmodulen kan festes til en ikke-kontinuerlig servo, som er festet på midtplaten med Arduino, 9V batteripakken (som driver arduinoen) og de to infrarøde mottakermodulene foran på roboten. Disse modulene er laget med loddebrett for gjennomgående hull og festet med skruer til platen. Kretsene for disse modulene er avbildet i det generelle skjemaet.

Topplate

På denne delen av enheten er bryterne ikke fikset, men roboten kan allerede gjøre alt unntatt handlinger som krever lokket, og dermed kan vi gjøre noen tester for å korrigere grensen, tilpasse bevegelseskoden og ha en enkel tilgang til havnene på arduinoen.

Når alt dette er oppnådd, kan topplaten festes med avstandsstykker. De siste komponentene som er de to bryterne, knappen, servoen, summeren og lokksystemet kan endelig festes til topplaten for å fullføre monteringen.

Det siste du må teste og korrigere er vinkelen på servoen for å åpne lokket.

Terskelen til kantfølere må tilpasses med det medfølgende potensiometeret (ved bruk av en flat skrutrekker) for forskjellige bordflater. Et hvitt bord bør ha en lavere terskel enn for eksempel et brunt bord. Høyden på sensorene vil også påvirke den nødvendige terskelen.

På slutten av dette trinnet er monteringen ferdig og den siste gjenværende delen er de manglende kodene.

Trinn 6: Koding: Å sette alt sammen

All nødvendig kode for å få roboten til å fungere er i zip -filen som kan lastes ned. Den viktigste er den "viktigste" koden som inkluderer oppsett og funksjonell sløyfe for roboten. De fleste andre funksjonene er skrevet i underfiler (også i zip-mappen). Disse underfilene bør lagres i samme mappe (som heter "hoved") som hovedskriptet før du laster det opp til Arduino

Først defineres robotens generelle hastighet sammen med variabelen "påminnelse". Denne "påminnelsen" er en verdi som husker i hvilken retning roboten svingte. Hvis "påminn = 1", var/svinger roboten til venstre, hvis "påminner = 2", svarte/dreier roboten til høyre.

int hastighet = 9; // Generell hastighet på roboten

int minne = 1; // Innledende retning

I oppsettet av roboten initialiseres de forskjellige underfilene til programmet. I disse delfilene er de grunnleggende funksjonene for kontroll av motorer, sensorer, … skrevet. Ved å initialisere dem i oppsettet, kan funksjonene som er beskrevet i hver av disse filene brukes i hovedsløyfen. Ved å aktivere funksjonen r2D2 (), vil roboten lage en lyd som R2D2 -roboten fra Star Wars -filmfranchisen når den starter opp. Her er funksjonen r2D2 () deaktivert for å forhindre at summeren trekker for mye strøm.

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

ugyldig oppsett () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int minne = 1; // innledende retning Starter (påminnelse); }

Starteren (påminnelse) -funksjonen blir først påkalt i oppsettet. Denne funksjonen får roboten til å snu og se etter IR -signalet til en av knappene. Når den har funnet knappen, forlater programmet Starter -funksjonen ved å endre variabelen 'kond' til falsk. Under rotasjonen av roboten må den være oppmerksom på omgivelsene: den må oppdage kanter og hindringer. Dette kontrolleres hver gang før det fortsetter å snu. Når roboten oppdager et hinder eller en kant, vil protokollen for å unngå disse hindringene eller kantene bli utført. Disse protokollene vil bli forklart senere i dette trinnet. Startfunksjonen har en variabel som er påminnelsesvariabelen som ble diskutert før. Ved å gi påminnelsesverdien til Starter -funksjonen, vet roboten i hvilken retning den må snu for å lete etter knappen.

// Starter Loop: Vend om og søk etter knappen // ------------------------------------ ----------------

void Starter (int påminnelse) {if (isedgeleft () || isedgeright ()) {// Oppdag kantene edgeDetected (påminnelse); } annet {bool cond = true; mens (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } annet {if (minne == 1) {// Vi svingte til venstre hvis (isobstacleleft ()) {stopspeed (); avoid_obstacle (påminnelse); } annet hvis (isedgeleft () || isedgeright ()) {// Oppdag kantene edgeDetected (påminnelse); } annet {sving venstre (hastighet); }} annet hvis (minne == 2) {if (isobstacleright ()) {stopspeed (); avoid_obstacle (påminnelse); } annet hvis (isedgeleft () || isedgeright ()) {// Oppdag kantene edgeDetected (påminnelse); } annet {svingende (hastighet); }}}}}}

Hvis roboten finner knappen, forlates den første startsløyfen, og den viktigste, funksjonelle sløyfen til roboten begynner. Denne hovedsløyfen er ganske kompleks siden hver gang må roboten oppdage om det er et hinder eller en kant foran den. Hovedtanken er at roboten følger knappen ved å finne den og miste den hver gang. Ved å bruke to IR -sensorer kan vi skille mellom tre situasjoner:

  • forskjellen mellom IR -lyset oppdaget av venstre og høyre sensor er større enn en viss terskel, og det er en knapp.
  • forskjellen i IR -lys er mindre enn terskelen, og det er en knapp foran roboten.
  • forskjellen i IR -lys er mindre enn terskelen, og det er INGEN knapp foran roboten.

Måten sporrutinen fungerer på er som følger: Når knappen oppdages, beveger roboten seg mot knappen ved å dreie i samme retning som den svingte (ved hjelp av påminnelsesvariabelen) og samtidig bevege seg litt fremover. Hvis roboten svinger for langt, vil knappen gå tapt igjen, og på dette tidspunktet husker roboten at han må snu i den andre retningen. Dette gjøres også mens du går litt fremover. Ved å gjøre dette svinger roboten konstant til venstre og svinger til høyre, men i mellomtiden går den fremover mot knappen. Hver gang roboten finner knappen, fortsetter den bare å snu til den har mistet den. I så fall begynner den å bevege seg i den andre retningen. "turnleft ()" eller "turnright ()", mens hovedløkken bruker "moveleft ()" og "moveright ()". Funksjonene moveleft/right får ikke bare roboten til å snu, men får ham også til å bevege seg fremover samtidig.

/ * Funksjonell sløyfe ---------------------------- Her er det bare sporrutinen */

int tapt = 0; // Hvis tapt = 0 er knappen funnet, hvis tapt = 1 er knappen tapt tom sløyfe () {if (isedgeleft () || isedgeright ()) {

hvis (! isobstacle ()) {

fremover (hastighet); forsinkelse (5); } annet {avoid_obstacle (påminnelse); } annet {if (minne == 1 && lost == 1) {// Vi svingte til venstre stopphastighet (); if (! isobstacleright ()) {moveright (speed); // Snu deg rundt for å finne knappen} else {avoid_obstacle (påminnelse); } minne = 2; } annet hvis (minne == 2 && lost == 1) {stopspeed (); hvis (! isobstacleleft ()) {moveleft (hastighet); // Vi svingte til høyre} else {avoid_obstacle (påminnelse); } minne = 1; } annet hvis (tapt == 0) {if (minne == 1) {// Vi svingte til venstre hvis (! isobstacleleft ()) {moveleft (hastighet); // Vi svingte til høyre} else {stopspeed (); avoid_obstacle (påminnelse); } //} annet hvis (påminn == 2) {if (! isobstacleright ()) {moveright (speed); // Snu deg rundt for å finne knappen} else {stopspeed (); avoid_obstacle (påminnelse); }}} forsinkelse (10); tapt = 0; }} //}}

Nå er en liten forklaring på de to mest komplekse rutinene gitt:

Unngå kanter

Protokollen for å unngå kanter er definert i en funksjon som kalles "edgeDetection ()" som er skrevet i "bevegelse" -fil. Denne protokollen er avhengig av at roboten bare skal støte på en kant når den har nådd målet: knappen. Når roboten først har oppdaget en kant, er det første den gjør å flytte litt tilbake for å være på en trygg avstand fra kanten. Når dette er gjort, venter roboten i 2 sekunder. Hvis noen trykker på knappen på forsiden av roboten i de to sekundene, vet roboten at den har nådd personen som vil ha smøret og åpner smørrommet og presenterer smøret. På dette tidspunktet kan noen ta smør fra roboten. Etter noen sekunder vil roboten bli lei av å vente og bare stenge smørlokket. Når lokket er lukket, vil roboten utføre startsløyfen for å se etter en annen knapp. Hvis det skjer at roboten møter en kant før den når målet og knappen på forsiden av roboten ikke trykkes på, vil ikke roboten åpne smørlokket og vil umiddelbart utføre startsløyfen.

Unngå hindringer

Avoid_obstacle () -funksjonen er også plassert i underfilen "bevegelse". Den vanskelige delen om å unngå hindringer er det faktum at roboten har en ganske stor blind flekk. Ultralydsensoren er plassert på forsiden av roboten, noe som betyr at den kan oppdage hindringer, men vet ikke når han blir passert den. For å løse dette brukes følgende prinsipp: Når roboten støter på et hinder, bruker den remingvariabelen for å snu i den andre retningen. På denne måten unngår roboten å treffe hinderet. Roboten fortsetter å snu til ultralydssensoren ikke lenger oppdager hindringen. I løpet av tiden roboten snur, økes en teller til hindringen ikke lenger blir oppdaget. Denne telleren gir deretter en tilnærming til hinderets lengde. Ved å bevege deg deretter fremover og samtidig redusere telleren kan hindringen unngås. Når telleren når 0, kan Starter -funksjonen brukes igjen for å flytte knappen. Selvfølgelig gjør roboten Starter -funksjonen ved å snu i retningen den husket at den gikk før han møtte hindringen (igjen ved å bruke påminnelsesvariabelen).

Nå som du forstår koden fullt ut, kan du begynne å bruke den!

Sørg for å tilpasse tersklene til miljøet ditt (IR -refleksjon er for eksempel høyere på hvite bord) og tilpasse de forskjellige parameterne til dine behov. Det bør også gis stor oppmerksomhet til kraften til de forskjellige modulene. Det er av største betydning at servomotorene ikke drives av Arduino 5V -porten, siden de tar mye strøm (dette kan skade mikrokontrolleren). Hvis den samme strømkilden brukes til sensorene som den som driver servoene, kan det oppstå noen måleproblemer.

Anbefalt: