Samstag, 12. Januar 2019

Odroid XU4Q mit Akku/Batterie betreiben

Im Rahmen meines Roboter-Projektes muss der Odroid per Batterie bzw. Akku mit Strom versorgt werden. Laut offizieller Spezifikation benötigt der Odroid 5V DC mit 4A zum stabilen Betrieb. Rechnerisch entspricht dies einer Leistung von 20W.

Es gibt keine Akkus oder Batterien, welche direkt 5V liefern. In Reihe geschaltete Alkali-Mangan-Zellen (z.B. der gute Alte 9V Block) liefern nur Spannungen welche ein ganzzahliges Vielfaches von 1,5V darstellen. Die im Modellbau verbreiteten Lithium-Polymer(LiPo)-Akkus liefern hingegen ganzzahlig vielfache Spannungen von 3,7V, also 3,7V, 7,4V, 11,1V usw. Es gibt zwar USB-Powerbanks, welche sehr genau 5V als Ausgangsspannung liefern, aber der maximale Strom liegt bei nur 2A.

Es führt kein Weg daran vorbei eine Stromversorgung aus einem passenden DC-DC-Wandler und einer passenden Batterie selber zusammenzustellen.

Aus dem Modellbau habe ich schon Turningy 3S, 2200mAh LiPo-Akkus vorliegen. Diese liefern 11,1V (tatsächlich über 12V, wenn vollaufgeladen) und einen maximalen Strom von etwa 44-50A (je nach Discharge-Rating 20C-25C). Diese Akkus können aufjedenfall ausreichend Strom liefern, um den Odroid zu speisen.
Als DC-DC-Wandler habe ich mir bei Ebay einen Stepdown-Wandler mit 10A max Strom und Eingangsspannungsbereich 6,5-60V und Ausgangsspannungsbereich 1,5-30V für ca. 7€ gekauft.
DC-DC Stepdown-Wandler, 10A, Uin=6,5V-60V; Uout= 1,5V-30V


Zunächst habe ich ein Labornetzteil an den Eingang des DC-DC-Wandlers geschlossen und mit 12V betrieben. Der Odroid wurde an den Ausgang des DC-DC-Wandlers geschlossen. So konnte ich den Odroid mit angestecktem WLan-Stick, USB-Webcam und Tastatur problemlos booten und betreiben.
Im Bootvorgang konnte ich den Odroid am Labornetzteil teilweise 1,5A ziehen sehen, d.h. 18W (dies kommt sehr nahe an die 20W aus den offiziellen Odroid-Spezifikationen).
Im normalen Betrieb zog der Odroid im Mittel etwa 0,7A, d.h. etwa 8-9W. Wenn man die CPU richtig quält, so kann der Strom aber durchaus 1,2A überschreiten, also 15W.

Nach diesem Testlauf mit Labornetz habe ich einen 2200 mAh LiPo 20-30C an den DC-DC-Wandler-Eingang angeschlossen. Mit dem ersten Akku konnte ich den Odroid nicht stabil booten. Mehrere Versuche führten zu einer nichtendenen Bootschleife. Tatsächlich war dieser LiPo etwas aufgebläht und ich vermute, dass dieses Exemplar defekt war.
Mit einem weiteren Turningy 2200 mAh LiPo 25-35C konnte ich den Odroid dann aber stabil booten und ca. 45 min betreiben.

Verwendeter LiPo-Akku und DC-DC-Stepdown-Wandler

Odroid mit angeschlossenem WLan-Stick und Stromversorgung

Auf dem Odroid hatte ich während dem 45min-Akku-Betrieb einen RTMP-Stream-Server gestartet, der im lokalen Netzwerk die angeschlossene USB-Webcam zum Streaming zur Verfügung stellt. Diesen Stream konnte ich auf meinem Windows-Rechner flüssig empfangen und abspielen. D.h. die gesamte Testdauer waren der WLan-Stick und die Webcam als Verbraucher aktiv am Odroid. In dieser Betriebsart braucht der Odroid ca. 10W, d.h im Test wurden ca. 7,5Wh verbraucht. Rechnerisch kann der gezeigte LiPo 2,2Ax11,1V=24,4 Wh Energie speichern. Tatsächlich war der Akku aber nicht vollständig geladen, dies ist die hauptsächlich Erklärung für die geringe Akku-Laufzeit des Odroid in meinem Test.
Mit einem zweiten Akku, LiPo von Zippy 1000 mAh 3s 25C, konnte der Odroid auch stabil betrieben werden. Dieser Akku hat etwas weniger als die Hälfte der Kapazität und somit sollte rechnerisch eine Betriebsdauer von etwas über 1h möglich sein. Im Test konnte der Odroid 27 min mit dieser Batterie betrieben werden. Hier war die Batterie voll aufgeladen. D.h. die halbierte Laufzeit ist zunächst nicht zu erklären. Möglicherweise arbeitet der DC-DC-Wandler sehr ineffizient und die Batterie selbst ist auch schon mehrere Jahre alt.
In jedem Fall ist für meinen Anwendungsfall eine Betriebsdauer > 30 min ausreichend und mit einer Investition in einen besseren Akku sollte eine Laufzeit von über 2h kein Problem darstellen.


Samstag, 5. Januar 2019

Odroid ohne Monitor

Da ich nur zwei Monitore besitze und es einfach nicht mehr gewohnt bin mit weniger Monitoren an einem PC zu arbeiten musste ich eine Lösung finden den Odroid ohne Monitor zu bedienen.

Dazu habe ich den Odroid und meinen PC so eingerichtet, dass ich mittels puTTY via SHH vom PC (Windows 10) auf den Odroid (Ubuntu 18.04 Mate) zugreifen kann.

Zunächst muss man ssh-server auf dem Odroid installieren:
sudo apt-get --yes install openssh-server
nun läuft ein ssh-Server auf dem Odroid.

Unter Windows lädt man sich das Tool puTTY herunter und installiert es. Mein Odroid hat den Hostnamen ubuntu1804.
Ich muss in puTTY nur den Hostnamen oder die IP eintragen sowie Port 22 und Connection type SSH auswählen. Mit Open öffnet sich eine Konsole, in der man sich mit dem Odroid-Benutzernamen und Passwort anmeldet. Nun ist man per Konsole auf dem Odroid.

Um auch Fenster zu sehen, kann man X11-Forwarding in puTTY aktivieren. Zudem muss man auf dem Odroid prüfen, ob X11-Portforwarding aktiviert ist:
 sudo nano /etc/ssh/sshd_config
und prüfen ob

X11Forwarding yes
im File steht bzw. nicht auskommentiert ist.

Unter Windows muss man noch einen X-Server installieren, z.B: xming.
PuTTY muss noch unter Connection-->SSH-->X11 konfiguriert werden: Enable X11 forwarding, sowie X display location = localhost:0.

Wenn man sich jetzt mit puTTY auf dem Odroid einloggt und z.B. chromium-browser startet, so öffnet sich über xming ein Fenster mit Chromium.
Man sollte am Odroid jetzt keinen Monitor angeschlossen haben, da es sonst zu starken Performance-Einbrüchen kommt.



Dienstag, 1. Januar 2019

Erste Schritte am Odroid XU4Q

Im Rahmen meines Roboter-Projekts habe ich mir einen Odroid xu4q (mit passiver Kühlrippe) gekauft. In diesem Blogpost beschreibe ich die Inbetriebnahme des Odroids sowie das Einrichten eines RTMP-Servers zum Videostreaming einer Webcam im lokalem Netzwerk.

Zunächst wurde dieser ohne jegliches Netzteil, SD-Karte und Wifi geliefert.
Daher habe ich mir noch folgende Komponenten gekauft:
  • Netzteil 5V/DC, 3.5 Ampére von Voltcraft
  • Wifi USB-Dongle TPLink WN821N v6
  • SD-Card 64GB SanDisk Ultra
Das Netzteil ist etwas knapp dimensioniert, da laut Hersteller 5V DC 4Amp benötigt wird. Mangels Verfügbarkeit beim lokalen Elektronikhandel musste es aber das 3,5 Amp Netzteil sein. Ich habe den Odroid nun seit einigen Tagen in Betrieb und stelle keine Probleme mit dem Netzteil fest.

Bevor man irgendetwas mit dem Odroid anfangen kann, muss man sich noch ein Image eines Betriebssystems auf die SD-Karte schreiben. Ich habe mich für Ubuntu Mate 18.04 entschieden. Die "Installation" des Betriebssystems auf der SD-Karte mittels Windows-PC ist tatsächlich gar nicht so schwierig. Ich habe mich da an einen sehr alten Blog-Eintrag gehalten: https://com.odroid.com/sigong/blog/blog_list.php?bid=130. Man benötigt einen SD-Kartenleser, dort wird mittels des Tools Win32DiskImager das Ubuntu-Image geschrieben. Das Image kann man sich hier laden. Anschließend wird die SD-Karte in den Odroid gesteckt und der kleine weiße Schalter nahe dem HDMI-Anschluss auf µSD gestellt (andernfalls versucht der Odroid vom eMMC oder gar nicht zu booten). An den HDMI-Anschluss noch einen Monitor anschließen sowie Tastatur und/oder Maus an die USB-Anschlüsse. Wenn man dem Odroid nun Strom gibt, so fängt ein blaues Licht an zu leuchten und der Odroid bootet. Sehr schnell kommt man zum Startbildschirm (Benutzer: odroid, passwort: ohne Passwort). Das root/sudo passwort ist zunächst odroid.
Hinweis: Ich musste den Odroid anfangs 2 oder 3 mal booten, bis ich mich erfolgreich einloggen konnte.


Aufgrund der geringen Anzahl der USB-Ports am Odroid, benutze ich keine Maus, nur eine Tastatur. Daher hier eine Liste von hilfreichen Linux-Befehlen:
  • ctrl+alt+t öffnet ein neues Terminal
  • alt+F10 Fenster in Vollbild 
  • alt+F4 Fenster schließen
  • alt+tab Zwischen Fenstern wechseln 
  • Windows-Taste öffnet das Menü
  • shutdown Herunterfahren des Odroid
  • reboot  Neustarten des Odroid
  • ifconfig  zeigt u.a. die IP des Odroid (unter wlan0)
  • ps -e zeigt alle laufenden Prozesse; ps -e | grep xy zeigt alle Prozesse mit xy im Namen 
  • kill 12345  beendet den Prozess mit der id 12345 (diese id kann man vorher mit ps -e ermitteln)
  • pkill xyz beendet den Prozess mit dem Namen xyz 
  • ~/Desktop ist der Pfad zum Desktop
  • nano ~/Desktop/test.txt öffnet die Textdatei test.txt in der Konsole. Mit ctrl+x kann man nano beenden und wird vorher gefragt ob man speichern möchte


Mit dem Wlan-Dongle hatte ich Schwierigkeiten. Zwar konnte ich mich direkt in mein WLan einloggen, leider war die Signalqualität und Übertragungsgeschwindigkeit extrem gering. Standardmäßig ist der rtl8xxxu-Treiber geladen. Dieser Treiber ist suboptimal. Dieser Post: https://github.com/Mange/rtl8192eu-linux-driver/issues/46 löste mein Problem. Man muss rtl8xxxu nur blacklisten und den Treiber rtl8192eu herunterladen, installieren und den Odroid neustarten.
Blacklisten:
sudo nano /etc/modprobe.d/blacklist-rtl8xxxu.conf
und dann in diese Datei blacklist rtl8xxxu schreiben und speichern
 Neuen Treiber herunterladen, bauen und installieren
sudo apt-get install linux-headers-generic git build-essential
git clone https://github.com/Mange/rtl8192eu-linux-driver.git
cd rtl8192eu-linux-driver
make
sudo make install 
Neustart
reboot
Letzendlich habe ich noch ein Datei-Sharing zwischen dem Odroid und meinem Windows-PC eingerichtet, via Samba. Diese Anleitung https://websiteforstudents.com/share-files-on-ubuntu-16-04-lts-with-windows-10-systems/ hat mir da sehr geholfen.


Der Odroid stellt das Herzstück meines Roboterprojektes dar. Er soll Bilder einer 3D-Kamera verarbeiten, Steuerbefehle verarbeiten und einen Arduino ansteuern, welcher wiederum die Elektromotoren steuert. Um die Kamerabilder auch von anderen PCs im gleichen Netzwerk sehen zu können, habe ich einen rtmp-Server auf dem Odroid installiert. Zu diesem Server streamt zur Zeit ffmpeg die Bilder einer Logitech Webcam.
Als Server verwende ich nginx mit rtmp-Modul. Zum Einrichten habe ich mich an folgende Anleitung gehalten: http://usefulramblings.org/?page_id=10660. Laut dieser Anleitung muss man nginx selber bauen. Dies führte bei mir zu zwei Fehlern, daher kommt hier nocheinmal die Anleitung mit Modifikationen (fett) für den Odroid bzw. das Ubuntu Mate Image 18.04 für den Odroid.

  1. sudo apt-get update
  2. sudo apt-get install unzip
  3. sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev 
    sudo apt-get install --reinstall zlibc zlib1g zlib1g-dev

    sudo apt-get install libsssl1.0-dev
  4. wget http://nginx.org/download/nginx-1.8.0.tar.gz
  5. tar -zxvf nginx-1.9.9.tar.gz
  6. wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
  7. unzip master.zip
  8. cd nginx-1.9.9
  9. ./configure –add-module=../nginx-rtmp-module-master --with-c-opt="Wno-error"
  10. make
  11. sudo make install
  12. start nginx:  sudo /usr/local/nginx/sbin/nginx
  13. stop nginx:  sudo /usr/local/nginx/sbin/nginx -s stop
  14. Configure Nginx with RTMP by editing the file /usr/local/nginx/conf/nginx.conf and placing the following code into it at the end of the file: 

    rtmp
    server {
      listen 1935;
      chunk_size 4096;
      application live {
       live on;
       record off;
       }
     }
    }

Mit folgendem FFMPEG-Befehl wird die Webcam, welche am USB-Port des Odroid angeschlossen ist, zu nginx gestreamt:
ffmpeg -f v4l2 -s 640x480 -r 15 -i /dev/video0 -vcodec libx264 -crf 35 -g 15 -tune zerolatency -f flv rtmp://localhost/live/stream
-s legt die Kameraauflösung fest und muss von der Webcam unterstützt werden.
-r legt die Framerate in fps fest
-i ist der input-path (die erste Kamera liegt unter Linux immer unter /dev/video0)
-vcodec legt fest, wie die einzelnen Frames codiert werden sollen. libx264 und libx265 sind für besonders kleine Datenmengen bekannt.
-crf legt die Güte des codierten Videos fest. Je höher, desto besser die Bildqualität, aber auch Videogröße. libx264 und libx265 sind rechenintensive Codecs. Je höher der -crf Wert, desto weniger muss zum Codieren gerechnet werden. D.h. man muss hier einen guten Mittelwert zwischen Rechenzeit zur Codierung und Videogröße zum flüssigen Streamen finden.
-g legt fest nach wie vielen Frames ein Key Frame gesetzt wird. Das Video wird zum Streaming in Pakete anhand der Key Frames zerschnitten. D.h. je größer der Wert, desto größer die Frameanzahl in einem Paket welche vom Server verteilt werden. Wenn man eine geringe Latenz beim Streaming erhalten möchte, möchte man Pakete mit wenigen Frames verschicken, d.h. die GOP size (-g) darf nicht zu groß sein. In diesem Fall entspricht die Latenz etwa eine Sekunde, da -r 15.Wenn man -g dagegen zu klein wählt, dann steigt die Paketgröße stark an, da das Coding mittels libx264 oder libx265 nicht mehr so effizient ist. Dies führt zu einer stark erhöhten Bitrate und führt dann wieder zu hohen Latenzen.
-tune zerolatency lässt ffmpeg bestimmte (mir unbekannte Parameter) so zu setzen, dass die Latenz reduziert wird.
-f flv legt das Containerformat des Videostreams als flv fest. Möglich auch z.B. asf oder mpeg. Mit flv konnte ich aber die geringsten Latenzen von etwa 1000ms erreichen.

Den Stream kann man dann im Netzwerk unter der Adresse rtmp://<ip vom Odroid>/live/stream abgreifen. Z.B. mit dem VLC-Player oder ffplay. Der VLC-Player führte bei mir zu sehr hohen Latenzen. FFPlay (Teil von ffmpeg) sowohl für Windows wie auch Linux vorhanden führte zu besseren Ergebnissen. Ich verwende folgenden Befehl

ffplay -fflags -nobuffer -probesize 32 -i rtmp://ubuntu1804/live/stream

ubuntu1804 ist der Host-Name von meinem Odroid.