Vorstellung RC-Car mit Node.js

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich habe kürzlich mein schon etwas länger andauerndes Projekt soweit abgeschlossen, dass ich fürs Erste zufrieden bin.

    Was genau ist nun dieses Projekt?

    Die Grundidee war, dass ich mein noch vorhandenes 1:10 RC-Auto über eine eingebaute Kamera und dann per Smartphone steuern kann. Das ist hauptsächlich für das "in der Wohnung fahren" gedacht, man sollte daher aber noch die normale Fernsteuerung zum richtigen Schnellfahren verwenden können.

    Verwendete Hardware:
    - RC-Auto: Tamiya M02L (VW Käfer)
    - Fernsteueranlage (kompl. mit PWM Servos und Empfänger)
    - 7,2V 5Ah NiMH Racing Akku
    - RPi Rev B
    - RPi Camera Modul mit IR-Filter
    - Realtek WLAN Stick (8192 Chipsatz)
    - Step-Down Wandler
    - je 1x 74HC00, 74HC02, 74HC08
    - diverse Buttons und LEDs

    // Edit: Bilder der Hardware in Beitrag #6 ;)

    Soo, jetzt kommt der eigentlich schwierige Teil, die Software Lösung der Problemstellung.

    Prinzipiell hatte ich vor mich mit dem Projekt ein wenig in Javascript und auch Node.js einzuarbeiten. Deshalb war die Wahl des Interfaces schon vor Projektbeginn klar.
    Die Entscheidung ist mir zudem sehr leicht gefallen, da Node einfach eine der neuesten Sachen ist und sehr viel Potential hat und man sich auch nicht extra um ajax kümmern muss.

    Ein weiterer Punkt, der mir sehr wichtig ist, ist die Integration des Autos in bestehende WLAN Netzwerke, sofern welche vorhanden sind. Ansonsten wird automatisch ein Hotspot erstellt. Das Koppeln des Autos geschieht in beide Richtungen (Smartphone zu Hotspot-Modus oder auch Client-Modus in neues WLAN aufnehmen) mit dem integrierten (!) WPS Taster des WLAN Sticks.

    Außerdem sind natürlich noch einige andere Programm, sowie deren Abhängigkeiten von Nöten, um das alles ans Laufen zu bekommen.

    Verwendete Software:
    - Node.js (Web-Server)
    - motion (RPi-Cam Stream zum WebIf)
    - pi-blaster (Software PWM)
    - hostapd (Realtek Version)
    - dnsmasq (DHCP-Server)
    - diverse kleine Scripte für Kleinigkeiten

    // Edit: Zum Thema WLAN habe ich einen gesonderten Beitrag (#7) erstellt

    Lange Rede, kurzer Sinn, hier sind erstmal n paar Screenshots des Web-Interfaces meines RC-Autos, auf dem man auch glaube ich ganz gut sehen, wie sich das Interface bedienen lässt ;)

    Start:

    Control-Mode (-> Let Me Drive It) - Stillstand:

    Control-Mode (-> Let Me Drive It) - Bedienung:

    Configuration - Lenkung und Gas Einstellungen:

    Configuration - Diverse Switches:

    Configuration - Umschalten auf Kontrolle der PWM Signale durch den RPi:

    System:

    System - Umschalten des WLAN-Modus:

    Logout - bei Shutdown/Restart/WLAN-Switch:

    Bei den Screenshots mit mehreren Browserfenstern waren jeweils einmal Opera, Firefox und Chrome geöffnet. Alle relevanten Daten werden in Echtzeit an jeden verbunden Client gepusht (z.B. eine Änderung eines Sliders, Move-Button Position, etc.).

    Hinterlasst mir gerne schonmal ein kleines Feedback zum Interface, im Laufe der kommenden Tage wird es dann mit dem Rest weiter gehen ;)

    Einmal editiert, zuletzt von driftmonster (28. Januar 2015 um 16:36)


  • schickes chassis, die beetle karosserie gibt dir eine menge platz für den rest :D
    für den rpi brauchst du eine eigene stromversorgung, sonst kommst du meiner meinung nach nicht weit.

    Die große Karosserie ist auf jedenfall ein gute Basis gewesen und ich kann mein erstes grobes Design komplett unterbringen. Ich habe allerdings noch vor mir eine Platine zu zeichnen, die noch wesentlich schlanker und bessere Anschlussmöglichkeiten hat, sowie direkt auf den RPi steckbar ist.

    Für die Stromversorgung hab ich ja meinen Step-Down Wandler, der direkt an den Akku angeschlossen ist und sekundär bis 2A kann. Von daher hatte ich mit der Stromversorgung noch keine Probleme.

    Weitere Bilder werde ich wahrscheinlich heute Nachmittag nach der Arbeit knipsen und hochladen ;)


  • welche kapazität hat der akku vom fahrzeug?

    :D ok 5Ah

    also maximal 2std fahrezeit.

    Die 5Ah Stunden würden für den reinen RPi mit Peripherie bei ca 1,4A knappe 3,5h reichen. Die Leistung des Motors (7,2V mit >15A in der Spitze) wird natürlich nicht über den Step-Down Wandler geschaltet. Effektive Fahrzeit beträgt ca. eine dreiviertel Stunde, bis der Akku leer ist. Das hängt aber wie bei einem großen Auto auch stark von der Fahrweise ab.

    Wie versprochen gibt es aber jetzt erstmal neue Bilder. Leider kann ich in dem Startbeitrag nicht mehr so viele Bilder anhängen, deshalb jetzt hier:

    Meine originale Karosserie hat inzwischen einige Macken, zum Glück konnte ich aber noch eine neue und originale Karosse ergattern, die ich dann in nem geilen Orange Metallic lackiert hab ;)

  • Sou,

    wie angekündigt werde ich jetzt noch etwas weiter auf meine automatische WLAN Client/Hotspot Umschaltung beim Starten des RPi eingehen.

    WLAN Stick: Edimax EW-7612UAn

    Prinzipieller Ablauf des Startvorgangs meines WLAN

    -1- WLAN startet im Client Modus und sucht 30 Sekunden nach (in der wpa_supplicant.conf) verfügbaren und bekannten Netzwerken, falls vorhanden wird über DHCP eines z.B. Routers eine IP gezogen.

    -2- Wenn der erste Suchlauf 30 Sekunden lang nicht erfolgreich war, wird hostapd mit einer festen IP Adresse auf wlan0 gestartet. Zudem startet noch dnsmasq um einen eigenen DHCP Server für die anzumeldenden Geräte zu haben.

    Soweit so gut. Jetzt möchte man natürlich auch gerne das Smartphone mit dem Gerät verbinden, ohne jedesmal ein kryptisches Passwort eingeben zu müssen. Ausserdem wäre so das Anmelden des Autos in ein neues WLAN Netz nicht möglich. Deshalb hab ich mit Hilfe des Git von ninjablocks
    den integrierten WPS Taster des WLAN Sticks zum laufen gebracht. Da es hier mehrere Fälle gibt, gehe ich die besser einzeln durch:

    WPS Taster im Hotspot Modus diücken:
    Im Hotspot-Modus wird einfach 120 Sekunden nach einem Gerät gesucht, das ebenfalls einen WPS Taster (hard- oder softwaretechnisch) gedrückt hat. Wird ein neues Gerät gefunden, wird diesem über dnsmasq eine IP zugewiesen.
    Der Vorgang ist gestoppt und kann neu begonnen werden. Jedes neue Gerät muss nacheinander angemeldet werden.

    WPS Taster im Client Modus diücken:
    Im Client Modus wird ebenfalls 120 Sekunden nach einem Gerät gesucht, das einen WPS Taster (hard- oder softwaretechnisch) gedrückt hat. Wird hier ein WLAN Netzwerk gefunden, wird dies in der wpa_supplicant.conf hinterlegt. Der Vorgang ist gestoppt und kann neu begonnen werden.
    Sollte binnen 120 Sekunden kein WLAN mit WPS gefunden werden, startet automatisch wieder der Hotspot, sodass man zur Not immer im HotSpot Modus auf das Interface und somit das Auto zugreifen kann.

    Manuelle Umschaltung über das Webinterface von Hotspot in Client Modus:
    Es wird jetzt ein wenig abstrakt, aber ich versuch das deutlich zu erklären; Sind keine WLAN Netzwerke verfügbar und man schaltet manuell wieder vom Hotspot in den Client Modus um ein neues WLAN hinzuzufügen, wird erneut 30 Sekunden lang nach den hinterlegten Netzwerken gesucht, sollte dann erneut keines dieser erreichbar sein, wird per Software der WPS Button gedrückt und somit 120 Sekunden nach neuen WLAN Netzwerken gesucht.

    Jetzt wartet ihr sicher schon auf Source und Scripte, die ich euch jetzt natürlich nicht vorenthalte:

    Anleitung zur Installation von hostapd (ignoriert den Teil mit der brigde und installiert die bridge utils auch nicht mit, außer ihr habt einen anderen Verwendungszweck)

    /etc/hostapd/hostapd.conf - Angepasst auf den WLAN Stick, sodass dieser im n Standard läuft

    /etc/dnsmasq/dnsmasq.conf

    Code
    interface=lo
    interface=wlan0
    dhcp-range=192.168.10.10,192.168.10.20,255.255.255.0,24h

    /etc/wpa_supplicant/wpa_supplicant.conf - Das dummy Netzwerk und darin disable=0 ist wichtig!

    /etc/network/interfaces

    Jetzt kommen die interessanten Sachen, die selbstgeschrieben Scripte. Ich weiß, da besteht durchaus verbesserungspotential, aber das werd ich noch refactorn, wenn ich den Nerv dazu hab ;)

    /usr/bin/wlan.client (==> Wird in der rc.local gestartet !!)

    /usr/bin/wlan.hotspot

    Zum WPS Taster hab ich ja oben schon den Link zum Sample File angegeben um den WPS Taster zu überwachen. Dieses hab ich dann noch kurz abändern müssen

    Es sind aber ein paar Änderungen nötig, ganz oben die Funktion erweitern

    Hotspot:

    Code
    static void HWPBC_SignalHandler(int sig)
    {
    	//if(sig==0x0a)
    	{
    	system("/usr/bin/statusled.blinken");
    	system("echo $(date +'%T')' >> HOTSPOT >> WPS PBC ist 120 Sekunden aktiv' >> /var/log/wlan.log &");
    	system("hostapd_cli -p/var/run/hostapd wps_pbc any > /dev/null 2>&1 &");
    	system("/usr/bin/wps.hotspot.blinken > /dev/null 2>&1 &");
    	}
    }

    Client:

    Sowie bei beiden ganz unten ein

    Code
    sleep(1);


    in die innere while Schleife um die CPU Last zu reduzieren.

    Dateien speichern, mit gcc kompilieren, Rechte auf 755. Ihr solltet dann jeweils eine wps.client und eine wps.hotspot haben.

    Ich habe aber zusätzlich noch eine StatusLED, die ich bei neuen Meldungen gerne Blinken lassen, deshalb habe ich noch für jeden Modus ein "Blinkscript" geschrieben.

    /usr/bin/wps.client.blinken

    /usr/bin/wps.hotspot.blinken

    Die oben in den WPS Programmen hinterlegte /usr/bin/stausled.blinken

    Bash
    #!/bin/bash
    echo "0" > /sys/class/gpio/gpio22/value
    sleep 0.1
    echo "1" > /sys/class/gpio/gpio22/value
    sleep 0.1
    echo "0" > /sys/class/gpio/gpio22/value
    sleep 0.1
    echo "1" > /sys/class/gpio/gpio22/value
    exit 0

    Damit dürfte jetzt auch eigentlich alles soweit abgedeckt sein. Würde mich über ein Feedback freuen, war jetzt doch mehr Aufwand das mal bis ins Detail aufzuschreiben, wie angenommen.

    Einmal editiert, zuletzt von driftmonster (28. Januar 2015 um 16:49)


  • ich persönlich würde nur den hostp modus verwenden. wenn nötig hast du immer noch das lan.
    den rest muß ich mir mal we anschaun.

    Ehhm, genau das ist es ja was mich stört. Wenn man mit dem Auto bei Freunden in der Wohnung über das dortige WLAN rumfahren möchte, hat man sicher keine Lust jedesmal erst n Laptop mitzuschleppen, anzumachen, sich über SSH zu verbinden, die wpa_supplicant zu bearbeiten und dann auch nochmal das Auto komplett neu zu starten. Ist ja völliger Blödsinn, wenn es auch komfortabler geht.

    Und wenn man draußen unterwegs ist und z.B aus Versehen den Client Modus einschaltet und es da keine Netzwerke finden kann, ist das Auto kurze Zeit später wieder im Hotspot Modus erreichbar.

    Ich hab die ganzen Skripte ja nicht umsonst geschrieben :D


    hast du einen autonom modus vorgesehen?

    Nein, ist bei diesem Projekt nicht vorgesehen.

  • Souu, es geht weiter mit neuem Material zu dem Projekt ;)

    Ich habe mal noch meine Platine bzw. eher Schaltung ein wenig weiter designed und möchte euch diese noch zeigen. Die Dateien hänge ich in an, sind direkt aus Eagle.
    Das Layout der Platine habe ich nicht fertig, da würde ich mich sehr freuen, wenn da einer von euch noch Lust zu hat diese auf den Raspberry Pi B anzupassen. Dafür können auch gerne die Bauteile gegen SMD Versionen getauscht werden, da ich zum Erstellen erstmal nur die erstbesten und momentan eingesetzten Bauteile benutzt habe.

    RPi_Schaltung.zip

  • Hi,

    das System läuft komplett (außer Kamerastream) über Node.js. Die Seiten sind daher in HTML5 mit Javascript geschrieben.
    Es wurden keine Vorlagen verwendet, da ich mich ja durch das Projekt in die Sprache und alles Weitere einarbeiten wollte.

  • Wäre es vielleicht möglich das Auto mal in Aktion zu sehen. In einem kleinem Video vielleicht. Mich würde die Reaktionszeit und das Fahrverhalten des Vehikels interessieren. Vielen dank für diese tolle Projekt Beschreibung.

  • Moin!

    Dein Projekt gefällt mir sehr! Besonders das Node.js...
    Ich versuche mich da gerade einzuarbeiten. Alle Tutorials die ich für die Installation auf dem PI finde laufen bei mir nicht.
    Deshalb meine Frage: Könntest du vielleicht eine kleine Linksammlung von den Seiten machen die du dafür gebraucht hast?

    Da würde ich mich riesig drüber freuen und sicherlich auch alle anderen die sich mit Node.js auseinandersetzen wollen und dein Projekt finden :thumbs1::bravo2:

    LG Kleiner Mann ;)

  • Hallo zusammen,

    ich hatte auf Grund der Prüfungsphase des Studiums keine Zeit, um mich großartig um andere Sachen zu kümmern. Ich habe aber inzwischen noch ein wenig Arbeit investiert und eine Platine erstellt.
    Ein Video werde ich demnächst noch anfertigen, mir sind noch kleine Kinderkrankheiten aufgefallen, die noch beseitigt werden müssen. Dann sollte die Übertragung nochmals wesentlich schneller und stabiler sein, sodass sich grob geschätzt bis zu 10 Leute gleichzeitig am Auto anmelden und den Stream sehen können. Wie und was ich gemacht hab, werde ich dann hinterher erklären können ;)

    Zum Installieren von Node.js hab ich eine deutsche Anleitung verwendet, allerdings hauptsächlich, da dort ein Daemon Script drin stand. Musste mal Google fragen, war eines der ersten Ergebnisse.

    Zur Anmerkung; ich hab mir aus dem Repository die 11.8 heruntergeladen, da dies die neueste vorkompilierte und gut lauffähige Version für ARM beinhaltet. Kannst natürlich auch die aktuellste selbst kompilieren, das wird dich aber bestimmt zwei Stunden kosten.

    Da ihr aber auch noch was zum Gucken erwartet, hier mal das gerenderte Bild der Platine. Das fehlende Bauteil ist eine 5mm DuoLED, die in PovRay nicht enthalten ist.

  • Sou,

    es hat zwar doch einige Zeit gebraucht, aber ich habe mal drei Videos gemacht, in den man eigentlich alles gut sehen kann.
    Ich habe jetzt einfach mal eine Mini-Runde im Haus gedreht, bei dem schlechten Wetter muss man ja nix nass werden lassen ;)

    Letzte Änderung an der Hardware war die Stromversorgung, da habe ich ein StromPi PCB angeschlossen, das ist die Platine zwischen RPi und der obersten RC-Platine (die inzwischen auch gefertigt wurde).
    Zusätzlich habe ich noch eine kleine Spannungsanzeige für den RC-Akku unterhalb der Kamera.

    Hardware und Booten:

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Interface und Einstellungen:

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Multibrowser:

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Bei dem kleinen Crash am Ende der Fahrt ist nichts passiert, hört sich im Video nur ziemlich laut an ;)

    Einmal editiert, zuletzt von driftmonster (26. November 2015 um 17:55)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!