Inhaltsverzeichnis:

Der Butterroboter: Der Arduino-Roboter mit existenzieller Krise - Gunook
Der Butterroboter: Der Arduino-Roboter mit existenzieller Krise - Gunook

Video: Der Butterroboter: Der Arduino-Roboter mit existenzieller Krise - Gunook

Video: Der Butterroboter: Der Arduino-Roboter mit existenzieller Krise - Gunook
Video: 10 Cool Inventions Anyone Can Print - The Best Models for Brand-New Printers 2024, Juli
Anonim
Image
Image

Dieses Projekt basiert auf der Zeichentrickserie "Rick and Morty". In einer der Episoden baut Rick einen Roboter, dessen einziger Zweck es ist, Butter zu bringen. Als Studenten der Bruface (Brüsseler Fakultät für Ingenieurwissenschaften) haben wir eine Aufgabe für das Mechatronik-Projekt, einen Roboter basierend auf einem vorgeschlagenen Thema zu bauen. Die Aufgabe für dieses Projekt lautet: Baue einen Roboter, der nur Butter serviert. Es kann eine existenzielle Krise geben. Natürlich ist der Roboter in der Episode von Rick and Morty ein ziemlich komplexer Roboter und es müssen einige Vereinfachungen vorgenommen werden:

Da der einzige Zweck darin besteht, Butter mitzubringen, gibt es einfachere Alternativen. Anstatt den Roboter aussehen zu lassen und die Butter zu greifen, bevor er sie zur richtigen Person bringt, kann der Roboter die Butter die ganze Zeit tragen. Die Hauptidee besteht also darin, einen Wagen zu bauen, der die Butter dorthin transportiert, wo sie sein muss.

Neben dem Transport der Butter muss der Roboter wissen, wohin er die Butter bringen muss. In der Episode benutzt Rick seine Stimme, um den Roboter zu rufen und zu befehlen. Dies erfordert ein teures Spracherkennungssystem und wäre zu kompliziert. Stattdessen bekommt jeder am Tisch eine Schaltfläche: Sobald diese Schaltfläche aktiviert ist, kann der Roboter diese Schaltfläche finden und sich darauf zubewegen.

Zusammenfassend muss der Roboter die folgenden Anforderungen erfüllen:

  • Es muss sicher sein: es muss Hindernissen ausweichen und sich selbst daran hindern, vom Tisch zu fallen;
  • Der Roboter muss klein sein: Der Platz auf dem Tisch ist begrenzt und niemand möchte einen Roboter, der Butter serviert, aber halb so groß ist wie der Tisch selbst;
  • Die Arbeitsweise des Roboters kann nicht von der Größe oder Form des Tisches abhängen, so dass er auf verschiedenen Tischen verwendet werden kann;
  • Es muss die Butter zur richtigen Person am Tisch bringen.

Schritt 1: Hauptkonzept

Die zuvor genannten Anforderungen können mit unterschiedlichen Techniken erfüllt werden. Die getroffenen Entscheidungen zum Hauptdesign werden in diesem Schritt erläutert. Details zur Umsetzung dieser Ideen finden Sie in den folgenden Schritten.

Um seine Aufgabe zu erfüllen, muss sich der Roboter bewegen, bis das Ziel erreicht ist. In Anbetracht der Anwendung des Roboters ist es klar, dass die Verwendung von Rädern anstelle einer "Gehbewegung" besser ist, um ihn in Bewegung zu setzen. Da ein Tisch eine ebene Fläche ist und der Roboter keine sehr hohen Geschwindigkeiten erreicht, sind zwei angetriebene Räder und eine Laufkugel die einfachste und am einfachsten zu steuernde Lösung. Die angetriebenen Räder müssen von zwei Motoren angetrieben werden. Die Motoren müssen ein großes Drehmoment haben, aber keine hohe Drehzahl erreichen, deshalb werden kontinuierliche Servomotoren verwendet. Ein weiterer Vorteil von Servomotoren ist die einfache Verwendung mit einem Arduino.

Die Erkennung von Hindernissen kann mit einem Ultraschallsensor erfolgen, der den Abstand misst und an einem Servomotor befestigt ist, um die Messrichtung zu wählen. Die Kanten können mit LDR-Sensoren erkannt werden. Die Verwendung von LDR-Sensoren erfordert den Bau eines Geräts, das sowohl ein LED-Licht als auch einen LDR-Sensor enthält. Ein LDR-Sensor misst das reflektierte Licht und kann als eine Art Distanzsensor angesehen werden. Das gleiche Prinzip besteht bei Infrarotlicht. Es gibt einige Infrarot-Näherungssensoren, die einen digitalen Ausgang haben: nah oder nicht nah. Genau das braucht der Roboter, um die Kanten zu erkennen. Durch die Kombination von 2 Kantensensoren, die wie zwei Insektenantennen platziert sind, und einem angesteuerten Ultraschallsensor soll der Roboter in der Lage sein, Hindernissen und Kanten auszuweichen.

Die Tastenerkennung kann auch über IR-Sensoren und LEDs erfolgen. Der Vorteil von IR ist, dass es unsichtbar ist, was die Nutzung für die Leute am Tisch nicht störend macht. Es könnten auch Laser verwendet werden, aber dann wäre das Licht sichtbar und auch gefährlich, wenn jemand den Laser auf das Auge einer anderen Person richtet. Außerdem müsste der Benutzer die Sensoren am Roboter nur mit einem dünnen Laserstrahl anvisieren, was ziemlich nervig wäre. Durch die Ausrüstung des Roboters mit zwei IR-Sensoren und die Konstruktion des Tasters mit einer IR-LED weiß der Roboter, in welche Richtung er gehen muss, indem er der Intensität des IR-Lichts folgt. Wenn kein Knopf vorhanden ist, kann sich der Roboter umdrehen, bis eine der LEDs das Signal von einem der Knöpfe erfasst.

Die Butter wird in ein Fach auf der Oberseite des Roboters gelegt. Dieses Fach kann aus einer Box und einem betätigbaren Deckel zum Öffnen der Box bestehen. Um den Deckel zu öffnen und den Ultraschallsensor zu bewegen, um die Hindernisse zu scannen und zu erkennen, benötigen wir zwei Motoren. Zu diesem Zweck sind nicht kontinuierliche Servomotoren besser geeignet, da die Motoren an eine bestimmte Position gehen und diese Position beibehalten müssen.

Ein zusätzliches Merkmal des Projekts war die Interaktion mit der externen Umgebung mit einer Roboterstimme. Ein Summer ist einfach und für diesen Zweck geeignet, kann jedoch nicht jederzeit verwendet werden, da die Stromaufnahme hoch ist.

Die Hauptschwierigkeiten des Projekts liegen in der Codierung, da der mechanische Teil ziemlich einfach ist. Viele Fälle müssen berücksichtigt werden, um zu vermeiden, dass der Roboter stecken bleibt oder etwas Unerwünschtes tut. Die Hauptprobleme, die wir lösen müssen, sind der Verlust des IR-Signals aufgrund eines Hindernisses und das Stoppen, wenn es am Knopf ankommt!

Schritt 2: Materialien

Mechanische Teile

  • 3D-Drucker und Laserschneidmaschine

    • PLA wird für den 3D-Druck verwendet, aber Sie können auch ABS verwenden
    • Eine Platte aus 3 mm Birkensperrholz wird zum Laserschneiden verwendet, da es die Möglichkeit bietet, später leicht Änderungen vorzunehmen, Plexiglas kann auch verwendet werden, aber es ist schwieriger, es nach dem Laserschneiden zu ändern, ohne es zu zerstören
  • Schrauben, Muttern, Unterlegscheiben

    Die meisten Komponenten werden mit M3-Halbrundschrauben, Unterlegscheiben und Muttern zusammengehalten, einige erfordern jedoch einen M2- oder M4-Schraubensatz. Die Länge der Bolzen liegt im Bereich von 8-12 mm

  • PCB-Abstandshalter, 25 mm und 15 mm
  • 2 Servomotoren mit kompatiblen Rädern
  • Etwas dicker Metalldraht mit einem Durchmesser von ca. 1-2 mm

Elektronische Teile

  • Mikrocontroller

    1 Arduino UNO-Board

  • Servomotor

    • 2 große Servomotoren: Feetech kontinuierlich 6 kg 360 Grad
    • 2 Mikro-Servomotoren: Feetech FS90
  • Sensoren

    • 1 Ultraschallsensor
    • 2 IR-Näherungssensoren
    • 2 IR-Fotodioden
  • Batterien

    • 1 9V Batteriehalter + Batterie
    • 1 4AA Batteriehalter + Batterien
    • 1 9V Batteriekasten + Batterie
  • Zusätzliche Komponenten

    • Einige springende Drähte, Drähte und Lötplatten
    • Einige Widerstände
    • 1 IR-LED
    • 3 Schalter
    • 1 Summer
    • 1 Taste
    • 1 Arduino zu 9V Batterieanschluss

Schritt 3: Testen der Elektronik

Testen der Elektronik
Testen der Elektronik
Testen der Elektronik
Testen der Elektronik

Erstellung des Buttons:

Der Taster besteht einfach aus einem Schalter, einer Infrarot-LED und einem 220-Ohm-Widerstand in Reihe, der von einer 9-V-Batterie gespeist wird. Dies ist in einem 9-V-Akkupack für ein kompaktes und sauberes Design untergebracht.

Erstellung der Infrarot-Empfängermodule:

Diese Module werden mit Durchsteck-Lötplatten hergestellt, die später mit Schrauben am Roboter befestigt werden. Die Schaltungen für diese Module sind in den allgemeinen Schaltplänen dargestellt. Das Prinzip besteht darin, die Intensität des Infrarotlichts zu messen. Um die Messungen zu verbessern, können Kollimatoren (aus Schrumpfschläuchen) verwendet werden, um auf eine bestimmte interessierende Richtung zu fokussieren.

Unterschiedliche Anforderungen des Projekts müssen mit elektronischen Geräten erfüllt werden. Die Anzahl der Geräte sollte begrenzt werden, um die Komplexität relativ gering zu halten. Dieser Schritt enthält die Schaltpläne und jeden Code, um alle Teile separat zu testen:

  • Kontinuierliche Servomotoren;
  • Ultraschallsensor;
  • Nicht kontinuierliche Servomotoren;
  • Summer;
  • Richtungserkennung der IR-Taste;
  • Kantenerkennung durch Näherungssensoren;

Diese Codes können am Anfang helfen, die Komponenten zu verstehen, sind aber auch für das Debugging in späteren Phasen sehr nützlich. Wenn ein bestimmtes Problem auftritt, kann der Fehler leichter erkannt werden, indem alle Komponenten separat getestet werden.

Schritt 4: 3D-gedruckte und lasergeschnittene Teile-Design

Design von 3D-gedruckten und lasergeschnittenen Teilen
Design von 3D-gedruckten und lasergeschnittenen Teilen
Design von 3D-gedruckten und lasergeschnittenen Teilen
Design von 3D-gedruckten und lasergeschnittenen Teilen
Design von 3D-gedruckten und lasergeschnittenen Teilen
Design von 3D-gedruckten und lasergeschnittenen Teilen

Lasergeschnittene Teile

Die Baugruppe besteht aus drei horizontalen Hauptplatten, die durch PCB-Abstandshalter zusammengehalten werden, um ein offenes Design zu erhalten, das bei Bedarf einen einfachen Zugang zur Elektronik bietet.

In diese Platten müssen die notwendigen Löcher geschnitten werden, um die Abstandshalter und andere Komponenten für die Endmontage zu verschrauben. Hauptsächlich haben alle drei Platten Löcher an der gleichen Stelle für die Abstandshalter und spezielle Löcher für die Elektronik, die jeweils auf jeder Platte befestigt sind. Beachten Sie, dass die Mittelplatte in der Mitte ein Loch zum Durchführen von Drähten hat.

Kleinere Stücke werden auf die Abmessungen des großen Servos zugeschnitten, um sie an der Baugruppe zu befestigen.

3D gedruckte Stücke

Zusätzlich zum Laserschneiden müssen einige Teile 3D-gedruckt werden:

  • Die Halterung für den Ultraschallsensor, der ihn mit einem Mikro-Servomotorarm verbindet
  • Die Halterung für das Laufrad und die beiden IR-Kantensensoren. Das besondere Design der kastenförmigen Enden des Teils für die IR-Sensoren dient als Bildschirm, um Interferenzen zwischen der Taste, die das IR-Signal aussendet, und den IR-Sensoren zu vermeiden, die sich nur auf das Geschehen am Boden konzentrieren müssen
  • Die Unterstützung für den Mikro-Servomotor beim Öffnen des Deckels
  • Und schließlich der Deckel selbst, der aus zwei Teilen besteht, um einen größeren Betätigungswinkel zu haben, indem eine Kollision mit dem Mikro-Servomotor vermieden wird, der den Deckel öffnet:

    • Die untere, die an der oberen Platte befestigt wird
    • Und die Oberseite, die durch ein Scharnier mit der Unterseite verbunden ist und vom Servo mit einem dicken Metalldraht betätigt wird. Wir haben uns entschieden, dem Roboter ein wenig Persönlichkeit zu verleihen, indem wir ihm einen Kopf geben.

Sobald alle Teile entworfen und die Dateien im richtigen Format für die verwendeten Maschinen exportiert wurden, können die Teile tatsächlich hergestellt werden. Beachten Sie, dass der 3D-Druck viel Zeit in Anspruch nimmt, insbesondere bei den Abmessungen des Deckeloberteils. Es kann ein oder zwei Tage dauern, um alle Teile zu drucken. Das Laserschneiden ist jedoch nur eine Frage von Minuten.

Alle SOLIDWORKS-Dateien befinden sich im gezippten Ordner.

Schritt 5: Montage und Verdrahtung

Image
Image
Montage und Verdrahtung
Montage und Verdrahtung
Montage und Verdrahtung
Montage und Verdrahtung
Montage und Verdrahtung
Montage und Verdrahtung

Die Montage wird eine Mischung aus Verdrahtung und Verschrauben der Komponenten sein, von unten nach oben beginnend.

Bodenplatte

Die Bodenplatte wird mit dem 4AA-Batteriepack, den Servomotoren, dem gedruckten Teil (Befestigung der Kugelrolle unter der Platte), den beiden Kantensensoren und 6 männlich-weiblichen Abstandshaltern zusammengebaut.

Mittelplatte

Als nächstes kann die mittlere Platte montiert werden, wobei die Servomotoren zwischen den beiden Platten komprimiert werden. Diese Platte kann dann fixiert werden, indem ein weiterer Satz Abstandshalter darauf gelegt wird. Einige Kabel können durch das mittlere Loch geführt werden.

Das Ultraschallmodul kann an einem nicht-kontinuierlichen Servo befestigt werden, das mit dem Arduino, dem 9V-Akku (der das Arduino versorgt) und den beiden Infrarot-Empfängermodulen an der Vorderseite des Roboters auf der Mittelplatte befestigt ist. Diese Module werden mit Durchgangsloch-Lötplatten hergestellt und mit Schrauben an der Platte befestigt. Die Schaltungen für diese Module sind in den allgemeinen Schaltplänen dargestellt.

Deckplatte

In diesem Teil der Montage sind die Schalter nicht befestigt, aber der Roboter kann bereits alles tun, außer Aktionen, die den Deckel erfordern Zugang zu den Häfen des Arduino.

Ist dies alles erreicht, kann die Kopfplatte mit Distanzstücken fixiert werden. Die letzten Komponenten, die die beiden Schalter, der Taster, das Servo, der Summer und das Deckelsystem sind, können schließlich an der oberen Platte befestigt werden, um die Montage abzuschließen.

Das letzte, was getestet und korrigiert werden muss, ist der Winkel des Servos, um den Deckel richtig zu öffnen.

Die Schwelle der Kantensensoren muss mit dem mitgelieferten Potentiometer (mit einem flachen Schraubendreher) für unterschiedliche Tischoberflächen angepasst werden. Ein weißer Tisch sollte einen niedrigeren Schwellenwert haben als beispielsweise ein brauner Tisch. Auch die Höhe der Sensoren beeinflusst den benötigten Schwellenwert.

Am Ende dieses Schrittes ist die Baugruppe fertig und das letzte verbleibende Teil sind die fehlenden Codes.

Schritt 6: Codierung: Alles zusammenfügen

Der gesamte erforderliche Code, damit der Roboter funktioniert, befindet sich in der ZIP-Datei, die heruntergeladen werden kann. Der wichtigste ist der "Haupt"-Code, der das Setup und die Funktionsschleife des Roboters enthält. Die meisten anderen Funktionen werden in Unterdateien geschrieben (auch in den gezippten Ordner). Diese Unterdateien sollten im selben Ordner (der als "main" bezeichnet wird) wie das Hauptskript gespeichert werden, bevor es auf den Arduino hochgeladen wird

Zunächst wird die allgemeine Geschwindigkeit des Roboters zusammen mit der Variablen „erinnern“definiert. Diese "Erinnerung" ist ein Wert, der sich daran erinnert, in welche Richtung sich der Roboter drehte. Bei "erinnern = 1" drehte der Roboter nach links, bei "erinnern = 2" drehte der Roboter nach rechts.

int-Geschwindigkeit = 9; // Allgemeine Geschwindigkeit des Roboters

int erinnern = 1; // Anfangsrichtung

Beim Setup des Roboters werden die verschiedenen Unterdateien des Programms initialisiert. In diese Unterdateien sind die Grundfunktionen zur Ansteuerung der Motoren, Sensoren, … geschrieben. Durch die Initialisierung im Setup können die in jeder dieser Dateien beschriebenen Funktionen in der Hauptschleife verwendet werden. Durch Aktivieren der Funktion r2D2() macht der Roboter ein Geräusch wie der R2D2-Roboter aus dem Star Wars-Film-Franchise, wenn es startet. Hier ist die Funktion r2D2() deaktiviert, um zu verhindern, dass der Summer zu viel Strom zieht.

//Setup @ Reset //----------------

Void setup () { initialize_IR_sensors (); initialize_obstacles_and_edges(); initialize_movement(); initialize_lid(); initialize_buzzer(); // r2D2(); int erinnern = 1; // Anfangsrichtung Starter (erinnern); }

Die Funktion Starter(erinnern) wird zuerst im Setup aufgerufen. Diese Funktion lässt den Roboter sich umdrehen und nach dem IR-Signal einer der Tasten suchen. Sobald es die Schaltfläche gefunden hat, beendet das Programm die Starter-Funktion, indem es die Variable 'cond' auf false ändert. Während der Rotation des Roboters muss er seine Umgebung kennen: Er muss Kanten und Hindernisse erkennen. Dies wird jedes Mal überprüft, bevor er sich weiterdreht. Sobald der Roboter ein Hindernis oder eine Kante erkennt, wird das Protokoll zum Umgehen dieser Hindernisse oder Kanten ausgeführt. Diese Protokolle werden später in diesem Schritt erklärt. Die Starter-Funktion hat eine Variable, die die zuvor besprochene Erinnerungsvariable ist. Durch die Übergabe des Erinnerungswerts an die Starter-Funktion weiß der Roboter, in welche Richtung er sich drehen muss, um nach dem Knopf zu suchen.

//Starter Loop: Dreh dich um und suche nach dem Button //------------------------------------ ----------------

Void Starter (int erinnern) { if (isedgeleft () || isedgeright ()) { // Erkenne die Kanten edgeDetected (remind); aufrechtzuerhalten. Else { bool cond = true; while (cond == true) { if (buttonleft() == false && buttonright() == false && isButtonDetected() == true) { cond = false; aufrechtzuerhalten. Else { if (erinnern == 1) {// Wir bogen nach links ab if (isobstacleleft ()) { stopspeed (); vermeiden_hindernis(erinnern); } else if (isedgeleft() || isedgeright()) {// Erkenne die Kanten edgeDetected(remind); aufrechtzuerhalten. Sonst { links abbiegen (Geschwindigkeit); }} else if (erinnern == 2) { if (isobstacleright ()) { stopspeed (); Avoid_obstacle (erinnern); } else if (isedgeleft() || isedgeright()) {// Erkenne die Kanten edgeDetected(remind); aufrechtzuerhalten. Sonst { rechts abbiegen (Geschwindigkeit); } } } } } }

Wenn der Roboter den Knopf findet, wird die erste Starterschleife verlassen und die Hauptfunktionsschleife des Roboters beginnt. Diese Hauptschleife ist ziemlich komplex, da der Roboter jedes Mal erkennen muss, ob sich ein Hindernis oder eine Kante davor befindet oder nicht. Die Hauptidee ist, dass der Roboter dem Knopf folgt, indem er ihn jedes Mal findet und verliert. Durch die Verwendung von zwei IR-Sensoren können wir drei Situationen unterscheiden:

  • der Unterschied zwischen dem vom linken und rechten Sensor erkannten IR-Licht ist größer als ein bestimmter Schwellenwert, und es gibt eine Taste.
  • der Unterschied im IR-Licht ist kleiner als der Schwellenwert, und vor dem Roboter befindet sich ein Knopf.
  • der Unterschied im IR-Licht ist kleiner als der Schwellenwert und es gibt KEINE Taste vor dem Roboter.

Die Track-Routine funktioniert wie folgt: Wenn der Knopf erkannt wird, bewegt sich der Roboter auf den Knopf zu, indem er sich in die gleiche Richtung dreht, in die er gedreht hat (unter Verwendung der Erinnerungsvariable) und gleichzeitig ein wenig vorwärts. Wenn der Roboter zu weit dreht, geht der Knopf wieder verloren und der Roboter erinnert sich an dieser Stelle, dass er sich in die andere Richtung drehen muss. Dies geschieht auch, während Sie sich ein wenig vorwärts bewegen. Dabei dreht der Roboter ständig nach links und rechts, bewegt sich aber in der Zwischenzeit immer noch in Richtung des Knopfes. Jedes Mal, wenn der Roboter den Knopf findet, dreht er sich einfach weiter, bis er ihn verloren hat. In diesem Fall beginnt er sich in die andere Richtung zu bewegen. Beachten Sie den Unterschied in den Funktionen, die in der Starterschleife und der Hauptschleife verwendet werden: Die Starterschleife verwendet "turnleft()" oder "turnright()", während die Hauptschleife "moveleft()" und "moveright()" verwendet. Mit den Moveleft/right-Funktionen dreht sich der Roboter nicht nur, sondern bewegt ihn gleichzeitig vorwärts.

/* Funktionsschleife -------------------------- Hier gibt es nur die Trackroutine */

int verloren = 0; // Bei verloren = 0 wird die Schaltfläche gefunden, bei verloren = 1 geht die Schaltfläche verloren void loop() { if (isedgeleft() || isedgeright()) {

if (!isobstacle()) {

vorwärts bewegen (Geschwindigkeit); Verzögerung(5); } Else { Avoid_obstacle (erinnern); aufrechtzuerhalten. Else {if (erinnern == 1 && verloren == 1) {// Wir bogen nach links stopspeed (); if (!isobstacleright()) { moveright (Geschwindigkeit); // Umdrehen, um die Schaltfläche zu finden } else { Avoid_obstacle(remind); } erinnern = 2; aufrechtzuerhalten. Sonst wenn (erinnern == 2 && verloren == 1) { stopspeed (); if (!isobstacleleft ()) { moveleft (Geschwindigkeit); //Wir bogen rechts ab} else { Avoid_obstacle(remind); } erinnern = 1; } sonst if (verloren == 0) { if (erinnern == 1) { // Wir bogen nach links ab if (!isobstacleleft ()) { moveleft (speed); // Wir bogen rechts ab} else { stopspeed (); Avoid_obstacle (erinnern); } //} else if (erinnern == 2) { if (!isobstacleright ()) { moveright (speed); // Drehen Sie sich um, um die Schaltfläche zu finden} else { stopspeed(); Avoid_obstacle (erinnern); } } } Verzögerung(10); verloren = 0; } } //} }

Nun eine kleine Erklärung der beiden komplexesten Routinen:

Kanten vermeiden

Das Protokoll zur Vermeidung von Kanten wird in einer Funktion namens "edgeDetection()" definiert, die in die Unterdatei "movement" geschrieben wird. Dieses Protokoll beruht darauf, dass der Roboter erst dann auf eine Kante stoßen soll, wenn er sein Ziel erreicht hat: den Knopf. Sobald der Roboter eine Kante erkennt, bewegt er sich zunächst ein wenig zurück, um einen sicheren Abstand von der Kante zu haben. Danach wartet der Roboter 2 Sekunden. Wenn jemand in diesen zwei Sekunden den Knopf an der Vorderseite des Roboters drückt, weiß der Roboter, dass er die Person erreicht hat, die die Butter haben möchte, öffnet das Butterfach und präsentiert die Butter. An diesem Punkt kann jemand Butter vom Roboter nehmen. Nach ein paar Sekunden hat der Roboter das Warten satt und schließt einfach den Butterdeckel. Sobald der Deckel geschlossen ist, führt der Roboter die Starterschleife aus, um nach einem anderen Knopf zu suchen. Wenn der Roboter vor Erreichen seines Ziels auf eine Kante stößt und der Knopf an der Vorderseite des Roboters nicht gedrückt wird, öffnet der Roboter den Butterdeckel nicht und führt sofort die Starterschleife aus.

Vermeiden Sie Hindernisse

Die Funktion Avoid_obstacle() befindet sich auch in der Unterdatei "movement". Das Schwierige daran, Hindernissen auszuweichen, ist die Tatsache, dass der Roboter einen ziemlich großen toten Winkel hat. Der Ultraschallsensor ist an der Vorderseite des Roboters platziert, wodurch er Hindernisse erkennen kann, aber nicht weiß, wann er daran vorbeikommt. Um dies zu lösen, wird folgendes Prinzip verwendet: Trifft der Roboter auf ein Hindernis, wendet er die Reming-Variable in die andere Richtung. Auf diese Weise vermeidet der Roboter, das Hindernis zu treffen. Der Roboter dreht sich weiter, bis der Ultraschallsensor das Hindernis nicht mehr erkennt. Während sich der Roboter dreht, wird ein Zähler erhöht, bis das Hindernis nicht mehr erkannt wird. Dieser Zähler gibt dann eine Annäherung an die Länge des Hindernisses. Durch anschließendes Vorwärtsbewegen und gleichzeitiges Verringern des Zählers kann das Hindernis umgangen werden. Sobald der Zähler 0 erreicht, kann die Starter-Funktion erneut verwendet werden, um die Taste zu verschieben. Natürlich führt der Roboter die Starter-Funktion durch, indem er sich in die Richtung dreht, in die er sich erinnert hat, bevor er auf das Hindernis gestoßen ist (wiederum mit der Erinnerungsvariable).

Nachdem Sie den Code nun vollständig verstanden haben, können Sie ihn verwenden!

Passen Sie die Schwellenwerte unbedingt an Ihre Umgebung an (die IR-Reflexion ist beispielsweise bei weißen Tischen höher) und passen Sie die verschiedenen Parameter an Ihre Bedürfnisse an. Auch der Stromversorgung der verschiedenen Module sollte große Aufmerksamkeit geschenkt werden. Es ist wichtig, dass die Servomotoren nicht über den Arduino 5V-Port mit Strom versorgt werden, da sie viel Strom aufnehmen (dies könnte den Mikrocontroller beschädigen). Wenn für die Sensoren dieselbe Stromquelle wie für die Servos verwendet wird, können einige Messprobleme auftreten.

Empfohlen: