Raspberry-PI als WLAN-Router für Ardumower (Idee)

nero76

Moderator
Hallo zusammen,

ich werde hier beschreiben hier wie man den Raspberry PI als Hilfsmittel verwenden kann um:
- Einen Arduino Mega/DUE über WLAN zu flashen (mit Weiterverwendung der Arduino IDE). Da dies über den "Native USB"-Anschluss passiert, geht der Flash-Vorgang besonders schnell vonstatten (wenige Sekunden).
- Die seriellen Ports des Arduino Mega/DUE über WLAN zu benutzen (z.B. Zugriff via Telnet)
- ihn als Webcam zu benutzen (über Web Browser)

Mit dieser Anleitung macht ihr also die USB-Ports des Arduino über das WLAN erreichbar (ggf. mit voller USB-Geschwindigkeit), erweitert ihn um Flashen über WLAN und um eine Webcam.

rasperry_flasher_overview.png


Im folgenden wird das ein- oder andere vermutl. zu knapp beschrieben - weitere Details baue ich bei entsprechender Anfrage hier ein.

1. Was wird benötigt:
- Raspberry PI (ich verwende den Raspberry B+) mit WLAN-Adapter (ich verwende einen "EDIMAX"), Kamera (ich verwende ein internes Kamera-Modul mit Fischauge - eine USB-Kamera nach UVC-Standard geht auch)
- Arduino Mega oder DUE (andere Arduinos sollten auch gehen, dann müssen aber Anpassungen erfolgen)
- PC (ich verwende Windows, Mac/Linux geht auch) im WLAN

2. Zunächst ein paar Grundlegende Tipps für den Umgang mit dem Raspberry PI:
2.1 Raspberry PI einrichten: Ich verwende als Betriebssystem "Raspbian 7 (wheezy)". https://jankarres.de/2012/08/raspberry-pi-raspbian-installieren/ http://www.raspberrypi-tutorials.de/erste_installation_raspbian.html https://www.elektronik-kompendium.de/sites/raspberry-pi/1906291.htm
2.2 Zugriff vom PC aus
Da wir uns nicht direkt vor den Raspberry setzen wollen, brauchen wir einen Fernzugriff. Entweder "Remote Desktop" oder "SSH" (verschlüsseltes Terminal).
Remote Desktop: https://www.datenreise.de/raspberry-pi-remote-desktop-xrdp-installieren/ und http://www.gieseke-buch.de/raspberr...emotedesktop-den-raspberry-pi-desktop-steuern
(sudo apt-get install tightvncserver; sudo apt-get install xrdp)
SSH: http://raspberrypiguide.de/howtos/ssh-zugriff-unter-raspbian-einrichten/
2.3 WLAN einrichten
Aus demselben Grund wie 2.2 brauchen wir das WLAN: https://www.elektronik-kompendium.de/sites/raspberry-pi/1912221.htm Ich nutze die Konfiguration über /etc/wpa_supplicant/wpa_supplicant.conf:
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
network={
ssid="The_ESSID"
psk="Your_wifi_password"
}
sudo ifdown wlan0; sudo ifup wlan0

Ihr solltet an dieser Stelle einen Raspberry haben den ihr über WLAN erreichen und fernsteuern könnt. Der Raspberry PI 3 hat ggf. Aussetzer/Verzögerungen im WLAN, gelöst wurde dies durch Deaktivierung des Power-Save vom WLAN ( sudo iwconfig wlan0 power off ) das wurde dann später in die rc.local eingestellt.

Das Terminal-Fenster des Raspberry solltet ihr schon mal geöffnet haben und Befehle darin ausprobiert haben. Dieses werden wir im folgenden des öfteren brauchen. Hier nur ein Beispiel um den Befehl "df" auszuführen welcher uns den freien Speicherplatz anzeigt. Ich verwende das Windows-Programm "PuTTY" (https://the.earth.li/~sgtatham/putty/latest/x86/putty-0.67-installer.msi), um mich mit dem Raspberry über SSH-Protokoll zu verbinden.

Die Default Login-Daten des Raspberry für SSH (Port 22) sind:
Host-Name: Legt ihr beim Einrichten des Raspberry fest (z.B. raspberrypi) - Tipp: bei meinem Raspberry PI 3 musste ich "raspberrypi.local" verwenden, "raspberrypi" reichte nicht
Login-Name: pi
Passwort: raspberry

putty.png


Ein paar Tipps für das Terminal:
* Mit CTRL+C könnt ihr ein laufendes Programm beenden
* Mit Pfeiltasten hoch/runter die letzten Eingaben wiederholen
* Mit TAB Autovervollständigung von Dateinamen
* Mit Maustaste Text im Terminal markieren, mit Linksklick in Zwischenablage (Windows) kopieren und umgekehrt mit Rechtsklick im Terminal wieder einfügen

2.4 SFTP (FTP über SSH)
Zum Kopieren von Dateien zwischen dem PC und dem Raspberry kann man das SFTP-Protokoll verwenden, z.B. mit dem Windows-Programm WinSCP (https://winscp.net).

Ich benutze zum Editieren von Raspberry-Dateien einen PC und dort den Editor "Notepad++" (https://notepad-plus-plus.org/) mit dem installierten Plugin "NppFTP". Damit kann man einfach Dateien am Rasperry vom PC aus editieren:
raspberry_remote_editor.png


Für beide Programme verwendet ihr folgende Einstellungen:
Host: IP bzw. Hostname des Raspberry
User: pi
Passwort: raspberry
Port: 22 (SSH-Port)

Tipp: Anstelle der IP-Adresse könnt ihr auch den Hostnamen verwenden. Der Hostname kann über den Befehl "hostname" auf dem Raspberry Terminal herausgefunden werden.

3. Raspberry als Webcam benutzen
Ich verwende das Programm "motion" - die Einrichtung ist hier beschrieben: https://willy-tech.de/motion-fur-den-raspberry-pi/
sudo nano /etc/default/motion und dort Dienst aktivieren (auf 'yes' stellen)

sudo nano /etc/motion/motion.conf und dort einstellen:
width 640
height 480
framerate 10
output_pictures off
ffmpeg_output_movies off
stream_motion off
stream_localhost off
stream_maxrate 10

Dann motion-Dienst starten: sudo /etc/init.d/motion restart

Für den PI2 und eine interne Kamera muss ggf. ein Firmware-Update erfolgen mit ("rpi-update") damit die Kamera funktioniert. Der Kameratreiber muss für motion auch installiert werden:
sudo apt-get -fym install v4l-utils motion
Testen kann man das ganze dann über
sudo modprobe bcm2835-v4l2
Wenn der Treiber nicht automatisch gestartet wird, muss man diesen in die /boot/config.txt (bzw. /etc/modules) eintragen.

Wenn alles richtig gemacht wurde, könnt ihr über den Web Browser auf die Kamera zugreifen (Tipp: Für meinen Raspberry PI3 musste ich eingeben "http://raspberrypi.local:8081"):
rasperry_webcam.png


Tipp: Anstelle der IP-Adresse könnt ihr auch den Hostnamen verwenden. Der Hostname kann über den Befehl "hostname" auf dem Raspberry Terminal herausgefunden werden.

4. Die seriellen Ports des Arduino DUE über WLAN benutzen
Wir benutzen das Linux-Programm "socat" um die seriellen Daten vom bzw. zum Arduino Due über TCP weiterzuleiten.

Zunächst 'socat' installieren. Am Raspberry eingeben:
sudo apt-get install socat

Mit folgendem Befehl könntest du bereits direkt einen Telnet-Server für die serielle Schnittstelle '/dev/ttyACM0' auf 115200 Baud aufmachen (mit CTRL+C kann abgebrochen werden):
socat TCP-LISTEN:8083,fork,reuseaddr FILE:/dev/ttyACM0,b115200,raw,echo=0

Nun das Python-Skript "flasher.py" im Anhang auf den Raspberry kopieren, startbar machen und ausführen.

Am Raspberry eingeben:
mkdir ardumower
cd ardumower
wget http://www.ardumower.de/media/kunena/attachments/905/uploader_flasher.zip unzip uploader_flasher.zip
chmod +x flasher.py
./flasher.py

flasher.png


Ab jetzt habt ihr einen Server auf TCP-Port 8083 welcher euch serielle Daten schickt bzw. auf serielle Daten wartet welche er dann zum Arduino Due schickt (je nachdem wie ihr das Skript konfiguriert, wahlweise zum Native-USB oder Programming USB):

Native-USB: /dev/ttyACM0
Programming-USB: /dev/ttyACM1

(beendet werden kann das Programm mit "CTRL+C")

Tipp: den seriellen Port (/dev/tty...) kannst du herausfinden, indem Du nach dem Einstecken des Arduinos den Befehl 'dmesg' eingibst.

Mit Hilfe eines Telnet-Programms (z.B. PuTTY für Windows) habt ihr so über WLAN Zugriff auf den seriellen Port des Arduino. Im Telnet-Programm legt ihr fest:
Host: IP bzw. Hostname des Raspberry
Port: 8083

Tipp: Anstelle der IP-Adresse könnt ihr auch den Hostnamen verwenden. Der Hostname kann über den Befehl "hostname" auf dem Raspberry Terminal herausgefunden werden.

5. Den Arduino Mega/DUE über WLAN flashen
Am PC wird hierfür das Python-Skript "uploader.py" gestartet welches ständig schaut ob die Arduino IDE eine neue Binary Datei generiert hat (z.B. getriggert durch CTRL+R in der Arduino IDE). Falls eine neue Binary-Datei gefunden wird, wird diese zum Raspberry geschickt (über TCP Port 8082) und dort das Arduino Tool "bossa" zum Flashen benutzt.

5.1 Boassa herunterladen und kompilieren (für Arduino DUE)
Zum Flashen des Due verwenden wir "bossa". Zur Installation am Rasperry eingeben:
wget https://github.com/shumatech/BOSSA/archive/master.zip unzip master.zip
cd BOSSA-master/
make bin/bossac
sudo cp bin/bossac /usr/bin

Zum Testen, "bossac" manuell einmal mit einer Binary-Datei starten. Wo die Arduino IDE eine passende Flash-Datei erstellt, könnt ihr erfahren indem ihr in der Arduino IDE unter "Datei->Voreinstellungen->Ausführliche Ausgaben während: Hochladen" aktiviert. Nun also bossac einmal testen:
bossac -i -p ttyACM0 -R -e -w -b flash.bin

5.2 Avrdude installieren (für Arduino Mega)
Zum Flashen des Mega verwenden wir "avrdude". Zur Installation am Terminal eingeben:
sudo apt-get install avrdude

Zum Testen, "avrdude" manuell einmal mit einer Binary-Datei ('ardumower.ino.hex') ausprobieren. Wo die Arduino IDE eine passende Flash-Datei erstellt, könnt ihr erfahren indem ihr in der Arduino IDE unter "Datei->Voreinstellungen->Ausführliche Ausgaben während: Hochladen" aktiviert. Nun also avrdude einmal testen:
avrdude -v -V -patmega2560 -cwiring -P/dev/ttyUSB0 -b115200 -D -Uflash:w:flash.bin:i

5.3 Die Optionen im Skript "flasher.py" anpassen, dann das Skript starten:
./flasher.py

5.4 Am PC: Python installieren https://www.python.org/downloads/ 5.5 Das Skript "uploader.py" im Anhang herunterladen, anpassen und ausführen:
In Eingabeaufforderung eingeben: python uploader.py
(beendet werden kann das Programm mit "CTRL+C")

Nun die Arduino IDE öffnen und einen Kompiliervorgang starten (CTRL+R). Wichtig: die Arduino IDE nicht beenden, damit das erstellte Binary nicht sofort wieder gelöscht wird.

raspberry_flasher.png


Links seht ihr wie das "uploader.py" Skript die geänderte Binary gefunden hat und zum Raspberry schickt. Rechts seht ihr wie der Raspberry die Datei auf den Due flasht.

5.6 Arduino über Web Interface flashen
Eine weitere Möglichkeit den Arduino mit dem Raspberry PI über WLAN zu flashen ist ein Web Interface, wo man die Flash-Datei auswählen und mit einem Button hochladen kann. Voraussetzung hierfür ist dass ihr Punkt 5.1 bzw. 5.2 gemacht habt (avrdude bzw. bossac bei euch läuft). Wir werden als nächstes den Apache-Server und PHP installieren:
sudo apt-get install php5

Jetzt sollte bereits ein HTTP-Server laufen auf Port 80. Über einen Web-Browser solltet ihr also bereits auf den PI zugreifen können (http://IP_des_PI:80). Die Standardseite (index.html) sollte entweder unter /var/www oder /var/www/html zu finden sein. Den genauen Ort müsst ihr nachsehen und für die nachfolgenden Schritte ggf. anpassen (immer dann wenn von /var/www die Rede ist bitte durch /var/www/html ersetzen wenn dies der Ort für eure Webseiten ist - ich gehe in den nachfolgenden Schritten und in dem noch folgendem PHP-Skript von /var/www aus).

Dann dem Apache-Benutzer (www-data) Rechte für die seriellen Schnittstellen geben:
sudo usermod -a -G dialout www-data
Damit es funktioniert, muss der Apache einmal neu gestartet werden:
sudo /etc/init.d/apache2 restart

Das PHP-Skript (index.php) im Anhang nach /var/www kopieren:
cd /var/www
sudo wget http://www.ardumower.de/media/kunena/attachments/905/index.zip sudo unzip index.zip

Das PHP-Skript ggf. von DOS-Format nach UNIX-Format konvertieren (zumindest Python mag CR+NL nicht):
sudo apt-get install dos2unix
sudo dos2unix index.php

PHP-Skript ggf. anpassen (Speichern mit CTRL+X und Y):
sudo nano index.php
Hier ein Beispiel wo die Optionen für einen AVR-Mega328 gesetzt wurden (die genauen Optionen für avrdude/boassac könnt ihr erfahren indem ihr in der Arduino IDE unter "Datei->Voreinstellungen->Ausführliche Ausgaben während: Hochladen" aktiviert):
index_settings.png


Eine bereits vorhandene Startseite (index.html) löschen:
sudo rm index.html

Ein Verzeichnis zum Upload (/var/www/uploads) erstellen.
sudo mkdir /var/www/uploads
Dem Apache-Benutzer (www-data) Schreib-Rechte für diesen Upload-Ordner geben:
sudo chmod o+w /var/www/uploads

Nun die Webseite aufrufen (http://IP_des_PI:80), Binary auswählen und zum Flashen hochladen ('ardumower.ino.hex'). Falles es nicht auf Anhieb klappen will könnt ihr die Apache-Fehlermeldungen wie folgt einsehen:
cat /var/log/apache2/error.log

webflasher.png


Tipp: die Arduino IDE nicht beenden damit das erstellte Binary nicht sofort wieder gelöscht wird.


5.7 Alle Dienste über Web Interface
Hierbei könnt ihr alle zuvor gennanten Dienste (Kamera, Flashen, Serial-TCP-Router) über ein Web Interface erreichen. Wichtig ist dass alle vorigen Punkte durchgeführt wurden (avrdude, bossac, socat, motion, apache2).

Die Datei im Anhang nach /var/www/html kopieren und entpacken:
cd /var/www/html
sudo wget http://www.ardumower.de/media/kunena/attachments/905/web.zip sudo unzip web.zip

Dem Benutzer www-data Rechte für sudo geben:
sudo nano /etc/sudoers

Und dort diese Zeile ergänzen:
www-data ALL=(ALL) NOPASSWD: ALL

Nun sollte das Web Interface erreichbar sein. Hier noch die Schritte damit Ardumower Azurit mit der ' pfodApp für PC ' funktioniert:
* in Ardumower-Datei 'drivers.h' die seriellen Ports für Bluetooth und Console tauschen (wir wollen pfodApp über serial ansprechen) und neu flashen
* Über das neue Web Interface Serial-TCP-Router für Baudrate (Azurit 19200) starten
* pfodApp für PC mit Processing öffnen, Parameter im Code einstellen (useTcp=true, tcpHost=Raspberry_IP) und starten


raspberry-pi-ardumower_2016-10-12.png



-Editierung wird auf Anfrage fortgesetzt-

Bestimmt klappt bei euch das ein- oder andere nicht wie beschrieben - bitte fragt dann hier (nicht festbeißen), so dass ich das Tutorial weiter verbessern und ausbauen kann :)
 
Cool !

Müsste das nicht auch dann über das Wlan Modul gehen nur ohne Kamera ?

Das würde für viele echt klasse sein, wenn Sie nicht Ihr Bord ausbauen müssten esp-link

Stefan
 
@Stefan,
damit bin ich schon am experimentieren.
Melde mich wenn ich da weiter bin. Montag ist ja Feiertag. ;)
Wobei das mit dem RPI schon sehr cool ist und auch ganz andere Möglichkeiten bietet.
Gruß
Stephan
 
Zum oben genannten esp-link: Ganz nett, aber es funktioniert nicht mit dem Arduino Due bzw. es könnte maximal den seriellen Port ("Programming USB") des Due verwenden, richtig? Mein Ziel war es über "Native USB" zu flashen, erst dann sind Flash-Zeiten (für das relativ große Ardumower-Sunray) im Sekunden-Bereich drin (ich gebe zu: ist aber nur für Entwickler wirklich interessant)

PS: Ich habe oben den Anhang aktualisiert - Man kann nun auch den Mega über WLAN flashen.


raspberry_mega_2016-10-02.png

Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/raspberry_mega_2016-10-02.png/
 
Zuletzt bearbeitet von einem Moderator:
AlexanderG schrieb:
Der nächste Schritte wäre z.B. aus dem Skript (flasher.py) einen Service (sog. Linux-Dämon) zu machen, so dass das Skript bei jedem Start des Raspberry gestartet wird: http://blog.scphillips.com/posts/20...o-run-in-the-background-as-a-service-on-boot/
Jemand Fit in Python und Linux Dämons? ;)

(PS: die Skripte werden weiter im ersten Beitrag aktualisiert)

Der Uploader läuft aber local auf deinem PC, es müsste also nur der flascher gestartet werden. Der würde dann abr jedesmal das flash.bin brennen, auch wenn es vorhanden war.
Besser fände ich es wenn nicht der flasher als daemon läuft, sonder z.B über eine HTML Seite aufgerufen wird, wo man die Datei hochlädt, diese dann gebrannt und danach gelöscht wird.

Wäre aber echt cool :)
Stefan
 
Zuletzt bearbeitet von einem Moderator:
Hallo Stefan,

schau mal oben im ersten Beitrag unter Punkt 5.6 (Arduino über Web Interface flashen) - habe das gerade ergänzt und war quasi eine Fingerübung ;-)

Gruss,
Alexander
 
Hallo Alexander,

so der Web-Uploader läuft prima. Meine Anpassungen von Deinem Skript laufen auch. Jetzt hat man schon zwei Möglichkeiten zu flashen. Mal sehen ich spiele mit dem Gedanken das so zu erweitern, dass ich sowohl den Mega/DUE auf der Main sowie BumperDuino und Freunde (SensorDuino) alles gleichzeitig am PI habe und so beliebig auf die Teilsysteme einwirken/programmieren kann. Das wird dann wohl wieder eine kleine Wochenendaktion. Auf jeden Fall macht das ganze richtig Spaß, mit der Kamera doppelt.

Gruß

Jürgen

Oberflaeche.jpg

Bild von der Umgebung bei zwei Bildschirmen IDE ist auf dem zweiten.

uploaderlauft.jpg

Bild nach flaschen 328p WEB über Browser

veraenderungenfuerdenmega328.jpg

Bild der Veränderungen bei mir für 328p
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2370/Oberflaeche.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Und noch ein Video welches zeigt wie komfortabel jetzt die Software-Entwicklung ablaufen kann: ich sitze im Büro, benutze die Arduino IDE, flashe den Due ein paar mal neu mit Software-Änderungen und teste den Roboter - alles über WLAN vom Büro aus (Video zeigt den geglückten Versuch des manuellen Andockens) .

https://www.youtube.com/watch?v=WxsdHD1lHQ4&feature=youtu.be
 
Hier ein einfaches Start script für den flasher.py auf dem Raspberry.


Code:
#!/bin/sh
# description: Start or stop the flash server
# Added by SM

### BEGIN INIT INFO
# Provides:             flasher.py
# Required-Start:       
# Required-Stop:        
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    FHEM server
### END INIT INFO


cd /home/pi/flasher



case "" in
'start')

        echo "Starting flasher..."


        python ./flasher.py &


        RETVAL=$?
        ;;
'stop')
        echo "Stopping flasher..."


        pkill -U root python
        RETVAL=$?
        ;;

*)
        echo "Usage: ___SNIPPET___ { start | stop  }"
        RETVAL=1
        ;;
esac
exit $RETVAL



als flasher speichern.
nach /etc/init.d kopieren und ausführbar machen.

einen link nach /etc/rc5.d als S99flash setzen

kann auch manuell mit start / stop gestartet oder beendet werden.

Stefan
 
Auf dem Raspberry muss noch für die Programmierung über das web Frontend die rechte gesetzt werden, damit der avrdude auf den usb port zugreifen kann.

sudo usermod -aG dialout www-data

Stefan
 
Hi.

Congratulation I follow your tuto with Google translate
For the moment expect the uppercase and space add by Google translate in command line all is OK.
I use a Raspberry 3 and need to use the Ip adress of the PI everytime instead of Hostname (Maybe Windows 10 or my routeur).

but i need help with Arduino Ide and Mega Board.
I can't find the file i need to download
you write or more precise 'Google translate'

For testing, try "avrdude" manually once with a binary file (flash.bin). Where the Arduino IDE creates a suitable Flash file, you can find it in the Arduino IDE under "File-> Preferences-> Detailed output during: Upload" activated. So now avrdude once test:

But i can't find a .bin file.

Here print screen when ide compile

flasharduinomega.jpg


and the folder

dossierflasharduinomega.jpg



Which file did i choose ??

Thanks for your help
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/3545/flasharduinomega.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Es gibt nun ein Web-Interface (Punkt 5.7 Alle Dienste über Web Interface, in der Beschreibung im ersten Beitrag oben) womit alle Dienste (Kamera, Flashen, Serial-TCP-Router/pfodApp) über eben dieses Web Interface erreichbar sind.
 
Hallo Alex,


Code:
Dem Benutzer www-data Rechte für sudo geben:
sudo nano /etc/sudoers

Und dort diese Zeile ergänzen:
www-data ALL=(ALL) NOPASSWD: ALL


Das ist ein Sicherheitsrisiko, da damit jeder der auf das Web Interface zugreifen kann Root rechte ohne Password erhält.

Besser währe es, entweder die Entsprechenden Programme der Gruppe www-data zuzuardnen oder dem Benutzer www-data die Rechte für die Gruppe zuzuordnen.

Es geht bestimmt um den Zugriff auf den USB Port. Das kannst mit

"sudo usermod -aG dialout www-data"

erreichen.
Dadurch darf das Webfrontend auf die Gruppe Dialout zugreifen und dazu gehört der USB Port.

Stefan
 
Ja, es geht um die WLAN-Konfiguration (Änderung von Dateien über sudo, Ausführen von killall und noch einige weitere Kommandos welche root-Rechte benötigen) - Das ganze Ding ist sowieso (noch) ein Sicherheitsrisiko da jeder der sich im selben Netz befindet Zugriff auf den Mäher, die Kamera, das Flashen etc. bekommt. Sinnvoll wäre wohl auch ein Login.
 
Oben