Home

Basisinstallation Software

Die Schüler-Roboter Softwareinstallation

Der Roboter nutzt einen Raspberry Pi 3 Model B als Herzstück. Das Standard-Betriebssystem für den Raspberry Pi ist Raspbian. Es gibt aber auch Alternativen. Beispielsweise bietet Dexter Industries für den GoPiGo3 DexterOS, Raspbian for Robots und Cinch an. DexterOS ist leicht zu benutzen und zu updaten, beinhaltet eine Scratch-ähnliche Umgebung namens Bloxter (Onlineversion) und eine Entwicklungsumgebung für Python. DexterOS ist Closed Source und nicht erweiterbar - kein freier Zugriff auf das Dateisystem, keine Installation eigener Software. Raspbian for Robots basiert auf Raspbian, mit zusätzlicher Software von Dexter Industries. Cinch soll das Erstellen eines Wi-Fi Access Points ermöglichen.

Für die Experimente mit dem Schüler-Roboter wird eine eigene Softwareinstallation benutzt:

Wer es einfach mag, nutzt ein vorhandenes Kartenimage und muss sich um die Details der Installation und Konfiguration nicht kümmern. Siehe Kapitel SD Karte initial beschreiben und Mit Roboter verbinden. Gruppenleiter sollten ausserdem Installation anpassen und Installation zurücksetzen lesen. In SD Karte aktualisieren ist beschrieben, wie die Installation ohne das Entfernen der SD Karte aktualisiert werden kann. SD Kartenimage erstellen ist für die Maintainer des Kartenimages und technisch Interessierte gedacht.

SD Karte initial beschreiben

Um die SD Karte im GoPiGo3 zu wechseln, müssen mehrere Kabel entfernt werden. Das ist mühsam und tut den Steckverbindern auch nicht gut. Deshalb versuchen wir die Karte so selten wie möglich zu wechseln. Am Besten du beschreibst die Karte vor dem Bau des Roboters und steckst sie in den Raspberry Pi. Spätere Aktualisierungen von RaspbianForStudentRobot sind in der Regel ohne das Entfernen der Karte möglich.

Zum initialen Beschreiben der SD Karte brauchst du einen weiteren Computer mit SD Kartenleser, z.B. einen Windows Laptop. Die physische Kartengröße muss microSD sein, denn nur diese akzeptiert der Raspberry Pi 3 Model B. Wir empfehlen eine Kapazität von 32 GB. Häufig werden microSD Karten mit einem Adapter verkauft. Mit diesem können sie in einem Computer genutzt werden, der nur die SD Größe unterstützt.

Die SD Karte muss eine Partition haben und diese muss mit FAT32 formatiert sein. Das ist bei neue gekauften Karten in der Regel bereits der Fall. Ansonsten kann das mit Betriebssystem Boardmitteln erreicht werden, oder du nutzt den SD Memory Card Formatter der SD Association.

RaspbianForStudentRobot liegt als zip Datei vor. Den Inhalt der Datei musst du auf die SD Karte kopieren.

Dann stecke die Karte in den Raspberry Pi und baue den Roboter fertig zusammen.

Ist der Roboter fertig zusammengebaut, die Kamera, der Servo, der Abstandssensor und der Wi-Fi Adapter installiert, kannst du den Roboter erstmalig starten. Das machst du, indem du die Power Taste (rechts hinten am GoPiGo3 Board) drückst. Beim ersten Start wird das Betriebssystem automatisch installiert und dann gestartet. Während dieses Vorgangs blinkt die grüne LED neben der Power Taste. Die kleine grüne LED neben dem mini-USB Anschluss blinkt bei Lese- und Schreiboperationen auf der SD Karte. Die Zeitdauer für die Installation hängt von der Geschwindigkeit der SD Karte ab. Bei einer 32 GB Samsung EVO Plus dauert die Installation etwa 12 Minuten. Die Installation ist abgeschlossen und das Betriebssystem gestartet, wenn die LED neben der Power Taste ständig grün leuchtet. Jetzt kannst du dich mit dem Roboter verbinden - siehe unten.

Mit Roboter verbinden

Roboter ausschalten

SD Karte aktualisieren

Eine neue Version von RaspbianForStudentRobot kann ohne das Entfernen der SD Karte aus dem Raspberry Pi installiert werden. Die notwendigen Schritte werden hier beschrieben. Wen das Entfernen der SD Karte nicht stört kann alternativ den Schritten in SD Karte initial beschreiben folgen.

In der NOOBS Partition liegen die Installationsdateien für RaspbianForStudentRobot. Diese soll aktualisiert werden. Die Installation selber wird bei diesem Prozess nicht verändert. Erst beim nächsten Zurücksetzen der Installation werden die neuen Installationsdateien benutzt. NOOBS wird bei diesem Prozess nicht aktualisiert.

Als Quelle für das Image wird ein SMB Share angenommen.

sudo mkdir /mnt/transfer
sudo mount -r -t cifs -o user=<username> //<fileserver>/<folder> /mnt/transfer

sudo mkdir /mnt/noobs
sudo mount /dev/mmcblk0p1 /mnt/noobs

sudo rm -r /mnt/noobs/os/*

sudo unzip /mnt/transfer/<image>.zip os/* -x os/.placeholder -d /mnt/noobs/

sudo umount /mnt/transfer
sudo rmdir /mnt/transfer

sudo umount /mnt/noobs
sudo rmdir /mnt/noobs

Siehe Kapitel Installation zurücksetzen zum Installieren des neuen Images.

Installation zurücksetzen

Die vorhandene Installation wird gelöscht und neu aufgesetzt. Alle gespeicherten Daten gehen dabei vorloren. Das ist hilfreich, wenn der Roboter von mehreren Personen genutzt wird und Änderungen des Vorgängers entfernt werden sollen, oder wenn eine neue Version installiert werden soll. Wichtige Dateien bitte vorher sichern.

Wird die u.g. Datei gelöscht, wird der NOOBS Installer beim Neustart automatisch das Image neu installieren und dann die Installation booten.

sudo rm /media/pi/SETTINGS/installed_os.json
sudo shutdown -r now

Die Zeitdauer für die Installation hängt von der Geschwindigkeit der SD Karte ab. Bei einer 32 GB Sandisk dauert die Installation etwa 15 Minuten. Der Vorgang ist abgeschlossen, wenn die Schreib LED (grün) aus bleibt.

Achtung beim ersten Verbinden: Hostname und Passwort wurden bei der Installation auch zurückgesetzt. Siehe Kapitel Mit Roboter verbinden für Voreinstellungen.

Installation anpassen

TODO

sudo nano /etc/hostapd/hostapd.conf

Zeile ssid ändern.

ssid=student-robot1
sudo nano /etc/dnsmasq.conf

Zeile address ändern.

address=/student-robot1.home/192.168.42.1
sudo raspi-config

SD Kartenimage erstellen

Wer sich nicht mit den Details der Installation herumschlagen möchte nimmt ein vorhandenes Kartenimage (siehe SD Karte initial beschreiben) und kann diesen Abschnitt ignorieren. :-)

Kopieren von NOOBS und Raspbian auf die SD Karte

Die folgenden Schritte auf einem anderen Rechner als dem Raspberry Pi ausführen (z.B. einem Windows Laptop). Der Rechner muss auf die SD Karte schreiben können.

NOOBS (nicht NOOBS Lite) von https://www.raspberrypi.org/downloads/noobs/ herunterladen, z.B. NOOBS_v2_8_2.zip.

SHA-256 kontrollieren.

Zip Datei entpacken. Der Inhalt wird in den nächsten Schritten modifiziert und dann auf eine SD Karte geschrieben.

Parameter ` silentinstall` an die Parameterliste in recovery.cmdline anhängen. Dieser Parameter wird für die initiale headless Installation und bei Updates benötigt. Ist bereits ein Betriebssystem installiert, wird NOOBS kein silentinstall durchführen. Damit kann der Parameter immer in der Datei bleiben.

Eine leere Datei ssh erstellen. Die Datei liegt im gleichen Verzeichnis wie recovery.cmdline. Die Datei wird beim Partitionsetup in die boot Partition kopiert und sorgt beim Boot Vorgang dafür, dass der ssh Server gestartet wird und man sich somit remote anmelden kann.

In Verzeichnis os/ alle Betriebssysteme ausser Raspbian löschen (z.B. LibreELEC_RPi, LibreELEC_RPi2).

Eine große Datei .placeholder (Datei in zip) in das Verzeichnis os/ legen. Die Datei dient dazu, Platz in der ersten Partition zu reservieren. Dadurch können später auch größere Updates installiert werden.

microSD Karte mit mindestens 8 GB mit einer Partition und FAT32 formatieren.

Dateien auf die Karte kopieren.

Die lokalen Dateien behalten. Wir brauchen sie später bei der Erstellung des Images.

Raspbian konfigurieren

SD Karte in den Raspberry Pi des GoPiGo3 stecken.

Ethernet Netzwerkkabel in den Raspberry Pi stecken.

Der Raspberry Pi/GoPiGo3 wird während der Softwareinstallation vorzugsweise über den USB Anschluss mit Strom versorgt. Die Akkus können entfernt werden.

Raspberry Pi anschalten (durch Einstecken des USB Kabels). Die Power LED des GoPiGo3 wird erst dann korrekt über An/Aus und Batteriezustand informieren, wenn die entsprechende Software installiert wurde.

Der Raspberry Pi installiert und bootet selbständig Raspbian. Die Zeitdauer für die Installation hängt von der Geschwindigkeit der SD Karte ab. Bei einer 32GB Sandisk dauert die Installation etwa 15 Minuten. Der Vorgang ist abgeschlossen, wenn die Schreib LED (grün) aus bleibt.

Netzwerkadresse ermitteln

Mit Raspberry Pi über ssh verbinden. Nutzername/Passwort sind pi/raspberry.

Passwort ändern.

passwd

raspberry, 2x myr0bot

Raspbian aktualisieren, reboot wenn notwendig.

sudo apt update
sudo apt upgrade
[ -f /var/run/reboot-required ] && sudo shutdown -r now

Konfiguration mit raspi-config

sudo raspi-config

Samba installieren. Damit kann auf Verzeichnisse zugegriffen werden, und Windows Clients finden den Raspberry Pi mit dem Namen.

sudo apt install samba

Nutzer pi hinzufügen

sudo smbpasswd -a pi

2x myr0bot

Samba Konfiguration anpassen

sudo nano /etc/samba/smb.conf

Im Bereich [homes] folgende Parameter ändern:

read only = yes ändern in

   read only = no

create mask = 0700 ändern in

   create mask = 0644

directory mask = 0700 ändern in

   directory mask = 0755

Am Ende der Datei folgendes Share hinzufügen

[root]
   comment = root
   path = /
   read only = yes
   valid users = pi

Parameter überprüfen

testparm

Samba neu starten

sudo systemctl restart smbd
sudo systemctl restart nmbd

ll in der bash erlauben

nano .bashrc

Bei den ls aliases hinzufügen. Änderung gilt erst für die nächste bash session.

alias ll='ls -laF'

Midnight Commander (ein textbasierter Dateimanager) installieren.

sudo apt install mc

Feste Namen den Wi-Fi Adaptern zuweisen.

Nach dem Einstecken des USB WLAN Adapters hat der Raspberry Pi zwei WLAN Schnittstellen. Diese heissen wlan0 und wlan1. Welche Schnittstelle welchen Namen bekommt ist zufällig und kann sich zwischen Neustarts ändern. Damit lässt sich kein Access Point aufsetzen oder Firewall Regeln definieren. Die Predictable Network Interface Names sind nur bedingt hilfreich. Beim Raspberry Pi bekommt der USB WLAN Adapter damit eine ID, die seine MAC Adresse beinhaltet. Das macht die Konfiguration aufwendiger, wenn das gleiche SD Kartenimage für mehrere Raspberries benutzt werden soll. Schlimmer noch: das interne WLAN ist manchmal wlan0, manchmal wlan1. Folgende Änderungen erzwingen den namen wlan0 für das interne WLAN und wlan1 für einen USB Adapter. Nur ein WLAN USB Adapter darf gleichzeitig benutzt werden.

Neue Datei anlegen

sudo nano /etc/udev/rules.d/72-wlan-geo-dependent.rules

Als Inhalt einfügen

#
# +---------------+
# | wlan1 | wlan1 |
# +-------+-------+
# | wlan1 | wlan1 |
# +---------------+ (RPI USB ports with position independent device names for a maximum of 1 optional wifi dongle)
# 
# | wlan0 | (onboard wifi)
#
ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="sdio", KERNELS=="mmc1:0001:1", NAME="wlan0"
ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1.2",       NAME="wlan1"
ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1.4",       NAME="wlan1"
ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1.3",       NAME="wlan1"
ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1.5",       NAME="wlan1"

Neu starten

sudo shutdown -r now

Zuweisung der Gerätenamen kontrollieren

ifconfig

wlan0 sollte jetzt der interne WLAN Adapter sein, wlan1 der USB Adapter, eth0 das Ethernet Kabel und lo das Loopback Device.

Access Point, DHCP und DNS Server installieren

Dnsmasq (DHCP und DNS Server) und hostapd (Access Point Software) installieren.

sudo apt-get install dnsmasq hostapd

Services stoppen, bis wir mit der Konfiguration fertig sind.

sudo systemctl stop dnsmasq
sudo systemctl stop hostapd

Der interne WLAN Adapter (wlan0) wird als Access Point genutzt. Ihm wird eine statische IP Adresse zugewiesen.

sudo nano /etc/dhcpcd.conf

Am Ende der Datei einfügen

interface wlan0
    static ip_address=192.168.42.1/24

Dhcpcd neu starten.

sudo systemctl restart dhcpcd

Dnsmasq konfigurieren

sudo nano /etc/dnsmasq.conf

Am Ende der Datei einfügen

interface=wlan0

dhcp-range=192.168.42.100,192.168.42.200,1h

no-hosts
address=/student-robot.home/192.168.42.1

Neue Konfigurationsdatei für hostapd erstellen

sudo nano /etc/hostapd/hostapd.conf

Als Inhalt einfügen

interface=wlan0
driver=nl80211
ssid=student-robot
hw_mode=g
#country_code=DE
# non-overlapping channels: 1, 6, 11
channel=1
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=changeitnow
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

Position der Konfigurationsdatei festlegen

sudo nano /etc/default/hostapd

Zeile #DAEMON_CONF=”” ändern in

DAEMON_CONF="/etc/hostapd/hostapd.conf"

Services starten

sudo systemctl start hostapd
sudo systemctl start dnsmasq

IP-Forwarding aktivieren

sudo nano /etc/sysctl.conf

Ändere Zeile #net.ipv4.ip_forward=1 in

net.ipv4.ip_forward=1

Masquerate für ausgehende Verbindungen auf eth0 und wlan1.

sudo nano /etc/rc.local

Vor exit 0 einfügen

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE

Wpa_supplicant soll nur wlan1 steuern (nicht aber den Access Point wlan0).

sudo mv /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant-wlan1.conf

Reboot

sudo shutdown -r now

GoPiGo3 Software installieren

GoPiGo3 Software installieren und Reboot. Die Software beinhaltet u.a. einen Service für die GoPiGo3 Power LED und den Power Schalter, sowie Python Bibliotheken für GoPiGo3 Hardware.

curl -L https://dexterindustries.com/update_gopigo3 | bash
sudo shutdown -r now

DI_Sensors installieren - wird für den Abstandssensor benötigt.

curl -L https://dexterindustries.com/update_sensors | bash

GoPiGo Scratch Erweiterung installieren

Die Erweiterung installieren.

git clone https://github.com/markokimpel/gopigoscratchextension.git ~/student-robot.org/gopigoscratchextension/

Zur Vorbereitung des Tests Raspberry Pi runterfahren.

sudo shutdown -h now

Warten bis grüne LED nicht mehr leuchtet. Dann USB Stromversorgung entfernen.

Ethernetkabel entfernen.

Installation testen

Partitionen sichern

Ethernetkabel mit Raspberry Pi verbinden.

Stromversorgung vorzugsweise über USB Port. Die Akkus können entfernt werden.

Nicht benötigte Pakete entfernen, ggf. Reboot.

sudo apt autoremove
[ -f /var/run/reboot-required ] && sudo shutdown -r now

Die Partitionen werden mit bsdtar gesichert.

sudo apt install bsdtar

Die Archive müssen ausserhalb der zu sichernden Partition gespeichert werden, z.B. auf einem SMB Share.

sudo mkdir /mnt/transfer
sudo mount -t cifs -o user=<username> //<fileserver>/<folder> /mnt/transfer

Boot Partition mit bsdtar sichern.

Die Datei cmdline.txt beziehen wir vom Originalarchiv in der NOOBS Partition. Sie wurde während der Installation verändert. Die Datei os_config.json wird während der Installation erzeugt und muss deshalb nicht gesichert werden. Die Datei config.txt enthält Informationen zur Aktivierung der Kamera, der Schnittstellen SPI und I2C, sowie die voreingestellt Bildschirmauflösung.

sudo bsdtar --numeric-owner --format gnutar -cpvf /mnt/transfer/boot.tar -C /boot --exclude ./cmdline.txt --exclude ./os_config.json .

sudo mkdir /mnt/noobs
sudo mount -r /dev/mmcblk0p1 /mnt/noobs

cd ~
cp /mnt/noobs/os/Raspbian/boot.tar.xz boot.tar.xz
unxz boot.tar.xz
sudo bsdtar --numeric-owner --format gnutar -rpvf /mnt/transfer/boot.tar --include ./cmdline.txt @boot.tar
rm boot.tar

sudo umount /mnt/noobs
sudo rmdir /mnt/noobs

Root Partition mit bsdtar sichern.

sudo bsdtar --numeric-owner --format gnutar --one-file-system -cpvf /mnt/transfer/root.tar -C / .

TODO: Dateien/Verzeichnisse ausschliessen

Während der Ausführung von bsdtar in der Root Partition werden die folgenden Fehlermeldungen auf stderr ausgegeben. Sie können ignoriert werden.

Das SMB Share wieder entfernen.

sudo umount /mnt/transfer
sudo rmdir /mnt/transfer

Das Komprimieren geht am schnellsten, wenn eine schnelle CPU mit mehreren Kernen und viel Speicher zur Verfügung stehen. Das geht ausserhalb des Raspberry Pis am besten. Neuere Versionen von xz unterstützen die Option -T 0. Damit werden mehrere Ausführungs-Threads genutzt.

xz -k -9 -e -T 0 boot.tar
xz -k -9 -e -T 0 root.tar

Partitionen in NOOBS integrieren

Jetzt wird das ausgepackte NOOBS Image aus dem ersten Schritt weiter modifiziert.

Verzeichnis os/Raspbian/ in os/RaspbianForStudentRobot/ umbenennen.

Die folgenden Änderungen erfolgen im Verzeichnis os/RaspbianForStudentRobot/.

Beim Editieren von Textdateien auf Unix Zeilenendungen achten.

Datei os.json anpassen. Neuer Inhalt:

{
    "description": "Raspbian with modifications for the Student-Robot",
    "kernel": "4.14",
    "name": "RaspbianForStudentRobot",
    "password": "myr0bot",
    "release_date": "2018-08-15",
    "supported_models": [
        "Pi 3"
    ],
    "url": "https://www.student-robot.org/",
    "username": "pi",
    "version": "stretch"
}

In Datei partitions.json for partition root folgende Werte anpassen:

Datei Raspbian.png in RaspbianForStudentRobot.png umbenennen.

Datei README.txt dem Verzeichnis hinzufügen.

Datei boot.tar.xz durch die oben erzeugte Version ersetzen. Datei root.tar.xz durch die oben erzeugte Version ersetzen.

Das gesamte NOOBS Verzeichnis in ein zip, z.B. RaspbianForStudentRobot_2018-08-15.zip, einpacken. Dateien wie recovery.cmdline liegen direkt im Wurzelverzeichnis.

Glückwunsch, du hast ein neues SD Kartenimage erzeugt. Dieses kann nun wie in SD Karte initial beschreiben und SD Karte aktualisieren beschrieben genutzt werden.

Referenzen

Copyright 2018 Marko Kimpel

Licensed under the GNU General Public License version 3, or (at your option) any later version.