# IOT-Labor ## Versuch 1: Bash - Alle Aufgaben sind als Skripte implementiert ## Versuch 2: Python - Aufgaben a bis c als Skripte implementiert - sshfs pi@172.23.90.43:/home/pi ~/test ### d) - Laden des Servo Daemon ```bash /home/pi/PiBits/ServoBlaster/user/servod ``` - Konfigurieren von zwei Servos auf den P1 Pins **11** und **12**. - Pin in P1 Header: 11 ist GPIO Pin: 17 ist Servo: 1 - Pin in P1 Header: 12 ist GPIO Pin: 18 ist Servo: 2 - Pulsbreite ist die Periodendauer: T = $\frac{1}{f}$ - 100Hz sind 0.01s, also 10000 $\mu s$ - $\frac{1}{100Hz} = 0.01s = 10000\mu s$ - Servos und Pulsbreite in ```/dev/servoblaster``` eintragen ```bash sudo /home/pi/src/PiBits/ServoBlaster/user/servod --cycle-time 1000 echo 1=wert > /dev/servoblaster echo 2=wert > /dev/servoblaster ``` ### e) - Oszilloskop an GPIO Pin 17 anschließen - Minimale Pulsbreite ermitteln? - 25% sind 60 - 50% sind ~120 - 75% sind ~190 - 100% sind 250 ### f) - in der servoblaster_ctl.py ### g) - Als Skript implementiert ## Versuch 3: Steuerung Keyboard ### 4d) #### Motor - Pulsbreite von 100 bis 200 - $150 + \frac{v}{v_{max}} * 50$ | v [m/s] | PWM (gemessen) | PWM (soll) | |---------|----------------|------------| | 0 |1.5ms |1.5ms | | -12.3 |2ms |2ms | | 0.9 |1.54ms |1.5409ms | | 10.5 |1.54ms |1.5ms | | -7.4 |1.16ms |11.636ms | #### Steuerung - Pulsbreite von 100 bis 200 - $150 + \frac{\alpha}{\alpha_{max}} * 50$ | $\alpha$ [°] | PWM (gemessen) | PWM (soll) | |-------|----------------|------------| | -3 |1.46ms |14.66ms | | 18 |1.3ms |17ms | |51.7 |2ms | 2ms | 0 |1.5ms |1.5ms | | -44.2 |1ms |1ms | ## Veruch 4: Wiimote - Wiimote mit dem hcitool finden ```bash hcitool scan ``` - Grundgerüst ist implementiert - Accelerometer Steuerung - TODO - Anlog zur Maussteuerung - Werte MAX, MIN anpassen ## Versuch 5 - Verbinden mit WLAN - ESSID: group20n oder iot_lab_wlan_bgn_03? - Kein Passwort und kein DHCP ```bash sudo ifconfig wlan0 192.168.1.42 netmask 255.255.255.0 up sudo iwconfig wlan0 essid off sudo iwconfig wlan0 essid iot_lab_wlan_bgn_2 ``` - dann Routen prüfen ### Delays und Offset messen - Zeit synkronisieren ```bash ntpq -pn time1.rrzn.uni-hannover.de > peers ``` - Für dratgebunden - 8.962 0.071 | | Dealy [ms] | Offset [ms] | |-------|-------|--------| |Laptop | 1.991 | 0.023 | | Pi | 0.508 | 0.321 | - Für dratlos | | Dealy [ms] | Offset [ms] | |-------|-------|--------| | Pi |0.425 |0.157 | - **Default Route wieder auf ethernet stellen** - NTP Service konfigurieren# - in ```/etc/ntp.conf``` - ```server time1.rrzn.uni-hannover.de``` eintragen - ```sudo service ntp stop|start``` ### Streaming über das drahtgebundene Netz - PI Kamera konfigurieren - Kamera anstellen ```bash sudo raspi-config ``` - Segmentation offloading ausschalten - Für beide Interfaces ```bash ethtool -K tso off ``` - tcpdump starten auf Client und Server - als root - Auf dem Client ```bash tcpdump -i tcp and port 1337 and dst -w ``` - Auf dem Server ```bash tcpdump -i tcp and port 1337 and src -w ``` - simple-server.py und simple-client.py verwenden - Client auf dem PI - Server auf dem Laptop ```bash ./simple-server.py -a --tcp ./simple-client.py -s --tcp ``` - Commulative arrival function für Server und Client berechnen und ploten - Für später schon Bitraten notieren ```bash ./plot-pcap.py --client --server ``` - OWDs berechnen ```bash ./calc-owd.py --client --server ``` ![](https://i.imgur.com/MiUiD78.png) - Mittelwert: 0.395ms - Standardabweichung: 0.213ms - Eingestellte Bitrate: 2Mbit/s - Tatsächlich gesendete Bitrate: 0.26Mbit/s ### Streaming über WLAN - default route über WLan einrichten #### Plot TCP - Stream für 60s mitschneiden und auswerten - Wie vorher schon nur über WLan - Plot der Pakete - OWDS - Mittelwert: 13.78ms - Standardabweichung: 8.11ms ![](https://i.imgur.com/SeeoqsY.png) #### Plot UDP - Mittelwert: 4.68ms - Standardabweichung: 2.87ms ![](https://i.imgur.com/o9eunaC.png) - Was ist besser? - UDP #### Mittelwert und Standardabweichung der OWDs - TCP: - Mittelwert: 13.78ms - Standardabweichung: 8.11ms - UDP: - Mittelwert: 4.68ms - Standardabweichung: 2.87ms - Um OWDs mit UDP genauer zu berechnen müsste die Reihenfolge der Pakete beachtet werden und die Uhren von Client und Server genaustens synkronisiert werden. #### Verschiedene Bitraten - Hier wieder OWDs messen - Mit UDP - 0.2 MBit/s mit LAN ![](https://i.imgur.com/11t6Skr.png) - 2 MBit/s mit LAN ![](https://i.imgur.com/TBB2xbD.png) | LAN | $\mu_{OWD}$ | $\sigma_{OWD}$ | Wertung | | -------- | -------- | -------- | --------- | | 0.2 Mbits/s | -0.01 | 0 | + - | | 2 Mbit/s | -0.007 | 0 | + + | - 0.2 MBit/s mit WLAN ![](https://i.imgur.com/qlLJ9S4.png) - 2 MBit/s mit WLAN ![](https://i.imgur.com/6KARpaL.png) | WLAN | $\mu_{OWD}$ | $\sigma_{OWD}$ | Wertung | | -------- | -------- | -------- | --------- | | 0.2 Mbits/s | 53.03 | 29.76 | - - | | 2 Mbit/s | 5.17 | 3.03 | + - | #### Verschiedene Parameter raspivid - 1280 x 720, 20fps, 2Mbit/s , - ```-t 0 -fps 20 -w 1280 -h 720 -b 2000000 -o``` - 1280 x 720, 10fps, 2Mbit/s - ```-t 0 -fps 10 -w 1280 -h 720 -b 2000000 -o``` - 1280 x 720, 5fps, 2Mbit/s - ```-t 0 -fps 5 -w 1280 -h 720 -b 2000000 -o``` - 640 x 360, 40fps, 2Mbit/s - ```-t 0 -fps 40 -w 640 -h 360 -b 2000000 -o``` - 640 x 360, 20fps, 2Mbit/s - ```-t 0 -fps 20 -w 640 -h 360 -b 2000000 -o``` | Parameterset | $\mu_{OWD}$ | $\sigma_{OWD}$ | Wertung | |--------------|-------------|----------------|---------| |```-t 0 -fps 20 -w 1280 -h 720 -b 2000000 -o```| 5.17ms | 3.02ms | + - | |```-t 0 -fps 10 -w 1280 -h 720 -b 2000000 -o```| 5.69ms | 3.38ms | - - | |```-t 0 -fps 5 -w 1280 -h 720 -b 2000000 -o```| 5.64ms | 3.40ms | - - | |```-t 0 -fps 40 -w 640 -h 360 -b 2000000 -o```| 6.2ms | 3.91ms | + + | |```-t 0 -fps 20 -w 640 -h 360 -b 2000000 -o```| 8.86ms | 5.03ms | + + | #### Verschiedene Puffergrößen - WLAN - Puffergröße: 10B, nichts zu sehen - Puffergröße: 1400B - $\mu_{OWD}: 5.17ms$ - $\sigma_{OWD}: 3.02ms$ - Wertung: +- - Was passiert, wenn die Puffergröße größer als die MTU - Fragmentierung, mehr Overhead - Mit 4000B Puffergröße versuchen - Mit Wireshark angucken - Fragmentierung ist zu sehen ### Streaming am Fahrzeug - Ploten der Pakete in einer Abbildung (wie vorher) - Wenn das Modellauto sich stetig vom Router entfernt. ![](https://i.imgur.com/GWpC1ek.png) - Wenn das Modellauto den Raum verlässt. ![](https://i.imgur.com/a6SrYKR.png) ## Versuch 6 - Sensoten für diesen Versuch: - Infrarot: GP2D12 - Kompas: CMPS03 - Radencoder: Hat Reflexoptokoppler CNY70 - Ultraschall-Modul: SRF08 - Überprüfen ob Sensoren angeschlossen sind - y-Flag gibt den Bus an ```bash sudo i2cdetect -l sudo i2cdetect -y 1 ``` - Adressen der Sensoren: - Infrarot: 0x4f in V - Kompas: 0x60 - Radencoder: On pin 21 - Ultraschall-Modul: 0x70, 0x71 - Kernelmodule laden i2c-bcm2708 - Überprüfen mit ```lsmod``` - Adressen in die ```ikt_car_sensorik.py``` eintragen - Unten in der Main