1 Elinux Remote¶
H. Högl, 2021, 2022
„Elinux Remote“ ist ein Server, der im G2.16 steht. Mit dem Server sind zwei Beagle Bone Black Boards (BBB) verbunden. Man kann sich mit seinen RZ Zugangsdaten von zu Hause aus mit ssh einloggen, dazu muss aber vorher eine VPN Verbindung aufgebaut werden:
$ ssh elinux-remote.informatik.hs-augsburg.de
Alternativ kann man sich (ohne VPN) zunächst per ssh mit dem RZ Rechner login.hs-augsburg.de
verbinden und von dort dann eine zweite SSH Verbindung zum elinux-remote Rechner aufmachen.
Hier sieht man, wie der Aufbau aussieht (beim Draufklicken werden die Bilder grösser)
Der Rechner ist ein Intel Xeon E3-1220 4-core v3 @ 3.10GHz
(siehe cat /proc/cpuinfo
) mit 32 GByte RAM.
Er sollte also von der Rechenleistung her auch für grössere Kompilierarbeiten geeignet sein. Aber Vorsicht: Wer viel kompilieren möchte, sollte das nicht im Homeverzeichnis machen! Da dies mittels NFS vom Rechenzentrum gemountet ist, geht der Dateizugriff vor allem wenn man viele kleine Dateien hat ziemlich langsam. Am besten man erledigt diese Sachen auf der sehr schnellen internen Platte, z.B. in /tmp
(wird aber beim Booten gelöscht!). Besser ist es
in den Arbeitsbereichen /home/elinux_work
und /home/elinux_work2
zu arbeiten.
1.1 Blockschaltbild¶
Das Blockschaltbild sieht wie folgt aus. Einige GPIO Leitungen des Beagle Board können über einen „Embedded Remote Controller“ (ERC) angesteuert werden. Der ERC ist mit einem ESP8266 Board („NodeMCU“) realisiert worden. Der ERC kann dazu vom PC aus über eine serielle Schnittstelle Kommandos erhalten (ser-erc). Die Konsole des Beagle Bone ist über eine serielle Schnittstelle mit dem PC verbunden (ser-console). Das Beagle Board ist ausserdem über ein Ethernet-Kabel an das Intranet der Hochschule angeschlossen (eth-bbb).
Die Abbildung zeigt nur ein BBB/ERC am Server. Beim aktuellen Aufbau sind zwei solcher (gestrichelten) Einheiten angeschlossen. Im März 2022 wurde eine Änderung bei der Netzwerkverkabelung gemacht. Der PC hat nun eine zweite Netzwerkschnittstelle, die in ein unabhängiges Labor-Netz (RT-Labor-Netz 10.10.0.0/24) geht. An den Router für das Labor-Netz sind die Ethernet Schnittstellen der Beaglebones angeschlossen.
BBB1
hostname beaglebone1
eth-bbb rt-bbb-elinux-1.informatik.hs-augsburg.de (10.10.0.221 via DHCP vom Router)
pwd debian / elin216BB und root / elin216root
ser-console /dev/rtlab/tty_elinux-001 (115200 Baud)
ser-erc /dev/rtlab/tty_erc_0005
WebCam http://elinux-remote.informatik.hs-augsburg.de:8091 (VPN)
BBB2
hostname beaglebone2
eth-bbb rt-bbb-elinux-2.informatik.hs-augsburg.de (10.10.0.222 via DHCP vom Router)
pwd debian / elin216BB und root / elin216root
ser-console /dev/rtlab/tty_elinux-002 (115200 Baud)
ser-erc /dev/rtlab/tty_erc_0006
WebCam http://elinux-remote.informatik.hs-augsburg.de:8092 (VPN)
Die Webcam kann über VPN z.B. mit vlc
betrachtet werden (vlc <URL>
).
Achtung Zum Zugreifen auf die Boards soll man immer mit dem Boardserver arbeiten. Das ist das bbb Programm im nächsten Abschnitt.
1.2 Boardserver¶
Der Zugriff auf die Boards wird elementar von einem „Boardserver“ gesteuert. Der Boardserver übernimmt die Reservierung und beendet nach abgelaufener Zeit alle Prozesse.
Usage: bbb [opts] [args]
Options:
-h, --help this help
--check check for board server running and board reservation
--reserve reserve board
--free free board
--erc=BS_ERC io operation with embedded remote controller (--bs-erc
reset|power|leds|buttons|buttons=4|buttons=12|buttons=0xf
Bye.
Beispiele:
$ bbb --check
$ bbb --reserve
$ bbb --check
Board server running
Board 0 reserved for user hhoegl
Usage time: 5/30 min
Board Access (use VPN!):
- BBB console: /dev/rtlab/tty_elinux-001
- Webcam (Video Stream): http://elinux-remote.informatik.hs-augsburg.de:8091
$ bbb --erc buttons
{'buttons': 8, 'error': False, 'leds': 1} # gibt buttons und leds zurueck
$ bbb --erc leds
{'buttons': 8, 'error': False, 'leds': 0} # gibt buttons und leds zurueck
$ bbb --erc buttons=0xa
{'buttons': 10, 'error': False, 'leds': 0}
$ bbb --erc reset # Board neu starten
$ bbb --free
Nachdem die maximale Zeit abgelaufen ist, oder nach einem –free, werden die Prozesse abgeschossen, welche auf die seriellen Schnittstellen ser-console und ser-erc zugreifen. Eine ssh Verbindung zum BBB über eth-bbb wird nicht beendet.
Der Quelltext:
https://gitlab.informatik.hs-augsburg.de/hhoegl/boardserver_bbb
1.3 Embedded Remote Controller¶
Mit dem ERC muss man normalerweise nicht direkt kommunizieren. Die wichtigsten Kommandos für den ERC sind in den Boardserver (bbb) eingebaut.
Der Code ist auf Gitlab:
https://gitlab.informatik.hs-augsburg.de/domokun/embedded-remote-controller
In der README.md Datei steht, wie man auf den ERC über die serielle Schnittstelle zugreift.
Eine Besonderheit ist, dass zum Abschluss der Zeilen ein \n
(LF, 0x0A) erwartet wird, auch
bei der Ausgabe wird LF verwendet. Man muss picocom
wie folgt starten, damit man die Ausgabe sieht:
$ picocom -b 115200 /dev/rtlab/tty_erc_0006 -c --omap=crlf --imap=lfcrlf
Es gibt keinen Prompt, man gibt einfach das Kommando ein, z.B. INFO und erhält dann die Ausgabe:
INFO
INFO: ERC (Embedded-Remote-Controller), rev=0.3, debug_msg=0, rst_active=0, pwr_active=0, btn_inv=1
1.4 Testskripte auf BBB¶
pin_all_off.sh
#!/bin/bash
cd /sys/class/gpio/
echo out > gpio44/direction
echo out > gpio45/direction
echo out > gpio46/direction
echo out > gpio47/direction
echo 0 > gpio44/value
echo 0 > gpio45/value
echo 0 > gpio46/value
echo 0 > gpio47/value
pin_test_passthrough.sh
#!/bin/bash
cd /sys/class/gpio/
echo in > gpio66/direction
echo in > gpio67/direction
echo in > gpio68/direction
echo in > gpio69/direction
echo out > gpio44/direction
echo out > gpio45/direction
echo out > gpio46/direction
echo out > gpio47/direction
while true
do
cat gpio66/value > gpio44/value
cat gpio67/value > gpio45/value
cat gpio68/value > gpio46/value
cat gpio69/value > gpio47/value
done
led_loop (Python)
#!/usr/bin/env python3
# H. Hoegl, 2021-04-19
import os, time
GPIOSTR = "echo {val} > /sys/class/gpio/gpio{nr}/{op}"
if __name__ == "__main__":
os.system(GPIOSTR.format(val="out", nr="44", op="direction" ))
n = 0
while True:
print("loop", n)
os.system(GPIOSTR.format(val="1", nr="44", op="value"))
time.sleep(1)
os.system(GPIOSTR.format(val="0", nr="44", op="value"))
time.sleep(1)
n += 1