Das hier wird ein relativ langes Projekt, das mir schon seit einiger Zeit im Kopf rumschwirrt, ich aber noch nie die Zeit dafür gefunden habe. Eigentlich hab ich die Zeit jetzt auch nicht um das am Stück durchzudrücken, das würde locker zwei Froetzmonate dauern, dank meiner bescheidenen Programmierkenntnisse und meines eingeschränkten CAD-Talents. Aber ich will dabei ja auch was lernen und gerade ersteren der beiden Punkte hiermit verbessern. Wenn dabei dann noch was nützliches rauskommt, umso besser.
Meine Lernziele sind:
– Bluetooth mit Arduino
– Kommunikation zwischen Android und dem Bluetoothmodul
– Auslösen von Aktionen im Arduino über Bluetooth
– Gegenstands- und Hinderniserkennung mit Ultraschall-Abstandsensoren
– Autonomes Fahren im begrenzten Umfeld
– Funktion und Aufbau einer Induktionsschleife
– Rasen und sein Wachstumsverhalten
– Wetterfester Gehäusebau für Outdoorgeräte
Puh – ganz schön viel und noch lange nicht alles…
Auf dem Bild seht ihr einen ersten Testaufbau. Wie man unschwer erkennen kann, soll das Teil am Ende mal fahren können. Dazu verwende ich einen Arduino UNO Klon, der je nach endgültigem Umfang noch durch einen Arduino Mega ersetzt wird. Für den Anfang tuts aber der UNO. Auf dem Arduino steckt ein Bluetooth-Modul um über diesen Funkweg eine serielle Schnittstelle zu schaffen. Das Teil soll also am Ende noch ferngesteuert sein? Ja, genau.
Im folgenden Video hab ich ein Testprogramm für die Schrittmotoren geschrieben, das im Prinzip nichts anderes macht als „Wenn Knopf, dann bissl vor fahren“. Leider sind die Motoren nicht stark genug um den Prototyp zu bewegen. Ich werde mir stärkere Motoren suchen oder mit Zahnriemen die ich noch hier habe eine „Übersetzung“ bauen, dann hätte ich mehr Drehmoment an den Rädern, aber die Motoren müssten schneller drehen.
Als nächstes werde ich mir ein paar Unterprogramme (vorwärts, rückwärts, links, rechts, 180°Drehung auf der Stelle, usw…) schreiben und versuche die dann per Bluetooth zu aktivieren.
Wie gesagt, das ganze steht noch völlig am Anfang und ich weiss auch noch nicht, ob ich dieses Jahr fertig werde, da ich immer wieder mal zwischendurch daran weitermache. Den Projekttitel passe ich an, sobald es etwas konkreter wird.
20161030
Ich habe mal wieder etwas weiter an meinem RMR-Prototyp gearbeitet. Da die Schrittmotoren sich als zu schwach erwiesen haben um das Teil später mal über den holprigen Rasen zu bewegen, hab ich mir für den Prototyp Getriebemotoren geholt, die ordentlich Drehmoment aufbauen. Sie drehen zwar nur mit ca. 30 Umdrehungen pro Minute, aber das reicht fürs erste. Die Räder vom alten Versuch mit den Schrittmotoren hab ich teilweise wieder verwenden können. Die Aufnahme auf die Welle der Motoren musste ich aber durch eine neue Konstruktion ersetzen. Um ein rudimentäres autonomes Fahren zu testen hab ich zwei Ultraschall-Abstandssensoren auf die Versuchsplatine gesteckt und kann somit nach vorne den Abstand zum nächsten Objekt messen. Das ist erstaunlich genau und von 1cm-5m nutzbar.
Kleiner Exkurs zum Ultraschallsensor und wie man damit Entfernungen misst:
Der Sensor hat vier Anschlüsse, Versorgungsspannung (+), Masse (-), Trigger und Echo. Versorgung und Masse sind klar, was machen aber die anderen beiden Anschlüsse? Über den Triggereingang gibt man – in meinem Fall – mit dem Arduino ein HIGH-Signal von bspw. 10ms. Der Sensor gibt während der Trigger HIGH ist einen Ultraschallton aus. Sobald der Ton irgendwo von einem Hindernis zum Ultraschallsensor reflektiert wird, gibt dieser ein HIGH-Signal am Echo-Pin aus. Nach dem Abschalten des Triggersignals muss man also nur noch die Zeit messen, bis der Echopin wieder LOW ist. Jetzt hat man eine Zeit in Mikro- oder wenigen Millisekunden, die der Laufzeit des Schalls entspricht. Schall schafft unter normalen Bedingungen in der Luft, wie man weiß, einen cm innerhalb von 29,1µs. Wenn die gemessene Zeit jetzt 4000µs entspricht muss man nur noch die Zeit durch 29,1 teilen und man hat die cm. In diesem Fall ca. 137cm.
Na, habt ihr es gemerkt? der Schall legt 137cm zurück, allerdings vom Ultraschallsensor zum Hindernis und wieder zurück – also muss man den Wert noch durch 2 teilen. Der korrekte Abstand beträgt also 68,5cm.
Für Das Video habe ich die Sensoren nach vorne ausgerichtet und vorher die Programme für Vorwärts, Rückwärts, Links und Rechts geschrieben. Das Programm macht nichts anderes als den Abstand beider US-Sensoren auszulesen und abhängig davon entsprechende Aktionen zu starten. Wenn einer der Sensoren unter 10cm signalisiert (ODER-Verknüpfung) fährt der Prototyp rückwärts und im umgekehrten Fall, wenn beide Sensoren über 40cm (UND-Verknüpfung) freie Bahn melden fährt er vorwärts.
Es kommen irgendwann noch Stoßsensoren vorne und hinten dran und evtl. noch ein drehbarer US-Sensor oben in die Mitte um ein „fast-Rundumblick“ zu erhalten und daraus ein 2D-Array der Umgebung zu erstellen und daraus die Fahraktionen abzuleiten.
Mit den Ein- und Ausgängen wird es mit dem normalen Arduino Uno langsam knapp. Es gäbe die Möglichkeit mit Schieberegistern oder I²C-Bus die I/Os zu erweitern, aber der Arduino Mega liegt schon seit ner Weile in meiner Teileschublade. Vom Speicher her müsste der normale Arduino bei meinen bescheidenen Programmierkünsten reichen, aber das Mehr, das der Mega mitbringt schadet sicher nicht.
Hier mal das Video:
20161030
Grau ist alle Theorie – nach zwei Wochen mehr oder weniger Kopfzerbrechen über die Verschiedenen Fahrmodi, die ich im Kommentarbereich meines Programms ablege,
Fahrsituationen:
// ---------------------------------------------------------------------------------
// | | | |
// | FL | FF | FR |
// | gap_r - gap_l > 20cm | gap_l & gp_r < 10cm | gap_r - gap_l > 20cm |
// | forward_right(); | bumper_f | forward_left(); |
// | gap_r - gap_l > 10cm | - backward(); | gap_r - gap_l > 10cm |
// | right(); | - randomturn(); | left(); |
// | | | |
// ---------------------------------------------------------------------------------
// | | | |
// | LL | .-^-. | RR |
// | | |RMR| | |
// | ???? | 0|###|0 | ???? |
// | | """"" | |
// | | | |
// | | | |
// ---------------------------------------------------------------------------------
// | | | |
// | | bumper_r | |
// | | forward(); | |
// | | | |
// | BL | BB | BR |
// | | | |
// | | | |
// ---------------------------------------------------------------------------------
Hier mal ein Video der ersten autonomen Probefahrt:
Wie schon geschrieben, die Fahrbefehle sind noch sehr unausgereift, die Geschwindigkeiten der Parameter für die Drehbewegungen, der Ablauf nach dem Erkennen eines Hindernisses waren vorher nur in meinem Kopf und noch nicht irgendwo simuliert oder getestet. Wenn ich hier n Garten finde, in dem so ein richtiger Mähroboter „arbeitet“, werde ich den mal beobachten und vielleicht mal den ein oder anderen Stein in den Weg werfen
um zu sehen was der dann macht.
Hab das nicht weiter verfolgt, da ich einen normalen Rasenmähroboter sehr günstig gekauft habe und somit für den Eigenbau gerade kein Bedarf mehr ist. Aber das gelernte kann man sicher anderswo einsetzen.