Innehållsförteckning:

Smörroboten: Arduino -roboten med existentiell kris: 6 steg (med bilder)
Smörroboten: Arduino -roboten med existentiell kris: 6 steg (med bilder)

Video: Smörroboten: Arduino -roboten med existentiell kris: 6 steg (med bilder)

Video: Smörroboten: Arduino -roboten med existentiell kris: 6 steg (med bilder)
Video: Part 34: Strategies for Optimizing Funding in 2021 2024, Juli
Anonim
Image
Image

Detta projekt är baserat på den animerade serien "Rick and Morty". I ett av avsnitten gör Rick en robot vars enda syfte är att ta med smör. Som studenter från Bruface (Bryssels tekniska fakultet) har vi ett uppdrag för mekatronikprojektet som är att bygga en robot baserad på ett föreslaget ämne. Uppdraget för detta projekt är: Gör en robot som endast serverar smör. Det kan ha en existentiell kris. Naturligtvis är roboten i avsnittet av Rick and Morty en ganska komplex robot och några förenklingar måste göras:

Eftersom det enda syftet är att ta med smör finns det mer enkla alternativ. Istället för att få roboten att se ut och ta tag i smöret, innan den tar den till rätt person, kan roboten bära smöret hela tiden. Huvudidén är alltså att göra en vagn som transporterar smöret dit det behöver vara.

Förutom att transportera smöret måste roboten veta var han behöver ta med smöret. I avsnittet använder Rick sin röst för att ringa och styra roboten. Detta kräver ett dyrt röstigenkänningssystem och skulle vara för komplicerat. Istället får alla vid bordet en knapp: när den här knappen är aktiverad kan roboten lokalisera den här knappen och gå mot den.

För att sammanfatta måste roboten uppfylla följande krav:

  • Det måste vara säkert: det måste undvika hinder och förhindra att det faller från bordet.
  • Roboten måste vara liten: utrymmet på bordet är begränsat och ingen skulle vilja ha en robot som serverar smör men är halva storleken på själva bordet;
  • Robotens funktion kan inte bero på bordets storlek eller form, på så sätt kan den användas på olika bord;
  • Det måste föra smöret till rätt person vid bordet.

Steg 1: Huvudkoncept

De tidigare nämnda kraven kan uppfyllas med olika tekniker. Besluten om huvuddesignen som fattades förklaras i detta steg. Detaljer om hur dessa idéer implementeras finns i följande steg.

För att fullgöra sin plikt måste roboten röra sig tills destinationen nås. Med tanke på robotens tillämpning är det enkelt att använda hjul istället för en "gående" rörelse är bättre att få den att röra sig. Eftersom ett bord är en plan yta och roboten inte kommer att nå särskilt höga hastigheter är två manövrerade hjul och en hjulkula den enklaste och enklaste kontrolllösningen. De manövrerade hjulen måste drivas av två motorer. Motorerna måste ha ett stort vridmoment men de behöver inte nå en hög hastighet, det är därför kontinuerliga servomotorer kommer att användas. En annan fördel med servomotorer är enkelheten att använda med en Arduino.

Detektering av hinder kan göras med en ultraljudssensor som mäter avståndet, fäst vid en servomotor för att välja mätriktning. Kanterna kan detekteras med LDR -sensorer. Att använda LDR -sensorer kräver konstruktion av en enhet som innehåller både ett LED -ljus och en LDR -sensor. En LDR -sensor mäter det reflekterade ljuset och kan ses som en slags avståndssensor. Samma princip finns med infrarött ljus. Det finns några infraröda närhetssensorer som har en digital utgång: nära eller inte nära. Detta är exakt vad roboten behöver för att upptäcka kanterna. Genom att kombinera 2 kantsensorer placerade som två insektsantenner och en aktiverad ultraljudssensor bör roboten kunna undvika hinder och kanter.

Knappdetekteringen kan också åstadkommas med hjälp av IR -sensorer och lysdioder. Fördelen med IR är att den är osynlig vilket gör att användningen av den är störande för människorna vid bordet. Lasrar kan också användas, men då skulle ljuset vara synligt och även farligt när någon riktar lasern mot en annan persons öga. Användaren skulle också behöva rikta in sensorerna på roboten med bara en tunn laserstråle, vilket skulle vara ganska irriterande. Genom att utrusta roboten med två IR-sensorer och konstruera knappen med en IR-led, vet roboten vilken riktning han behöver gå genom att följa IR-ljusets intensitet. När det inte finns någon knapp kan roboten vända förrän en av lysdioderna fångar signalen från en av knapparna.

Smöret läggs i ett fack på toppen av roboten. Detta fack kan bestå av en låda och ett manövrerat lock för att öppna lådan. För att öppna locket och flytta ultraljudssensorn för att skanna och upptäcka de hinder vi behöver två motorer och för detta ändamål är icke -kontinuerliga servomotorer mer anpassade eftersom motorerna måste gå i en viss position och behålla den positionen.

En extra funktion i projektet var att interagera med den yttre miljön med en robotröst. En summer är enkel och anpassad för detta ändamål men den kan inte användas när som helst eftersom den aktuella dragningen är hög.

De största svårigheterna med projektet bygger på kodningen, eftersom den mekaniska delen är ganska enkel. Många fall måste beaktas för att undvika att roboten fastnar eller gör något oönskat. De viktigaste problemen vi behöver lösa är att tappa IR -signalen på grund av ett hinder och stanna när den kommer till knappen!

Steg 2: Material

Mekaniska delar

  • 3D -skrivare och laserskärmaskin

    • PLA kommer att användas för 3D -utskrift men du kan också använda ABS
    • En tallrik med 3 mm björkplywood kommer att användas för laserskärning eftersom det ger möjlighet att göra ändringar senare, plexiglas kan också användas men det är svårare att modifiera det när det är laserskuret utan att förstöra det
  • Bultar, muttrar, brickor

    De flesta komponenterna hålls ihop med M3 -knapphuvudbultar, brickor och muttrar, men några av dem kräver M2- eller M4 -bultar. Bultarnas längd ligger i intervallet 8-12 mm

  • PCB -distanser, 25 mm och 15 mm
  • 2 servomotorer med kompatibla hjul
  • Något tjock metalltråd runt 1-2 mm i diameter

Elektroniska delar

  • Mikrokontroller

    1 arduino UNO -bräda

  • Servomotorer

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

    • 1 ultraljudssensor
    • 2 IR -närhetssensorer
    • 2 IR fotodioder
  • Batterier

    • 1 9V batterihållare + batteri
    • 1 4AA batterihållare + batterier
    • 1 9V batterilåda + batteri
  • Ytterligare komponenter

    • Några hopptrådar, trådar och lödplattor
    • Några motstånd
    • 1 IR -LED
    • 3 omkopplare
    • 1 summer
    • 1 knapp
    • 1 Arduino till 9V batterikontakt

Steg 3: Testa elektroniken

Testar elektroniken
Testar elektroniken
Testar elektroniken
Testar elektroniken

Skapande av knappen:

Knappen är helt enkelt gjord av en strömbrytare, en infraröd LED och ett 220 Ohm -motstånd i serie, som drivs av ett 9V -batteri. Detta sätts i ett 9V batteripaket för en kompakt och ren design.

Skapande av de infraröda mottagarmodulerna:

Dessa moduler är gjorda med lödbrädor för genomgående hål, som senare kommer att fästas med skruvar på roboten. Kretsarna för dessa moduler visas i det allmänna schemat. Principen är att mäta intensiteten hos det infraröda ljuset. För att förbättra mätningarna kan kollimatorer (gjorda med krymprör) användas för att fokusera på en viss intresseriktning.

Olika krav på projektet måste uppnås med hjälp av elektroniska enheter. Antalet enheter bör begränsas för att hålla en relativt låg komplexitet. Detta steg innehåller kopplingsscheman och varje kod för att testa alla delar separat:

  • Kontinuerliga servomotorer;
  • Ultraljudssensor;
  • Icke kontinuerliga servomotorer;
  • Summer;
  • IR -knappriktningsdetektering;
  • Kantdetektering med närhetssensorer;

Dessa koder kan hjälpa till att förstå komponenterna i början, men det är också mycket användbart för felsökning i senare skeden. Om ett visst problem uppstår kan felet lättare upptäckas genom att testa alla komponenter separat.

Steg 4: 3D -tryckt design och laserskärning

3D -tryckta och laserskurna delar
3D -tryckta och laserskurna delar
3D -tryckta och laserskurna delar
3D -tryckta och laserskurna delar
3D -tryckta och laserskurna delar
3D -tryckta och laserskurna delar

Laserskurna bitar

Enheten är gjord av tre huvudsakliga horisontella plattor som hålls samman av PCB -distanser för att få en öppen design som ger enkel åtkomst till elektroniken vid behov.

Dessa plattor måste ha de nödvändiga hålen skurna för att skruva av distanserna och andra komponenter för den slutliga monteringen. I huvudsak har alla tre plattorna hål på samma plats för distanserna och specifika hål för elektroniken som är fixerade på respektive platta. Lägg märke till att mittplattan har ett hål för ledningar i mitten.

Mindre bitar skärs till måtten på den stora servon för att fästa dem på enheten.

3D -tryckta bitar

Förutom laserskärning måste vissa bitar 3D -skrivas ut:

  • Stödet för ultraljudssensorn, som länkar den till en mikro servomotorarm
  • Stödet för hjulet och de två IR -kantgivarna. Den speciella utformningen av den typ av lådformade ändar av stycket för IR -sensorerna fungerar som en skärm för att undvika störningar mellan knappen som avger IR -signal och IR -sensorerna som bara behöver fokusera på vad som händer på marken
  • Stödet för mikroservomotorn som öppnar locket
  • Och slutligen själva locket, tillverkat av två delar för att ha en större arbetsvinkel genom att undvika kollisioner med mikroservomotorn som öppnar locket:

    • Den nedre som kommer att fästas på topplattan
    • Och toppen som är länkad till botten med ett gångjärn och manövreras av servon med en tjock metalltråd. Vi bestämde oss för att lägga till lite personlighet till roboten genom att ge den ett huvud.

När alla bitar är designade och filerna exporterade i rätt format för de maskiner som används, kan bitarna faktiskt göras. Tänk på att 3D -utskrift tar mycket tid, särskilt med måtten på lockets övre del. Du kan behöva en eller två dagar för att skriva ut alla bitar. Laserskärning är dock bara några minuter.

Alla SOLIDWORKS-filer finns i den zippade mappen.

Steg 5: Montering och kabeldragning

Image
Image
Montering och kabeldragning
Montering och kabeldragning
Montering och kabeldragning
Montering och kabeldragning
Montering och kabeldragning
Montering och kabeldragning

Monteringen kommer att vara en blandning av ledningar och skruva ihop komponenterna, från botten till toppen.

Bottenplatta

Bottenplattan monteras med 4AA-batteripaketet, servomotorerna, den tryckta delen (fäst kulhjulet under plattan), de två kantsensorerna och 6 distansdon för han-femal.

Mellanplatta

Därefter kan mittplattan monteras och komprimera servomotorerna mellan de två plattorna. Denna platta kan sedan fixeras genom att lägga en annan uppsättning distanser ovanpå den. Vissa kablar kan ledas genom mitthålet.

Ultraljudsmodulen kan anslutas till en icke-kontinuerlig servo, som är fixerad på mittplattan med Arduino, 9V batteripaket (som driver arduino) och de två infraröda mottagarmodulerna längst fram på roboten. Dessa moduler är gjorda med genomgående hållödningskort och fästs med skruvar på plattan. Kretsarna för dessa moduler visas i det allmänna schemat.

Topplatta

Vid denna del av enheten är omkopplarna inte fixade men roboten kan redan göra allt utom åtgärder som kräver locket, så det gör att vi kan göra några tester för att korrigera gränsen, anpassa rörelsekoden och ha en enkel tillgång till portarna på arduino.

När allt detta uppnås kan topplattan fixeras med distanser. De sista komponenterna som är de två omkopplarna, knappen, servon, summern och locksystemet kan slutligen fixeras till topplattan för att avsluta monteringen.

Det sista som ska testas och korrigeras är servovinkeln för att öppna locket korrekt.

Tröskeln för kantgivarna måste anpassas med den medföljande potentiometern (med hjälp av en platt skruvmejsel) för olika bordsytor. Ett vitt bord ska ha en lägre tröskel än ett brunt bord till exempel. Även sensornas höjd påverkar den tröskel som behövs.

I slutet av detta steg är monteringen klar och den sista återstående delen är de saknade koder.

Steg 6: Kodning: Att sätta ihop allt

All nödvändig kod för att få roboten att fungera finns i den zippade filen som kan laddas ner. Den viktigaste är den "huvudsakliga" koden som inkluderar robotens konfiguration och funktionella loop. De flesta andra funktionerna skrivs i underfiler (även i den zippade mappen). Dessa underfiler bör sparas i samma mapp (som heter "main") som huvudskriptet innan de laddas upp till Arduino

Först definieras robotens allmänna hastighet tillsammans med variabeln "påminnelse". Denna "påminnelse" är ett värde som kommer ihåg åt vilket håll roboten vände. Om "påminn = 1", var/svänger roboten åt vänster, om "påminner = 2", var/svängde roboten åt höger.

int hastighet = 9; // Robotens allmänna hastighet

int påminnelse = 1; // Initial riktning

I konfigurationen av roboten initieras programmets olika delfiler. I dessa delfiler skrivs de grundläggande funktionerna för styrning av motorer, sensorer, …. Genom att initiera dem i installationen kan funktionerna som beskrivs i var och en av dessa filer användas i huvudslingan. Genom att aktivera funktionen r2D2 () kommer roboten att göra ett ljud som R2D2 -roboten från Star Wars -filmfranchisen när det startar. Här är funktionen r2D2 () inaktiverad för att förhindra att summern drar för mycket ström.

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

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int påminnelse = 1; // initial riktning Starter (påminnelse); }

Startfunktionen (påminnelse) används först i installationen. Denna funktion får roboten att vända och leta efter IR -signalen på en av knapparna. När den har hittat knappen kommer programmet att lämna startfunktionen genom att ändra variabeln 'kond' till falskt. Under robotens rotation måste den vara medveten om sin omgivning: den måste upptäcka kanter och hinder. Detta kontrolleras varje gång innan det fortsätter att vända. När roboten väl upptäcker ett hinder eller en kant, kommer protokollet för att undvika dessa hinder eller kanter att köras. Dessa protokoll kommer att förklaras senare i detta steg. Startfunktionen har en variabel som är påminnelsesvariabeln som diskuterades tidigare. Genom att ge påminnelsevärdet till startfunktionen vet roboten i vilken riktning den behöver vända för att leta efter knappen.

// Starter Loop: Vänd dig om och sök efter knappen // ------------------------------------ ----------------

void Starter (int påminnelse) {if (isedgeleft () || isedgeright ()) {// Upptäck kanterna edgeDetected (påminnelse); } annat {bool cond = true; medan (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } annat {if (påminn == 1) {// Vi svängde vänster om (isobstacleleft ()) {stopspeed (); undvika_hinder (påminna); } annars om (isedgeleft () || isedgeright ()) {// Upptäck kanterna edgeDetected (påminnelse); } annat {sväng vänster (hastighet); }} annars if (påminn == 2) {if (isobstacleright ()) {stopspeed (); undvika_hinder (påminna); } annars om (isedgeleft () || isedgeright ()) {// Upptäck kanterna edgeDetected (påminnelse); } annat {turnright (hastighet); }}}}}}}

Om roboten hittar knappen, avslutas den första startslingan och robotens huvudsakliga, funktionella slinga börjar. Denna huvudslinga är ganska komplex eftersom varje gång måste roboten upptäcka om det finns ett hinder eller en kant framför den. Huvudtanken är att roboten följer knappen genom att hitta den och förlora den varje gång. Genom att använda två IR -sensorer kan vi skilja tre situationer:

  • skillnaden mellan IR -ljuset som detekteras av vänster och höger sensor är större än en viss tröskel, och det finns en knapp.
  • skillnaden i IR -ljus är mindre än tröskeln, och det finns en knapp framför roboten.
  • skillnaden i IR -ljus är mindre än tröskeln, och det finns INGEN knapp framför roboten.

Spårrutinen fungerar på följande sätt: när knappen detekteras rör sig roboten mot knappen genom att vrida i samma riktning som den svängde (med påminnelsevariabeln) och samtidigt gå lite framåt. Om roboten svänger för långt, kommer knappen att gå förlorad igen, och vid denna tidpunkt kommer roboten ihåg att han behöver svänga åt andra hållet. Detta görs också medan du går lite framåt. Genom att göra detta svänger roboten ständigt till vänster och svänger åt höger, men fortsätter under tiden mot knappen. Varje gång roboten hittar knappen, fortsätter den bara att vrida tills den har tappat den, i vilket fall den börjar röra sig åt andra hållet. Observera skillnaden i funktioner som används i startslingan och huvudslingan: "turnleft ()" eller "turnright ()", medan huvudslingan använder "moveleft ()" och "moveright ()". Funktionerna för rörelse/höger får inte bara roboten att vända utan får honom också att gå framåt samtidigt.

/ * Funktionsslinga ---------------------------- Här finns bara spårrutinen */

int förlorat = 0; // Om förlorad = 0 hittas knappen, om den går förlorad = 1 förloras knappen tomrumslinga () {if (isedgeleft () || isedgeright ()) {

om (! isobstacle ()) {

framåt (hastighet); fördröjning (5); } annat {undvik_hinder (påminnelse); } annat {if (påminn == 1 && lost == 1) {// Vi svängde vänster stopphastighet (); om (! isobstacleright ()) {moveright (hastighet); // Vänd dig om för att hitta knappen} else {avoid_obstacle (påminnelse); } påminn = 2; } annars om (påminn == 2 && lost == 1) {stopspeed (); om (! isobstacleleft ()) {moveleft (hastighet); // Vi svängde åt höger} else {avoid_obstacle (påminnelse); } påminn = 1; } annat om (förlorat == 0) {if (påminnelse == 1) {// Vi svängde vänster om (! isobstacleleft ()) {moveleft (hastighet); // Vi svängde åt höger} else {stopspeed (); undvika_hinder (påminna); } //} annat om (påminn == 2) {if (! isobstacleright ()) {moveright (hastighet); // Vänd dig om för att hitta knappen} else {stopspeed (); undvika_hinder (påminna); }}} fördröjning (10); förlorat = 0; }} //}}

Nu ges en liten förklaring av de två mest komplexa rutinerna:

Undvik kanter

Protokollet för att undvika kanter definieras i en funktion som kallas "edgeDetection ()" som är skriven i "rörelse" -fil. Detta protokoll bygger på det faktum att roboten bara ska stöta på en kant när den har nått sin destination: knappen. När roboten väl upptäcker en kant är det första den gör att flytta tillbaka lite för att vara på ett säkert avstånd från kanten. När detta är gjort väntar roboten i 2 sekunder. Om någon trycker på knappen längst fram på roboten under de två sekunderna, vet roboten att den har nått den som vill ha smöret och öppnar smörfacket och presenterar smöret. Vid denna tidpunkt kan någon ta smör från roboten. Efter några sekunder tröttnar roboten på att vänta och stänger bara smörlocket. När locket är stängt kommer roboten att köra startslingan för att leta efter en annan knapp. Om det händer att roboten stöter på en kant innan den når sin destination och knappen på robotens framsida inte trycks in, kommer roboten inte att öppna smörlocket och omedelbart utföra startslingan.

Undvik hinder

Avoid_obstacle () -funktionen finns också i underfilen "rörelse". Det svåra med att undvika hinder är det faktum att roboten har en ganska stor blind fläck. Ultraljudssensorn är placerad på framsidan av roboten, vilket innebär att den kan upptäcka hinder, men vet inte när han passeras. För att lösa detta används följande princip: När roboten väl stöter på ett hinder använder den remingvariabeln för att vända åt andra hållet. På så sätt undviker roboten att träffa hindret. Roboten fortsätter att vrida tills ultraljudssensorn inte längre upptäcker hindret. Under den tid roboten vänder, ökas en räknare tills hindret inte längre upptäcks. Denna räknare ger då en approximation av hinderets längd. Genom att gå sedan framåt och samtidigt minska räknaren kan hindret undvikas. När räknaren når 0 kan startfunktionen användas igen för att flytta knappen. Naturligtvis gör roboten Starter -funktionen genom att vrida i den riktning den kom ihåg att den gick innan han stötte på hindret (igen med hjälp av påminnelsesvariabeln).

Nu när du förstår koden fullt ut kan du börja använda den!

Var noga med att anpassa trösklarna till din miljö (IR -reflektion är till exempel högre på vita bord) och anpassa de olika parametrarna till dina behov. Dessutom bör stor uppmärksamhet ägnas åt drivningen av de olika modulerna. Det är av största vikt att servomotorerna inte drivs av Arduino 5V -porten, eftersom de tar mycket ström (detta kan skada mikrokontrollen). Om samma strömkälla används för sensorerna som den för att driva servon kan några mätproblem uppstå.

Rekommenderad: