Inhoudsopgave:

De boterrobot: de Arduino-robot met existentiële crisis - Ajarnpa
De boterrobot: de Arduino-robot met existentiële crisis - Ajarnpa

Video: De boterrobot: de Arduino-robot met existentiële crisis - Ajarnpa

Video: De boterrobot: de Arduino-robot met existentiële crisis - Ajarnpa
Video: Assemble Penguin-Bot Arduino Robot KIT Step 2: Assemble The Legs Part 1 2024, Juni-
Anonim
Image
Image

Dit project is gebaseerd op de animatieserie "Rick and Morty". In een van de afleveringen maakt Rick een robot die als enige doel heeft boter te brengen. Als studenten van Bruface (Brusselse Faculteit Ingenieurswetenschappen) hebben we een opdracht voor het mechatronica-project dat een robot moet bouwen op basis van een voorgesteld onderwerp. De opdracht voor dit project is: Maak een robot die alleen boter serveert. Het kan een existentiële crisis hebben. Natuurlijk is de robot in de aflevering van Rick and Morty een vrij complexe robot en moeten er enkele vereenvoudigingen worden aangebracht:

Aangezien het enige doel is om boter te brengen, zijn er meer rechttoe rechtaan alternatieven. In plaats van de robot te laten kijken en de boter te pakken voordat hij deze naar de juiste persoon brengt, kan de robot de boter de hele tijd dragen. Het belangrijkste idee is dus om een kar te maken die de boter vervoert naar waar het moet zijn.

Naast het transporteren van de boter, moet de robot ook weten waar hij de boter heen moet brengen. In de aflevering gebruikt Rick zijn stem om de robot te bellen en te bevelen. Dit vereist een duur spraakherkenningssysteem en zou te ingewikkeld zijn. In plaats daarvan krijgt iedereen aan tafel een knop: zodra deze knop is geactiveerd, kan de robot deze knop vinden en ernaartoe bewegen.

Om samen te vatten, moet de robot aan de volgende vereisten voldoen:

  • Het moet veilig zijn: het moet obstakels vermijden en voorkomen dat het van de tafel valt;
  • De robot moet klein zijn: de ruimte op de tafel is beperkt en niemand zou een robot willen die boter serveert maar half zo groot is als de tafel zelf;
  • De werking van de robot kan niet afhankelijk zijn van de grootte of vorm van de tafel, op die manier kan hij op verschillende tafels worden gebruikt;
  • Het moet de boter bij de juiste persoon aan tafel brengen.

Stap 1: Hoofdconcept

Aan de eerder genoemde eisen kan worden voldaan met behulp van verschillende technieken. In deze stap worden de gemaakte beslissingen over het hoofdontwerp toegelicht. Details over hoe deze ideeën worden geïmplementeerd, vindt u in de volgende stappen.

Om zijn taak te volbrengen, moet de robot bewegen totdat de bestemming is bereikt. Gezien de toepassing van de robot is het duidelijk dat het gebruik van wielen in plaats van een "lopende" beweging beter is om hem te laten bewegen. Aangezien een tafel een plat oppervlak is en de robot geen erg hoge snelheden zal bereiken, zijn twee aangedreven wielen en een zwenkkogel de eenvoudigste en gemakkelijkst te bedienen oplossing. De aangedreven wielen moeten worden aangedreven door twee motoren. De motoren moeten een groot koppel hebben, maar ze hoeven geen hoge snelheid te bereiken, daarom zullen er continue servomotoren worden gebruikt. Een ander voordeel van servomotoren is de eenvoud van gebruik met een Arduino.

De detectie van obstakels kan worden gedaan met behulp van een ultrasone sensor die de afstand meet, bevestigd aan een servomotor om de richting van de meting te kiezen. De randen kunnen worden gedetecteerd met behulp van LDR-sensoren. Het gebruik van LDR-sensoren vereist de constructie van een apparaat dat zowel een led-lamp als een LDR-sensor bevat. Een LDR-sensor meet het gereflecteerde licht en kan worden gezien als een soort afstandssensor. Hetzelfde principe bestaat bij infrarood licht. Er zijn enkele infrarood naderingssensoren die een digitale uitgang hebben: dicht of niet dichtbij. Dit is precies wat de robot nodig heeft om de randen te detecteren. Door 2 randsensoren te combineren die zijn geplaatst als twee insectenantennes en een geactiveerde ultrasone sensor, moet de robot obstakels en randen kunnen vermijden.

De knopdetectie kan ook worden bereikt door gebruik te maken van IR-sensoren en leds. Het voordeel van IR is dat het onzichtbaar is waardoor het gebruik ervan niet storend is voor de mensen aan tafel. Lasers zouden ook kunnen worden gebruikt, maar dan zou het licht zichtbaar en ook gevaarlijk zijn als iemand de laser in het oog van een ander richt. Ook zou de gebruiker de sensoren op de robot moeten richten met slechts een dunne laserstraal, wat behoorlijk vervelend zou zijn. Door de robot uit te rusten met twee IR-sensoren en de knop te voorzien van een IR-led, weet de robot welke kant hij op moet door de intensiteit van het IR-licht te volgen. Als er geen knop is, kan de robot zich omdraaien totdat een van de leds het signaal van een van de knoppen opvangt.

De boter wordt in een compartiment bovenop de robot gedaan. Dit compartiment kan bestaan uit een doos en een bediend deksel om de doos te openen. Om het deksel te openen en de ultrasone sensor te verplaatsen om de obstakels te scannen en te detecteren, hebben we twee motoren nodig en voor dit doel zijn niet-continue servomotoren meer aangepast omdat de motoren op een bepaalde positie moeten gaan en die positie moeten behouden.

Een extra kenmerk van het project was om met een robotstem te communiceren met de externe omgeving. Een zoemer is eenvoudig en aangepast voor dit doel, maar kan op geen enkel moment worden gebruikt omdat de huidige trekkracht hoog is.

De belangrijkste problemen van het project zijn de codering, aangezien het mechanische gedeelte vrij eenvoudig is. Er moet rekening worden gehouden met veel gevallen om te voorkomen dat de robot vast komt te zitten of iets ongewensts doet. De belangrijkste problemen die we moeten oplossen, zijn het verlies van het IR-signaal door een obstakel en stoppen wanneer het bij de knop aankomt!

Stap 2: Materialen

Mechanische onderdelen

  • 3D-printer en lasersnijmachine

    • PLA wordt gebruikt voor 3D-printen, maar je kunt ook ABS gebruiken
    • Een plaat van 3 mm berkenmultiplex zal worden gebruikt voor lasersnijden, omdat dit de mogelijkheid biedt om later gemakkelijk wijzigingen aan te brengen. Plexiglas kan ook worden gebruikt, maar het is moeilijker om het aan te passen als het eenmaal is gelaserd zonder het te vernietigen
  • Bouten, moeren, ringen

    De meeste componenten worden bij elkaar gehouden met M3-bolkopbouten, ringen en moeren, maar voor sommige zijn M2- of M4-bouten nodig. De lengte van de bouten ligt in het bereik van 8-12 mm

  • PCB-afstandhouders, 25 mm en 15 mm
  • 2 servomotoren met compatibele wielen
  • Wat dik metaaldraad met een diameter van ongeveer 1-2 mm

Elektronische onderdelen

  • Microcontroller

    1 arduino UNO-bord

  • servomotoren

    • 2 grote servomotoren: Feetech continu 6Kg 360 graden
    • 2 micro-servomotoren: Feetech FS90
  • Sensoren

    • 1 Ultrasone sensor
    • 2 IR-nabijheidssensoren
    • 2 IR-fotodiodes
  • Batterijen

    • 1 9V batterijhouder + batterij
    • 1 4AA batterijhouder + batterijen
    • 1 9V accubak + batterij
  • Extra componenten

    • Enkele springdraden, draden en soldeerplaten
    • Sommige weerstanden
    • 1 IR-LED
    • 3 schakelaars
    • 1 zoemer
    • 1 knop
    • 1 Arduino naar 9V batterijconnector

Stap 3: De elektronica testen

De elektronica testen
De elektronica testen
De elektronica testen
De elektronica testen

Creatie van de knop:

De knop wordt eenvoudig gemaakt door een schakelaar, een infrarood-LED en een 220 Ohm-weerstand in serie, gevoed door een 9V-batterij. Deze zit in een 9V batterijpakket voor een compact en strak design.

Creatie van de infrarood ontvangermodules:

Deze modules zijn gemaakt met doorlopende soldeerplaten, die later met schroeven aan de robot worden bevestigd. De schakelingen voor deze modules zijn weergegeven in het algemene schema. Het principe is om de intensiteit van het infrarood licht te meten. Om de metingen te verbeteren, kunnen collimators (gemaakt met krimpbuizen) worden gebruikt om te focussen op een bepaalde interesserichting.

Verschillende vereisten van het project moeten worden bereikt met behulp van elektronische apparaten. Het aantal apparaten moet worden beperkt om de complexiteit relatief laag te houden. Deze stap bevat de bedradingsschema's en elke code om alle onderdelen afzonderlijk te testen:

  • continue servomotoren;
  • Ultrasoon sensor;
  • Niet-continue servomotoren;
  • Zoemer;
  • IR-knop richtingsdetectie;
  • Randdetectie door naderingssensoren;

Deze codes kunnen helpen om de componenten in het begin te begrijpen, maar ze zijn ook erg handig voor het debuggen in latere stadia. Als zich een bepaald probleem voordoet, kan de bug gemakkelijker worden opgespoord door alle componenten afzonderlijk te testen.

Stap 4: 3D-geprint en lasergesneden stukkenontwerp

Ontwerp van 3D-geprinte en lasergesneden stukken
Ontwerp van 3D-geprinte en lasergesneden stukken
Ontwerp van 3D-geprinte en lasergesneden stukken
Ontwerp van 3D-geprinte en lasergesneden stukken
Ontwerp van 3D-geprinte en lasergesneden stukken
Ontwerp van 3D-geprinte en lasergesneden stukken

Lasergesneden stukken

De assemblage is gemaakt van drie horizontale hoofdplaten die bij elkaar worden gehouden door PCB-afstandhouders om een open ontwerp te krijgen dat indien nodig gemakkelijke toegang tot de elektronica biedt.

In die platen moeten de nodige gaten worden gesneden om de afstandhouders en andere componenten voor de eindmontage te schroeven. Hoofdzakelijk hebben alle drie de platen gaten op dezelfde locatie voor de afstandhouders en specifieke gaten voor de elektronica die respectievelijk op elke plaat zijn bevestigd. Merk op dat de middelste plaat in het midden een gat heeft voor het doorvoeren van draden.

Kleinere stukken worden op de afmetingen van de grote servo gesneden om ze aan de montage te bevestigen.

3D-geprinte stukken

Naast lasersnijden zullen sommige stukken 3D geprint moeten worden:

  • De ondersteuning voor de ultrasone sensor, die deze verbindt met één micro-servomotorarm
  • De steun voor het zwenkwiel en de twee IR-randsensoren. Het specifieke ontwerp van het soort doosvormige uiteinden van het stuk voor de IR-sensoren fungeren als een scherm om interferentie te voorkomen tussen de knop die het IR-signaal uitzendt en de IR-sensoren die zich alleen moeten concentreren op wat er op de grond gebeurt
  • De ondersteuning voor de micro-servomotor die het deksel opent
  • En tot slot het deksel zelf, gemaakt uit twee stukken om een grotere werkhoek te hebben door botsing met de micro-servomotor te vermijden die het deksel opent:

    • De onderste die aan de bovenplaat wordt bevestigd:
    • En de bovenkant die door een scharnier met de onderkant is verbonden en door de servo wordt bediend met een dikke metalen draad. We besloten om een beetje persoonlijkheid aan de robot toe te voegen door hem een hoofd te geven.

Zodra alle stukken zijn ontworpen en de bestanden zijn geëxporteerd in het juiste formaat voor de gebruikte machines, kunnen de stukken daadwerkelijk worden gemaakt. Houd er rekening mee dat 3D-printen veel tijd kost, zeker met de afmetingen van het bovenstuk van de deksel. Je hebt misschien een of twee dagen nodig om alle stukken af te drukken. Lasersnijden is echter slechts een kwestie van minuten.

Alle SOLIDWORKS-bestanden zijn te vinden in de gezipte map.

Stap 5: Montage en bedrading

Image
Image
Montage en bedrading
Montage en bedrading
Montage en bedrading
Montage en bedrading
Montage en bedrading
Montage en bedrading

De montage zal een mix zijn van bedrading en het aan elkaar schroeven van de componenten, beginnend van onder naar boven.

Bodemplaat

De bodemplaat is geassembleerd met het 4AA-batterijpakket, de servomotoren, het geprinte deel (bevestiging van de kogelgieter onder de plaat), de twee randsensoren en 6 man-vrouwafstandhouders.

Middenplaat

Vervolgens kan de middelste plaat worden gemonteerd, waarbij de servomotoren tussen de twee platen worden samengedrukt. Deze plaat kan vervolgens worden vastgezet door er nog een set afstandhouders op te plaatsen. Sommige kabels kunnen door het middelste gat worden geleid.

De ultrasone module kan worden bevestigd aan een niet-continue servo, die op de middelste plaat wordt bevestigd met de Arduino, het 9V-batterijpakket (dat de arduino van stroom voorziet) en de twee infraroodontvangermodules aan de voorkant van de robot. Deze modules zijn gemaakt met doorlopende soldeerplaten en met schroeven aan de plaat bevestigd. De schakelingen voor deze modules zijn weergegeven in het algemene schema.

Bovenplaat

In dit deel van de montage zijn de schakelaars niet vast, maar de robot kan al alles doen, behalve acties waarvoor het deksel nodig is, dus het stelt ons in staat om wat tests uit te voeren om de drempel te corrigeren, de code van de beweging aan te passen en een gemakkelijke toegang tot de havens van de arduino.

Wanneer dit allemaal is bereikt, kan de bovenplaat worden vastgezet met afstandhouders. De laatste componenten die de twee schakelaars, de knop, de servo, de zoemer en het dekselsysteem zijn, kunnen uiteindelijk op de bovenplaat worden bevestigd om de montage te voltooien.

Het laatste dat u moet testen en corrigeren, is de hoek van de servo om het deksel correct te openen.

De drempel van de randsensoren moet worden aangepast met de meegeleverde potentiometer (met behulp van een platte schroevendraaier) voor verschillende tafeloppervlakken. Een witte tafel moet een lagere drempel hebben dan bijvoorbeeld een bruine tafel. Ook de hoogte van de sensoren zal de benodigde drempel beïnvloeden.

Aan het einde van deze stap is de montage klaar en het laatst overgebleven deel zijn de ontbrekende codes.

Stap 6: Coderen: alles samenbrengen

Alle benodigde code om de robot te laten werken staat in het gezipte bestand dat kan worden gedownload. De belangrijkste is de "hoofd" -code die de setup en functionele lus van de robot bevat. De meeste andere functies zijn geschreven in subbestanden (ook in de gecomprimeerde map). Deze subbestanden moeten worden opgeslagen in dezelfde map (die "main" wordt genoemd) als het hoofdscript voordat u het naar de Arduino uploadt

Eerst wordt de algemene snelheid van de robot gedefinieerd samen met de variabele "herinneren". Deze "herinnering" is een waarde die onthoudt in welke richting de robot draaide. Als "herinneren = 1" draait/draait de robot naar links, als "herinneren = 2", draait/draait de robot naar rechts.

int-snelheid = 9; // Algemene snelheid van de robot

int herinneren = 1; // Oorspronkelijke richting

In de setup van de robot worden de verschillende subbestanden van het programma geïnitialiseerd. In deze subbestanden worden de basisfuncties over de aansturing van de motoren, sensoren, … geschreven. Door ze in de setup te initialiseren, kunnen de functies die in elk van deze bestanden worden beschreven in de hoofdlus worden gebruikt. Door de functie r2D2() te activeren, maakt de robot een geluid zoals de R2D2-robot uit de Star Wars-filmfranchise wanneer het start op. Hier is de r2D2()-functie uitgeschakeld om te voorkomen dat de zoemer te veel stroom trekt.

// Instellen @ reset//----------------

void setup(){ initialize_IR_sensors(); initialize_obstacles_and_edges(); initialize_movement(); initialize_lid(); initialize_buzzer(); // r2D2(); int herinneren = 1; // initiële richting Starter (herinneren); }

De Starter(herinneren) functie wordt eerst aangeroepen in de setup. Deze functie zorgt ervoor dat de robot zich omdraait en op zoek gaat naar het IR-signaal van een van de knoppen. Zodra het de knop heeft gevonden, verlaat het programma de Starter-functie door de variabele 'cond' in false te veranderen. Tijdens het draaien van de robot moet hij zich bewust zijn van zijn omgeving: hij moet randen en obstakels detecteren. Dit wordt iedere keer gecontroleerd voordat hij verder draait. Zodra de robot een obstakel of een rand detecteert, wordt het protocol om deze obstakels of randen te vermijden uitgevoerd. Deze protocollen zullen later in deze stap worden uitgelegd. De Starter-functie heeft één variabele en dat is de herinneringsvariabele die eerder werd besproken. Door de herinneringswaarde aan de Starter-functie te geven, weet de robot in welke richting hij moet draaien om de knop te zoeken.

//Starter Loop: Draai je om en zoek naar de knop//------------------------------------ ----------------

void Starter (int herinnering) {if (isedgeleft() || isedgeright()) { // Detecteer de randen edgeDetected (herinner); } else { bool cond = waar; while (cond == true) { if (buttonleft() == false && buttonright() == false && isButtonDetected() == true) { cond = false; } else { if (herinner == 1) { // We sloegen linksaf if (isobstacleleft()) { stopspeed(); vermijden_obstakel (herinneren); } else if (isedgeleft() || isedgeright()) { // Detecteer de randen edgeDetected (herinneren); } else { linksaf(snelheid); } } else if (herinneren == 2) { if (isobstacleright()) { stopspeed(); vermijden_obstakel (herinneren); } else if (isedgeleft() || isedgeright()) { // Detecteer de randen edgeDetected (herinneren); } else { rechtsaf(snelheid); } } } } } }

Als de robot de knop vindt, wordt de eerste Starter-lus verlaten en begint de belangrijkste, functionele lus van de robot. Deze hoofdlus is vrij complex omdat de robot elke keer moet detecteren of er een obstakel of een rand voor is. Het belangrijkste idee is dat de robot de knop volgt door deze te vinden en elke keer weer te verliezen. Door gebruik te maken van twee IR-sensoren kunnen we drie situaties onderscheiden:

  • het verschil tussen het IR-licht dat wordt gedetecteerd door de linker- en rechtersensor is groter dan een bepaalde drempel en er is een knop.
  • het verschil in IR-licht is kleiner dan de drempel en er zit een knop voor de robot.
  • het verschil in IR-licht is kleiner dan de drempel en er zit GEEN knop voor de robot.

De manier waarop de baanroutine werkt, is als volgt: wanneer de knop wordt gedetecteerd, beweegt de robot naar de knop door in dezelfde richting te draaien als waarin hij draaide (met behulp van de herinneringsvariabele) en tegelijkertijd een beetje naar voren te bewegen. Als de robot te ver draait, gaat de knop weer verloren en op dit punt herinnert de robot zich dat hij in de andere richting moet draaien. Dit gebeurt ook terwijl je een beetje vooruit gaat. Hierdoor draait de robot constant naar links en naar rechts, maar gaat ondertussen nog steeds naar de knop toe. Elke keer dat de robot de knop vindt, blijft hij gewoon draaien totdat hij hem kwijt is. In dat geval begint hij in de andere richting te bewegen. Let op het verschil in functies die worden gebruikt in de Starter-lus en de hoofdlus: de Starter-lus gebruikt "turnleft()" of "turnright()", terwijl de hoofdlus "moveleft()" en "moveright()" gebruikt. De beweeglinks/rechts-functies zorgen ervoor dat de robot niet alleen draait, maar hem tegelijkertijd ook vooruit beweegt.

/* Functionele lus ---------------------------- Hier is alleen de trackroutine */

int verloren = 0; // Als verloren = 0 is de knop gevonden, als verloren = 1 is de knop verloren void loop() { if (isedgeleft() || isedgeright()) {

if (!isobstakel()) {

vooruit (snelheid); vertraging (5); } else { avoid_obstacle (herinneren); } else {if (herinner == 1 && lost == 1) { // We gingen linksaf stopspeed(); if (!isobstacleright()) { moveright(snelheid); // Draai je om om de knop te vinden } else { avoid_obstacle (remind); } herinneren = 2; } else if (herinneren == 2 && verloren == 1) { stopspeed(); if (!isobstacleleft()) { moveleft(snelheid); // We sloegen rechtsaf } else { avoid_obstacle (herinneren); } herinneren = 1; }else if (lost == 0) { if (herinner == 1) { // We sloegen linksaf if (!isobstacleleft()) { moveleft(speed); // We sloegen rechtsaf } else { stopspeed(); vermijden_obstakel (herinneren); } // } else if (herinner == 2) { if (!isobstacleright()) { moveright(speed); // Draai je om om de knop } else { stopspeed(); vermijden_obstakel (herinneren); } } } vertraging(10); verloren = 0; } } //} }

Nu wordt een kleine uitleg gegeven van de twee meest complexe routines:

Vermijd randen

Het protocol om randen te vermijden is gedefinieerd in een functie genaamd "edgeDetection()" die is geschreven in het subbestand "movement". Dit protocol gaat ervan uit dat de robot pas een rand mag tegenkomen als hij zijn bestemming heeft bereikt: de knop. Zodra de robot een rand detecteert, is het eerste wat hij doet een klein stukje achteruit gaan om op een veilige afstand van de rand te zijn. Zodra dit is gebeurd, wacht de robot 2 seconden. Als iemand in die twee seconden op de knop aan de voorkant van de robot drukt, weet de robot dat hij de persoon heeft bereikt die de boter wil en opent hij het botervak en presenteert de boter. Op dit punt kan iemand boter uit de robot halen. Na een paar seconden is de robot het wachten beu en sluit hij gewoon het boterdeksel. Zodra het deksel is gesloten, voert de robot de Starter-lus uit om naar een andere knop te zoeken. Als het gebeurt dat de robot een rand tegenkomt voordat hij zijn bestemming bereikt en de knop aan de voorkant van de robot niet wordt ingedrukt, zal de robot het boterdeksel niet openen en onmiddellijk de Starter-lus uitvoeren.

Vermijd obstakels

De functie avoid_obstacle() bevindt zich ook in het subbestand "movement". Het moeilijke van het vermijden van obstakels is het feit dat de robot een behoorlijk grote dode hoek heeft. De ultrasone sensor is aan de voorkant van de robot geplaatst, waardoor hij obstakels kan detecteren, maar niet weet wanneer hij er voorbij is. Om dit op te lossen, wordt het volgende principe gebruikt: Zodra de robot een obstakel tegenkomt, gebruikt hij de reming-variabele om in de andere richting te draaien. Op deze manier vermijdt de robot het obstakel te raken. De robot blijft draaien totdat de ultrasone sensor het obstakel niet meer detecteert. Gedurende de tijd dat de robot draait, wordt een teller verhoogd totdat het obstakel niet meer wordt gedetecteerd. Deze teller geeft dan een benadering van de lengte van het obstakel. Door vervolgens naar voren te bewegen en tegelijkertijd de teller te verlagen, kan het obstakel worden vermeden. Zodra de teller op 0 staat, kan de Starter-functie opnieuw worden gebruikt om de knop te verplaatsen. Natuurlijk voert de robot de startfunctie uit door te draaien in de richting waarin hij zich herinnerde dat hij ging voordat hij het obstakel tegenkwam (opnieuw met behulp van de herinneringsvariabele).

Nu je de code volledig begrijpt, kun je hem gaan gebruiken!

Zorg ervoor dat u de drempels aanpast aan uw omgeving (IR-reflectie is bijvoorbeeld hoger op witte tafels) en dat u de verschillende parameters aan uw behoeften aanpast. Ook moet er veel aandacht worden besteed aan de voeding van de verschillende modules. Het is van het grootste belang dat de servomotoren niet worden gevoed door de Arduino 5V-poort, omdat ze veel stroom verbruiken (dit kan de microcontroller beschadigen). Als voor de sensoren dezelfde stroombron wordt gebruikt als die voor de servo's, kunnen er meetproblemen optreden.

Aanbevolen: