Harald Schmidt
Raspberry Pi programmieren mit C/C++ und Bash
Mehr als 50 Programme rund um Foto, Video & Audio. Inkl. Einsatz von WiringPi, ALSA & OpenCV
Inhaltsverzeichnis
6
Vorwort
18
1 Die Welt des Raspberry Pi
22
1.1 Die Modelle des Raspberry Pi
22
1.1.1 Energieversorgung
26
1.1.2 Der Raspberry Pi Zero W
27
1.1.3 Raspberry Pi 2 und Pi 3
31
1.2 SD-Karten und microSD-Karten
34
1.3 Von Wheezy zu Stretch – Downloads für Raspbian
35
1.3.1 Die Release Notes als Chronik
36
1.4 Über NOOBS zur Raspbian SD-Karte
37
1.4.1 NOOBS aus dem Internet holen und entpacken
38
1.4.2 NOOBS auf die leere (micro)SD-Karte kopieren
40
1.5 NOOBS auf dem Raspberry Pi
41
1.5.1 Wohin mit dem Bild?
41
1.5.2 Energie für NOOBS
42
1.6 Der NOOBS Recovery-Modus
48
2 Der Raspberry Pi und Linux
52
2.1 Das Abbild von Raspbian für die SD-Karte
53
2.1.1 Die Abbilddatei mit einem Linux-PC übertragen
57
2.1.2 Der Win32 Disk Imager
57
2.2 Die Grundkonfiguration des Raspbian Desktops
59
2.2.1 Tastaturlayout und Spracheinstellung
60
2.2.2 Konfiguration von Autologin, Hostname und Bootmodus
68
2.2.3 Passwortänderung
69
2.2.4 Freigabe für SSH und Abfrage der IP-Adresse
70
2.3 Der Raspberry Pi Desktop als Bedienoberfläche
71
2.3.1 Die Lage der Panelleiste ändern
72
2.3.2 Der Aufbau der Panelleiste
72
2.3.3 Programmstart über Tastaturkürzel
73
2.3.4 Eine symbolische Desktop-Verknüpfung hinzufügen
74
2.3.5 Eine neue Desktop-Datei erzeugen
75
2.3.6 Ein Programm der Anwendungsstartleiste hinzufügen
77
2.3.7 Miniprogramme im Panel
78
2.3.8 Das Konsolenkommando lxpanelctl
80
2.4 Der Main Menu Editor Alacarte
80
2.5 Das Erscheinungsbild anpassen mit LxAppearance
81
2.6 Der Raspbian Desktop auf dem PC oder Mac
83
2.7 Nützliche Programme ohne und mit grafischer Oberfläche
85
2.8 Autostart mit und ohne GUI
92
2.8.1 Die versteckte Datei .bashrc
93
2.8.2 Die Datei rc.local
95
2.9 Die Verwendung von LXTerminal in Desktop-Dateien
97
2.10 Pakete – Installation und Verwaltung
99
2.10.1 Der vorinstallierte Paketmanager pi-packages
100
2.10.2 Der Paketmanager Synaptic
101
2.10.3 Paketverwaltung über Konsolenkommandos
102
2.11 Die Bildschirmauflösung mit und ohne den RPi-Desktop einstellen
110
2.11.1 Über HDMI zum Fernseher
114
2.11.2 Über den HDMI/VGA-Adapter zum Monitor
115
2.11.3 Einstellung der Auflösung mit raspi-config
117
2.12 Audioumschaltung und Bluetooth-Lautsprecher
119
2.13 Systembackup im laufenden Betrieb
122
3 Betriebssysteme, Partitionen, Backup und Restore
124
3.1 SD-Karte, USB-Stick, Festplatte – was erkennt der Raspberry Pi?
126
3.2 SD-Karten mit Betriebssystem
129
3.2.1 Hinein in die Box
129
3.2.2 Der passende Aufkleber
130
3.2.3 Binäre Einheiten und die Kapazität von SD-Karten
130
3.3 SD-Karten identifizieren mit sd-label.sh
131
3.4 Hinweise zu Backup und Restore
134
3.5 Formatierung von SD-Karten
136
3.6 Das USB Image Tool
138
3.7 Direktkopie der SD-Karte mit piclone
140
3.8 Der Partitionsmanager GParted
142
3.9 Eine bootfähige SD-Karte mit sd-restore.sh erzeugen
145
3.10 Backup von SD-Karten mit sd-back.sh
150
3.10.1 Nullen vor dem Backup
154
3.11 Ein Blick in das Abbild der SD-Karte
156
3.12 Festplatten am Raspberry Pi
158
3.12.1 Der Einhängepunkt und die Systemkonsole
162
3.12.2 Einhängen der Partition über /etc/fstab
163
4 Programmieren mit dem Pi
164
4.1 Dateien und Programme zum Buch
165
4.2 Paketinstallation über die Skriptdateien zum Buch
167
4.3 Die Skriptdateien zum Buch – was ist wo?
169
4.4 Die Shell als Kommandointerpreter
171
4.4.1 Umgebungsvariablen
174
4.4.2 vcgencmd
175
4.5 Strings in Bash, C und C++
177
4.6 Programmieren mit Bash
178
4.6.1 Eingabe, Ausgabe und if else
178
4.6.2 Feldtrenner und float-Werte
181
4.6.3 Formatierte Ausgabe mit printfcalc.sh
183
4.6.4 Ausgabekommandos für ASCII-Dateien
183
4.6.5 Bash-Arrays mit numerischem Index
184
4.6.6 Assoziative Bash-Arrays mit Wortindex
186
4.6.7 Funktionen, Parameter und Exit-Codes
187
4.6.8 Ausgabeumleitung und Rückgabewerte
188
4.6.9 Ein Bash-Skript mit Funktionen und Indexsuche
191
4.6.10 Indexelemente sortieren und finden mit assosort.sh
194
4.6.11 Ausgabespalten neu anordnen mit dosdir.sh
195
4.6.12 Die Ausgabe Einlesen und die IFS-Trennzeichen
197
4.6.13 Filtern mit cut und grep
200
4.6.14 Farben in der Konsolenausgabe
207
4.6.15 Zeichen entfernen mit trim.sh
209
4.6.16 Dateinamen oder Pfade extrahieren
210
4.6.17 Die Position einer Zeichengruppe oder eines Strings finden
210
4.6.18 Ein Blick in raspi-config
212
4.7 Bash in Beispielen
214
4.7.1 Wie copydesk.sh funktioniert
214
4.7.2 Farbige Listings mit colordir.sh
215
4.7.3 Analyse von Partitionsgrößen mit sd-info.sh
217
4.7.4 Feldinhalte aus Audiodateien kompakt anzeigen
220
4.7.5 EXIF-Daten anzeigen mit jhead.sh
222
4.7.6 Metadaten ermitteln mit mediainfo.sh
225
4.7.7 Diagnose der Bildschirmauflösung mit scrreso.sh
229
4.7.8 Eine Bildschirmecke zur Videowiedergabe nutzen (OMXPlayer)
231
4.7.9 Prozesse anzeigen mit pgrep_htop.sh
233
4.8 Skriptdateien mit ASCII-GUI (whiptail/dialog)
238
4.8.1 Vom Skript zum Kommando
242
4.8.2 Eine allgemeingültige Dateiauswahl im Skript verwenden
244
4.8.3 Programmauswahl über Checkboxes
246
4.8.4 Bilder als ASCII-Art anzeigen
249
4.8.5 Programmstart mit fotomenu.sh
255
4.8.6 Programmstart über Desktop-Dateien und ASCII-Dialoge
258
4.8.7 Dateiauswahl bei sd-mount.sh
261
4.8.8 Der Programmstarter opencvgui.sh als ASCII-GUI
264
4.9 C-Programme mit Raspbian nutzen (hello_pi/GPU)
266
4.9.1 Videoprojektion auf eine rotierende Teekanne (hello_teapot.c)
268
4.9.2 Mathematische Kunst mit hello_triangle2.c
269
4.9.3 Das Skript helloGPU.sh auf einem „großen“ Linux-PC starten
270
4.9.4 Mit make zum eigenen C-Programm
271
4.9.5 Das Skript helloGPU2.sh für weitere GPU-Programme
274
4.9.6 Programme starten mit system und popen
275
4.9.7 Zeit ist relativ
278
4.9.8 Mausklicks, Bewegungen und Scrollevents auswerten
280
4.9.9 Von der Mausbewegung zur Audioausgabe
285
4.10 Der Qt Creator als Entwicklungsumgebung
289
4.11 Die Entwicklungsumgebung Code::Blocks
294
4.12 GTK+ Programmierung
297
4.13 Die Geany-Entwicklungsumgebung
300
4.14 Python und IDLE als Entwicklungsumgebung
303
4.15 Zenity-Dialoge
307
4.16 GitHub und Raspbian
308
5 Elektronik und Programme für den GPIO-Port
310
5.1 Schaltungen aufbauen
313
5.1.1 Drähte oder Drahtbrücken
316
5.1.2 SMD-Adapter und ICs
318
5.1.3 Widerstände, Widerstandsnetzwerke und Kondensatoren
319
5.1.4 Der LED-Test
321
5.2 Eine LED per Software schalten (Ein/Aus)
322
5.3 Eine LED per Software dimmen (Pulsweitenmodulation)
325
5.4 Eine LED am Optokoppler
327
5.5 GPIO-Pins im Read-Modus (Bash)
328
5.5.1 GPIO-Pins zyklisch abfragen (Polling)
329
5.5.2 GPIO-Pins im Interrupt-Modus (Flankenerkennung)
330
5.5.3 Flankenerkennung bei mehreren Schaltern
333
5.6 WiringPi-Beispiele mit C-Quelltext
336
5.6.1 WiringPi im Interrupt-Modus
337
5.7 Experimente zur Impulswahl
338
5.7.1 Audiodateien durch Impulswahl abspielen
342
5.7.2 Impulsdiagramme mit GnuPlot
343
5.8 Von der Helligkeit zur Frequenz
346
5.8.1 Frequenzen messen mit dem Oszilloskop und mit r2f.cpp
347
5.9 Stufenschalter, Tastenfelder, Encoder und Codierschalter
352
5.10 Analog/Digital-Wandler für die SPI-Schnittstelle
354
5.10.1 Analoge Messwerte mit spiloop.c erfassen
357
5.11 Die I2C-Schnittstelle
359
5.12 Analog/Digital-Wandler für I2C
360
5.13 Ein LCD-Display am I2C-Bus
365
5.13.1 Ausgaben mit sysinfo.sh
370
5.13.2 PIDs auf dem LCD-Display mit pgrep_menuctrl.sh
372
5.14 Die C-Library bcm2835 für den GPIO-Port
374
5.15 Mehr Ampere mit externen Spannungsquellen
376
5.16 Vom Schaltplan zum Layout
378
5.16.1 EAGLE Light
379
6 Sensoren und Software für Infrarot und Ultraschall
384
6.1 LIRC als Empfänger
385
6.1.1 Kommandos per IR-Fernbedienung auslösen
391
6.1.2 Ein Auswahlmenü auf dem LCD-Display
394
6.2 Entfernungsmessung per Ultraschall
397
6.3 Ein Abstandswarner mit ultraloop.c im Qt Creator
402
6.4 Entfernungsmessung mit Infrarotlicht
407
6.4.1 Distanzmessung über den MCP3426 als A/D-Wandler
409
7 Netzwerke und der Fernzugriff auf den Raspberry Pi
410
7.1 Die automatische Vergabe von IP-Adressen
413
7.2 Netzwerkkabel, Übertragungsraten und ethtool
422
7.3 Eine Direktverbindung zum Raspberry Pi
423
7.3.1 Die Link-Local-IP
427
7.4 Netzwerkkameras
428
7.4.1 Eine Direktverbindung für Netzwerkkameras
430
7.5 Der SSH-Server und ein Linux-PC als Client
431
7.5.1 SSH und die Weiterleitung des X11-Fensters
436
7.5.2 Fingerabdrücke auf (micro)SD-Karten
438
7.6 Zwei Schlüssel zum Vergleich – SSH ohne Passwort
439
7.7 PuTTY als Windows-Client
441
7.8 Remote-Zugriff mit WinSCP und Krusader als Client
445
7.9 Der SSH-Fernzugriff per ASCII-GUI
449
7.9.1 Ein Desktop-Icon auf dem Client-PC
449
7.10 Ein Remote-Desktop mit TightVNC
450
7.11 Energie sparen mit TMux
453
7.12 Die ASCII-GUI pgrep_gui.sh
458
7.13 TMux und die ASCII-GUI pgrep_gui.sh
462
7.13.1 TMux-Skripting
464
7.14 WLAN-Verbindungen und WLAN-Sticks
466
7.14.1 WLAN-Verbindungen und wpa_gui
470
7.15 Die Netzwerk-Tools arp-scan und nmap
472
7.16 Netcat – vom Chatprogramm zum Videoempfänger
474
7.17 Fünf Wege zum Raspberry Pi
475
7.18 Über Android zum Raspberry Pi
477
7.18.1 Über F-Droid zu ConnectBot
478
7.19 Über USB OTG zum Raspberry Pi Zero
481
8 Audio und Composite Video am Pi
484
8.1 Buchsen, Kabel, Signale
484
8.2 Audiowiedergabe
488
8.3 Der AlsaMixer
495
8.4 Audioaufzeichnung und ALSA-Tools
497
8.4.1 SoX mit der Webcam als Audioquelle
500
8.4.2 SoX passt auf – Reaktion auf Geräusche
506
8.4.3 Informationen zur Audiodatei mit soxi
509
8.4.4 Audioaufzeichnung im Remote-Modus
510
8.4.5 Lautsprecherdurchsagen aus sicherem Abstand (remote)
513
8.4.6 Externe USB-Soundkarten und das Programm speaker-test
514
8.5 Sprachsynthese auf dem Linux-PC
518
8.5.1 Sprachausgabe mit eSpeak
519
8.5.2 Sprachausgabe über tts.sh mit eSpeak, SVOX-Pico und Festival
520
9 Videodaten – Aufzeichnung und Wiedergabe
524
9.1 Der OMXPlayer
525
9.1.1 Kommandos für den OMXPlayer (DBUS-Interface)
527
9.2 Videodateien aus dem Internet holen
529
9.3 Archivierte Videos abspielen mit guiPlay.sh
533
9.4 Videoplayer und multiplay.sh
541
9.5 Wiedergabe mit videoselect.sh und avplay
545
9.6 Wo ist das Videogerät?
546
9.7 Daten zum Videogerät mit dem V4L-Treiber
549
9.8 MPEG-Spezifikationen, Codecs und Containerdateien
552
9.9 Fotografieren und Filmen mit guvcview
553
9.10 Fotografieren mit fswebcam
557
9.11 Die libav-tools und avconv (bzw. ffmpeg)
563
9.11.1 Der Webcam-Zugriff mit avconv
564
9.11.2 Vertonung mit avconv
566
9.11.3 Bildschirmvideos mit dem Raspberry Pi
567
9.11.4 Videos konvertieren mit WinFF
569
9.12 Motion auf dem Pi
571
9.12.1 Der Programmstarter motiongui.sh
574
9.12.2 Der Blick auf die Uhr
579
9.12.3 Motion-Parameter geeignet festlegen
581
9.12.4 Namen für Bilder und Videodateien
587
9.12.5 Einblendung von Zeitstempeln und Texten
588
9.12.6 Markierte Bewegungen
589
9.12.7 Bewegungsalarm auf Teilbereichen des Bildes
590
9.12.8 Automatische E-Mails bei Ereignissen
593
9.12.9 Den Videostream anzeigen und weiterleiten
594
9.12.10 Parameteränderung per ASCII-GUI und setvalue.sh
597
10 Kameramodule zum Raspberry Pi
598
10.1 Das 8-Megapixel-Kameramodul mit Sony-IMX219-Sensor
602
10.2 Fotos mit raspistill
604
10.2.1 EXIF-Daten ermitteln
609
10.2.2 Fotografieren mit fotomenu.sh
610
10.2.3 Der manuelle Belichtungsmodus
612
10.2.4 Fotografieren mit Zeit-/ISO-Automatik
614
10.2.5 Farben und Spezialeffekte
617
10.2.6 Fotos bei sehr wenig Licht und im Signalmodus
621
10.3 Konverter für Einzelbilder
625
10.4 Bilder und das FBI
626
10.5 Videos aufzeichnen mit raspivid
629
10.6 Videodateien mit MP4Box und avconv verarbeiten
632
10.7 Der UV4L-Treiber zum Kameramodul des Raspberry Pi
634
10.7.1 Fotografieren mit multicam.sh
638
10.7.2 Filmen mit dd
642
10.8 Binning bei raspistill und raspivid
643
10.9 Motion und das Kameramodul
646
11 Automatischer Datentransfer
652
11.1 SFTP-Kommandos per Skript ausführen
653
11.2 Eine RAM-Disk als Zwischenpuffer
657
11.2.1 Bilder auf der RAM-Disk
658
11.2.2 Die RAM-Disk überwachen
660
11.3 Datentransfer mit FileZilla
662
12 Audiosignale analysieren
664
12.1 Audacity
666
12.2 Die Verwendung von libsndfile
668
12.2.1 Die Abtastwerte einer Audiodatei in Textform
670
12.2.2 Ein Blick auf die Dokumentation
671
12.2.3 Ausgabeumleitung für Audiodaten mit sndout.cpp
672
12.3 Pausenerkennung und Segmentierung
676
12.3.1 Audiosegmentierung und Sprachausgabe mit audiosegm.cpp
677
12.4 Die Library tinyalsa
682
12.4.1 Abtastraten mit tinypcminfo.c ermitteln
684
12.4.2 Audioaufnahmen mit capaudio.sh und tinycap.c
685
12.5 Der Pi als Papagei
689
12.6 Spektrogramme mit sndfile-tools und Audacity
691
12.7 Vokaltraining mit voxvokal.sh
700
12.8 Das Audioquiz
704
13 OpenCV und der Pi
708
13.1 Die Konfiguration von OpenCV
709
13.2 Mit dem Compiler zur ausführbaren Datei
712
13.3 OpenCV – Dokumentation und Beispielprogramme
716
13.4 OpenCV, CMakeGUI und Code::Blocks
719
13.5 Die Qt-Projektdateien zu den Beispielprogrammen
721
13.6 Das Programm fpsec.cpp auf dem Pi benutzen
724
13.6.1 Fenster und Tastaturcodes von fpsec.cpp
725
13.6.2 Konturbilder vom Webcambild
726
13.6.3 Konturbilder vom Videobild
727
13.6.4 FloodFill auf dem Videobild
728
13.7 Programmierung mit OpenCV
729
13.7.1 Grundlegende Datentypen und OpenCV-Klassen
729
13.7.2 Fenster, Steuerelemente und cv::waitKey
731
13.7.3 Optimierung von Farb- und Grauwertbildern per Tastendruck
732
13.7.4 Binarisierung von Bildern mit cv::threshold
735
13.7.5 Regionen und Beschriftungen
737
13.8 Konfiguration für die WITH_QT-Oberfläche
738
14 Objektsegmentierung mit OpenCV
740
14.1 Segmentierung von Textzeilen
740
14.2 Symbolerkennung mit iconreader.cpp
743
14.3 Symbolerkennung auf Webcambildern
746
14.3.1 Einsatzzweck, Bedienung und Tastaturcodes
748
14.3.2 Vom Graustufenbild zum Erkennungsresultat
753
14.3.3 Der Alarm und die Statistik
759
14.4 Die sprechende Lichtschranke
761
15 Experimente
762
15.1 Booten mit Sprachausgabe
762
15.2 Ein Eingabemodul mit IR-Detektor und LCD-Display
765
15.2.1 Den Schaltungsaufbau planen
768
15.2.2 Lötarbeiten für die Elektronik zum DOGM204 LCD-Display
770
15.2.3 Das LCD-Display testen
771
15.2.4 Das Eingabemodul eichen
773
15.2.5 Die Drehung des Codierschalters auswerten
776
15.3 Ein Client/Server-Konzept für das Eingabemodul
777
15.3.1 Nur mit Maus und Display?
783
15.4 Ein Client/Server-Konzept mit menuctrl.sh
786
15.4.1 Fotos mit MenuCtrl
791
15.5 Über MenuCtrl fswebcam starten/beenden
794
15.6 Die hello_pi GPU-Programme mit MenuCtrl starten/beenden
795
15.7 MenuCtrl im Infrarotlicht
797
15.8 MenuCtrl schon beim Booten starten
802
16 Schlusswort
804
17 Übersicht der Programme und Skriptdateien zum Buch
806
Stichwortverzeichnis
812
© 2009-2024 ciando GmbH