Inhaltsverzeichnis:

Ein 4WD-Roboter, der über ein Remote-USB-Gamepad gesteuert wird - Gunook
Ein 4WD-Roboter, der über ein Remote-USB-Gamepad gesteuert wird - Gunook

Video: Ein 4WD-Roboter, der über ein Remote-USB-Gamepad gesteuert wird - Gunook

Video: Ein 4WD-Roboter, der über ein Remote-USB-Gamepad gesteuert wird - Gunook
Video: Remote USB Gamepad Driven 4WD Robot Demo 1 For Instructable 2024, Juni
Anonim
Image
Image

Für mein nächstes Robotikprojekt war ich aufgrund unvorhergesehener Umstände gezwungen, meine eigene Roboterplattform zu entwerfen / zu entwerfen.

Das Ziel ist es, autonom zu sein, aber zuerst musste ich seine grundlegenden Fahrfähigkeiten testen, also dachte ich, es wäre ein lustiges Nebenprojekt, sich so zu verhalten und zu steuern, als wäre es ein RC-Fahrzeug (funkgesteuert), sondern verwenden Sie stattdessen ein USB-Gamepad.

Die Ergebnisse waren ungefähr so gut oder besser, als ich erwartet hatte.

Der Vorteil der USB-Gamepad-Route mit viel Programmierung besteht darin, dass ich sie anpassen und zu dem hinzufügen kann, was ich bereits getan habe. Ich habe keine wirkliche Erfahrung mit dem Bau eines RC-Fahrzeugs, aber ich stelle mir vor, dass man mit dem, was der RC-Sender (Joysticks / Tasten usw.) und der RC-Empfänger haben, ziemlich feststeckt.

Zum Beispiel habe ich eine Erkennung hinzugefügt, dass der Roboter gegen eine Wand gefahren ist, nur indem die Software hohe Ströme und niedrige Encoder-Geschwindigkeitswerte erkennt.

Optional kann man dem Roboter einige USB-Webcams hinzufügen, je nach Anzahl und Platzierung kann man den Roboter durch den Wohnbereich und in einen anderen Raum fahren, während man woanders vor dem Computer sitzt, an dem das USB-Gamepad angeschlossen ist es.

Dieses Instructable wird keine echte, detaillierte, all-inclusive, Schritt-für-Schritt-Anleitung sein, aber ich werde versuchen, so viele Details wie möglich zu geben.

Lieferungen

Vorgeschlagene Teile: Das meiste davon habe ich von Servo City (Actobotics) erhalten.

2 - 13,5 U-Kanäle, für die Seiten des Grundrahmens. Darauf werden die Motoren montiert. Ich habe etwas kürzeres genommen und meine Motoren sind an den Ecken montiert, was die Montage erschwerte.

2 - 12 U-Kanäle für Vorder- und Rückseite des Grundrahmens.

2 - 15 U-Kanäle für die Stoßfänger vorne und hinten

2 - 7 (oder waren es 7,5 ?) U-Kanäle für die vorderen Säulen. Dies ist nicht zu kritisch, die Längen können variieren. Es hängt davon ab, wie hoch die hinteren Säulen sind und in welcher Höhe Sie die abgewinkelten U-Kanal, der zwischen ihnen verbindet.

2 - (Länge?) U-Profile für das abgewinkelte Element, von vorne nach hinten, die die aufrechten Säulen verbinden. Dies ist kritisch, da Servo City / Actobotics zu diesem Zweck 45-Grad-Winkelplatten oder -Halterungen verkauft, aber Sie müssen etwas rechnen / trignieren, um sicherzustellen, dass Sie die richtigen Längen erhalten.

2 - (Länge?) U-Kanäle, die als höherwertige seitliche Stoßfänger dienen, auch diese hängen davon ab, was Sie mit der Basis machen

2 - (Länge?) U-Profile als überlagerte vordere und hintere Stoßfänger, dito Ausgabe nach oben.

1 - (Länge?) U-Profil als oberstes Element, überspannt die hinteren Säulen. Dieser darf nicht zu kritisch sein, da Sie oben oder vor / hinter den aufrechten Säulen montieren können.

12 (ca.) L-Kanäle oder Halterungen. Diese dienen mehreren Zwecken, verleihen aber im Wesentlichen den Ecken des Grundrahmens UND der aufrechten Säulen strukturelle Integrität/Stärke.

4 (+?) 3-Loch- bis 5-Loch-Flachkanäle. Diese verleihen dem Roboter auch strukturelle Festigkeit.

ServoCity verkauft zwei Hauptarten von großflächigen Flachbildschirmen, die für die Verwendung als Unterwagen oder als Oberseite für Ihre Batterie und / oder Controller oder sogar für eine höher gelegene Oberfläche für Sensoren nützlich sind.

Es gibt ein 4 (4,5?) "X 12" Panel, und ich denke, das andere ist ein 9 (9,5?)" X 12 Panel.

Hier werden die Dinge interessant und können verwirrend und teuer werden (kleine Teile summieren sich). Über diese Verbindungsstücke, von denen es MEHRERE gibt, können alle Kanäle usw. miteinander verbunden werden. An dieser Stelle habe ich leider keine umfassende, detaillierte und spezifische Teileliste.

Und die Sache ist, dass Sie nicht genau wissen, welche Sie benötigen oder wie viele, weil es so viele Möglichkeiten gibt, diese Teile zusammenzufügen.

Ich kann auflisten, was ich verwendet habe:

www.servocity.com/90-quad-hub-mount-c

www.servocity.com/side-tapped-pattern-moun…

www.servocity.com/90-quad-hub-mount-d

Die folgenden beiden sind sehr praktisch, und ich würde mich einfach damit eindecken:

www.servocity.com/single-screw-plate

www.servocity.com/dual-screw-plate

Als nächstes sind alle Schrauben (Bolzen). Ich habe mit einer Packung JEDE Größe angefangen und habe die meisten von ihnen durchgemacht. Ich benutzte längere Schrauben, wo die Größe keine Rolle spielte, und reservierte die kürzeren dort, wo sie ERFORDERLICH waren, da keine andere Länge funktionieren würde.

Schließlich sollten Sie 1 Beutel davon erhalten:

www.servocity.com/6-32-nylock-nuts-pack

Ich habe nicht so viele verwendet, aber sie (glaube ich) sind entscheidend, um sicherzustellen, dass sich Ihre Motoren im Laufe der Zeit nicht vom Rahmen lösen. Aufgrund des U-Kanals würden nur zwei pro Motor funktionieren

Sie benötigen mindestens 4 davon, Sie erhalten möglicherweise einen zusätzlichen oder so, falls Sie einen Schaden verursachen (glauben Sie mir, Sie können die Motoren ein paar Mal an- / abmontieren):

www.servocity.com/heavy-duty-clamping-shaf…

Normalerweise sind Motorwellen 6 mm und Achsen 1/4 (0,25 Zoll) groß.

Ich würde einige schwarze Schrauben bekommen, die angeblich stärker sind, und sie für die oben genannten Klemmen verwenden und NICHT die Schrauben verwenden, die mit den Klemmen geliefert werden:

(Ich denke, das sind die):

4 - 1/4" (0,25") Durchmesser Lager

1 - Beutel mit schwarzen 1/4 Spacern

4 - Spannen von D-Naben

www.servocity.com/0-770-clamping-d-hubs

4 - D-Wellen (#6340621.375" (1-3/8")

4 - 6 Schwerlasträder

www.servocity.com/6-heavy-duty-wheel

Beachten Sie, dass ich diese Räder liebe, aber sie haben eine harte Gummikante. Sie scheinen auf harten Böden und Teppichen und wahrscheinlich auf harten Betonwegen gut zu funktionieren. Wird nicht gut auf Gras, Sand usw.

AUCH neigen sie dazu, Ihren Teppich zu verschmieren !!!

4 - Motoren:

www.servocity.com/motors-actuators/gear-mo…

Ich fuhr mit 223 RPM, gute Höchstgeschwindigkeit im Innenbereich, konnte auch meinen Roboter (schwer mit 2 SLA 12V-Batterien) recht leicht in Zeitlupe bewegen.

2 - Motor-Encoder für die Motoren. (Die Roboclaw von Servo City verarbeitet nur 2 Encoder)

1 - Roboclaw 2X45A Motorcontroller, stellen Sie sicher, dass Sie den mit den grünen Klemmenblöcken erhalten, nicht die Stifte…. naja… jeder hat seine vorteile. Im Nachhinein.. Ich könnte die Stifte bekommen haben.

Ich denke, das war's von Servo City.

SparkFun verkauft Arduino Uno (das habe ich verwendet) und auch Redboard Artemis als Laufwerksmanager.

Sie möchten einen Raspberry Pi 3 (oder 4?) als Ihr High-Level-"Gehirn" und als Schnittstelle zu Ihnen.

Sie benötigen Verkabelung, Schalter, Sicherungen und eine sehr robuste "Flyback" -Diode.

Ich habe eine Duracell 12V 14AH Deep-Cycle-SLA-Batterie verwendet, aber Sie können alles verwenden.

WARNUNG! Das Design dieses Roboters (HOCH und BREIT, aber SHORT) geht von einer Art schweren Schwerpunkt aus, wie es eine SLA-Batterie bieten würde. Es kann mit diesen anderen Arten von Akkus mit neuerer Technologie nicht gut zurechtkommen. LiPo, Lion usw. Es könnte leicht umkippen.

Von Pololu habe ich ein paar Barrel-Plug-Adapter bekommen, damit ich das Arduino und/oder das Redboard unabhängig mit Strom versorgen konnte, obwohl diese per USB mit dem Raspberry verbunden wären, da ich nicht auf den Strom des Raspberry angewiesen sein wollte. (Besonders Montage von Kameras, Sensoren etc.)

Sie benötigen einen 12-zu-5-V-Abwärtsspannungsregler, mindestens 5 A (?) für den Raspberry. Die anderen können alles zwischen 7 und 15V verarbeiten, also direkt an die SLA-Batterie.

Das war's für Teile.

Was ich NICHT tun würde - 90-Grad-Kegelradgetriebe.

Auch hier gibt es viele Videos in meiner Robotics-YouTube-Playlist, die die meisten der oben genannten Punkte detailliert beschreiben.

Schritt 1: Konstruktion

Ehrlich gesagt sind alle meine Bauschritte bereits in Form von Youtubes. Sie können diese in meiner Robotics-Playlist sehen, beginnend bei "Wallace Robot 4". Die Vorgänger (Wallace II, Wallace III) haben auch gutes Material

www.youtube.com/playlist?list=PLNKa8O7lX-w…

Schritt 2: Testen Sie Roboclaw, Motoren und Encoder

Die Hersteller von Roboclaw (BasicMicro) haben eine Windows-Anwendung, mit der Sie sicherstellen können, dass die Motoren und Encoder korrekt mit dem Roboclaw verdrahtet sind. Sie werden gleichseitige Motoren parallel zum Roboclaw anschließen. Sie können wählen, ob Sie die Encoderkabel nur für die hinteren Motoren oder die vorderen Motoren verwenden möchten, oder vielleicht noch besser - DIAGONAL.

Der Grund für meinen Vorschlag hat mit der (späteren) Suche nach einem festgefahrenen Roboter zu tun. Einen Status diagonal zu haben, ob sich die Vorder-/Hinterräder nicht drehen/drehen, ist möglicherweise besser als nur die Vorder- oder nur die Hinterräder.

HINWEIS: Was ich NICHT getan habe, ist, den Arduino zu verwenden, um auch eine Verbindung (über GPIO-Pins) mit den Encodern herzustellen fragen Sie die Roboclaw nach ihren beiden Encoderwerten (und Geschwindigkeiten) ab.

HINWEIS: Ich habe die Anwendung von BasicMicro verwendet, um die Roboclaw für Ramping Up / Ramping Down vorzukonfigurieren. Dies ist gut für den Schutz der Hardware und der Elektronik. In meiner Robotics-Playlist gibt es ein Video dazu.

Fast hätte ich es vergessen: Ich habe auch einige Bullet-Connector-Kabel gekauft, die zwischen den Motorkabeln und der Roboclaw verlaufen. HINWEIS: Wenn Sie dies tun, werden Sie feststellen, dass die Gesamtkabellänge WIRKLICH LANG ist. Aber ich wollte keine schneiden müssen, wenn ich es nicht musste. Ich habe (für spätere Schritte) Kommunikationsprobleme mit dem USB zwischen dem Raspberry und dem Arduino festgestellt, wahrscheinlich aufgrund von EMI-Rauschen.. Aber ich habe das mit Software umgangen.

Wenn es zu einem Problem wird, können Sie Drähte abkürzen - Sie können auch eine Metallabschirmung kaufen (von Amazon, 1 Durchmesser).

Letzte Sache: Dies muss ich noch tun --- Lassen Sie den Roboclaw automatisch konfigurieren oder abstimmen (unter Verwendung von Encodern), sodass sich sowohl der linke als auch der rechte Motor mit der gleichen Geschwindigkeit bewegen und der Roboter geradeaus fährt.

Meins krümmt sich sehr leicht über etwa 12 Fuß, aber nicht genug, dass ich das Bedürfnis verspürte, etwas dagegen zu tun.

Schritt 3: Hinzufügen und Programmieren des Arduino

Sie benötigen den Hohlstecker und einige Kabel sowie ein USB-Kabel. Stellen Sie sicher, dass Sie den richtigen für den Arduino-Anschluss erhalten.

Sie müssen die Arduino-IDE herunterladen.

Hier bei Github ist die neueste Skizze, die das Fahren des Roboters behandelt:

github.com/elicorrales/wallace.robot.ardui…

Sie werden das Arduino an Ihren Computer anschließen, auf dem die IDE ausgeführt wird, und basierend auf der Schreibweise der Skizze verwenden Sie die Pins 10 und 11 des Arduino für die serielle Kommunikation (Software Serial) mit dem Roboclaw.

Ich habe ein einfaches Kommunikationsprotokoll zwischen dem Raspberry Pi und dem Arduino entwickelt.

Es basiert auf ASCII-Zeichen, was das Debuggen und Testen einfach mit dem "seriellen Monitor"-Fenster der Arduino IDE erleichtert.

Die Befehle beginnen bei der Nummer "0" (Null) und gehen bei Bedarf einfach nach oben

Die Befehle, die in den "20" beginnen, sind direkte Roboclaw-Befehle, und die Befehle darunter sind ausschließlich Arduino-bezogene Befehle.

Aufgrund des EMI-Rauschens habe ich die Befehlszeichenfolge um eine Prüfsumme verbessert.

Jede Zeichenfolge enthält also:

# Anzahl der Token in der Zeichenfolge einschließlich dieses

die Prüfsumme

Angenommen, Sie möchten, dass das Arduino mit seinem Befehlsmenü reagiert:

4 0 12 16

"4" sind vier Token in einer Zeichenfolge.

"0" ist der MENU-Befehl.

"12" ist die von mir gewählte Zufallszahl.

"16" ist die Summe von 4 + 0 + 12.

Derselbe MENU-Befehl könnte anders sein:

4 0 20 24

Da ich eine andere Zufallszahl gewählt habe, ist auch die Prüfsumme anders.

Beispiel, Sie möchten mit 100 % Geschwindigkeit vorwärts fahren:

5 29 0 134 100

"5" fünf Token

"29" der FORWARD-Befehl

"0" die Zufallszahl

"134" die Prüfsumme

"100" der Parameter 1 (in diesem Fall die Geschwindigkeit)

Wenn der Arduino diesen eingehenden String nicht überprüfen kann, lässt er ihn einfach fallen / ignoriert ihn, keine Antwort.

Wenn der Arduino mit X Millisekunden keinen nächsten Bewegungsbefehl erhält, sendet er einen STOP-Motoren an die Roboclaw.

Der Arduino startet und sendet einen Auto-Status an den USB-Port … es sei denn, er soll damit aufhören.

An diesem Punkt sollten Sie bereit sein, die Roboclaw zu steuern und die Motoren beim Drehen zu beobachten, indem Sie einfach den "Serial Monitor" in der IDE verwenden.

Schritt 4: Hinzufügen und Programmieren des Raspberry Pi (node.js)

Auch hier, wenn Sie sich meine Robotics-Playlist ansehen, bin ich von Anfang an jeden Schritt durchgegangen, um den Raspberry zum Laufen zu bringen.

Die eine Sache, die ich vielleicht beschönigt habe, ist, dass Sie einen 5V-Regler benötigen und entweder ein USB-Kabel dafür irgendwie konstruieren, schneiden / modifizieren oder den Raspberry auf andere Weise mit Strom versorgen.

Hier bei Github finden Sie alles, was Sie im Raspberry brauchen, um über USB mit dem Arduino zu kommunizieren.

github.com/elicorrales/wallace.robot.raspb…

Es gibt sogar Testskripte.

Sie können sich den Servercode von node.js ansehen und sehen, wie der Raspberry die knappen numerischen Anweisungen in URL-Strings vom Typ REST umwandelt. Mit "curl" können Sie Testbefehle senden.

Beispiel:

Ihre RP3-IP-Adresse:8084/arduino/api/forward/50

bewirkt, dass die Motoren die Räder kurzzeitig nach vorne drehen.

Wenn Sie das in eine Shell-Skriptschleife einfügen, sehen Sie, wie sich die Räder weiterdrehen.

Der node.js-Code (server.js) enthält eine Neuverbindungsfunktion für den Fall, dass die serielle Kommunikation zum Arduino verloren geht. Sie können dies testen, indem Sie einfach das Arduino vom Raspberry trennen und wieder anschließen.

Stellen Sie sicher, dass die serielle Baudrate zwischen den beiden übereinstimmt.

Da Arduino schlechte Datenpakete verwirft und auf der Ebene node.js und auf der Javascript-Ebene des Browsers alles so codiert ist, dass es viele "Drive" -Befehle sendet, konnte ich bis zu 2 000 000 Baud ausführen (2Mbps).

Wenn Sie die Testskripts ausführen und sehen, wie sich die Räder drehen, sind Sie bereit für den nächsten Schritt.

Schritt 5: Letzter Schritt - Programmierung / Verwendung des Webseiten-Clients

Im Github-Link zum Raspberry-Teil von all dem sind die Client-Dateien enthalten.

index.html. index.js. p5.min.js.

Sie handhaben das USB-Gamepad über die Gamepad-API (browserbasiert) und Sie sollten die verschiedenen Schaltflächen und Schieberegler sehen, die auch auf der Webseite verfügbar sind.

Der Javascript-Code fragt die X- und Y-Achsen-Werte für einen der Joysticks ab. Es ruft sehr schnell ab und sendet alle diese Werte an den node.js-Server, der bei 8084 lauscht.

Die Rohwerte der X- und Y-Achse der Joysticks liegen zwischen 0 und 1.

Aber die Roboclaw-Motorcontroller-Bibliotheksfunktion, die im Arduino zum Antreiben der Motoren verwendet wird, erwartet einen Wert zwischen -100 bis 0 (rückwärts) oder (0 bis 100) vorwärts.

Soo…. das ist der Zweck der Aufnahme der p5.min.js. Es hat einfach diese sehr schöne, praktische map()-Funktion, in der Sie den Rohwert, den Rohwert (aktuellen) Bereich und den neuen, gewünschten Bereich angeben. Und es wandelt den Rohwert in den Wert im neuen zugeordneten Bereich um.

Ein weiterer Punkt: Bei 100er Geschwindigkeit kann der Roboter sehr knifflig sein. Ich bin ständig auf etwas gestoßen. Aber selbst wenn Sie darin besser werden, ist es immer noch empfindlich, wenn Sie nach links oder rechts drehen.

Etwas, das Sie hinzufügen könnten, ähnelt dem aktuellen Max-Speed-Schieberegler auf der Webseite. Dieser Schieberegler bestimmt den höchsten oder maximalen Wert, dem Sie die Joysticks Xs und Ys zuordnen.

Beispiel:

Angenommen, Sie ordnen 0 -> 1 bis 0 -> 100 zu. Wenn Sie den Joystick auf den Punkt drücken, sind Sie bei 100. Empfindlich. Könnte zu schnell sein.

Aber wenn Sie den Max Speed-Schieberegler etwas zurückschieben, ordnen Sie jetzt 0 -> 1 auf 0 -> 80 oder 70 zu.

Das bedeutet, dass Sie mehr Spielraum haben, Ihren Joystick zu bewegen, ohne dass eine so große Änderung der Geschwindigkeit an die node.js (und an den Arduino) gesendet wird.

Und zusätzlich könnten Sie die Xs (nach links oder rechts drehen) von den Ys (vorwärts oder rückwärts) in ihre eigenen maximal verfügbaren Geschwindigkeiten trennen.

Daher können Sie Ys bei 0 bis 100, 0 bis -100 für schnelle Linearbewegungen belassen, aber die maximale Xs-Geschwindigkeit für eine kontrolliertere Rotationsbewegung verringern. Beste aus beiden Welten.

Schritt 6: Optional: Fahren Sie den Roboter mit Maus-Ziehen und / oder Touch-Ereignissen

Wenn Sie so weit gekommen sind, wissen Sie, dass die Softwareschichten vom Browser über das Javascript bis zum Raspberry node.js-Server und schließlich zum Arduino die X- und Y-Koordinaten des Gamepad-Joysticks in die " vorwärts" (oder "rückwärts" usw.) Befehle (und deren Geschwindigkeitswert).

Außerdem wissen Sie dann, dass die Xs und Ys der Joysticks zwar von minus 1 über null bis plus 1 sind, diese jedoch zwischen null und 100 umgewandelt werden müssen. Nun, die Höchstgeschwindigkeit hängt von der Höchstgeschwindigkeitseinstellung auf der Webseite ab.

Soo … das einzige, was Sie tun müssen, um entweder die Maus oder Touch-Ereignisse (wie auf einem Smartphone) zu verwenden, ist, diese Ereignisse zu erfassen und die Xs und Ys zu ergreifen.

ABER ---- diese Xs und Ys liegen NICHT zwischen minus 1 und 1. Sie beginnen mit 0 und steigen positiv an, da sie im Wesentlichen die Pixel oder die relativen Bildschirmkoordinaten eines HTML-Elements (z. B. eines Bootstrap-Panels) oder einer Leinwand sind.

Auch hier ist die "map()"-Funktion der Js-Bibliothek des P5 sehr praktisch, um das neu zuzuordnen, was wir brauchen.

Ich habe den Code so umgestaltet, dass er zwei verschiedene Webseiten hat, eine für den Desktop mit dem Gamepad, eine andere für Mobilgeräte mit den Touch-Ereignissen.

Sobald die Xs und Ys neu zugeordnet wurden, werden sie in dieselbe Codekette usw. eingespeist, wie dies auch die Xs und Ys vom Gamepad sind.

Empfohlen: