Forum: PC-Programmierung Über Raspberry Pi ein Arduino-Board programmieren


von Fabian S. (fabian31415)


Lesenswert?

Hallo!

Ich habe einen autonomen Roboter gebaut, der einen Raspberry Pi (Modell 
B) und ein "Arduino Mega 2560"-Board besitzt. Der Raspi, der einen 
WLAN-Stick hat und daher über ein Ad-Hoc-Netzwerk über SSH oder 
Remote-Desktop für meinen Laptop erreichbar ist, soll im Wesentlichen 
das Kamerabild auswerten und das Arduino-Board, welches natürlich sein 
USB-Port hat, kümmert sich um alles andere an dem Roboter.

Jetzt wollte ich den Raspi und das Arduino via USB miteinander 
verbinden, damit die beiden so einiges an Daten hin- und hertauschen 
können, während der Roboter gerade in Betrieb ist (der Raspi hat 
übrigens einen USB-Hub).

Da dachte ich mir folgendes: Den Raspi programmiere ich über SSH über 
das Ad-Hoc-Netz, ganz bequem drahtlos. Da der ohnehin mit dem Arduino 
über USB verbunden ist, könnte ich doch das Arduino-Programm auch von 
dem Raspi über USB auf den Arduino schreiben lassen.

Dazu hatte ich folgende Ansätze:
 1. Die Arduino-IDE auf dem Raspi installieren und über Remote-Desktop 
programmieren. Leider wird das Bild, das ich über Remote-Desktop (ich 
nutze xrdp) bekomme, sehr langsam aktualisiert, das macht nicht so 
richtig Spaß...
 2. Den Raspi irgendwie so konfigurieren, dass er den seriellen Port des 
Arduinos über das Ad-Hoc-Netzwerk bereitstellt. Leider habe ich so 
überhaupt gar keine Ahnung davon, wie oder ob das funktionieren könnte.
 3. Selber ein Skript für meinen Laptop schreiben, das durch das 
Makefile aufgerufen wird und dann die *.hex-Datei via FTP oder SFTP auf 
den Raspi überträgt und dort läuft noch ein Skript oder ein richtiges 
Programm, das dann den avrdude mit der entsprechenden *.hex-Datei in der 
Parameterliste aufruft. Das kommt mir ein bisschen übertrieben vor, ist 
als Notlösung aber vlt. noch denkbar.
 4. Über SSH den Arduino-Code schreiben und auch über SSH compilieren 
und übertragen. Allerdings dürfte der Arduino-Code bald mehrere tausend 
Zeilen lang werden (es wird ein sehr komplexer Roboter) und dann wäre 
eine IDE mit mehreren Quellcode-Dateien in verschiedenen Tabs ganz 
praktisch.

Was haltet ihr von den Ansätzen?
Welche sind gut umsetzbar und wenig fehleranfällig?
Falls Variante 2 sinnvoll ist, wie könnte das gehen?
Gibt es noch andere/bessere Lösungsansätze?

Viele Grüße,

Fabian


P.S.: Zur Not könnte ich natürlich auch zu jedem Übertragen des 
Arduino-Programms den USB-Stecker vom Raspi herausnehmen, den vom Laptop 
hineinstecken, übertragen und die Stecker wieder zurückstecken, aber das 
wäre mir auf Dauer etwas nervig...

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die Ansätze 2 und 3 erscheinen mir am sinnvollsten, da beide nur wenige
Ressourcen auf dem Raspi erfordern.

Zu 2: Mit socat kannst du auf dem Raspi den seriellen Port
(/dev/ttyUSB0) mit einem TCP-Socket verbinden. Auf dem Laptop verbindest
du den TCP-Socket mit einem PTY. Die TCP läuft entweder direkt und
unverschlüsselt zwischen Raspi und Laptop oder getunnelt über die
SSH-Verbindung, die du auch auch als interaktive Verbindung zum Raspi
nutzt.

Zu 3: Du musst auf dem Raspi nur den Avrdude installieren. Die zu
programmierende Hex-Datei musst du nicht unbedingt per FTP auf den Raspi
spielen, du kannst sie auf Laptop-Seite in den SSH-Aufruf umleiten und
auf Raspi-Seite vom Avrdude über Stdin lesen lassen.

Ich habe das Ganze nicht ausprobiert, deswegen kann ich nicht
garantieren, dass nicht noch irgendwo ein Haken versteckt ist. Aber
eigentlich bin ich mir ziemlich sicher, dass es so gehen müsste.

von Tom (Gast)


Lesenswert?


von Fabian S. (fabian31415)


Lesenswert?

Danke erstmal für die sehr hilfreichen Antworten!

Ich habe mir jetzt einen Befehl zusammengebastelt, der via SSH den 
avrdude aufruft, der dann über stdin seine Datei bekommt.

sshpass -p 'mein_tolles_passwort' ssh -l pi 192.168.3.1 avrdude -P 
/dev/ttyACM0 -p m2560 -c stk500v2 -U flash:w:-:i < test.hex

Da mein Raspi sich neuerdings nicht mehr mit seinem zweiten WLAN-Stick 
mit dem WLAN verbinden will, um den avrdude zu installieren, muss ich 
nachher mal das Ethernetkabel heraussuchen. Ich bin aber zuversichtlich, 
dass das mit dem Befehl etwas wird!

von Fabian S. (fabian31415)


Lesenswert?

Unglaublich! Es funktioniert!
Das hier habe ich eben in meiner Konsole erhalten:

fabian@ROSIS-PC:/media/Daten/Arduino/Neu$ sshpass -p 'mein_passwort;)' 
ssh -l pi 192.168.2.1 avrdude -P /dev/ttyACM0 -p m2560 -c stk500v2 -V -U 
flash:w:-:i < test.hex

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 
0.01s

avrdude: Device signature = 0x1e9801
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be 
performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "<stdin>"
avrdude: writing flash (262106 bytes):

Writing | ################################################## | 100% 
16.37s

avrdude: 262106 bytes of flash written

avrdude done.  Thank you.

fabian@ROSIS-PC:/media/Daten/Arduino/Neu$

Vielen Dank für eure Hilfe! Das Problem wäre damit gelöst!

von Spock (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.