Modified RC Car

February 22, 2018 Patrick Hochenhauser

ultra

Mein Projekt:

Die Idee war es ein Akkubetriebenes Modelauto mit einem ESP32 Board zu steueren und folgende Funktionen zu integrieren:

  • Steuerung mittels XBOX360 Controller
  • Blinker
  • Abstandsmessung mittels Ultraschallsenso (Einparkhilfe)
  • WiFi Verbindung
  • Bildübertragung mit einer OV7670 Kamera

Jedoch habe ich mich wie immer etwas übernommen und konnte nicht alle Funktionen inkludieren. In den Folgenden Abschnitte werde ich die Problematik und gegebenenfalls Lösungen erläutern.

 

Arbeitsschritte, Probleme, Lösungen:

1) XBOX 360 Controller:

Um das ESP32 Board mit einem Xbox Controller an zu steuern benötigt man Processing. Da die Arduino IDE auf Processing basiert sind beide miteinander kompatibel. Um einen Xbox Controller in Processing zu verwenden benötigt man eine dazu passende Libary. Und hier stieß ich auch schon auf das erste Problem. Die meisten Libaries die ich fand, waren nur mit einem WiFi Controller kompatibel und für meinen Wired Controller nicht zu gebrauchen. Nach etwas längerer Suche stieß ich auf die Libary “Game Control Plus” von Peter Lager. Leider war es mit der Installation der Libary noch nicht getan und ich musste sie etwas anpassen, damit der Controller funktionierte. Zusätzlich musste ich die Libary “G4P” installieren. Die Positionen beider Joysticks haben ich mittels einen roten Punktes visualisiert.

 

2) Senden von Char´s mittels SerialPort zum ansteuern des Lenkungsservos:

Dieser Teil war mit Abstand der Zeitaufwendigste. Er kostet mich zirka eine Woche an Arbeit damit ich es mehr oder weniger zum laufen bringen konnte. Meine Idee war es den Servo mit dem Joystick anzusteuern. Der Joystick kann die Postion von -1 bis 1 annehmen und ich wollte das der Servo auch jeden zwischen Wert annehmen kann. Also jeden Wert von 0 bis 180, denn einmal will man etwas mehr einlenken und ein anders mal etwas weniger. Durch die map() Funktion war es einfach den Wert vom Joystick auf die benötigten Werte des Servos umzuwandeln. Dann musste ich den umgewandelten Wert der ein Floattyp war zu einem Integer Typecasten und danach zu einem Charstring. Diesen Charstring sendete ich dann mittels myPort.write() zum Board. Und dann das ganze umgekehrt in der Arduino IDE. Char auslesen mit Serial.read(). String -> Int. Den Int in für die Servo Position verwenden. Klingt einfach, ist es auch, jedoch hat das so nicht geklappt. Der Servo machte nichts. Ich habe etliche Code Varianten versucht. Auch das ich 180 verschieden Char Zeichen für jede Position verschicke. Ohne erfolg. Dann kam mir der Gedanke, dass das Board eventuell so viele Signale nicht verarbeiten könne und ich probierte es mit einem delay(). Der Servo fing an zu zucken und ein bisschen herum zu tänzeln. Verschiedene delay Zeiten an beiden Stellen (Arduino und Processing) habe ich versucht. Auch verschiedene Arten wie ich Daten von Processing zum Board schicke, wie Int zu String, Int zu Char, Float zu ect….  Ich habe auch den Code so umgeschrieben das nur dann ein Wert gesendet wird wenn sich der Wert des Joysticks verändert. Alles ohne Erfolg. Nach langem Scheitern entschied ich mich für die russische Variante. Durch mehrere IF-Klauseln habe ich dann 18 verschiedene Chars für 18 verschiedene Positionen versendet. bsp: if (temp > 100 && temp < 110) myPort.write(‘A’); Diese Variante klappte auf Anhieb und es war auch nicht mehr notwendig, nur dann einen Wert zu senden, wenn sich der Wert verändert, was für mich nicht zu erklären ist … Ich werde das Projekt nach dem Semester weiterführen, vielleicht finde ich irgendwann eine Lösung dafür.

 

3) Ansteuern des elektronischen Fahrtreglers

Durch längere Recherche fand ich heraus das solche Regler genauso wie Servos angesteuert werden. (manche Regler haben jedoch Interne Einstellungen wie, Bremsregelung ect.) Durch diese Erkenntnis war es nun ein einfaches für mich den Motor zum laufen zu bringen. Das einzige das etwas gedauert hat war heraus zu finden das dieser Regler eine 5V Versorgung benötigt und nicht eine 3.6V Versorgung. Ansteueren musste ich den Regler auch mittels der russischen Variante (leider). 30 km/h Spitze sollten jedoch im Bereich des Möglichen liegen.

 

4) Ultraschallsensor

Der Sensor hat 4 Pins, Echo, Trigger, GND, 3,6V. Die letzten beiden sind selbsterklärend. Echo sendet ein Signal in den raum das an einem Objekt reflektiert wird und zurück “geworfen” wird. Der Trigger Pin ist für das Empfangen verantwortlich. Durch die Zeit die der Schall benötigt für hin und retour, wird der Abstand gemessen. Der Sensor war relativ einfach zu programmieren und glücklicherweise stieß ich durch Zufall auf die Libary “NewPing” von Tim Eckel die sogar die paar Zeilen Code überflüssig gemacht haben. Die empfangenen Daten haben ich über den seriellen Port an Processing gesendet und den Abstand im Ausgabefenster visualisiert.

5) Blinker

Die Problematik hierbei ist, dass man das einfache “blink” example durch die verwendete delay() Funktion nicht verwenden kann. Dieses Problem umging ich mit der millis() Funktion. Den Wert von millis() speicherte ich in eine Variable “currentMillis” und wenn currentMillis – previousMillis (was zu beginn 0 ist) größer “interval” (eine Variable die zuvor mit einem int Wert festgelegt wurde) dann setzt den ledpin auf HIGH und speichere millis() in previousMillis usw.

 

6) WiFi Verbindung

Ich habe es leider nicht geschafft mich zuhause mit meinem Netzwerk zu verbinden. Hier habe ich auch zwei Tage lang mit verschiedenen Code Varianten ohne Erfolg herum experimentiert bis ich es schließlich bei einem Kollegen versuchte und dort hat es auch auf Anhieb geklappt. Bis jetzt ist mir schleierhaft was an meinem Netzwerk anders ist und wie ich das Problem lösen kann.

Verwendete Materialien:

  • ESP32 LoRa Board
  • elektronischer Fahrtregler “LRP Runner”
  • Servomotor “Conrad S-3111”
  • Ultraschallsensor HC-SR04
  • 4 Gelbe Leds
  • 4 100Ohm Widerstände

Hier noch ein Video mit einer kleinen Präsentation :

, , electronics, interactive