Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektewise20:pflanzenhaustierpublic:start

Pflanzenhaustier Dokumentation

Abschnitt 1: Themenbeschreibung

Unsere Vorstellung war es, einen Roboter zu bauen, der auf Kommando mit einer Topfpflanze zu der hellsten Stelle im Raum fährt. Zusätzlich wollten wir zwei weitere Features einbauen. Zum Einen eine Feuchtigkeitserkennung, wo bei zu geringer Feuchtigkeit ein Geräusch inform von Bellen aus einem Lautsprecher herauskommt. Desweiteren haben wir ein Programm geschrieben, welches dem Roboter nach einem Klatschen zur Startposition zurückführen soll.

Abschnitt 2: Methoden und Umsetzung

Überblick über das Gesamtsystem

Unser Pflanzenhaustierroboter besteht aus zwei Systemen:

  • Fortbewegungssystem: Das Fortbewegungssytem besteht aus den Schrittmotoren, Ultraschallsensoren und den Phototransistoren. Diese arbeiten zusammen um den Blumentopf sicher zur hellsten Stelle zu bewegen. Die Ultraschallsensoren sorgen für Hinderniserkennung. Die Phototransistoren finden das Licht. Und die Schrittmotoren ermöglichen die Lenkung und Fortbewegung des Blumentopfes.
  • Kommunikatonssystem: Das Kommunikationssystem ermöglicht dem Roboter Signale zu geben und zu emfangen. Es besteht aus Feuchtigkeitssensor, Mikrofon und Lautsprecher. Der Feuchtigkeitssensor misst die Erde im Blumentopf und wenn diese zu trocken ist gibt der Lautsprecher ein Bellen von sich. Das Mikrofon lässt den Roboter ein Klatschen erkennen. Das Klatschen bedeutet für den Roboter, er soll sich zurück zum Startpunkt bewegen.

Abbildung 0: Übersicht über die Bestandteile des Pflanzenhaustierroboters

Aufgaben die gelöst wurden:

  • Hellste Stelle finden
  • Zurück zum Startpunkt bewegen
  • Hindernisse erkennen
  • Trockene Erde erkennen
  • Bellen vom lautsprecher abspielen
  • Roboter lenken und bewegen

Aufgaben die nicht gelöst wurden:

  • Zum genauen Startpunkt gehen, wegen praktischen ungenauigkeiten
  • Klatschen erkennen
  • Alle Funktionen integrieren

Einzelne Systembestandteile

Phototransistoren

Zwei Phototransistoren, die durch eine lichtundurchlässige Wand getrennt sind ermöglicht einem die Richtung der Hellstenstelle zu finden. Wenn der einer der Phototransistoren einen höheren Wert angibt als der Andere, dann ist die hellere Stelle in der Richtung von diesem Phototransistor.

Abbildung 1: Phototransistorengehäuse aus holz. Die Phototransistoren sind von einer lichtundurchlässige Wand getrennt.

Ultraschallsensor

Ein Ultraschallsensor der auf den Boden gerichtet ist und vorne am Roboter montiert ist, lässt den Roboter nicht über den Tischrand fahren, weil wenn der Sensor eine Distanz angibt, die größer als der normale Abstand zum Boden ist (5 cm), dann fährt der Roboter nicht mehr vorwärts.

Der zweite Ultraschallsensor der auch vorne montiert ist zeigt nach vorne, um mögliche Wände und andere Hindernisse zu erkennen, weil wenn der Roboter eine Distanz von weniger als 5 cm angibt, dann fährt er nicht mehr vorwärts.

Abbildung 2: Ultraschallsensoren am fertigen Roboter

Feuchtigkeitssensor

Der Feuchtigkeitssensor misst die Feuchtigkeit der Pflanzenerde, um dann durch den Lautsprecher ein Signal an uns zu gebe, falls die Erde bewässert werden soll. Wir haben uns durch Experimentation für ein Wert von 512 entschieden (Feuchtigkeitssensor ist an einem Analog-Pin angeschlossen um einen genaueren Messwert zu haben), aber dem die Erde als 'feucht' gilt.

Abbildung 3: Feuchtigkeitssensor im Pflanzentopf.

Steuerung der Schrittmotoren (Fortbewegung und Drehung)

Für die Bewegung des Roboters haben wir Schrittmotoren benutzt weil sie sehr genau gesteuert werden können und weil das Robotiklabor schon mehrere davon hatte. Unsere Schrittmotoren hatten jeweils 4 Anschlüsse (2 für den Strom, 2 für die Steuerung). Mit dem einen Steuerungsanschluss kann man die Richtung des Motors kontrollieren, mit dem anderen kann man den „Schritt” des Motors kontrollieren. Schrittmotoren drehen nicht kontinuierlich, sondern in kleine Schritte (bei unsere Motoren war ein Schritt 1,8˚). Wenn man die Spannung an dem Schritt-Anschluss ändert dreht der Motor um ein Schritt.

Um die Drehung des Roboters genau kontrollieren zu können mussten wir wissen, wie weit der Roboter (bzw. Das Rad) sich pro Schritt fortbewegt. Unsere Räder und unser Roboter hatten jeweils Durchmesser von 9 cm und 24 cm. Damit haben wir berechnet, dass ein Schritt für 1,41 mm Fortbewegung sorgt, oder für 0,673˚ Drehung (wenn die Räder nicht in derselben Richtung drehen). Die Rechnungen dafür sind unten schriftlich und in visueller Form zu sehen.

Abbildung 4: Berechnung der gefahrenen Strecke pro Schritt und Drehung pro Schritt

Kommunikation mit dem Nutzer (Bellen)

Um dem Nutzen kommunizieren zu können, dass die Pflanze Wasser braucht, soll der Roboter bellen. Am Anfang wollten wir die Audio-Datei als „Array” im Arduino-Speicher speichern, aber das haben wir nicht geschafft, also haben wir entschieden, die Datei auf ein SD-Karten-Modul zu speichern. Dafür muss die SD-Karte als FAT16 formatiert werden und die Audio-Datei als unsigned 8-bit WAV gespeichert werden. Da der Arduino ein sehr einfacher Mikroprozessor ist kann er nur sehr einfache Datei- und Speicherformate verstehen. Um die Datei von der SD-Karte abzuspielen werden die Libraries „TMRpcm” (Download-Link unten), „SD.h” und „SPI.h” benötigt.

Auf Signale vom Nutzer reagieren (Klatschen)

Nachdem der Roboter dem Nutzer kommuniziert hat, dass die Pflanze Wasser braucht, sollte der Nutzer den Roboter mit einem Klatschen zurück zum Startpunkt rufen können. Dafür muss der Roboter mit einem Mikrofon erkennen können, wenn die es im Zimmer lauter wird, also wenn die Lautstärke einen vorbestimmten Wert überschreitet. Bei dieser Aufgabe gab es zwei große Herausforderungen. Erstens war das Mikrofon nicht stark genug um einen Klatschen erkennen zu können (bzw. Von den Hintergrundsgeräuschen zu separieren). Um diese Problem zu lösen wollten wir uns ein besseres Mikrofon aussuchen, aber dieses war immer noch nicht stark genug um ein Klatschen zu erkennen, und wir konnten nur eine Reaktion kriegen, wenn wir direkt ins Mikro reingeblasen haben. Noch eine Herausforderung, mit der wir umgehen mussten war dass die Schrittmotoren, obwohl sie nicht so laut sind, viel näher ans Mikrofon sind als der Nutzer, was heißt dass das Mikro vom Roboter selbst triggert werden könnte. Dazu haben wir bisher keine Lösung gefunden.

Den Weg zurück zum Startpunkt finden

Als wir die Projektplanung geschrieben haben hatten wir schon ein grobes Bild davon, wie wir den Weg von einem beliebigen Punkt zurück (also wenn man den Roboter ein paar Minuten laufen lässt) zum Startpunkt finden könnten, nämlich indem wir die Bewegungen und Drehungen des Roboters irgendwie speichern würden und diese dann nutzen würden, um die Position des Roboters und den optimalen Rückweg zu berechnen.

Abbildung 5: Unsere Vorstellung des „Pathfinding” während der Projektplanung

Wir hatten uns auch vorgestellt, dass der Roboter einfach seine Bewegungen/seine Laufbahn umgekehrt wiederholen könnte, aber haben uns ziemlich schnell dagegen entschieden, da diese Lösung komplexer, zeitaufwändiger und weniger elegant als die andere war. Als wir uns das Problem weiter überlegten haben wir entschieden, ein Koordinatensystem relativ zur Startposition zu definieren und die X- und Y-Positionen und Drehung des Roboters bei jeder Bewegung aktuell zu halten. Eine wichtige Eigenschaft des gewählten Ansatz ist dass der Roboter mit separaten Bewegungen/Drehungen fortbewegt (d.h. Er dreht nicht während er fährt). Das wird getan damit der Roboter nur in geraden Linien fährt, was die Berechnung der X- und Y-Positionen, sowohl als auch der Drehung, vereinfacht.

Abbildung 6: gleichzeitige Fortbewegung und Drehung vs. abwechselnde Fortbewegung und Drehung

Aktualisierung der Position und Drehung Die X-Position, Y-Position und Drehung, die relativ zur Startposition (bzw. Drehung) definiert sind, werden jeweils in eine Variable gespeichert. Nach jeder Bewegung (Fortbewegung oder Drehung) sollte(n) die jeweilige(n) Variable(n) aktualisiert werden. Da bei jeder Drehung der Drehwinkel ein angegebener Parameter ist (siehe Abschnitt zu Steuerung der Schrittmotoren) muss dieser Winkel nicht berechnet werden. Wir definieren einfach am Anfang eine float Variable und addieren bei jeder Drehung den angegebenen Drehwinkel zu dieser Variable (Drehungen gegen dem Uhrzeigersinn sind positiv, Drehungen im Uhrzeigersinn sind negativ). Daraus entsteht nach mehreren Drehungen eine absolute Drehung relativ zur Startdrehung. Diese kann man dann nutzen um bei jeder Fortbewegung (Streckengröße wird als Parameter angegeben) die X- und Y-Komponente zu berechnen. Diese Berechnung findet im Code wie folgend statt:

  1. Der Modulo der Drehung wird berechnet (Drehungen mit einem Betrag größer als 360˚ werden durch ein Drehwinkel kleiner als 360˚ dargestellt).
  2. Negative Drehungen werden in positiver Form dargestellt (z. B. -125˚ wird als 235˚ dargestellt).
  3. Eine Fallunterscheidung für jeden Quadranten findet statt, wobei die Streckengröße, Drehung und Trigonometrie verwendet werden um die relative X- und Y-Bewegung zu berechnen. Wichtig zu beachten ist dass man bei rechtwinkligen Dreiecken nur ein Winkel (außer dem rechten Winkel) und eine Seitenlänge braucht, um die anderen Seitenlängen zu finden.

Abbildung 7: Berechnung der X- und Y-Komponenten bei jeder Fortbewegung. Wichtig zu beachten in dieser Abbildung ist dass der Nullpunkt nicht den Startpunkt repräsentiert, sondern der Punkt von dem der Roboter sich eben Fortbewegt hat (d. h. Die oben visuell dargestellte Berechnung der X- und Y-Komponenten wird bei jeder Fortbewegung ausgeführt.).

Weg zurück zum Startpunkt berechnen Der Roboter sollte auch von einem beliebigen Punkt den Weg zurück zum Startpunkt finden können. Dafür haben wir den gleichen Ansatz gewählt, nur umgekehrt:

  1. Der Modulo der Drehung wird berechnet und die Drehung wird in positiver Form dargestellt.
  2. Eine Fallunterscheidung für jeden Quadranten findet statt, wobei die X- und Y-Positionen verwendet werden, um mit dem Satz des Pythagoras die Entfernung zum Startpunkt zu berechnen. Die Position und Drehung des Roboters werden dann verwendet, um ihn auf dem Startpunkt zu richten.
  3. Wenn der Roboter auf den Startpunkt gerichtet ist fährt einfach die berechnete Strecke (Entfernung).

Abbildung 8: Berechnung der Entfernung zum Startpunkt und um wie viel der Roboter sich drehen muss um sich auf den Startpunkt zu richten

Technische Daten und Pläne

Bauteil Anzahl
Rad (d = 9 cm) 2
Bewegliches Stützrad 1
Schrittmotor & Treiber 2
Mikrofon 1
Arduino Nano 1
Akku 2
Breadboard 1
Phototransistor 2
Lautsprecher 1
Feuchtigkeitssensor 1
Entfernungssensor (Ultraschall) 2
SD Karte 1
SD-Karten Modul 1
Pflanzentopf 1
Holz, Schrauben 1
100Ω Widerstand 2
Bauteil Signalfunktion Pinnummer
Schrittmotortreiber Links Direction 6
Step 5
Schrittmotortreiber Rechts Direction 3
Step 2
Mikrofon Analog A7
Lautsprecher Digital 9
Phototransistor Links Analog A1
Phototransistor Rechts Analog A2
Feuchtigkeitssensor Analog A0
Ultraschall 1 Digital 7
Ultraschall 2 Digital 8

Schaltplan:

Abbildung 9: Schaltplan der gesamten Elektronik

Ergebnis

Insgesamt würden wir das Projekt als Teilweise erfolgreich bewerten. Wir hatten am Anfang einen soliden Plan, wonach wir auch die Bestandteile des Projekts (bzw. Die Funktionen des Roboters) unter uns aufgeteilt haben. Fast alle von diesen Funktionen haben auch am Ende funktioniert, aber wir hatten Schwierigkeiten bei der Zusammenfassung dieser Funktionen in ein Programm. Außerdem gab es bei ein paar von den Funktionen andere Probleme, wie zum Beispiel die Erkennung des Klatschen und die Genauigkeit der Geh- und Pathfinding (Weg zurück zum Startpunkt finden)-Funktionen. Bei diesem Projekt haben wir einiges geschafft, aber es bleibt definitiv noch die Möglichkeit für Verbesserung.

Vorschläge für Erweiterung/Verbesserung:

  • Der Roboter könnte durch einem anderen Signal zurück zum Startpunkt gerufen werden, wie zum Beispiel Infrarot. Der Roboter könnte auch zurück zum Startpunkt gehen ohne ein Signal zu bekommen.
  • Statt seine Drehung in einer Variable zu speichern und diese Variable bei jeder Drehung zu aktualisieren könnte der Roboter einfach ein Kompass benutzen.
  • Für die Bewegung zum Startpunkt könnte der Roboter einfach ein Signal folgen (wie z. B. Radio oder RFID) statt seine X- und Y-Positionen in Variablen zu speichern und diese aktuell zu halten. Dies könnte Ungenauigkeit bei der Bewegung zum Startpunkt reduzieren.

Fotos vom fertigen Roboter

Von oben Von vorne
Schaltung Schaltung von oben
Roboter von der Seite

Code und Libraries

Eine ZIP Datei mit dem Code und die verwendeten Libraries: https://tubcloud.tu-berlin.de/s/tKjqLKCE3E3XFCN

pflanzenhaustier_master.zip

projektewise20/pflanzenhaustierpublic/start.txt · Zuletzt geändert: 2021/12/22 15:58 von d.golovko