Elinux Remote

H. Högl, April 2021

"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 Bilde grösser)

A B

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   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).

http://hhoegl.informatik.hs-augsburg.de/elinux/remote/elinux-remote-schema.png

Die Abbildung zeigt nur ein BBB/ERC am Server. Beim aktuellen Aufbau sind zwei solcher (gestrichelten) Einheiten angeschlossen.

BBB1

hostname     beaglebone1
eth-bbb      rt-bbb-elinux-1.informatik.hs-augsburg.de (141.82.48.186)
pwd          debian / elin21BB und root / elin21root
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 (141.82.48.187)
pwd          debian / elin21BB und root / elin21root
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.

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://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/boardserver_bbb

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://r-n-d.informatik.hs-augsburg.de:8080/michael.schaeferling/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

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

ElinuxRemote (last edited 2021-06-08 08:47:17 by HubertHoegl)