Posts mit dem Label Arduino werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Arduino werden angezeigt. Alle Posts anzeigen

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.




 

Mittwoch, 28. Dezember 2016

Erste Schritte mit dem Arduino Micro

Ich habe ein größeres Projekt geplant, der Bau eines 4WD Roboters. Möglicherweise wird die Steuerung oder ein Teil mittels eines Arduino Mikrocontroller geschehen.
Nun habe ich mir für ca. 29 Euro bei Conrad einen Arduino Micro gekauft.
Im folgenden Beschreibe ich eine Transistor-Schaltung die ich zu Versuchszwecken aufgebaut habe. Die Transistor-Schaltung dient dazu einen Verbraucher An- bzw. Auszuschalten, der seine Leistung nicht direkt über einen I/O Pin des Arduino bezieht. Das ist notwendig, wenn der Verbraucher (z.B. ein DC Motor) mehr als 5 V Spannungsversorgung oder 20 mA Dauerstrom bzw. 40 mA Spitzenstrom benötigt (siehe Spezifikation des Arduino Boards, Kapitel "Input and Output").

Arduino Micro Pin-Belegung (von https://www.arduino.cc)
Nach der automatischen Installation der Treiber des Arduinos unter Windows 7 und der Installation der IDE habe ich zunächst das Programm "Blink" auf den Arduino hochgeladen. Dies ist der Abschließende Schritt des "Getting Started" Tutorials auf Arduino.cc. Dieses Programm führt dazu, dass die LED auf dem Controller-Board blinkt: 1 Sekunde an und 1 Sekunde aus. Gleichzeitig liegt auch an dem I/O-Pin D13 eine Spannung von 5V bzw. 0V im 1 Sekundetakt an.

Nachfolgende Zeichnung zeigt die Schaltung, die ich als erstes zum Testen aufgebaut habe:

Die LED ist der Verbraucher-Dummy. Durch das programmierte Schalten von Pin D13 am Arduino wird ein NPN Transistor gesperrt bzw. auf Durchlass geschaltet. Wenn der Transistor auf Durchlass geschaltet ist, liegt an der LED der 3-Zellen LiPo Akku als Spannungsquelle an (11,1 V). Für eine LED sind keine 11,1 V notwendig. Später soll aber die LED durch ein DC Motor ersetzt werden, dieser braucht höhere Spannungen und Ströme als direkt vom Arduino am Pin D13 bereitgestellt werden können.
Schaltung um Verbraucher (LED) mittels Transistor An und Aus zuschalten.

Als Transistor wurde ein NPN 2N2222A verwendet. Welcher Pin am Transistor Emitter, Collector und Basis sind, kann dem verlinkten Datenblatt entnommen werden. Im Schaltbild zeigt der Pfeil den Emitter an. Die Basis ist über einen Widerstand mit dem steuerbaren Pin D13 am Arduino verbunden.

Der Vorwiderstand und Parallelwiderstand bei der LED sind so dimensioniert, dass bei durchgeschaltetem Transistor (11,1 V) durch die LED 15 mA Strom fließt. Ein größerer Strom würde die LED zerstören. Zudem muss die LED richtig herum eingebaut werden. Das längere Beinchen muss an den Plus-Pol.

Obige Schaltung wurde auf einem Steckbrett aufgebaut. Siehe nachfolgende zwei Fotos:

Die LiPo-Batterie ist nicht auf den Bildern gezeigt. Oben ist das "Blink"-Programm im "HIGH" Modus und unten im "LOW" Modus.

Diese Schaltung kann nicht direkt verwendet werden um einen DC Motor zu steuern. Zunächst habe ich einen Modelcraft 1:18 6V Getriebemotor zum Testen gekauft. Dieser benötigt 1,6 A Strom unter Last. Zudem ist eine Stall-Current von 20 A angegeben. Der hier verwendete Transistor kann nur 800 mA Strom über Collector-Emitter leiten und geht bei höheren Strömen kaputt.
Zunächst plane ich den MOSFET IRLZ34 oder IRLZ44 statt des Bipolartransistors zu verwenden. Zudem muss beim Betrieb eines DC Motors eine Freilaufdiode parallel zum Motor geschaltet werden. Andererseits führt beim An- bzw. Ausschalten des Motors der gegenläufige Induktionsstrom zum Durchbrennen des Transistors oder anderer Bauelemente.