Manual

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 103

DownloadManual
Open PDF In BrowserView PDF
ftDuino
ein fischertechnik-kompatibler Arduino

Bedienungsanleitung
Dr.-Ing. Till Harbaum
8. Juni 2018

2

Für Tanja, Maya, Fabian und Ida

© 2017 Dr.-Ing. Till Harbaum 

Projekt-Homepage: http://ftduino.de
Kontakt: mailto://info@ftduino.de
Forum: https://forum.ftcommunity.de/

Inhaltsverzeichnis
1 Einleitung
1.1 Das ftDuino-Konzept . . . . . . . . . . . . . . . . . . . .
1.1.1 Das fischertechnik-Baukastensystem . . . . . . . .
1.1.2 Das Arduino-System . . . . . . . . . . . . . . . . .
1.2 Der ftDuino-Controller . . . . . . . . . . . . . . . . . . .
1.2.1 Mikrocontroller . . . . . . . . . . . . . . . . . . .
1.2.2 USB-Anschluss . . . . . . . . . . . . . . . . . . .
1.2.3 Reset-Taster . . . . . . . . . . . . . . . . . . . . .
1.2.4 Interne LEDs . . . . . . . . . . . . . . . . . . . .
1.2.5 Spannungsversorgung . . . . . . . . . . . . . . . .
1.2.6 Anschlüsse . . . . . . . . . . . . . . . . . . . . . .
1.2.7 Hinweise für Arduino-erfahrene Nutzer . . . . . . .
1.3 Problemlösungen . . . . . . . . . . . . . . . . . . . . . .
1.3.1 Die grüne Leuchtdiode im ftDuino leuchtet nicht .
1.3.2 Der ftDuino taucht am PC nicht als COM:-Port auf
1.3.3 Der ftDuino funktioniert, aber die Ausgänge nicht .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

7
7
7
8
9
9
11
11
11
11
12
15
15
15
15
15

2 Installation
2.1 Treiber . . . . . . . . . . . . . . . . . . . .
2.1.1 Windows 10 . . . . . . . . . . . . .
2.1.2 Windows 7 und Windows Vista . . .
2.1.3 Linux . . . . . . . . . . . . . . . . .
2.2 Arduino-IDE . . . . . . . . . . . . . . . . .
2.2.1 Installation mit dem Boardverwalter
2.2.2 Updates . . . . . . . . . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

17
17
17
17
19
21
21
22

3 Erste Schritte
3.1 Der erste Sketch . . . . . . . . . . . . . . . . . . . .
3.1.1 Download des Blink-Sketches auf den ftDuino
3.1.2 Die Funktionsweise des Sketches . . . . . . .
3.1.3 Die Funktionen setup() und loop() . . . .
3.1.4 Anpassungen am Sketch . . . . . . . . . . .
3.2 Ansteuerung von fischertechnik-Komponenten . . . .
3.2.1 Der Sketch . . . . . . . . . . . . . . . . . . .
3.2.2 Eingänge . . . . . . . . . . . . . . . . . . . .
3.3 Kommunikation mit dem PC . . . . . . . . . . . . .
3.3.1 Der serielle Monitor . . . . . . . . . . . . . .
3.3.2 Sketchbeschreibung . . . . . . . . . . . . . .
3.3.3 USB-Verbindungsaufbau . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

23
23
24
25
25
25
26
26
27
28
29
30
30

4 Experimente
4.1 Lampen-Zeitschaltung . . . . .
4.1.1 Sketch LampTimer . .
4.2 Not-Aus . . . . . . . . . . . .
4.2.1 Sketch EmergencyStop
4.3 Pulsweitenmodulation . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

31
31
31
33
33
36

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

Inhaltsverzeichnis

5

. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
zweier ftDuinos
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

36
40
42
43
45
46
48
48
48
49
49
50
52
52
53
53
55
55
56
57
58
58
61
62
62
63
64
65
71
72
72
73
73
74
74

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

75
75
76
77
78
79

6 Community-Projekte
6.1 ftduino direct: ftDuino-Anbindung per USB an TXT und TX-Pi
6.2 ftDuinIO: ftDuino-Kontroll-App für TXT und TX-Pi . . . . . . . .
6.3 Brickly-Plugin: Grafische ftDuino-Programmierung in Brickly . .
6.4 startIDE: Programmierung direkt auf dem TX-Pi oder TXT . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

81
81
82
83
83

7 Bibliotheken
7.1 FtduinoSimple . . . . . . . . . . . . . . . . . . . . . . . .
7.1.1 Verwendung im Sketch . . . . . . . . . . . . . . . .
7.1.2 bool input get(uint8 t ch) . . . . . . . . . . .
7.1.3 bool counter get state(uint8 t ch) . . . . . .
7.1.4 void output set(uint8 t port, uint8 t mode)
7.1.5 void motor set(uint8 t port, uint8 t mode) .
7.1.6 Beispiel-Sketches . . . . . . . . . . . . . . . . . . .
7.2 Ftduino . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

85
86
86
87
87
87
88
88
88

4.4

4.5
4.6

4.7
4.8

4.9
4.10
4.11
4.12
4.13

4.14
4.15

4.16

4.3.1 Sketch Pwm . . . . . . . . . . . . .
Schrittmotoransteuerung . . . . . . . . . .
4.4.1 Vollschrittsteuerung . . . . . . . . .
4.4.2 Halbschrittsteuerung . . . . . . . .
Servomotoransteuerung . . . . . . . . . . .
4.5.1 Externe 6-Volt-Versorgung . . . . .
Die Eingänge des ftDuino . . . . . . . . . .
4.6.1 Spannungsmessung . . . . . . . . .
4.6.2 Widerstandsmessung . . . . . . . .
4.6.3 Ein Eingang als Ausgang . . . . . .
Temperaturmessung . . . . . . . . . . . . .
4.7.1 Sketch Temperature . . . . . . . .
Ausgänge an, aus oder nichts davon? . . . .
4.8.1 Sketch OnOffTristate . . . . . . .
4.8.2 Leckströme . . . . . . . . . . . . .
Aktive Motorbremse . . . . . . . . . . . . .
USB-Tastatur . . . . . . . . . . . . . . . .
4.10.1 Sketch USB/KeyboardMessage . . .
USB-GamePad . . . . . . . . . . . . . . . .
4.11.1 Sketch USB/GamePad . . . . . . . .
Entprellen . . . . . . . . . . . . . . . . . .
4.12.1 Sketch Debounce . . . . . . . . . .
Nutzung des I2 C-Bus . . . . . . . . . . . .
4.13.1 Sketch I2C/I2cScanner . . . . . .
4.13.2 MPU-6050-Sensor . . . . . . . . . .
4.13.3 OLED-Display . . . . . . . . . . . .
4.13.4 VL53L0X LIDAR-Distanzsensor . . .
4.13.5 ftDuino als I2 C-Client und Kopplung
WS2812B-Vollfarb-Leuchtdioden . . . . . .
4.14.1 Sketch WS2812FX . . . . . . . . . .
Musik aus dem ftDuino . . . . . . . . . . .
4.15.1 Sketch Music . . . . . . . . . . . .
4.15.2 Sketch MusicPwm . . . . . . . . . .
Der ftDuino als MIDI-Instrument . . . . . .
4.16.1 Sketch MidiInstrument . . . . . .

5 Modelle
5.1 Automation Robots: Hochregallager . .
5.2 ElectroPneumatic: Flipper . . . . . . . .
5.3 ROBOTICS TXT Explorer: Linienfolger
5.4 Idas Ampel . . . . . . . . . . . . . . . .
5.4.1 Zustandsautomaten . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

6

Inhaltsverzeichnis

7.2.1
7.2.2
7.2.3
7.2.4
7.2.5
7.2.6
7.2.7
7.2.8
7.2.9
7.2.10
7.2.11
7.2.12
7.2.13
7.2.14
7.2.15
7.2.16

Die Eingänge I1 bis I8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
void input set mode(uint8 t ch, uint8 t mode) . . . . . . . . . . . . . .
uint16 t input get(uint8 t ch) . . . . . . . . . . . . . . . . . . . . . . . .
Die Ausgänge O1 bis O8 und M1 bis M4 . . . . . . . . . . . . . . . . . . . . . . .
void output set(uint8 t port, uint8 t mode, uint8 t pwm) . . . . . .
void motor set(uint8 t port, uint8 t mode, uint8 t pwm) . . . . . . .
void motor counter(uint8 t port, uint8 t mode, uint8 t pwm, uint16
bool motor counter active(uint8 t port) . . . . . . . . . . . . . . . . . .
void motor counter set brake(uint8 t port, bool on) . . . . . . . . . .
Die Zählereingänge C1 bis C4 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
void counter set mode(uint8 t ch, uint8 t mode) . . . . . . . . . . . . .
uint16 t counter get(uint8 t ch) . . . . . . . . . . . . . . . . . . . . . .
void counter clear(uint8 t ch) . . . . . . . . . . . . . . . . . . . . . . . .
bool counter get state(uint8 t ch) . . . . . . . . . . . . . . . . . . . . .
void ultrasonic enable(bool ena) . . . . . . . . . . . . . . . . . . . . . .
int16 t ultrasonic get() . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8 Selbstbau
8.1 Erste Baustufe Spannungsversorgung“ . .
”
8.1.1 Bauteile-Polarität . . . . . . . . .
8.1.2 Kontroll-Messungen . . . . . . . .
8.2 Zweite Baustufe Mikrocontroller“ . . . .
”
8.2.1 Funktionstest des Mikrocontrollers
8.3 Dritte Baustufe Eingänge“ . . . . . . . .
”
8.4 Vierte Baustufe Ausgänge“ . . . . . . .
”
A Schaltplan

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
t counter)
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

88
89
89
89
90
90
91
91
91
92
92
92
92
93
93
93

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

94
94
95
95
96
96
97
98

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

99

B Platinenlayout

100

C Bestückungsplan

101

D Maße

102

E Gehäuse

103

Kapitel 1

Einleitung
Elektronik- und Computermodule für Konstruktionsbaukästen gibt es seit den Anfängen der privat genutzten Heimcomputer
der 80er Jahre. Diese Module verfügten über wenig eigene Intelligenz und waren vor allem für die Signalanpassung zwischen
dem Heimcomputer und den Motoren und Schaltern der Baukastensysteme zuständig, weshalb diese Module in der Regel
als “Interfaces” bezeichnet wurden, also als Schnittstelle zwischen Computer und Modell.
Über die Jahre stieg die Leistungsfähigkeit der Heimcomputer und auch die Elektronik-Module lernten dazu. Vor allem wurden
aus “Interfaces” über die Zeit “Controller”. Aus den weitgehend passiven Schnittstellen wurden Bausteine mit eigener
Intelligenz, die den Heimcomputer bzw. später den PC nur noch zur Programmierung benötigten. Einmal programmiert
konnten diese Controller das Modell auch eigenständig bedienen. Dazu wurden die auf dem PC entwickelten Programmdaten
auf den Conroller geladen und dort gespeichert.
Die heutigen Controller von Lego oder fischertechnik sind selbst leistungsfähige Computer. Um deren Komplexität für den
Endanwender benutzbar zu machen verbergen die Hersteller die Details der elektronischen Komponenten sowie der auf
den Geräten laufenden Software hinter gefälligen Benutzeroberflächen. Leider verpassen solche Systeme auf diese Weise die
Chance, Wissen über Aufbau und Funktion derartiger Controller zu vermitteln. Während sich die Hersteller gegenseitig darin
übertreffen, komplexe mechanische Getriebe im Wortsinne begreifbar zu machen stellen sich die dazugehörigen Controller
für den Anwender als undurchsichtige Bausteine dar.
Parallel hat sich seit der Jahrtausendwende die sogenannte Maker-Bewegung entwickelt, die den “Selbstmach”-Gedanken in
den Bereich der Elektronikentwicklung trägt. Systeme wie der Raspberry-Pi und der Arduino laden dazu ein, alle technischen
Details dieser komplett zugänglichen und dokumentierten Controller zu erforschen und eigene Entwicklungen zu betreiben.
Große Communities bieten umfangreiches Know-How und stellen Plattformen zum Wissensaustausch zur Verfügung. Im
Gegensatz zu den Controllern von fischertechnik und Lego steht hier das Innere des Controllers im Vordergrund. Allerdings
erfordert der Einsatz dieser Controller oft einges an handwerklichem Geschick beim Aufbau der Elektronik selbst sowie
speziell bei Robotik-Projekten bei der Umsetzung von mechanischen Komponenten.

1.1

Das ftDuino-Konzept

Die Idee hinter dem ftDuino ist es, die Brücke zwischen zwei Welten zu schlagen. Auf der einen Seite integriert er sich
mechanisch und elektrisch nahtlos in die Robotics-Serie der fischertechnik-Konstruktionsbaukästen. Auf der anderen Seite
fügt er sich perfekt in das Arduino-Ökosystem zur Software-Entwicklung von eingebetteten Systemen ein.

1.1.1

Das fischertechnik-Baukastensystem

Fischertechnik ist ein technikorientertes Konstruktionsspielzeug. Der Schwerpunkt liegt auf Mechanik, Elektromechanik,
Elektronik und zunehmend auch Robotik und der dafür nötigen Integration von informationsverarbeitenden Komponenten.
Fischertechnik selbst entwickelt und vertreibt seit den frühen 80er Jahren Elektronik-Module, die eine Verbindung zwischen
Computer und mechanischem Modell ermöglichen bzw. über eigene Intelligenz verfügen. Die dabei zum Einsatz kommenden
Steckverbinder sowie die Sensoren (Taster, Schalter, Lichtsensoren, . . . ) und Aktoren (Lampen, Motoren, Ventile, . . . ) sind
über die Jahre zueinander kompatibel geblieben und lassen sich nach wie vor beliebig miteinander kombinieren.

8

Kapitel 1. Einleitung

Abbildung 1.1: Der ftDuino im 3D-gedruckten Gehäuseprototyp
Die letzten zwei Controller-Generationen (fischertechnik TX- und TXT-Controller) haben eine vergleichbare mechanische
Größe und verfügen über eine vergleichbare Anzahl und Art von Anschlüssen zur Verbindung mit dem Modell. Die Modelle
aller aktuellen Robotics-Baukästen sind auf diese Anschlüsse ausgelegt und untereinander kombinierbar.

(a) TX-Controller

(b) TXT-Controller

Abbildung 1.2: Original-Controller von fischertechnik
Beide Original-Controller verfügen über acht analoge Eingänge, acht analoge Ausgänge, vier schnelle Zählereingänge und
einen I2 C-Erweiterungsanschluss.
Fischertechnik selbst vertreibt die PC-Software RoboPro zur visuellen Softwareentwicklung für die hauseigenen Controller.
Der Einstieg in RoboPro ist relativ einfach und spricht bereits Kinder an. Die Grenzen von RoboPro sind aber schnell
erreicht, wenn es um praxisnahe und inhaltlich anspruchsvolle Projekte in weiterführenden Schulen, Universitäten und der
Berufsausbildung geht. In diesen Bereichen haben sich Systeme wie die Arduino-Plattform etabliert.

1.1.2

Das Arduino-System

Das Arduino-Ökosystem hat sich in den letzten Jahren zum De-Facto-Standard für den Einstieg und die semiprofessionelle
Entwicklung und Programmierung von eingebetteten Systemen etabliert. Eingebettete Systeme sind in der Regel mecha-

1.2. Der ftDuino-Controller

9

nisch kleine Computer und informationsverarbeitende Module, die innerhalb einer Maschine Steuer- und Regelaufgaben
übernehmen und immer häufiger auch mit der Außenwelt kommunizieren.

(a) Arduino-Entwicklungsumgebung (IDE)

(b) Arduino-Leonardo-Controller

Abbildung 1.3: Die Arduino-Entwicklungsumgebung und -Controller
Die Arduino-IDE ist eine übersichtliche und leicht zu bedienende Programmeroberfläche, die sich auf Windows-, Linuxund Apple-PCs nutzen lässt. Die zu programmierenden Zielgeräte wie zum Beispiel der Arduino-Leonardo sind kleine und
kostengünstige Platinen, die per USB mit dem PC verbunden werden. Sie kommen üblicherweise ohne Gehäuse und stellen
über Steckverbinder eine Vielzahl von Signalleitungen zum Anschluss von Sensoren und Aktoren zur Verfügung. Typische
mit der Arduino-Plattform zu erledigende Aufgaben sind einfache Messwerterfassungen (Temperaturlogging, . . . ) und Steueraufgaben (Jalousiesteuerungen, . . . ).
Programme, die mit der Arduino-IDE geschrieben wurden, werden in der Arduino-Welt als sogenannte “Sketches” bezeichnet.
Mit Hilfe der Arduino-IDE können passende Sketches für den ftDuino geschrieben und über das USB-Kabel direkt auf das
Gerät hinutergeladen werden.
Auch für einfache Robotik-Experimente ist die Arduino-Plattform bestens geeignet. Schwieriger ist oft eine mechanisch
befriedigende Umsetzung selbst einfachster Robotik-Projekte. Diese Lücke kann das fischertechnik-System schließen.

1.2

Der ftDuino-Controller

Der ftDuino-Controller wurde bewusst mechanisch und elektrisch an den TX- und den TXT-Controller angelehnt, um ihn
ebenfalls direkt mit den aktuellen Robotics-Kästen kombinieren zu können. Gleichzeitig wurde er softwareseitig mit dem
Arduino-System kompatibel gehalten.

1.2.1

Mikrocontroller

Das Herz des ftDuino ist ein Mikrocontroller des Typs ATmega32u4. Dieser Mikrocontroller wird von Microchip (ehemals
Atmel) hergestellt und findet auch im Arduino-Leonardo Verwendung. Sketches, die für den Leonardo übersetzt wurden,
sind oft direkt auf dem ftDuino lauffähig.
Der ATmega32u4-Controller ist ein Mitglied der sogenannten AVR-Famile, auf der die meisten Arduino-Boards basieren. Die
AVR-Controller sind klein, günstig und benötigen zum Betrieb nur wenig weitere Bauteile. Ihr Speicher und ihre Rechenleistung reicht für den Betrieb sämtlicher fischertechnik-Modelle der Roboticsreihe deutlich aus.
Der ATmega32u4 verfügt über 32 Kilobytes nicht-flüchtigem Flash-Speicher, der als Sketch-Programmspeicher verwendet
wird sowie 2,5 Kilobytes internem RAM-Speicher zur Datenspeicherung. Der Prozessortakt beträgt 16 Megahertz. Jeweils
ein Sketch kann im Flash-Speicher permanent gespeichert werden und bleibt auch erhalten wenn der ftDuino von der
Spannungsversorgung getrennt wird.
Der ATmega32u4 ist eines der wenigen Mitglieder der AVR-Familie, das direkte USB-Unterstützung bereits auf dem Chip
mitbringt. Auf diese Weise ist der ftDuino sehr flexibel als USB-Gerät am PC einsetzbar.

10

Kapitel 1. Einleitung

USB
Reset

Analoge
Eingänge
I1 bis I8

RundLEDs stecker

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7

Zählereingänge
C1 bis C4

C3

+9V

I8

Analoge
Ausgänge
O1 bis O8
(Motorausgänge
M1 bis M4)

+
9V=

+9V

C4

Abbildung 1.4: Die Anschlüsse des ftDuino
I²C

USB

O1 - O4
ATmega32u4

2,5k
RAM
32k
Flash

USB
AVR8
Prozessorkern

SPI
IOPorts

O5 - O8

I²C

1k
EEPROM

LED

MC33879

ADC

MC33879

Timer

PullupMUX

C1 - C4

I1 - I8

Abbildung 1.5: Blockdiagramm des ftDuino
Bootloader
Der ftDuino wird mit einem im ATmega32u4 vorinstallierten sogenannten Caterina-Bootloader ausgeliefert. Dieses Programm
belegt permanent vier der 32 Kilobytes Flash-Speicher des ATmega32u4 und kann nicht ohne weiteres gelöscht oder verändert
werden.
Der Bootloader ermöglicht die Kommunikation mit dem PC und erlaubt es, dass der PC Programmdaten in den verliebenden
28 Kilobytes Flash-Speicher ablegen bzw. austauschen kann. Der Bootloader ermöglicht auf diese Weise das Hinunterladen
von Sketches in den ftDuino.
Dass der Bootloader aktiv ist und nicht etwa gerade ein Sketch ausgeführt wird, ist am Zustand der internen LEDs erkennbar
(siehe 1.2.4).

1.2. Der ftDuino-Controller

1.2.2

11

USB-Anschluss

Die Verbindung zum PC zur Programmierung und Datenübertragung wird über USB hergestellt. Der ftDuino verfügt über
eine sogenannte Mini-USB-Buchse und wird über ein handelsübliches Mini-USB-Kabel mit dem PC verbunden.

Abbildung 1.6: Strom- und USB-Anschluss des ftDuino

1.2.3

Reset-Taster

Normalerweise kann die Arduino-IDE durch entsprechende Kommandos über den USB-Anschluss den Bootloader des ftDuino
aktivieren, um einen neuen Sketch hinunterzuladen. Enthält ein hinuntergeladener Sketch aber Fehler, die eine normale
Programmausführung verhindern, dann kann es passieren, dass die USB-Kommunikation während der normalen Programmausführung nicht funktioniert und die Arduino-IDE den ftDuino von sich aus nicht mehr ansprechen kann.
Für diesen Fall verfügt der ftDuino über einen Reset-Taster. Wird dieser gedrückt, dann wird der Bootloader zwangsweise
aktiviert und die LEDs zeigen entsprechend den Start des Bootloaders an.
Ein mit einem fehlerhaften Sketch versehener ftDuino kann daher problemlos mit einem korrigierten Sketch versehen werden,
indem kurz vor dem Hinterladen der Reset-Taster kurz gedrückt wird. Mehr Details dazu finden sich im Abschnitt 1.3.

1.2.4

Interne LEDs

Der ftDuino verfügt über je eine grüne und rote interne Leuchtdiode (LED). Die grüne Spannungsversorungs-LED zeigt an,
dass der interne 5-Volt-Zweig mit Spannung versorgt ist und der Mikrocontroller des ftDuino versorgt wird.
Die rote LED steht für eigene Verwendung zur Verfügung und kann vom Anwender aus eigenen Sketches heraus unter der
Bezeichnug LED BUILTIN angespochen werden (siehe Abschnitt 3.1).
Die rote LED wird auch vom Caterina-Bootloader des ftDuino verwendet. Ist der Bootloader aktiv, so leuchtet die LED im
Sekundentakt sanft heller und dunkler (“fading”).

1.2.5

Spannungsversorgung

Der ftDuino kann auf vier Arten mit Spannung versorgt werden:
USB Über USB wird der ftDuino immer dann versorgt, wenn keine weitere Stromversorgung angeschlossen ist. Die USBVersorgung reicht allerdings nicht zum Betrieb der Analogausgänge. Lediglich die Eingänge können bei USB-Versorung
verwendet werden. Zusätzlich ist die Genauigkeit einer Widerstandsmessung an den Analogeingängen deutlich herab
gesetzt (siehe 1.2.6).

12

Kapitel 1. Einleitung

Hohlstecker Wird der ftDuino per Hohlstecker z.B. durch das fischertechnik Power Netzgerät 5052871 oder dem Netzteil
aus dem fischertechnik Power-Set 5052832 mit 9 Volt versorgt, so wird der gesamte ftDuino daraus versorgt und der
USB-Anschluss wird nicht belastet. Die Analogausgänge sind in diesem Fall benutzbar und die Widerstandsmessung an
den Analogeingängen erfolgt mit voller Genauigkeit. Für den Einsatz von Fremdnetzgeräten bietet fischertechnik unter
der Artikelnummer 1348633 einen Adapter von üblichen 5mm-Hohlsteckern auf den von fischertechnik verwendeten
3,45mm-Stecker an.
9V=-Eingang Eine Versorgung des ftDuino z.B. per Batterieset oder mit dem Akku aus dem Akku Set 349694 entspricht
der Versorgung per Hohlstecker. Wird der ftDuino sowohl über den 9V=-Eingang als auch per Hohlstecker versorgt,
dann erfolgt die Versorgung aus der Quelle, die die höhere Spannung liefert. Eine Rückspeisung in den Akku oder eine
Ladung des Akkus findet nicht statt.
I2 C Über den I2 C-Anschluss versorgt der ftDuino in erster Linie andere angeschlossene Geräte wie kleine Displays oder
Sensoren. Es ist aber auch möglich, ihn selbst über diesen Anschluss zu versorgen. Es bestehen dabei die gleichen
Beschränkungen wie bei der Versorgung über USB. Auf diese Weise ist zum Beispiel die Versorgung zweier gekoppelter
ftDuinos aus einer einzigen Quelle möglich (siehe Abschnitt 4.13.5).
min. 1,3mm

Masse
+9V

max. 3,45mm

Abbildung 1.7: 3,45mm fischertechnik-Hohlstecker

1.2.6

Anschlüsse

Die Anschlüsse des ftDuino teilen sich in die fischertechnik-kompatiblen Ein- und Ausgänge auf, die für die üblichen 2,6mmEinzelstecker geeignet sind, sowie die üblichen Steckverbinder aus dem Computerbereich. Die fischertechnik-kompatiblen Einund Ausgänge sind identisch zum fischertechnik-TXT-Controller angeordnet. Verdrahtungsschemata für den TXT können
daher in der Ŕegel direkt übernommen werden.

Analoge Eingänge
Der ftDuino verfügt über acht analoge Eingänge I1 bis I8, über die Spannungen von 0 bis 10 Volt sowie Widerstände von
0 bis über 10 Kiloohm erfasst werden können.
Die Eingänge sind über hochohmige Serienwiderstände gegen Kurzschlüsse sowie Über- und Unterspannung abgesichert.
Jeder Eingang ist mit einem eigenen Analogeingang des ATmega32u4-Mikrocontrollers verbunden. Die Analogwerterfassung
kann mit bis zu 10 Bit Auflösung erfolgen (entsprechend einem Wertebereich 0 bis 1023) und wird direkt in der Hardware
des Mikrocontrollers durchgeführt.
Ein Spannungsteiler erweitert den Eingangsspannungsbereich des Mikrocontrollers von 0 bis 5 Volt auf den bei fischertechnik
genutzten Bereich von 0 bis 10 Volt. Alle an fischertechnik-Modellen auftretenden Spannungen können damit erfasst werden.
Zur Widerstandsmessung kann kann jeder Eingang ftDuino-intern mit einem Widerstand gegen 5 Volt verschaltet werden.
Dieser Widerstand wirkt mit einem externen Widerstand als Spannungsteiler und aus der am Mikrocontroller gemessenen Spannung kann der Wert des extern angechlossenen Widerstands gemessen werden. Alle von fischertechnik-Modellen
üblicherweise verwendeten Widerstände können so erfasst werden.
1 fischertechnik-Datenbank:

https://ft-datenbank.de/search.php?keyword=505287
https://ft-datenbank.de/search.php?keyword=505283
3 fischertechnik-Datenbank: https://ft-datenbank.de/search.php?keyword=134863
4 fischertechnik-Datenbank: https://ft-datenbank.de/search.php?keyword=34969
2 fischertechnik-Datenbank:

1.2. Der ftDuino-Controller

13

Die analogen Eingänge sind nicht auf eine externe 9-Volt-Versorgung angewiesen, sondern funktionieren auch bei der Stromversorgung über den USB-Anschluss des PC. Allerdings sinkt in diesem Fall die Genauigkeit der Widerstandsmessung signifikant.
Analoge Ausgänge
Der ftDuino verfügt über acht analoge Ausgänge O1 bis O8. Diese Ausgänge werden über zwei spezielle Treiberbausteine im
ftDuino angesteuert. Die Treiberbausteine können jeden der acht Ausgänge unabhängig steuern. Sie sind identisch zu denen,
die fischertechnik in den TX- und TXT-Controllern einsetzt. Die Ausgänge sind daher kompatibel zu allen fischertechnikMotoren und -Aktoren, die auch am TX- und TXT-Controller betrieben werden können. Der maximal pro Ausgang verfügbare
Strom beträgt 600mA bis 1,2A.
Die Ausgänge sind bei einer reinen USB-Stromversorgung des ftDuino nicht verfügbar.
Der verwendete Treiberbaustein MC33879 ist kurzschlussfest und robust gegen Über- und Unterspannung an den Ausgängen.
Alle acht Ausgänge können unabhängig voneinander gegen Masse oder Eingangsspannung sowie hochohmig geschaltet
werden. Je zwei Einzelausgänge können zu einem Motorausgang kombiniert werden. Die Einzelausgänge O1 und O2 bilden
dabei den Motorausgang M1, O3 und O4 bilden M2 und so weiter.
Die Analogwerte an den Ausgängen werden durch eine sogenannte Pulsweitemodulation (PWM) erzeugt. Dabei werden die
Ausgänge kontinuierlich schnell ein- und ausgeschaltet, so dass Motoren, Lampen und andere träge Verbraucher dem Signal
nicht folgen können, sondern sich entsprechend des Mittelwerts verhalten. Dieses Verfahren wird in gleicher Weise auch im
TX- und TXT-Controller angewendet.
Beide MC33879 werden vom Mikrocontroller des ftDuino intern über dessen sogenannte SPI-Schnittstelle angeschlossen. Da
dadurch die speziellen PWM-Ausgänge des Mikrocontrollers nicht zur Erzeugung der der Pulsweitenmodulation herangezogen
werden können muss das PWM-Signal durch den Sketch bzw. die verwendeten Software-Bibliotheken (siehe Kapitel 7) selbst
erzeugt werden. Die sogenannte PWM-Frequenz wird dabei durch den verwendeten Sketch bestimmt und kann beliebig
variiert werden.
Mehr Informationen zum Thema PWM finden sich in Abschnitt 4.3.
Zählereingänge
Der ftDuino verfügt über vier spezielle Zählereingänge C1 bis C4. Diese Eingänge können rein digitale Signale erfassen und
mit hoher Geschwindigkeit Ereignisse auswerten. Die maximal erfassbare Signalrate liegt je nach Sketch bei mehreren 10.000
Ereignissen pro Sekunde.
Die Zählereingänge sind kompatibel zu den Encodern der fischertechnik-Encoder-Motoren und können unter anderem zur
Drehwinkelauswertung sowie zur Drehzahlbestimmung herangezogen werden.
Zählereingang C1 verfügt zusätzlich über die Möglichkeit, einen fischertechnik ROBO TX Ultraschall-Distanzsensor 1330095
auszuwerten.
I2 C-Anschluss
Der I2 C-Anschluss ist elektrisch und mechanisch zu dem des fischertechnik-TX-Controllers kompatibel. Der dort aus dem
Gerät herausgeführte sogenannte I2 C-Bus findet auch im Arduino-Umfeld häufige Verwendung und erlaubt den Anschluss
passender Elektronikkomponenten wie Sensoren, Analog-Digital-Wandler, Displays und ähnlich. Außerdem ist über den
I2 C-Bus eine Kopplung mehrerer ftDuinos möglich sowie die Kopplung des ftDuino mit dem TX-Controller und dem TXTController wie in Abschnitt 4.13 beschrieben.
Die Signale auf dem I2 C-Anschluss nutzen wie am TX-Controller einen 5-Volt-Pegel. Zusätzlich werden aus der Spannungsversorgung des ftDuino 5 Volt zur Versorgung angeschlossener Komponenten bereitgestellt. Aus dem 5 Volt-Ausgang dürfen
max. 100mA entnommen werden, um die ftDuino-interne Spannungsversorung nicht zu überlasten
Achtung! Der fischertechnik-TXT-Controller sowie für den Betrieb am TXT vorgesehene Komponenten sind aufgrund dessen
3,3 Volt-Signal-Pegel nicht direkt mit dem ftDuino kompatibel. Eine dirkete Verbindung zwischen TXT und ftDuino kann
5 fischertechnik-Datenbank:

https://ft-datenbank.de/search.php?keyword=133009

14

Kapitel 1. Einleitung

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 1.8: Anschluss des Ultraschallsensors 133009

SDA
SCL

Masse
+5V
SCL

Masse

SDA +5V

Abbildung 1.9: Buchsen- und Kabelbelegung des I2 C-Bus am ftDuino

den TXT beschädigen. Sollen der TXT oder für den Betrieb am TXT vorgesehene Komponenten am ftDuino verwendet
werden, so sind unbedingt passende I2 C-Pegelanpassung zwischenzuschalten wie in Abschnitt 4.13.5 beschrieben.
Achtung! Die auf dem I2 C-Anschluss liegenden Signale sind direkt und ungeschützt mit dem Mikrocontroller des ftDuino
bzw. mit dessen Spannungsversorgung verbunden. Werden an diesem Anschluss Kurzschlüsse verursacht oder Spannungen
über 5V angelegt, dann kann der ftDuino zerstört werden. Der I2 C-Anschluss sollte daher nur von erfahrenen Anwendern
verwendet werden. Aus diesem Grund wird der ftDuino mit einer Schutzkappe auf dem I2 C-Anschluss vertrieben. Diese
Kappe ist bei Bedarf vorsichtig mit einem flachen Schraubendreher zu entfernen.

Abbildung 1.10: Entfernen der Schutzkappe vom I2 C-Anschluss des ftDuino

1.3. Problemlösungen

1.2.7

15

Hinweise für Arduino-erfahrene Nutzer

Es gibt ein paar fundamentale Unterschiede zwischen dem klassischen Arduino und dem ftDuino. In erster Linie sind
dies die Schutz- und Treiberschaltungen, die beim ftDuino für die fischertechnik-Kompatibilität der Anschlüsse sorgt.
Diese Schaltungen sind der Grund, warum man die Ein- und Ausgänge des ftDuino nicht mit den Arduino-üblichen
pinMode() und digitalWrite()-Funktionen ansprechend kann. Diese Funktionen sind darauf ausgelegt, direkt Anschlüsse
des ATmega32u4-Mikrocontrollers zu steuern und berücksichtigen nicht, dass der ftDuino zusätzliche Schaltungen beinhaltet.
Aus diesem Grund werden die fischertechnik-kompatiben Ein- und Ausgänge des ftDuino über eigene Bibliotheken angesteuert, wie in Kapitel 7 beschrieben.
Erfahrene Nutzer können unter Umgehung dieser Bibliotheken nach wie vor auch direkt mit der Hardware des ftDuino
kommunizieren. Die Schaltpläne im Anhang A liefern alle dafür nötige Information.

1.3
1.3.1

Problemlösungen
Die grüne Leuchtdiode im ftDuino leuchtet nicht

Zunächst sollte der ftDuino von allen Verbindungen getrennt und ausschließlich über den USB-Anschluss mit dem PC
verbunden werden. Die grüne Leuchtdiode im ftDuino muss sofort aufleuchten. Tut sie das nicht, dann sollte ein anderer
PC bzw. ein anderer USB-Anschluss probiert werden.
Hilft das nicht, dann ist zunächst das USB-Kabel zu prüfen. Funktionieren andere Geräte an diesem Kabel? Gegebenenfalls
muss das Kabel ausgetauscht werden.

1.3.2

Der ftDuino taucht am PC nicht als COM:-Port auf

Der ftDuino wird nicht mehr vom PC erkannt und es wird kein COM:-Port angelegt.
Leuchtet die grüne Leuchtdiode am ftDuino? Falls nicht sollte wie unter 1.3.1 verfahren werden.
Leuchtet die grüne Leuchtdiode, dann sollte ein kurzer Druck auf den Reset-Taster (siehe 1.2.3) den Bootloader des ftDuino
für einige Sekunden aktivieren. Erkennbar ist dies am langsamen Ein- und Ausblenden der roten Leuchtdiode wie in Abschnitt
1.2.4 beschrieben. In dieser Zeit sollte der ftDuino vom PC erkannt werden. Dies wird u.a. unter Windows im Gerätemanager
wie im Abschnitt 2.1.2 beschrieben angezeigt.
Wird der ftDuino nach einem Reset erkannt, aber verschwindet nach ein paar Sekunden aus der Ansicht des Gerätemanagers
oder wird als unbekanntes Gerät angezeigt, dann wurde wahrscheinlich ein fehlerhafter Sketch auf den ftDuino geladen und
die Arduino-IDE ist nicht in der Lage, sich eigenständig mit dem ftDuino zu verbinden. In diesem Fall sollte man das
Blink-Beispiel (siehe Abschnitt 3.1) in der Arduino-IDE öffnen, den ftDuino per kurzem Druck auf den Reset-Taster in
den Booloader-Modus versetzen und direkt danach die Download-Schaltfläche in der Arduino-IDE drücken. Sobald der
funktionierende Sketch geladen wurde wird der ftDuino auch ohne manuelle Druck auf den Reset-Taster wieder von PC
erkannt und der entsprechende COM:-Port taucht wieder auf.
Der ftDuino bleibt nur wenige Sekunden im Bootloader und kehrt danach in den normalen Sketch-Betrieb zurück. Zwischen
dem Druck auf den Reset-Knopf und dem Start des Downloads aus der Arduino-IDE sollte daher möglichst wenig Zeit
vergehen.

1.3.3

Der ftDuino funktioniert, aber die Ausgänge nicht

Um die Ausgänge zu benutzen muss der ftDuino mit einer 9-Volt-Spannunsgquelle entweder über den Hohlstecker-Anschluss
oder über die üblichen fischertechnik-Stecker verbunden sein. Verfügt der ftDuino über keine ausreichende 9-Volt-Versorgung,
so können die Ausgänge nicht betrieben werden. Da der ftDuino selbst schon mit geringerer Soannung läuft ist dessen
Funktion kein sicheres Indiz dafür, dass eine ausreichende 9-Volt-Versorung vorhanden ist.
Ist der ftDuino über USB mit dem PC verbunden, dann versorgt er sich bei mangelhafter oder fehlender 9-Volt-Versorung
von dort. Geht der ftDuino ganz aus, sobald man die USB-Verbindung trennt, dann ist keine 9-Volt-Versorgung gegeben

16

Kapitel 1. Einleitung

und es muss sichergestellt werden, dass Polarität und Spannung korrekt bzw. ausreichend sind. Ggf. muss die Batterie
ausgetauscht oder der verwendete Akku geladen werden.

Kapitel 2

Installation
Die Installation der Software zur Benutzung des ftDuino erfolgt in mehreren Schritten. Zu allererst muss der Computer mit
dem ftDuino bekannt gemacht werden, in dem ein passender Treiber dafür sorgt, dass der Computer erfährt wie er mit dem
ftDuino zu kommunizieren hat.
Im zweiten Schritt wird dann die sogenannte Arduino-IDE installiert, also die eigentliche Programmierumgebung sowie die
Arduino-IDE mit dem ftDuino verbunden.
Für die Installation und auch für die im Kapitel 3 folgenden ersten Schritte reicht es, den ftDuino per USB mit dem PC
zu verbinden. Eine zusätzliche Stromversorgung per Netzteil oder Batterie ist erst nötig, wenn die Ausgänge des ftDuino
verwendet werden sollen.

2.1

Treiber

Unter den meisten Betriebssystemen wird der ftDuino vom Computer direkt erkannt, sobald er angesteckt wird. Das trifft
unter anderem auf Linux, MacOS X und Windows 10 zu, aber nicht für Windows 7.

2.1.1

Windows 10

Die Verwendung des ftDuinos unter Windows 10 erfordert keine Treiberinstallation durch den Anwender.
Sobald der ftDuino an einen PC unter Windows 10 angesteckt wird werden die passenden Treiber automatisch installiert. Windows 10 zeigt dies beim ersten Anschließen des ftDuino durch eine entsprechende Meldung am unteren rechten
Bildschirmrand an. Nach einigen Sekunden ist die Installation abgeschlossen und der ftDuino benutzbar.
Weiteres an- und abstecken erzeugt keine weiteren Meldungen, allerdings ist die erfolgreiche Erkennung des ftDuino unter
Windows 10 jederzeit an der typischen Melodie zu erkennen, die ein Windows-PC beim erkennen von Hardware ausgibt.

2.1.2

Windows 7 und Windows Vista

Windows 7 und Windows Vista bingen den passsenden Treiber ebenfalls bereits mit. Allerdings muss eine passende .infDatei geladen werden, um dafür zu sorgen, dass Windows diesen Treiber für den ftDuino nutzt.
Dass kein Treiber geladen ist erkennt man u.a. daran, dass der ftDuino im Gerätemanager uner “Andere Geräte” aufgeführt
wird.
Die .inf-Datei ist unter https://raw.githubusercontent.com/harbaum/ftduino/master/ftduino/driver/ftduino.inf zu finden.

18

Kapitel 2. Installation

Abbildung 2.1: ftDuino ohne passenden Treiber unter Windows 7

Nach dem Download reicht ein Rechtsklick auf die Datei und die Auswahl von “Installieren” im folgenden Menü.

Abbildung 2.2: Rechtsklick auf ftduino.inf
Windows bietet daraufhin an, den Treiber zu installieren.

(a) Bestätigungsabfrage

(b) Ggf. folgende Sicherheitsabfrage

Abbildung 2.3: Installation des Treibers
Ggf. erfolgt noch eine Sicherheitsabfrage. Dieser Frage kann man getrost zustimmen, da der eigentliche Treiber bereits Teil
von Windows 7 bzw. Windows Vista ist. Die ftduino.inf-Datei fordert Windows lediglich auf, ihn zu verwenden.
Sobald die Installation erfolgreich war wird der ftDuino als sogenannter COM:-Port eingebuden.
Je nach Betriebsmodus des ftDuino und je nach installierter Anwendung auf dem ftDuino befindet er sich im Anwendungsmodus oder im Bootloader. Windows unterscheidet zwischen beiden Zuständen und weist zwei unterschiedliche COM:-Ports
zu. Das ist so gewollt und soll nicht weiter irritieren. In den meisten Fällen wir der Benutzer nur den Anwendungsmodus zu
sehen bekommen.

2.1. Treiber

19

(a) Anwendungsmodus

(b) Bootloader

Abbildung 2.4: ftDuino mit passendem Treiber unter Windows 7

2.1.3

Linux

Der ftDuino wird von einem handelsüblichen Linux-PC ohne weitere manuelle Eingriffe erkannt. Da er das sogenannte
“Abstract Control Model” (ACM) implementiert taucht er im Linux-System als /dev/ttyACMX auf, wobei X eine fortlaufende
Nummer ist. Sind keine weiteren ACM-Geräte verbunden, so wird der ftDuino als /dev/ttyACM0 eingebunden.
Mehr Details erfährt man z.B. direkt nach dem Anstecken des ftDuino mit dem dmesg-Kommando:
$ dmesg
...
[15822.397956]
[15822.540331]
[15822.540334]
[15822.540336]
[15822.540337]
[15822.541084]

usb 3-1: new full-speed USB device number 9 using xhci_hcd
usb 3-1: New USB device found, idVendor=1c40, idProduct=0538
usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 3-1: Product: ftDuino
usb 3-1: Manufacturer: Till Harbaum
cdc_acm 3-1:1.0: ttyACM0: USB ACM device

Die genauen Meldungen variieren von System zu System, aber der generelle Inhalt wird vergleichbar sein.
Weitere Details zum erkannten USB-Gerät liefert das lsusb-Kommando:
$ lsusb -vd 1c40:0538
Bus 003 Device 009: ID 1c40:0538 EZPrototypes
Device Descriptor:
bLength
18
bDescriptorType
1
bcdUSB
2.00
bDeviceClass
239 Miscellaneous Device
bDeviceSubClass
2 ?
bDeviceProtocol
1 Interface Association
bMaxPacketSize0
64
idVendor
0x1c40 EZPrototypes
idProduct
0x0538
...
Diese Ausgaben sind besonders interessant, wenn man wie in Abschnitt 4.10 oder 4.16 beschrieben die erweiterten USBMöglichkeiten des ftDuino nutzt.

“Device or resource busy”
Auch wenn Linux bereits den eigentlichen Gerätetreiber mitbringt kann es trotzdem nötig sein, die Systemkonfiguration
anzupassen. Das Symptom ist, dass es beim Versuch, auf den ftDuino zuzugreifen, in der Arduino-IDE zu der folgenden
Fehlermeldung kommt.

20

Kapitel 2. Installation

Abbildung 2.5: Fehlermeldung bei installiertem ModemManager
In diesem Fall ist die wahrscheinlichste Ursache, dass ModemManager, ein Programm zur Bedienung von Modems, installiert
ist und sich mit dem ftDuino verbunden hat. Um das zu verhindern, dass der ModemManager versucht, sich mit dem ftDuino
zu verbinden, ist die Eingabe des folgenden Kommandos nötig:
sudo wget -P /etc/udev/rules.d https://raw.githubusercontent.com/harbaum/ftduino/master/ftduino/driver/99-ftduino.rules

Die Datei /etc/udev/rules.d/99-ftduino.rules muss danach exakt folgenden Inhalt haben:
ATTRS{idVendor}=="1c40" ATTRS{idProduct}=="0537", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="1c40" ATTRS{idProduct}=="0538", ENV{ID_MM_DEVICE_IGNORE}="1", MODE="0666"
Danach muss der ftDuino einmal kurz vom PC getrennt und wieder angesteckt werden und sollte danach problem zu
verwenden sein.
Das Kommandos legt eine Datei namens /etc/udev/rules.d/99-ftduino.rules an. Diese Datei enthält Regeln, wie
der Linux-Kernel mit bestimmten Ereignissen umgehen soll. In diesem Fall soll beim Einstecken eines USB-Gerätes mit der
Hersteller-Identifikation 1c40 und den Geräteidentifikationen 0537 und 0538 dieses vom ModemManager ignoriert werden.

2.2. Arduino-IDE

2.2

21

Arduino-IDE

Die integrierte Entwicklungsumgebung (IDE) für den Arduino bekommt man kostenlos für die gängigsten Betriebssysteme
unter https://www.arduino.cc/en/Main/Software. Die Windows-Version mit eigenem Installer ist dort z.B. direkt unter dem
Link https://www.arduino.cc/download handler.php erreichbar. Diese Arduino-IDE wird zunächst installiert.
Um den ftDuino unter der Arduino-IDE nutzen zu können muss eine entsprechende Konfoiguration vorgenommen werden.
Die Arduino-IDE erlaubt es, diesen Vorgang weitgehend zu automatisieren.

2.2.1

Installation mit dem Boardverwalter

Für die einfache Installation zusätzlicher Boards bringt die Arduino-IDE den sogenannten Boardverwalter mit. Zunächst
muss dem Boardverwalter in den Arduino-Voreinstellungen mitgeteilt werden, wo die ftDuino-Konfiguration zu finden ist.
Dazu trägt man https://raw.githubusercontent.com/harbaum/ftduino/master/package ftduino index.json in den Voreinstellungen wie folgt ein. Beim Eintragen der entsprechende Zeile ist darauf zu achten, dass die URL Unterstriche ( ) enthält,
die ggf. beim Kopieren (Copy’n Paste) der URL aus diesem PDF-Dokument verloren gehen. In diesem Fall sollte die URL
manuell eingegeben werden.

Abbildung 2.6: URL der ftDuino-Konfiguration in den Arduino-Voreinstellungen
Den eigentlichen Boardverwalter erreicht man danach direkt über das Menü der IDE unter Werkzeuge . Board: ... .
Boardverwalter... .

Abbildung 2.7: Den Boardverwalter startet man aus dem Menü
Nachdem die JSON-Datei in den Voreinstellungen eingetragen wurde bietet der Boardverwalter automatisch die ftDuinoKonfiguration an.

22

Kapitel 2. Installation

Abbildung 2.8: Im Boardverwalter kann das ftDuino-Board installiert werden
Durch Klick auf Installieren... werden alle für den ftDuino nötigen Dateien automatisch heruntergeladen und installiert.
Nach erfolgreicher Installtion kann der ftDuino unter den Boards ausgewählt werden.

Abbildung 2.9: Auswahl des ftDuino-Boards
Ist bereits ein ftDuino angeschlossen und wurde der nötige Treiber installiert, so lässt sich der ftDuino nun unter Port
auswählen.
Die Installation ist damit abgeschlossen. Während der Installation wurden bereits einige Beispielprogramme installiert. Diese
finden sich im Menü unter Datei . Beispiele . Examples for ftDuino .

Abbildung 2.10: Beispiele zum ftDuino-Board
Diese Beispiele können direkt geladen und auf den ftDuino hinuntergeladen werden.

2.2.2

Updates

Die Arduino-IDE benachrichtigt automatisch über Softwareupdates der ftDuino-Konfiguration. Mit wenig Aufwand bleibt
man so immer auf dem aktuellen Stand.

Kapitel 3

Erste Schritte
In diesem Kapitel geht es darum, erste Erfahrungen mit dem ftDuino und der Arduino-IDE zu sammeln. Voraussetzung ist,
dass der ftDuino von einem passenden Treiber auf dem PC unterstützt wird und dass die Arduino-IDE wie in Kapitel 2
beschrieben installiert und für die Verwendung des ftDuinos vorbereitet wurde.
Zusätzlich zum ftDuino wird ein handelsübliches Mini-USB-Kabel benötigt, wie es z.B. auch mit den fischertechnik TX und
TXT verwendet wird.

3.1

Der erste Sketch

Für die ersten Versuche benötigt der ftDuino keine seperate Stromversorgung. Es genügt, wenn er per USB vom PC versorgt
wird. Die fischertechnik-Ein- und Ausgänge bleiben zunächst unbenutzt.
Als erstes kann man den folgenden Sketch direkt in der Arduino-IDE eingeben. Das Beispiel muss aber nicht zwingend
manuell eingetippt werden, denn es findet sich als fertig mitgeliefertes Beispiel im Datei -Menü der Arduino-IDE unter
Datei . Beispiele . FtduinoSimple . Blink .

Abbildung 3.1: Die ftDuino-Beispiele in der Arduino-IDE
Alle vorinstallierten Beispiele können mit einem Klick geladen werden und es öffnet sich ein neues Fenster mit dem ausgewählten Beispiel.
1
2
3
4
5
6
7
8
9

/*
Blink
Schaltet die interne rote LED des ftDuino f ü r eine Sekunde ein
und f ü r eine Sekunde aus und wiederholt dies endlos .
Original :
http :// www . arduino . cc / en / Tutorial / Blink
*/

24

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

3.1.1

Kapitel 3. Erste Schritte

// die setup - Funktion wird einmal beim Start aufgerufen
void setup () {
// Konfiguriere den Pin , an den die interne LED angeschlossen ist , als Ausgang
pinMode ( LED_BUILTIN , OUTPUT ) ;
}
// die loop - Funktion wird immer wieder aufgerufen
void loop () {
digitalWrite ( LED_BUILTIN , HIGH ) ;
// schalte die LED ein ( HIGH ist der hohe S pannung spegel )
delay (1000) ;
// warte 1000 Millisekunden ( eine Sekunde )
digitalWrite ( LED_BUILTIN , LOW ) ;
// schalte die LED aus , indem die Spannung auf
// niedrigen Pegel ( LOW ) geschaltet wird
delay (1000) ;
// warte eine Sekunde
}

Download des Blink-Sketches auf den ftDuino

Der Blink-Sketch sollte nun geöffnet sein. Der ftDuino sollte an den PC angeschlossen sein und im Menü unter Werkzeuge .
Board der ftDuino ausgewählt sowie der richtige COM:-Port unter Werkzeuge . Port ausgewählt sein.

Abbildung 3.2: Auswahl des Ports in der Arduino-IDE unter Windows
Dies zeigt die Arduino-IDE auch ganz unten rechts in der Statusleiste an.

(a) Linux

(b) Windows

Abbildung 3.3: Der ausgewählte ftDuino wird in der Statusleiste angezeigt
Der Download des Sketches auf den ftDuino erfordert nur noch einen Klick auf die Download-Pfeil-Schaltfläche in der
Arduino-IDE oben links.

Abbildung 3.4: Download-Schaltfläche der Arduino-IDE
Der Sketch wird von der IDE zunächst in Maschinencode übersetzt. Wenn die Übersetzung erfolgreich war wird der Maschinencode über die USB-Verbdinung auf den ftDuino übertragen und dort im Flash-Speicher abgelegt.
Während des Downloads zeigt die interne rote Leuchtdiode des ftDuino wie in Abschnitt 1.2.4 beschrieben an, dass der
Bootloader aktiviert wird und dass der Download stattfindet.
Nach erfolgreichem Download startet der Sketch sofort und die interne rote Leuchtdiode blinkt langsam.

3.1. Der erste Sketch

25

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 3.5: Blinkende interne rote Leuchtdiode im ftDuino

3.1.2

Die Funktionsweise des Sketches

Der Sketch-Code besteht zum überwiegenden Teil aus erklärenden Kommentaren, die für die Funktion des Sketches völlig
unbedeutend sind und lediglich dem Verständnis durch einen menschlichen Leser dienen. Kommentarzeilen beginnen mit
einem doppelten Schrägstrich (//). Mehrzeilige Kommentare werden durch /* und */ eingechlossen. In diesem Dokument
sowie in der Arduino-IDE sind Kommentare an ihrer hellgrauen Färbung leicht zu erkennen. Tatsächlicher Code befindet
sich lediglich in den Zeilen 12 bis 15 sowie den Zeilen 18 bis 24.

3.1.3

Die Funktionen setup() und loop()

Jeder Arduino-Sketch enthält mindestens die beiden Funktionen setup() (englisch für Einrichtung) und loop() (englisch
für Schleife). Zwischen den beiden geschweiften Klammern ({ und }) befinden sich jeweils durch Semikolon abgetrennt die
eigentlichen durch den ftDuino auszuführenden Befehle. Die Befehle in der Funktion setup() werden einmal bei SketchStart ausgeführt. Sie werden üblicherweise verwendet, um initiale Einstellungen vorzunehmen oder Ein- und Ausgänge zu
parametrieren. Die Befehle der loop()-Funktion werden hingegen immer wieder ausgeführt solange der ftDuino eingechaltet
bleibt oder bis er neu programmiert wird. Hier findet die eigentliche Sketch-Funktion statt und hier wird auf Sensoren reagiert
und Aktoren werden angesteuert.
Auch das Blink-Beispiel arbeitet so. In der setup()-Funktion wird in Zeile 14 der mit der roten Leuchtdiode verbundene
interne Anschluss im ftDuino zum Ausgang erklärt.
In der loop()-Funktion wird dann in Zeile 19 der interne Anschluss der roten Leuchtdiode eingeschaltet (Spannungspegel
hoch, HIGH) und in Zeile 21 wird er ausgeschaltet (Spannungspegel niedrig, LOW). Zwischendurch wird jeweils in den Zeilen
20 und 23 1000 Millisekunden bzw. eine Sekunde gewartet. Die Leuchtdiode wird also eingeschaltet, es wird eine Sekunde
gewartet, sie wird ausgeschaltet und es wird eine weitere Sekunde gewartet. Dies passiert immer und immer wieder, so dass
die Leuchtdiode mit einer Frequenz von 0,5 Hertz blinkt.

3.1.4

Anpassungen am Sketch

Für den Einstieg ist es oft sinnvoll, mit einem vorgefertigten Sketch zu starten und dann eigene Änderungen vorzunehmen.
Die Beispiele der Arduino-IDE stehen aber allen Benutzern eines PCs zur Verfügung und können daher zunächst nicht
verändert werden. Nimmt man an einem Beispiel-Sketch Änderungen vor und versucht sie zu speichern, dann weist einen
die Arduino-IDE darauf hin, dass man eine eigene Kopie anlegen soll. Dazu öffnet die Arduino-IDE einen Dateidialog und
man hat die Möglichkeit, den Sketch vor dem Speichern umzubenennen z.B. in SchnellBlink.

Abbildung 3.6: Die Arduino-IDE fordert zum Speichern einer eigenen Kopie auf

26

Kapitel 3. Erste Schritte

Sobald man auf diese Weise eine eigene Kopie angelegt hat kann man sie beliebig verändern. Die eigene Kopie wird im
Menü der Arduino-IDE unter Datei . Sketchbook eingefügt und kann von dort später jederzeit wieder geladen werden.

Abbildung 3.7: Kopie SchnellBlink im Sketchbook der Arduino-IDE
Im Sketch kann man nun beispielsweise aus den 1000 Millisekunden in den Zeilen 20 und 23 jeweils 500 Millisekunden
machen.
18
19
20
21
22
23
24

void loop () {
digitalWrite ( LED_BUILTIN , HIGH ) ;
delay (500) ;
digitalWrite ( LED_BUILTIN , LOW ) ;
delay (500) ;

//
//
//
//
//

schalte die LED ein ( HIGH ist der hohe S pannung spegel )
warte 500 Millisekunden ( eine halbe Sekunde )
schalte die LED aus , indem die Spannung auf
niedrigen Pegel ( LOW ) geschaltet wird
warte eine halbe Sekunde

}

Nach erfolgreichem Download wird die Leuchtdiode dann jeweils für 0,5 Sekunden ein- und ausgeschaltet und die Blinkfrequenz verdoppelt sich auf ein Hertz.

3.2

Ansteuerung von fischertechnik-Komponenten

Um die interne Leuchtdiode des ftDuino blinken zu lassen hätten wir keinen ftDuino benötigt. Alle Arduinos verfügen über
eine solche interne Leuchtdiode und hätten für unser erstes Beispiel verwendet werden können.
Seine speziellen Fähigkeiten spielt der ftDuino aus, wenn es darum geht mit den üblichen fischertechnik-Sensoren und Aktoren umzugehen. Der Blink-Sketch soll daher so erweitert werden, dass zusätzlich zu Leuchtdiode eine am Ausgang O1
angeschlossene Lampe blinkt.
Angeschlossen wird dazu eine normale fischertechnik-Lampe mit einem Stecker an den Ausgang O1 des ftDuino und mit dem
zweiten Stecker an einen der Masseanschlüsse des ftDuino. Masseanschlüsse sind die 12 Anschlüsse, die in der Abbildung
3.8 mit einem Massesymbol ⊥ verbunden sind.
Da nun die mit 9 Volt betriebenen fischertechnik-Ausgänge verwendet werden muss der ftDuino zusätzlich mit 9 Volt versorgt
werden. Das kann z.B. über ein übliches fischertechnik-Netzteil erfolgen oder über einen Batteriehalter. Beide Anschlüsse
sind verpolungsgeschützt, speziell beim Anschluss der Batterie kann man also keinen Schaden anrichten.

3.2.1

Der Sketch

Der folgende Beispiel-Sketch BlinkO1 findet sich auch im Datei -Menü der Arduino-IDE unter Datei . Beispiele .
FtduinoSimple . BlinkO1 .
1
2
3
4
5
6

// BlinkO1 . ino
//
// Blinken einer Lamoe an Ausgang O1
//
// ( c ) 2018 by Till Harbaum < till@harbaum . org >

3.2. Ansteuerung von fischertechnik-Komponenten

27

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 3.8: Blinkende fischertechnik-Lampe ftDuino
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# include < FtduinoSimple .h >
void setup () {
// LED i nitialis ieren
pinMode ( LED_BUILTIN , OUTPUT ) ;
}
void loop () {
// schalte die interne LED und den Ausgang O1 ein ( HIGH bzw . HI )
digitalWrite ( LED_BUILTIN , HIGH ) ;
ftduino . output_set ( Ftduino :: O1 , Ftduino :: HI ) ;
delay (1000) ;

// warte 1000 Millisekunden ( eine Sekunde )

// schalte die interne LED und den Ausgang O1 aus ( LOW bzw . LO )
digitalWrite ( LED_BUILTIN , LOW ) ;
ftduino . output_set ( Ftduino :: O1 , Ftduino :: LO ) ;
delay (1000) ;

// warte eine Sekunde

}

Der Sketch unterscheidet sich nur in wenigen Details vom ursprünglichen Blink-Sketch. Neu hinzugekommen sind die Zeilen
7, 17 und 23. In Zeile 7 wird eine Bibliothek eingebunden, die speziell für den ftDuino mitgeliefert wird und den Zugriff
auf die Ein- und Ausgänge des ftDuino vereinfacht. In den Zeilen 17 und 23 wird der Ausgang O1 eingeschaltet (HI) bzw.
ausgeschaltet (LO). Weitere Details zu dieser Bibliothek finden sich in Kapitel 7.
Die Kommandos zum Ein- und Ausschalten der internen Leuchtdiode sind nach wie vor vorhanden, so dass die interne
Leuchtdiode nun parallel zur extern angeschlossenen Lampe blinkt.
Weitere einfache Beispiele und Erklärungen zur Benutzung der Ein- und Ausgänge in eigenen Sketches finden sich in
Abschnitt 7.1.1.

3.2.2

Eingänge

Zum Anschluss an übliche fischertechnik-Taster, -Fototransistoren und ähnlich verfügt der ftDuino über die acht Eingänge
I1 bis I8 und die Zählereingänge C1 bis C4.
Der Zugriff auf diese Eingänge erfolgt über passende Bibliotheken wie in Abschnitt 7 dargestellt. Über die FtduinoSimpleBibliothek kann der Schaltzustand eines Tasters abgefragt werden:
1

# include < FtduinoSimple .h >

28

Kapitel 3. Erste Schritte

Reset

3
2

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 3.9: Taster am Eingang I1 des ftDuino
2
3
4
5
6
7
8
9
10
11
12

void setup () {
// keine I ni t ia li si e ru ng noetig
}
void loop () {
// lies den Zustand einer Taste an Eingang I1
if ( ftduino . input_get ( Ftduino :: I1 ) ) {
/* ... tue etwas ... */
}
}

Um Analogwerte wie Spannungen und Widerstände einzulesen ist der erweiterte Funktionsumfang der Ftduino-Bibliothek
nötig. Bei ihrer Verwendung muss zunächst der Messmodus des Eingangs eingestellt werden, bevor Widerstands-Werte
gelesen werden können:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# include < Ftduino .h >
void setup () {
// In it i al is ie r un g der Ftduino - Bibliothek
ftduino . init () ;
// Eingang I1 zur W i d e r s t a n d s m e s s u n g vorbereiten
ftduino . input _set_mo de ( Ftduino :: I1 , Ftduino :: RESISTANCE ) ;
}
void loop () {
// Auswertung des Widerstands an Eingang I1
uint16_t widerstand = ftduino . input_get ( Ftduino :: I1 ) ;
/* ... tue etwas ... */
}

In den Experimenten in Kapitel 4 finden sich diverse Beispiel, in denen die Eingänge des ftDuino ausgertet werden inklusive
spezieller Sensoren wie dem Temperatursensor in Abschnitt 4.7.

3.3

Kommunikation mit dem PC

Der ftDuino ist primär dafür gedacht, ein Modell autonom zu steuern und während des Betriebs nicht auf die Hilfe eines
PC angewiesen zu sein. Trotzdem gibt es Gründe, warum auch im laufenden Betrieb ein Datenaustausch mit einem PC
erwünscht sein kann.
Vor allem während der Sketch-Entwicklung und bei der Fehlersuche hilft es oft sehr, wenn man sich z.B. bestimmte Werte
am PC anzeigen lassen kann oder wenn man Fehlermeldungen im Klartext an den PC senden kann. Aber auch die Ausgabe
z.B. von Messwerten an den PC zur weiteren Auswertung oder Speicherung ist oft hilfreich.
Ein Sketck kann dazu den COM:-Port zwischen ftDuino und PC für den Datenaustausch nutzen. Der ftDuino-Beispiel-Sketch
ComPort zum Beispiel verwendet den COM:-Port, um ein paar einfache Textausgaben am PC zu erzeugen. Das ComPort-

3.3. Kommunikation mit dem PC

29

Beispiel findet sich im Datei -Menü der Arduino-IDE unter Datei . Beispiele . FtduinoSimple . USB . ComPort .
Auch der ComPort-Sketch verwendet keinen der Ausgänge und benötigt daher neben der USB-Verbindung keinerlei weitere
Spannungsversorung.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

3.3.1

/*
ComPort - Kommunikation mit dem PC ü ber den COM : - Port
*/
int zaehler = 0;
void setup () {
// Port initial isieren und auf USB - Verbindung warten
Serial . begin (9600) ;
while (! Serial ) ;
// warte auf USB - Verbindung
Serial . println ( " ftDuino COM : - Port test " ) ;
}
void loop () {
Serial . print ( " Z ä hler : " ) ;
Serial . println ( zaehler , DEC ) ;

// gib " Z ä hler :" aus
// gib zaehler als Dezimalzahl aus

zaehler = zaehler +1;

// zaehler um eins hochz ä hlen

delay (1000) ;

// warte 1 Sekunde (1000 Millisekunden )

}

Der serielle Monitor

Man kann ein beliebiges sogenanntes Terminalprogramm auf dem PC nutzen, um Textausgaben des ftDuino via COM:Port zu empfangen. Die Arduino-IDE bringt prakischerweise selbst ein solches Terminal mit. Es findet sich im Menü unter
Werkzeuge . Serieller Monitor .

Abbildung 3.10: Der serielle Monitor findet sich im Werkzeuge -Menü
Man muss den COM:-Port nicht seperat einstellen, sondern es wird der COM:-Port übernommen, der bereits für den SketchDownload eingestellt wurde.
Nach der Auswahl im Menü öffnet der serielle Monitor ein eigenes zusätzliches Fenster auf dem PC. Wurde der ComPortSketch bereits auf den ftDuino geladen, dann erscheinen sofort entsprechende Ausgaben, sobald der serielle Monitor geöffnet
wurde.
Die Nutzung des COM:-Ports wird automatisch zwischen Sketch-Download und seriellem Monitor geteilt. Man kann also
jederzeit bei geöffnetem seriellen Monitor den Sketch-Editor in den Vordergrund holen und einen Download starten. Der
seriellem Monitor wird dann automatisch für die Zeit des Downloads deaktiviert.
Eine Besonderheit des USB-COM:-Ports die der ftDuino vom Arduino Leonardo erbt ist, dass die sogenannte Bitrate (oft
auch Baudrate genannt) keine Bedeutung hat. Im ComPort-Beispiel wird in Zeile 10 eine Bitrate von 9600 Bit pro Sekunde
eingestellt, in Abbildung 3.11 ist aber unten rechts eine Bitrate von 115200 Bit pro Sekunde eingestellt. Die USB-Verbindung

30

Kapitel 3. Erste Schritte

Abbildung 3.11: Der serielle Monitor
ignoriert diese Einstellungen und kommuniziert trotzdem fehlerfrei. Einige andere Mitglieder der Arduino-Familie wie der
Arduino-Uno benötigen hier aber übereinstimmende Einstellungen.

3.3.2

Sketchbeschreibung

Der Sketch besteht aus wenig mehr als den eigentlich Aufrufen zur Bedienung des COM:-Ports. Da der COM:-Port auch oft
“serieller Port”, englisch “Serial” genannt wird fangen die entsprechenden Funktionsaufrufe alle mit Serial. an.
In Zeile 10 der sofort bei Sketchstart aufgerufenen setup()-Funktion wird zunächst der COM:-Port für die Kommunikation
geöffnet. In Zeile 11 dann wird gewartet, bis der COM:-Port auf PC-Seite verfügbar ist und die erste Kommunikation
stattfinden kann. In Zeile 13 wird danach eine erste Startmeldung an den PC geschickt.
Innerhalb der widerholt durchlaufenen loop()-Funktion wird dann in den Zeilen 17 und 18 zunächst der Text “Zähler: “
ausgegeben, gefolgt von dem Inhalt der Variablen zaehler in Dezimaldarstellung. Die println()-Funktion führt nach der
Ausgabe einen Zeilenvorschub aus. Die folgende Ausgabe erfolgt daher am Beginn der nächsten Bildschirmzeile.
Schließlich wird in Zeile 20 die zaehler-Variable um eins erhöht und eine Sekunde (1000 Millisekunden) gewartet.

3.3.3

USB-Verbindungsaufbau

Bei Geräten wie dem Arduino Uno, die einen seperaten USB-Kommunikationsbaustein für die USB-Kommunikation nutzen,
besteht die USB-Verbindung durchgängig, sobald das Gerät mit dem PC verbunden ist. Beim ftDuino sowie beim Arduino
Leonardo übernimmt der Mikrocontroller wichtige Aspekte der USB-Kommunikaiton selbst. Das bedeutet, dass die logische
USB-Verbindung jedes Mal getrennt und neu aufgebaut wird, wenn ein neuer Sketch auf den Mikrocontroller übertragen
wird.
Beginnt der ftDuino direkt nach dem Download mit der Textausgabe auf dem COM:-Port, so gehen die ersten Nachrichten
verloren, da die USB-Verbindung noch nicht wieder aufgebaut ist. Daher wartet der Sketch in Zeile 11 darauf, dass die
Kommunikationsverbindung zwischen ftDuino und PC wieder besteht, bevor die ersten Ausgaben erfolgen.
Man kann testweise diese Zeile einmal löschen oder auskommentieren (Programmcode, der per // in einen Kommentar
verwandelt wurde, wird nicht ausgeführt).
8
9
10
11
12
13
14

void setup () {
// Port initial isieren und auf USB - Verbindung warten
Serial . begin (9600) ;
// while (! Serial ) ;
// warte auf USB - Verbindung
Serial . println ( " ftDuino COM : - Port test " ) ;
}

Lädt man diesen Sketch nun auf den ftDuino, so beginnt die Textausgabe im seriellen Monitor erst ab der Zeile Zähler: 2.
Die beiden vorhergehenden Zeilen werden vom ftDuino an den PC gesendet, bevor die USB-Verbindung wieder steht und
gehen daher verloren. Dieses Verhalten kann trotzdem gewünscht sein, wenn die Ausgabe über USB nur zusätzlich erfolgen
soll und der ftDuino auch ohne angeschlossenen PC arbeiten soll.

Kapitel 4

Experimente
Die Experimente dieses Kapitels konzentrieren sich auf einzelne Aspekte des ftDuino. Sie veranschaulichen einen Effekt oder
ein Konzept und verwenden dafür nur minimale externe Komponenten. Die Experimente stellen an sich keine vollständigen
Modelle dar, können aber oft als Basis dafür dienen.
Beispiele für komplexe Modelle finden sich im Kapitel 5.

4.1

Lampen-Zeitschaltung

Schwierigkeitsgrad:
Dieses sehr einfache Modell besteht nur aus einem Taster und einer Lampe und bildet die Funktion einer typischen Treppenhausbeleuchtung nach. Um Energie zu sparen wird hier nicht einfach ein Kippschalter genommen, um das Licht zu schalten.
Stattdessen wird ein Taster verwendet und jeder Druck auf den Taster schaltet das Licht nur für z.B. zehn Sekunden ein.
Wird während dieser Zeit der Taster erneut gedrückt, so verlängert sich die verbleibende Zeit wieder auf volle zehn Sekunden.
Nach Ablauf der zehn Sekunden verlischt das Licht und das Spiel beginnt von vorn.

Reset

3
2

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.1: Lampen-Zeitschaltung

4.1.1

Sketch LampTimer

Der folgende Sketch findet sich bei installierter ftDuino-Unterstützung im Menü der Arduino-IDE unter Datei .
Beispiele . FtduinoSimple . LampTimer .
1
2
3
4
5

/*
LampTimer - Lampen - Zeitschaltuhr
( c ) 2017 by Till Harbaum < till@harbaum . org >

32

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

Kapitel 4. Experimente

Schaltet eine Lampe an Ausgang O1 f ü r 10 Sekunden ein ,
sobald ein Taster an Eingang I1 gedr ü ckt wird .
*/
# include < FtduinoSimple .h >
uint32_t startzeit = 0;
// Die Setup - Funktion wird einmal ausgef ü hrt , wenn Reset gedr ü ckt oder
// das Board gestartet wird .
void setup () { }
// Die Loop - Funktion wird endlos immer und immer wieder ausgef ü hrt
void loop () {
// Teste , ob der Taster an I1 gedr ü ckt ist
if ( ftduino . input_get ( Ftduino :: I1 ) ) {
// merke Startzeit
startzeit = millis () ;
// schalte Lampe ein ( Ausgang HI )
ftduino . output_set ( Ftduino :: O1 , Ftduino :: HI ) ;
}
// g ü ltige Startzeit und seitdem mehr als 10 Sekunden
// (10.000 Millisekunden ) verstrichen ?
if (( startzeit != 0) &&
( millis () > startzeit + 10000) ) {
// vergiss Startzeit
startzeit = 0;
// schalte Lampe aus ( Ausgang OFF )
ftduino . output_set ( Ftduino :: O1 , Ftduino :: OFF ) ;
}
}

Sketchbeschreibung
Die für die Lampen-Zeitschaltung nötigen Funktionen des ftDuino sind sehr einfach und die Anwendung lässt sich mit der
einfachen FtduinoSimple-Bibliothek (siehe Abschnitt 7.1) abdecken.
Der Arduino-Sketch enthält eine leere setup()-Funktion, da keine Initialisierung nötig ist. Sämtliche Funktionalität steckt
in der loop()-Funktion.
Die Taste an I1 wird über input get() permanent abgefragt. Ist sie gedrückt, so wird die aktuelle Zeit seit Gerätestart
in Millisekunden mit der Funktion millis() abgefragt und in der Variablen startzeit gespeichert und die Lamoe wird
eingeschaltet. War die Lampe bereits an, dann bewirkt dieses zusätzliche Einschalten nichts, aber der bereits gesetzte
Zeitwert in startzeit wird durch den aktuellen ersetzt.
Unabhängig davon wird permanent getestet, ob startzeit einen gültigen Wert enthält und ob die aktuelle Systemzeit
bereits mehr als zehn Sekunden (10.000 Millisekunden) nach dem dort gespeicherten Wert liegt. Ist das der Fall, dann
sind seit dem letzten Tastendruck mehr als zehn Sekunden vergangen und die Lampe wird ausgeschaltet sowie der Wert in
startzeit auf Null gesetzt, um ihn als ungültig zu markieren.
Aufgabe 1: 20 Sekunden
Sorge dafür, dass die Lampe nach jedem Tastendruck 20 Sekunden lang an bleibt.
Lösung 1:
In Zeile 32 muss der Wert 10000 durch den Wert 20000 ersetzt werden, damit die Lampe 20000 Millisekunden, also 20
Sekunden eingeschaltet bleibt.
31
32

if (( startzeit != 0) &&
( millis () > startzeit + 20000) ) {

4.2. Not-Aus

33

Aufgabe 2: Keine Verlängerung
Sorge dafür, dass ein weiterer Druck auf den Taster, während die Lampe bereits leutet, die verbleibende Zeit nicht wieder
auf 10 Sekunden verlängert.
Lösung 2:
Vor der Zuweisung in Zeile 23 muss eine zusätzliche Abfrage eingefügt werden, die nur dann einen neue Wert setzt, wenn
bisher keiner gesetzt war. Beide Zeilen zusammen sehen dann so aus:
23
24

if ( startzeit == 0)
startzeit = millis () ;

Expertenaufgabe:
Schließt Du statt der Lampe eine Leuchtdiode an (der rote Anschluss der Leuchtdiode muss an Ausgang O1), dann wirst Du
etwas merkwürdiges bemerken, wenn das Licht eigentlich aus sein sollte: Die Leuchtdiode leuchtet trotzdem ganz schwach,
obwohl der Ausgang doch OFF ist. Wie kommt das?
Erklärung
Durch eine Lampe oder Leuchtdiode fließt ein Strom, wenn zwischen den beiden Anschlüssen ein Spannungsunterschied
besteht. Den einen Anschluss haben wir fest mit Masse bzw. 0 Volt verbunden, der andere ist offen und wird von den Bauteilen
im ftDuino nicht mit Spannung versorgt. Anders als bei einem mechanischem Schalter ist diese Trennung bei dem im ftDuino
als sogenannter Ausgangstreiber verwendeten Halbleiterbaustein aber nicht perfekt. Ein ganz kleiner sogenannter Leckstrom
fließt trotzdem zur 9V-Versorgungsspannung. Dieser kleine Strom reicht nicht, die Lampe zum Leuchten zu bringen. Aber
er reicht, die wesentlich effizientere Leuchtdiode ganz leicht aufleuchten zu lassen.
Lässt sich daran etwas ändern? Ja! Statt den Ausgang komplett unbeschaltet zu lassen können wir dem Ausgangstreiber im
ftDuino sagen, dass er den Ausgang fest auf Masse (0 Volt) schalten soll. Beide Anschlüsse der Leuchtdiode liegen dann
fest auf Masse und die Einflüsse irgendwelcher Leckströme treten nicht mehr in Erscheinung. Dazu muss in der Zeile 36 die
Konstante OFF durch LO ersetzt werden. LO steht für low, english niedrig und meint in diesem Fall 0 Volt. Die Leuchtdiode
erlischt nun komplett nach Ablauf der Zeit.
36

ftduino . output_set ( Ftduino :: O1 , Ftduino :: LO ) ;

Direkt nach dem Einschalten des ftDuino leuchtet die Leuchtdiode aber nach wie vor. Vielleicht findest Du selbst heraus,
wie sich das ändern lässt. Tipp: Die bisher unbenutzte setup()-Funktion könnte helfen.
Mehr dazu gibt es im Abchnitt 4.8.

4.2

Not-Aus

Schwierigkeitsgrad:
Ein Not-Aus-Schalter kann Leben retten und scheint eine einfache Sache zu sein: Man drückt einen Taster und die betreffende
Maschine schaltet sich sofort ab. Im Modell stellt ein XS-Motor mit Ventilator an Ausgang M1 die Maschine dar. Ein Taster
an Eingang I1 bildet den Not-Aus-Taster.

4.2.1
1
2
3
4
5
6

Sketch EmergencyStop
/*
EmergencyStop - Not - Aus
( c ) 2017 by Till Harbaum < till@harbaum . org >
Schaltet einen Ventilator aus , sobald der Not - Aus - Taster

34

Kapitel 4. Experimente

Reset

3
2

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.2: Not-Aus

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

bet ä tigt wird .
*/
# include < FtduinoSimple .h >
// Die Setup - Funktion wird einmal bei Start des Systems ausgef ü hrt
void setup () {
// Ventilator bei Start des Systems einschalten
ftduino . motor_set ( Ftduino :: M1 , Ftduino :: LEFT ) ;
// Ausgang der internen roten LED aktivieren
pinMode ( LED_BUILTIN , OUTPUT ) ;
// und LED ausschalten
digitalWrite ( LED_BUILTIN , LOW ) ;
}
// Die Loop - Funktion wird endlos immer und immer wieder ausgef ü hrt
void loop () {
// Teste , ob der Taster an I1 gedr ü ckt ist
if ( ftduino . input_get ( Ftduino :: I1 ) ) {
// Motor bremsen
ftduino . motor_set ( Ftduino :: M1 , Ftduino :: BRAKE ) ;
// interne rote LED einschalten
digitalWrite ( LED_BUILTIN , HIGH ) ;
}
}

Sketchbeschreibung
Der Sketch ist sehr kurz und einfach. In der setup()-Funktion wird in Zeile 15 bei Sketchstart der Motor gestartet. Zusätzlich
wird in den Zeilen 18 bis 20 die rote interne Leuchtdiode des ftDuino für die spätere Verwendung aktiviert, aber zunächst
ausgeschaltet gelassen.
In der loop()-Funktion wird in Zeile 26 permanent abgefragt, ob der Not-Aus-Taster geschlossen wurde. Ist das der Fall,
dann wird der Motor in Zeile 28 sofort gestoppt und in Zeile 30 die rote Leuchtdiode eingeschaltet. Der Motor wird bewusst
per BRAKE gestoppt statt OFF. Auf diese Weise wird der Motor kurzgeschlossen und aktiv gebremst, während er andernfalls
langsam auslaufen würde, was im Notfall eine Gefahr darstellen würde.

Aufgabe 1: Kabelbruch
Not-Taster sind zwar an vielen Maschinen vorhanden. Glücklicherweise werden sie aber nur sehr selten wirklich benötigt.
Das hat den Nachteil, dass kaum jemand bemerken wird, wenn mit dem Not-Aus-Taster etwas nicht stimmt. Anfälliger als
der Taster selbst sind oft die Kabel und es kann im Arbeitsalltag leicht passieren, dass ein Kabel beschädigt wird. Oft sieht
man das dem Kabel nicht an, wenn z.B. die Ummantelung unbeschädigt aussieht, durch zu starke Belastung aber dennoch
die Kupferleiter im Inneren unterbrochen sind. Der Resultat ist ein sogenannter Kabelbruch.

4.2. Not-Aus

35

Du musst kein Kabel durchreissen. Es reicht, wenn Du einen der Stecker am Kabel, das den Taster mit dem ftDuino
verbindet, heraus ziehst. Der Not-Aus-Taster funktioniert dann nicht mehr und die Maschine lässt sich nicht stoppen. Eine
gefährliche Situation.
Lösung 1:
Die Lösung für das Problem ist überraschend einfach. Wir haben unseren Not-Aus-Taster als Schließer angeschlossen. Das
bedeutet, dass der Kontakt geschlossen wird, wenn der Taster betätigt wird. Man kann den fischertechni-Taster aber auch
als Öffner verwenden. Der Kontakt ist dann im Ruhezustand geschlossen und wird bei Druck auf den Taster geöffnet.

3
2

3
1
2

1

Abbildung 4.3: Kabelbruchsicherer Not-Aus-Öffner
Mit dem aktuellen Sketch geht die Maschine bei einem Kabelbruch sofort in den Notzustand, da der Taster ja sofort als
geschlossen erkannt wird. Also muss auch im Sketch die Logik herum gedreht werden. Das passiert durch folgende Änderung
in Zeile 26:
26

if (! ftduino . input_get ( Ftduino :: I1 ) ) {

Man muss genau hinschauen, um den Unterschied zu sehen. Hinter der öffnenden Klammer steht nun aus Ausrufezeichen, das
in der Programmiersprache C für die logische Negation eines Ausdrucks steht. Die Bedingung wird nun also ausgeführt, wenn
der Taster nicht geschlossen ist. Nach dieser Änderung sollte sich die Maschine wieder genau wie ursprünglich verhalten.
Mit einer kleinen Änderung: Zieht man nun einen der Stecker am Not-Aus-Taster heraus, so stoppt die Maschine sofort.
Bei einem Kabelbruch würde das ebenfalls passieren.
So eine Schaltung nennt man auf englisch “Fail-Safe”: Wenn etwas kaputt geht, dann wechselt die Schaltung in einen
sicheren Zustand. Der fischertechnik-3D-Drucker verwendet diese Schaltung zum Beispiel für die Endlagentaster. Ist hier ein
Kabel abgerissen, dann fährt der Drucker seine Motoren nicht gewaltsam gegen die Endanschläge der Achsen. Stattdessen
verweigert der Drucker die Arbeit komplett, sobald die Verbdindung zu einem Endlagentaster unterbrochen ist.
Expertenaufgabe:
Ein Kabel kann nicht nur unterbrochen werden. Es kann auch passieren, dass ein Kabel z.B. so stark gequetscht wird, dass
die inneren Leiter Kontakt miteinander bekommen. Das passiert wesentlich seltener, stellt aber ebenfalls eine realistische
Gefahr dar.
Vor diesem Fall würde unsere verbesserte Notschaltung nicht schützen und der Not-Aus-Taster würde in dem Fall wieder
nicht funkionieren. Wir brauchen also eine Variante, bei der weder der geschlossene noch der offene Zustand der Verbindung
als “gut” erkannt wird.
Lösung:
Die Lösung ist in diesem Fall etwas aufwändiger. Es müssen nun mindestens drei Zustände unterschieden werden: “normal”,
“unterbrochen” und “kurzgeschlossen”. Reine Schalteingänge können aber nur die beiden Zustände “geschlossen” und
“offen” unterscheiden.
Die Lösung ist, die analogen Fähigkeiten der Eingänge zu nutzen. Dazu kann man z.B. direkt am Taster einen 100 ΩWiderstand in die Leitung integrieren.
Im Normalfall ist der Taster geschlossen und der am Eingang I1 zu messende Widerstand beträgt 100 Ω. Ist die Leitung
unterbrochen, dann ist der Widerstand unendlich hoch. Und ist die Leitung kurzgeschlossen, dann ist der Widerstand nahe
0 Ω. Die Maschine darf also nur dann laufen, wenn der Widerstand nahe an 100 Ω ist. Etwas Toleranz ist nötig, da der
genau Wert des verwendeten Widerstands Fertigungstoleranzen unterworfen ist und auch der geschlossene Taster sowie sein
Anschlusskabel über einen eigenen sehr geringen Widerstand verfügen, der den gemessenen Gesamtwiderstand beeinflusst.

36

Kapitel 4. Experimente

3
2

1

Abbildung 4.4: Gegen Kabelbruch und Kurzschluss sicherer Not-Aus
Warum muss der Widerstand nahe am Taster angebracht werden? Was passiert, wenn er nahe am ftDuino eingesetzt wird
und dann ein Kurzschluss im Kabel zwischen Widerstand und Taster auftritt?

4.3

Pulsweitenmodulation

Schwierigkeitsgrad:
Wenn man eine Lampe mit variierender Helligkeit leuchten lassen möchte oder einen Motor mit regelbarer Geschwindigkeit
laufen lassen will, dann benötigt man eine Möglichkeit, die Energieaufnahme der Lampe oder des Motors zu beeinflussen.
Am einfachsten klappt das mit einer einstellbaren Spannungsquelle. Bei höherer Spannung steigt auch die Energieaufnahme
der Lampe und sie leuchtet heller und der Motor dreht sich schneller, bei niedrigerer Spannung wird die Lampe dunkler und
der Motor dreht sich langsamer. Für die Analogausgänge des ftDuino bedeutet das, dass sie eine zwischen 0 und 9 Volt
kontinuierlich (analog) einstellbare Spannung ausgeben können sollen, um Lampen und Motoren von völliger Dunkelheit
bzw. Stillstand bis zu maximaler Helligkeit bzw. Drehzahl betreiben zu können.
Der Erzeugung variabler Spannungen ist technisch relativ aufwändig. Es gibt allerdings einen einfachen Weg, ein verglaichbares Ergebnis zu erzielen. Statt die Spannung zu senken schaltet man die Spannung periodisch nur für sehr kurze Momente
ein. Schaltet man die Spannung z.B. nur 50% der Zeit ein und 50% der Zeit aus, so wird über die Gesamtzeit gesehen nur die
Hälfte der Energie übertragen. Ob man das Ergebnis als Blinken der Lampe oder als Stottern des Motors wahrnimmt oder
ob die Lampe einfach mit halber Helligkeit leuchtet und der Motor mit halber Drehzahl dreht ist von der Geschwindigkeit
abhängig, mit der man die Spannung ein- und auschaltet.

Reset

3
2

1

3
2

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.5: Pulsweitenmodulation

4.3.1
1
2
3
4
5
6
7
8
9
10
11
12

Sketch Pwm
/*
Pwm - P u l s w e i t e n m o d u l a t i o n
( c ) 2017 by Till Harbaum < till@harbaum . org >
*/
# include < FtduinoSimple .h >
uint16_t schaltzeit = 8192;

// 8192 entspricht je 1/2 Sekunde an und aus

// Die Setup - Funktion wird einmal ausgef ü hrt , wenn Reset gedr ü ckt oder
// das Board gestartet wird .

4.3. Pulsweitenmodulation

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

37

void setup () { }
// warte die angegebene Zeit . Der " zeit " - Wert 8192 soll dabei einer halben Sekunde
// entsprechen . Es muss also " zeit " mal 500000/8192 Mikrosekunden gewartet werden
void warte ( uint16_t zeit ) {
while ( zeit - -)
_delay_us (500000/8192) ;
}
// Die Loop - Funktion wird endlos immer und immer wieder ausgef ü hrt
void loop () {
static uint8_t an_aus = false ;
// der aktuelle Ausgang - an / aus - Zustand
static uint8_t i1 = false , i2 = false ; // letzter Zustand der Tasten an I1 und I2
// ist die Taste an I1 gedr ü ckt ?
if ( ftduino . input_get ( Ftduino :: I1 ) ) {
// und war die Taste vorher nicht gedr ü ckt und ist die
// aktuelle Schaltzeit kleiner 8192?
if (! i1 && ( schaltzeit < 8192) ) {
// dann verdopple die Schaltzeit
schaltzeit *= 2;
// warte eine Millisekunde , falls die Taste nachprellt
_delay_ms (1) ;
}
// merke , dass die Taste an I1 zur Zeit gedr ü ckt ist
i1 = true ;
} else
// merke , dass die Taste an I1 zur Zeit nicht gedr ü ckt ist
i1 = false ;
// ist die Taste an I2 gedr ü ckt ?
if ( ftduino . input_get ( Ftduino :: I2 ) ) {
// und war die Taste vorher nicht gedr ü ckt und ist die
// aktuelle Schaltzeit gr ö ß er 1?
if (! i2 && ( schaltzeit > 1) ) {
// dann halbiere die Schaltzeit
schaltzeit /= 2;
// warte eine Millisekunde , falls die Taste nachprellt
_delay_ms (1) ;
}
// merke , dass die Taste an I2 zur Zeit gedr ü ckt ist
i2 = true ;
} else
// merke , dass die Taste an I2 zur Zeit nicht gedr ü ckt ist
i2 = false ;
// schalte den Ausgand O2 je nach Zustand der an_aus - Variable an oder aus
if ( an_aus )
// wenn der aktuelle an_aus - Zustand wahr ist , dann schalte den Ausgang ein
ftduino . output_set ( Ftduino :: O1 , Ftduino :: HI ) ;
else
// wenn der aktuelle an_aus - Zustand unwahr ist , dann schalte den Ausgang aus
ftduino . output_set ( Ftduino :: O1 , Ftduino :: OFF ) ;
// warte die aktuelle Schaltzeit
warte ( schaltzeit ) ;
// wechsel den an_aus - Zustand
an_aus = ! an_aus ;
}

Sketchbeschreibung
Der Sketch schaltet den Ausgang O1 in der loop()-Funktion in den Zeilen 60 bis 71 kontinuierlich ein und aus. Je nach
Wert der Variable an aus wird der Ausgang in Zeile 62 auf 9 Volt (HI) geschaltet oder in Zeile 65 ausgeschaltet (von der
Spannungsversorgung getrennt). In Zeile 71 wird in jedem Durchlauf der loop()-Funktion der Zustand der Variable an aus
gewechselt, so dass der Ausgang im in jedem Durchlauf im Wechsel ein- und ausgeschaltet wird.
Nach jeden An/Aus-Wechsel wird in Zeile 68 etwas gewartet. Wie lange gewartet wird steht in der Variablen schaltzeit
Sie gibt die Wartezeit in 1/8192 halben Sekunden an. Dazu wird in der Funktion wait() in Zeile 19 so oft 500000/8192

38

Kapitel 4. Experimente

Mikrosekunden gewartet wie in der Variablen schaltzeit angegeben. Warum halbe Sekunden? Weil zweimal pro Zyklus
gewartet wird, einmal wenn der Ausgang eingeschaltet ist und einmal wenn er ausgeschaltet ist. Wird jeweils eine halbe
Sekunde gewartet, so dauert der gesamte Zylus eine Sekunde und der Ausgang wird einmal pro Sekunde für eine halbe
Sekunde eingeschaltet. Der Ausgang wechselt also mit einer Frequenz von 1/Sek. oder einem Hertz.
Durch einen Druck auf den Taster an I1 (Zeile 28) kann der Werte der Variablen schaltzeit verdoppelt (Zeile 33) und
mit einem Druck auf den Taster an I2 (Zeile 44) halbiert (Zeile 49) werden. Dabei wird der Wert von Schaltzeit auf den
Bereich von 1 (Zeile 47) und 8192 (Zeile 31) begrenzt. Nun wird auch klar, warum dieser merkwürdig “krumme” Wert 8192
gewählt wurde: Da 8192 eine Zweierpotenz (213 ) ist lässt der Wert sich ohne Rundungsfehler bis auf 1 hinuterteilen und
wieder hochmultiplizieren.
Da die Tasten nur beim Wechsel zwischen an und aus abgefragt werden muss man den Taster bei niedrigen Frequenzen
einen Moment gedrückt haltem, bis sich die Blinkfrequenz verändert.
Wenn der Sketch startet leuchtet die Lampe einmal pro Sekunde für eine halbe Sekunde auf. Ein (langer) Druck auf
den Taster an I2 halbiert die Wartezeit und die Lampe blinkt zweimal pro Sekunde. Nach einem zweiten Druck auf den
Taster blinkt sie viermal usw. Nach dem sechsten Druck blinkt sie 32 mal pro Sekunde, was nur noch als leichtes Flackern
wahrnehmbar ist und nach dem siebten Druck gar 64 mal. Frequenzen oberhalb ca. 50 Hertz kann das menschliche Auge
nicht mehr auflösen und die Lampe scheint mit halber Helligkeit zu leuchten. Die Frequenz weiter zu erhöhen hat dann
keinen erkennbaren Effekt mehr.
Aufgabe 1: Die träge Lampe
Es ist in diesem Aufbau nicht nur das menschliche Auge, das träge ist. Die Lampe ist ebenfalls träge. Es dauert eine Zeit,
bis sich ihr Glühfaden aufheizt und die Lampe leuchtet und es dauert auch eine Zeit, bis sich der Glühfaden wieder so weit
abkühlt, dass die Lampe nicht mehr leuchtet.
Wesentlich schneller als Glühlampen sind Leuchtdioden. In ihnen muss sich nichts aufheizen oder abkühlen, sondern das
Licht entsteht direkt durch optoelektrische Effekte im Halbleitermaterial der Leuchtdiode. Schließt man statt der Lampe
eine Leuchtdiode an (rot markierter Anschluss an Ausgang O1), dann sieht das Verhalten zunächst ähnlich aus und wieder
scheint ab einer Frequenz von 64 Hertz die Leuchtdiode gleichmäßig mit halber Helligkeit zu leuchten. Viele Menschen
nehmen 64 Hz allerdings noch als leichtes Flimmern wahr und erst ab 100Hz redet man von einer wirklich flimmerfreien
Darstellung.
Man kann das Flimmern der Leuchtdiode aber auch bei diesen Frequenzen noch beobachten, wenn sich die Leuchtdiode
bewegt. Nutzt man ein etwas längeres Kabel, so dass die Leuchtdiode sich frei bewegen lässt und bewegt sie dann in einer
etwas abgedunkelten Umgebung schnell hin- und her, so wird der Eindruck einer Reihe von unterbrochenen Leuchtstreifen
entstehen.

Abbildung 4.6: Muster bei schneller Bewegung der flackernden Leuchtdiode
Je höher die PWM-Frequenz ist, desto kürzer sind die sichtbaren Leuchtstreifen.
Dieses Experiment kann man auch mit der Lampe wiederholen. Durch die Trägheit der Lampe sieht man nur einen durchgehenden Leuchtstreifen. Allerdings sollte man nicht allzu wild vorgehen, da der empfindliche Glühfaden einer leuchtenden
Lampe bei Erschütterung leicht kaputt geht. Leuchtdioden sind auch in dieser Beziehung robust und lassen sich selbst von
starken Erschütterungen nicht beeindrucken.

4.3. Pulsweitenmodulation

39

Aufgabe 2: Töne aus dem Motor
Ein Motor ist ebenfalls träge und nicht in der Lage, beliebig schnellen An-/Aus-Signalen zu folgen. Schon bei recht niedrigen
PWM-Frequenzen dreht sich der Motor kontinuierlich mit halber Drehzahl. Das dabei vornehmlich zu vernehmende Geräusch
ist das Laufgeräusch des Motors.
Wenn man den Motor aber mechanisch blockiert, indem man ihn z.B. mit der Hand festhält, dann wirddas Laufgeräsch
unterdrückt und ein anderer Effekt wird hörbar: Die Spulen im Motor wirken wie ein Lautsprecher und man kann die PWMFrequenz bei blockiertem Motor als Ton hören. Eine Veränderung der PWM-Frequenz hat dabei einen deutlich hörbaren
Unterschied der Tonhöhe zur Folge.
Je höher die PWM-Frequenz, desto höher der am blockierten Motor hörbare Ton.
Aufgabe 3: Nachteil hoher PWM-Frequenzen
Im Fall der Lampe scheint eine höhere PWM-Frequenz ein reiner Vorteil zu sein, da das Flimmern mit höherer Frequenz
abnimmt. Am Motor kann aber ein negativer Effekt beobachtet werden.
Läuft der Motor frei, so hängt die gehörte Tonhöhe des Motor-Laufgeräuschs mit seiner Drehgeschwindigkeit zusammen,
während das PWM-Geräuch der vorigen Aufgabe in den Hintergrund tritt. Je schneller der Motor dreht, desto höher die
Frequenz des Laufgeräuschs und umgekehrt.
Erhöht man nun die PWM-Frequenz, dann sinkt die Frequenz der Töne, die der Motor abgibt leicht. Er wird offensichtlich
mit steigener PWM-Frequenz langsamer. Dieser Effekt ist damit zu erklären, dass der Motor eine sogenannte induktive Last
darstellt. Er besteht im Wesentlichen aus Spulen, sogenannten Induktoren. Der Widerstand einer induktiven Last ist abhängig
von der Frequenz einer angelegten Wechselspannung. Und nichts anderes ist das durch die PWM erzeugte An-/Aus-Signal.
Je höher die Frequenz, desto höher der Widerstand der Spule und es fließt weniger Strom durch die Spule.
Es ist technisch möglich, die Ausgangsspannung zu glätten und diesen Effekt zu mildern. Diese Auslegung so einer Glättung
ist allerdings von der verwendeten PWM-Frequenz und der Stromaufnahme des Motors abhängig. Außerdem beeinflusst sie
das generelle Schaltverhalten des Ausgangs. Der Einsatz einer entsprechenden Glättung im ftDuino kommt daher nicht in
Frage, da die universelle Verwendbarkeit der Ausgänge dadürch eingeschränkt würde.
Ziel bei der Auswahl der PWM-Frequenz ist also eine Frequenz, die hoch genug ist, um Lampenflackern oder Motorstottern zu
verhindern, die aber dennoch möglichst gering ist, um induktive Widerstände in den Wicklungen der Motoren zu minimieren.
Eine PWM-Frequenz von 100-200Hz erfüllt diese Bedingungen.
Motordrehzahl in Abhängigkeit des PWM-Verhältnisses
Die Motordrehzahl lässt sich durch das Verhältnis der An- und Ausphasen während der Pulsweitenmodulation beeinflussen.
In den bisherigen Versuchen waren die An- und Ausphase jeweils gleich lang. Verändert man das Verhältnis der beiden
Phasen, dann lässt sich die Helligkeit einer Lampe oder die Drehzahl eines Motors steuern. Die PWM-Frequenz kann dabei
konstant bleiben.
0%
25%
50%
75%
100%

Abbildung 4.7: Ausgewählte PWM-Verhältnisse von 0 bis 100%
Je länger die eingeschaltete Phase gegenüber der ausgeschalteten, desto heller leuchtet die Lampe und desto schneller
dreht der Motor. Der genaue Zusammenhang zwischen Lampenhelligkeit und PWM-Verhältnis ist mangels entsprechender
Messmöglichkeit nicht einfach festzustellen. Die sogenannten Encoder-Motoren haben aber eine eingebaute Möglichkeit zur
Geschwindigkeitsmessung. Im Fall der TXT-Encodermotoren erzeugen diese Encoder 63 Signalimpulse pro Umdrehung der

40

Kapitel 4. Experimente

Achse. Man kann also durch Auswertung der Encodersignale an den Zählereingängen des ftDuino die Drehzahl des Motors
feststellen.

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.8: Anschluss des TXT-Encoder-Motors zur PWM-abhängigen Drehzahlmessung
Das Beispiel Datei . Beispiele . Ftduino . PwmSpeed regelt das An-/Ausverhältnis der PWM langsam von 0 auf
100% hoch und misst dabei kontinuerlich für jeweils eine Sekunde die am Eingang C1 anliegenden Impulse. Diese werden in
Umdrehungen pro Minute umgerechnet und ausgegeben. Dabei kommt die vollständige Bibliothek Ftduino zum Einsatz,
die die eigentliche Erzeugung der PWM-Signale bereits mitbringt. Die Erzeugung des PWM-Signals passiert vollständig im
Hintergrund, so dass der Sketch selbst lediglich den Motor startet und dann eine Sekunde wartet.
Speist man die so gewonnenen Daten in den sogenannten “seriellen Plotter”, der sich im Menü der Arduino-IDE unter
Werkzeuge . Serieller Plotter befindet, so kann man die Messergebnisse anschaulich visualisieren.

Abbildung 4.9: Leerlaufdrehzahl des TXT-Encoder-Motors in Abhängigkeit des PWM-Verhältnisses
Auf der horizontalen Achse ist das PWM-Verhältnis aufgetragen, beginnend mit “dauerhaft aus” ganz links bis “dauerhaft
an” ganz rechts. Auf der vertikalen Achse ist die gemessene Drehzahl in Umdrehungen pro Minute dargestellt. Man sieht,
dass der Zusammenhang im Leerlauf nicht linear ist. Bereits bei nur ca 25% der Zeit eingeschaltetem Signal wird 90% der
maximalen Motordrehzahl erreicht.
Man kann z.B. indem man den Motor eine konstante Last anheben lässt nachprüfen, wie sich diese Kurve und Last verändert.

4.4

Schrittmotoransteuerung

Schwierigkeitsgrad:
Gängige Elektromotoren, wie sie üblicherweise in Spielzeug eingesetzt werden sind sogenannte Asynchronmotoren. Diese in
der Regel mit Gleichspannung versorgten Motoren zeichnen sich dadurch aus, dass sie beim Anlegen einer Spannung sofort

4.4. Schrittmotoransteuerung

41

anfangen, sich zu drehen. Die Drehzahl richtet sich dabei nur indirekt nach außeren Einflüssen und der Motor dreht letztlich
so schnell es ihm möglich ist. Für viele Anwendungen ist diese Art Motor sehr gut geeignet. Modellautos lassen sich ohne
weitere Steuerung motorisieren und fahren auf mit diesen Motoren so schnell wie gerade möglich. Auch fischertechnik setzt
diese Motoren in den meisten Fällen ein und der ftDuino erlaubt es, sie direkt an jeweils einen Motorausgang M1 bis M4
anzuschließen.
Aber es gibt Anwendungen, in denen diese Motorfamilie sehr große Schwächen zeigt. So ist es sehr schwierig, mit einfachen
Asynchronmotoren eine exakte Drehzahl zu erreichen bzw. eine exakte Position anzufahren. Die Encoder-Motoren von
fischertechnik versuchen dies durch zusätzliche Hardware zu ermöglichen. Aber auch diesem Vorgehen sind Grenzen gesetzt,
speziell bei den fischertechnik-Encoder-Motoren, die nicht in der Lage sind, die Drehrichtung zu erfassen.

Abbildung 4.10: 17HS13-Schrittmotor am ftDuino
Für Aufgaben, bei denen es auf exaktes reproduzierbares Verhalten des Motors ankommt, gibt synchron arbeitende Motoren
wie die sogenannten Schrittmotoren. Gängige Anwendungen dafür sind heutzutage Scanner und 3D-Drucker, aber auch die
früher verwendeten Diskettenlaufwerke und frühe Festplatten verwendeten Schrittmotoren. Erkennbar ist die Nutzung von
Schrittmotoren auch am charakteristischen Betriebsgeräusch, das findige Tüftler sogar nutzen, um mit solchen Motoren
Musik zu erzeugen1 .

Reset

3
2

1

3
2

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.11: Anschluss des Schrittmotors an den ftDuino
Gängige Schrittmotoren bestehen aus einem drehbar gelagerten Anker aus Permanentmagneten, der von Elektromagneten
umgeben ist. Der Permanentmagnet richtet sich entsprechend den ihm umgebenden Magnetfeldern aus. Im Spannungslosen
1 Im

Internet leicht zu finden unter dem Stichwort “Floppymusik”

42

Kapitel 4. Experimente

Zustand lässt sich die Achse des Motors verlgeichsweise leicht drehen. Der dabei spürbare Widerstand resultiert daraus, dass
der Permanentmagnet von den Eisenkernen der Elektromagnete auch im spannungslosen Zustand angezogen wird.

Abbildung 4.12: Vereinfachtes Schema eines Schrittmotors
Der in der Abbildung dargestellte vereinfachte Schrittmotor verfügt über einen Permanentmagneten und zwei Elekomagnete.
Reale Schrittmotoren haben in der Regel mehr als zwei Spulen und der Anker bidet auch mehr als nur zwei magnetische
Pole ab. Auf das Funktionsprinzip hat diese Vereinfachung keine Auswirkungen.
Übliche sogenannte bipolare Schrittmotoren verfügen über vier Anschlüsse, jeweils zwei für jeden der beiden Elektromagneten.
Durch Anlegen einer Spannung werden die Elekromagneten magnetisiert. In der Folge richtet sich der Anker entsprechend
aus. Die Polarität der angelegten Spannung bestimmt die Richtung des Magnetfelds der Elektromagneten.

4.4.1

Vollschrittsteuerung

Sind immer beide Spulen unter Spannung, so gibt es vier verschiedene Ausrichtungen der beiden Elektromagnetfelder und
der Anker nimmt jeweils vier unterschiedliche Positionen ein. Wird eine entsprechende sich wiederholende Signalefolge an
die Elektromagneten angelegt, so folgt der Anker den Signalen und dreht sich. Er folgt dabei exakt den sich welchselnden
Magnetfeldern und dreht sich sychron zum angelegt Signalmuster. Geschwidigkeit und Position des Motors sind auf diese
Weise exakt vorhersagbar. Sind immer alle Spulen unter Spannung und durchläuft der Zyklus daher genau vier Zustände,
so spricht man von einer Vollschrittsteuerung.

A

L2

B

A

A

A

A

L1

L1

L1

L1

B

B

B

B

A

L2

B

A

L2

B

A

L2

B

L1.A
L1.B
L2.A
L2.B

Abbildung 4.13: Vollschrittansteuerung eines Schrittmotors
Ein Sketch, der kontinuiertlich das entsprechende Signalmuster erzeugt sieht folgendermaßen aus:
while (1) {
ftduino . motor_set ( Ftduino :: M1 ,
delay (5) ;
ftduino . motor_set ( Ftduino :: M2 ,
delay (5) ;
ftduino . motor_set ( Ftduino :: M1 ,
delay (5) ;
ftduino . motor_set ( Ftduino :: M2 ,

Ftduino :: LEFT ) ;
Ftduino :: LEFT ) ;
Ftduino :: RIGHT ) ;
Ftduino :: RIGHT ) ;

4.4. Schrittmotoransteuerung

43

delay (5) ;
}

Ein vollständiges Beispiel findet sich in der Arduino-IDE unter Datei . Beispiele . FtduinoSimple . StepperMotor .
Während sich der dargestellte vereinfachte Schrittmotor pro Signaländerung um 90° dreht und daher nach vier Schritten
eine volle Umdrehung absolviert hat haben reale Schrittmotoren eine höhere Auflösung. Gängig ist ein Schrittwinkel von
1,8°. Erst nach 200 Schritten hat sich so ein Motor einmal komplett gedreht. Da im abgebildeten Listing nach jedem Schritt
5ms gewartet wird werden genau 200 Schritte pro Sekunde erzeugt. Ein gängiger 1,8°-Motor würde sich genau einmal pro
Sekunden drehen.
Für die Experimente am ftDuino muss ein Motor gewählt werden, der mit den 9V-Ausgängen des ftDuino kompatibel ist.
Der hier verwendete 17HS13 ist für eine Betriebsspannung von 12V ausgelegt, arbeitet aber auch mit den fischertechniküblichen 9 Volt zuverlässig. Die Motoren des fischertechnik-Plotters 305712 von 1985 waren für 6 Volt ausgelegt. Sollen
diese Motoren am ftDuino betrieben werden, so ist dieser mit 6 statt den üblichen 9 Volt zu versorgen.
Die Abbildungen der Abläufe beinhalten in der unteren Hälfte jeweils die Signalverläufe an den vier Anschlüssen des Motors.
Die Signalverläufe sind farblich ensprechend der sich ergebenden Megnetfeldrichtung hinterlegt. Man sieht, wie die beiden
Anschlüsse eines Magneten immer genau gegenteilig angesteuert werden und sich das Magnetfeld beim Wechsel der Signale
ändert. Die abgebildete Farbe entspricht jeweils der Polarität der dem Anker zugewandten Seite des Elektromagneten.

4.4.2

Halbschrittsteuerung

Eine höhere Winkel-Auflösung erreicht man, wenn man den Schrittmotor im sogenannten Halbschrittbetrieb ansteuert. Der
Signalzyklus besteht in dem Fall nicht mehr aus vier sondern aus acht Schritten. In jedem zweiten Schritt wird einer der
beiden Elektromagneten abgeschaltet, so dass sich der Anker nur nach dem verbliebenen Magneten ausrichtet. Die sich
dadurch ergebenden vier Zwischenzustände sind von den resultierenden Winkel genau zwischen den vier Zuständen der
Vollschrittansteuerung angeordnet. Der Motor kann also die doppelt so viele Winkel ansteuern und entsprechend genauer
positioniert werden.

A

L2

B

A

A

A

A

A

A

A

A

L1

L1

L1

L1

L1

L1

L1

L1

B

B

B

B

B

B

B

B

A

L2

B

A

L2

B

A

L2

B

A

L2

B

A

L2

B

A

L2

B

A

L2

B

L1.A
L1.B
L2.A
L2.B

Abbildung 4.14: Halbschrittansteuerung eines Schrittmotors
In der Abbildung ist sichtbar, dass sich die beiden Signale zur Ansteuerung eines Elektromagneten nicht mehr gleichzeitig
ändern, sondern dass es einen Versatz gibt, währenddessen beide Signale auf gleichem Pegel liegen. Der Magnet steht zu
dieser Zeit nicht unter Spannung und hat kein Magnetfeld. Die Signalverläufe sind zu dieser Zeit daher nicht farbig hinterlegt.
Der Nachteil der Halbschrittansteuerung liegt darin, dass in den Zeiten, in denen nur ein Elektromagnet aktiv ist die Kraft
des Motors reduziert ist.

Timer-Interrupt betriebener Schrittmotor
Der im vorhergehenden Abschmitt verwendete Sketch zur Schrittmotoranszteuerung hat vor allem einen großen Vorteil:
Er ist anschaulich. Das Problem ist aber, dass die Ansteuerung Motors permanente Signalwechsel benötigt und daher die
Motorfunktionen im Sketch permanent aktiv sein müssen, damit der Motor sich dreht. Der Sketch verbringt praktisch
die ganze Zeit damit in den diversen delay()-Funktionsaufrufen, auf den nächsten Signalwechsel zu warten. Der großte
2 fischertechnik-Datenbank:

https://ft-datenbank.de/search.php?keyword=30571

44

Kapitel 4. Experimente

Nachteil: Während der Sketch einen Motor bedient kann er kaum etwas anderes tun. Einen zweiten Motor gleichzeit mit
ggf. sogar unterschiedlicher Drehzahl laufen zu lassen ist mit diesem einfachen Sketch kaum zu realisieren.
Das gleiche Problem stellte sich während der Entwicklung des ftDuino bereits mit den übrigen Komponenten des ftDuino
auch die Auswertung der Analogeingänge, die PQM-Drehzahlregelung der Motorausgänge und die Auswertung der Zähler
beanstruchen permant eine aktive Mitarbeit des Mikrocontrollers. Trotzdem muss der Anwender dafür in seinem Sketch
keine Funktion vorsehen. All diese Dinge passieren weitgehend unbemerkt im Hintergrund. Solch eine Hintergrundfunktion
wäre auch für den Betrieb des Schrittmotors wünschenswert.
Mikrocontroller wie der ATmega32u4 des ftDuino bestehen aus einem Mikroprozessor (der eigentlichen Recheneinheit)
und diversen zusätzlichen Hardwarekomponenten wie z.B. USB-Schnittstellenfunktionen. Unter anderem verfügt der ATmega32u4 über einige sogenannte Timer. Einen Timer kann man sich wie eine unabhängig vom eigentlichen Prozessor
arbeitende Uhr vorstellen. Man kann per Software festlegen, wie schnell die Uhr laufen soll und ob zu bestimmten Zeitpunkten ggf. bestimmte Dinge passieren sollen, aber das eigentliche Fortschreiten der Uhrzeit geschieht automatisch und
ohne weiteres Zutun eines auf dem Prozessor ausgeführten Sketches. Eines der Dinge, die von so einem Timer regelmäßig
ausgelöst werden können ist eine sogenannte Unterbrechungsanforderung (englisch Interrupt). Sie veranlasst den Prozessor,
zu unterbrechen, was auch immer er gerade tut und sich fpr kurze Zeit einer anderen Aufgabe zu widmen.
Diese Art von Unterbrechung ist ideal, um z.B. einen Schrittmotor zu steuern. Soll der Schrittmotor z.B. 200 Schritte pro
Sekunde bewegt werden, so kann ein Timer so programmiert werden, dass der Prozessor alle 5 Millesekunden unterbrochen
wird. In dieser Unterbrechung muss der Prozessor dann das Magnetfeld des Motors einen Schritt weiter drehen und sich
dann wieder seiner normalen Aufgabe widmen.
Das folgende Code-Segment programmiert den Timer 1 des ATmega32u4 so, dass die sogenannte Interrupt-Service-Routine
exakt alle 5 Millisekunden ausgeführt wird. Der Motor ließe sich so durch passenden Programmcode innerhalb dieser Routine
völlig unabhängig vom Hauptprogramm des Sketches betreiben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# include < FtduinoSimple .h >
// die sogegannte Interrupt - Service - Routine ( ISR ) wird
// nicht vom Sketch selbst zur Ausf ü hrung gebracht , sondern
// die Hardware des ATmega32u $ l ä st die Ausf ü hrung auf Basis
// eines Timer - Ereignisses aus
ISR ( T I M E R 1 _ C O M P A _ v e c t ) {
// Diese Funktion wird alle 5 ms ausgef ü hrt .
// Das Weiterdrehen des Schrittmotor - Magnetfeldes
// k ö nnte z . B . hier geschehen .
// ...
}
void
//
//
//
//

setup () {
Konfiguration des Timer 1 des ATmega32u4 , die genaue
Beschreibung der Register findet sich in Kapitel 14
des Datenblatt :
http :// ww1 . microchip . com / downloads / en / DeviceDoc / Atmel -7766 -8 - bit - AVR - ATmega16U4 -32
U4_Datasheet . pdf

// Timer 1 soll im sogenannten CTC - Modus schalten mit OCR1A
// als obere Grenze . Der Timer l ä uft mit 1/256 CPU - Takt . Dieser
// wiederum betr ä gt 16 Mhz , der Timer l ä uft also mit 62 ,5 kHz .
// Um den Motor 200 Schritte pro Sekunde zu drehen muss der
// Motor immer dann einen Schritt machen , wenn der Timer 312
// (62500/200) seiner Z ä hlschritte durchlaufen hat .
TCCR1A = 0;
TCCR1B = (1 < < WGM12 ) | (1 < < CS12 ) ; // Starte Timer 1 mit 1/256 F_CPU = 62.5 kHz
TCCR1C = 0;
// Ereignis ausl ö sen wenn 62400/200 Z ä hlerschritte erreicht sind
TCNT1 = 0;
OCR1A = 62500/200;
// E r e g n i s e r z e u g u n g bei Erreichen der Zielschritte ausl ö sen
TIMSK1 = (1 < < OCIE1A ) ;
}
void
//
//
//

loop () {
die Hauptroutine kann benliebig genutzt werden und
der Timer 1 - Interrupt wird unabh ä ngig regelm ä ß ig
ausgef ü hrt

4.5. Servomotoransteuerung

42

45

}

Das vollständige Beispiel findet sich unter Datei . Beispiele . FtduinoSimple . StepperMotorSrv . Es entspricht
weitgehend der vorgeschlagenen Nutzung von Timer 1. Ein zweiter Motor ließe sich z.B. ebenfalls im Hintergrund und
unabhängig vom bereits vorhandenen Motor und auch unabhängig vom Hauptorpgramm des Sketches durch Timer 3
steuern. Mit zwei Schrittmotoren ist so recht elegant z.B. ein sogegannter Plotter zu realisieren.

4.5

Servomotoransteuerung

Schwierigkeitsgrad:
Neben den normalen Gleichspannungsmotoren und den Schrittmotoren aus Abschnitt 4.4 gibt es eine dritte vor allem im
Modellbau verbreitete Art von Motoren, die sogenannten Servos. fischertechnik vertreibt einen Servo unter der Artikelnummer
1322923 .
Technisch bestehen Servos aus einfachen Gleichstrommotoren und einer einfachen Elektronik. Eine Messmechanik meldet
dieser Elektronik ständig den aktuellen Stellwert (Winkel) des Servos. Die Elektronik vergleicht diesen mit einem externen
Sollwert und regelt den Motor bei Bedarf nach. Das Servo folgt also mit seinem Drehwinkel einem externen Sollwert.
Servos haben daher ein drei-adriges Anschlusskabel. Zwei Adern werden zur Spannungsversorgung (rot = 6 Volt, braun =
Masse) verwendet, die dritte Ader (orange) überträgt den Sollwert. Es lassen sich handelsübliche Servos verwenden, aber
auch der fischertechnik-Servo 1322924 aus dem 5405855 -PLUS Bluetooth Control Set. Auch der fischertechnik RC-Servo
302756 von 1983 müsste auf diese Weise verwendbar sein. Das wurde jedoch bisher nicht überprüft.

Reset

Reset

I1

O1 O2

I1

O1 O2

I2

O3 O4

I2

O3 O4

I3

O5 O6

I3

O5 O6

I4

O7 O8

I4

O7 O8

I5

C1

I5

C1

I6

C2

I6

C3

I7

C4

I8

I²C

I7
I8

+9V

+9V

7806

C2
I²C
+9V

(a) Versorgung durch den ftDuino

C3
+9V

C4

(b) Versorgung mit 7806-Regler

Abbildung 4.15: Anschluss des Servos an den ftDuino
Da Servos für eine Betriebsspannung von 6 Volt ausgelegt sind und oft auch bei 5 Volt noch funktionieren ist eine Versorgung aus den internen 5 Volt des ftDuino über den I2 C-Anschluss möglich wie in Abbildung 4.15(a) dargestellt. Bei
dieser Versorgung ist Vorsicht geboten, da die Stromaufnahme des Servos 100mA nicht überschreiten darf, um die interne
Stromversorgung des ftDuino nicht zu überlasten. Die meisten Servos überschreiten diesen Wert deutlich und sollten daher
nicht direkt aus dem ftDuino versorgt werden.
3 fischertechnik-Datenbank:

https://ft-datenbank.de/search.php?keyword=132292
https://ft-datenbank.de/search.php?keyword=132292
5 fischertechnik-Datenbank: https://ft-datenbank.de/search.php?keyword=540585
6 fischertechnik-Datenbank: https://ft-datenbank.de/search.php?keyword=30275
4 fischertechnik-Datenbank:

46

Kapitel 4. Experimente

4.5.1

Externe 6-Volt-Versorgung

Wesentlich robuster und kaum aufwändiger ist die Versorgung über einen externen Spannungsregler z.B. vom Typ 7806,
der unter dieser Bezeichnung leicht im Online-Handel zu finden ist. Dieser sogenannte Längsregler kann direkt an einen
der 9-Volt-Ausgänge des ftDuino angeschlossen werden und stellt an seinem Ausgang eine auf 6 Volt reduzierte Spannung
bereit.
Benötigte Teile:
1x
1x
2x
1x
1x

Spannungsregler 7806
Servo-Verlängerungskabel JR-Stecker
roter ft-Stecker
grüner ft-Stecker
rote ft-Buchse

Der 7806 kann mit fischertechnik-üblichen Steckern versehen und dann direkt in den ftDuino eingesteckt werden. Der
Steuersignal-Anschluss muss mit dem SDA-Anschluss des I2 C-Steckers verbunden werden. Die zusätzliche Nutzung des
SCL-Anschlusses ermöglicht den Anschluss eines zweiten Servos. Trennt man das rote Kabel direkt am Stecker des Servos
auf und versieht es mit einem fischertechnik-Stecker wie in Abbildung 4.15(b) dargestellt, so lässt sich der Stecker des
Servos mit den zwei verbliebenden Adern direkt auf den I2 C-Anschluss stecken. Will man das Anschlusskabel des Servos
nicht zerschneiden, dann kann man auch ein handelsübliche JR-Servo-Verlängerungskabel zerschneiden wie in Abbildung
4.16(b) dargestellt. Der aufgetrennte mittlere rote Anschluss wird dann mit dem fischertechnik-Stecker an den ebenfalls mit
fischertechnik-Hülsen versehenen 7806 gesteckt.

(a) Servo an Regler und Adapterkabel ftDuino

(b) Spannungsregler und Adapterkabel

Abbildung 4.16: Servo-Motor am ftDuino
Das Steuersignal eines Servos entspricht nicht dem I2 C-Standard. Stattdessen verwenden Servos ein einfaches Pulsweitensignal, das alle 20 Millisekunden widerholt wird. Der Puls selbst ist zwischen einer und zwei Millisekunden lang und bestimmt
den Winkel, den das Servo einnehmen soll. Eine Millisekunde steht dabei für den minimalen Wert und zwei Millisekunden
für den maximalen. Soll der Servomotor in Mittelstellung fahren, so ist dementsprechend ein Puls von 1,5 Millisekunden
Länge nötig.
Das Servo verfügt über keine weitere Intelligenz und es werden die vorgegebenen Steuersignale nicht überprüft. Pulslängen
kleiner einer Millisekunde oder größer zwei Millisekunden versucht das Servo ebenfalls in entsprechende Winkel umzusetzen.
Dabei ist zu beachten, dass der Bewegung des Servos mechanische Grenzen gesetzt sind und das Servo Schaden nehmen
kann, wenn es Positionen außerhalb seines normalen Arbeitsbereichs anzufahren versucht. Es ist daher nicht ratsam, den
Bereich von ein bis zwei Millisekunden zu verlassen.
Um das nötige Puls-Signal auf den eigentlich für I2 C-Signale vorgesehenen Pins zu erzeugen muss auf Software
zurückgegriffen werden. Ein Programmfragment, das den Servo in die Mittelposition bewegt könnte z.B. folgendermaßen
aussehen:
1

void setup () {

4.5. Servomotoransteuerung

47

1ms

20ms

1,5ms

20ms

2ms

20ms

Abbildung 4.17: Servo-Winkel in Anhängigkeit vom Stellsignal
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

// Port D .1 ( SDA - Anschluss ) auf Ausgang schalten
bitSet ( DDRD , 1) ;
}
void loop () {
// Port D .1 auf High - Pegel (5 V ) legen
bitSet ( PORTD , 1) ;
// 1500 us (1.5 ms ) warten
_delay_us (1500) ;
// Port D .1 auf Low - Pegel ( GND ) legen
bitClear ( PORTD , 1) ;
// 18500 us (18.5 ms ) warten
_delay_us (20000 -1500) ;
}

Hier wird der SDA-Anschluss am I2 C zunächst in der setup()-Funktion zu einem unabhängig verwendbaren Ausgang
konfiguriert. In der Folge kann in der loop()-Funktion der Ausgang auf Hi (5 Volt) oder Masse (GND) geschaltet werden,
indem das entsprechende Bit im Register PORTD gesetzt oder gelöscht wird. Nach dem Einschalten des Ausgangs wird
1500 Mikrosekunden (1,5 Millisekunden) gewartet, nach dem Ausschalten 18,5 Millisekunden, so dass die Zykluszeit von
insgesamt 20 Millisekunden erreicht wird.
Wie schon beim Schrittmotor ergibt sich das Problem, dass der Prozessor des ftDuino bei dieser einfachen Art der Programmierung permanent mit der Signalerzeugung ausgelastet wird und nebenbei keine anderen Aufgaben erledigen kann.
Die Lösung besteht wie beim Schrittmotor darin, die Signalerzeugung im Hintergrund durch einen Hardwaretimer zu veranlassen. Das Beispiel Datei . Beispiele . FtduinoSimple . ServoDemo bringt eine einfache Klasse zur Servoansteuerung
mit. Das eigentliche Hauptprogramm sieht dann folgendermaßen aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

//
// Servo . ino
//
# include " Servo . h "
void setup () {
servo . begin () ;
}
void loop () {
static uint8_t value = Servo :: VALUE_MAX /2;
if ( value < Servo :: VALUE_MAX ) value ++;
else
value = 0;
servo . set ( value ) ;
delay (10) ;
}

Die Ansteuerung des Servos beschränkt sich auf den Aufruf der servo.begin()-Funktion, die die nötigen Timer im Hintergrund einrichtet. Der Winkel des Servos kann dann mit der servo.set()-Funktion von 0 (minimaler Winkel) bis Servo::VALUE MAX (maximaler Winkel) eingestellt werden. Die Mittelposition wird z.B. durch
servo.set(Servo::VALUE MAX/2) angefahren.

48

4.6

Kapitel 4. Experimente

Die Eingänge des ftDuino

Schwierigkeitsgrad:
Wer sich schon einmal mit einem Arduino beschäftigt hat weiss, dass man dort relativ frei bestimmen kann, welche Anschlüsse
man als Ein- oder Ausgänge verwenden möchte, da sämtliche Pins am Microcontroller in der Richtung umgeschaltet werden
können. Beim ftDuino konnte diese Fähigkeit nicht erhaltem werden, da an den Eingägen zusätzliche Schutzschaltungen
gegen Überspannung und Kurzschlüsse eingesetzt werden und die Signale Ausgänge verstärkt werden, um fischertechnikLampen und -Motoren betreiben zu können.

Abbildung 4.18: Interne Beschaltung der Eingänge I1 bis I8 des ftDuino
Jeder der acht Eingänge I1 bis I8 des ftDuino führt auf einen eigenen Analogeingang des ATmega32u4-Mikrocontrollers
und kann von diesem unabhängig ausgewertet werden. Dazu kann der Mikrocontroller die Spannung des entsprechenden
Eingangs messen.

4.6.1

Spannungsmessung

Bevor das Eingangssignal den Mikrocontroller erreicht wird es über einen Spannungsteiler aus zwei 47-Kiloohm-Widerständen
geführt. Diese Widerstände erfüllen zwei Aufgaben. Erstens halbieren sie die Spannung eines angelegten Signals bevor es den
Mikrocontroller erreicht. Da der Mikrocontroller ftDuino-intern mit 5 Volt betrieben wird und auch nur Signale im Bereich
von 0 bis 5 Volt verarbeiten kann. Die Spannungshalbierung erweitert den messbaren Eingangsspannungsbereich auf 0 bis
10 Volt, wodurch sich die fischertechnik-üblichen Spannungen bis maximal 9 Volt verarbeiten lassen. Zum zweiten schützen
diese Widerstände im Zusammenspiel mit den Mikrocontroller-internen Schutzdioden den Mikrocontroller vor Spannungen,
die außerhalb des für ihn verträglichen 0 bis 5 Volt-Spannungsbereichs liegen. Spannungen bis zu 47 Volt an einem Eingang
beschädigen den Mikrocontroller daher nicht.

4.6.2

Widerstandsmessung

Die 1 kΩ- und 2.2 kΩ-Widerstände sowie der Schalter haben keine Bedeutung, solange der Schalter offen ist. Acht dieser
Schalter, je einer für jeden Eingang, befinden sich im ftDuino im Baustein mit der Bezeichnung CD4051 (IC1) wie im
Schaltplan in Anhang A ersichtlich. Der Mikrocontroller kann genau einen der acht Schalter zu jeder Zeit schließen und auf
diese Weise einen Widerstand von insgesamt 3.2 kΩ (1 kΩ plus 2.2 kΩ) vom jeweiligen Eingang gegen 5 Volt aktivieren.
Der Schalter wird geschlossen und die Widerstände werden aktiviert, wenn eine Widerstandsmessung erfolgen soll. Der 3.2 kΩWiderstand bildet dann mit einem zwischen Eingang und Masse angeschlossenen externen Widerstand einen Spannungsteiler.
Aus der gemessenen Spannung kann dann der unbekannte externe Widerstand bestimmt werden.

4.7. Temperaturmessung

49

Die Widerstandsmessung wird von der Ftduino-Bibliothek im Hintergrund ausgeführt. Dabei findet auch eine automatrische
Umschaltung der Widerstandsmessung auf all jene Eingänge statt, die im Sketch zur Zeit zur Widerstandsmessung genutzt
werden. Der Programmierer muss sich also um keine Details kümmern und kann jederzeit Widerstandswerte mit Hilfe der
Funktion ftduino.input get() (siehe 7.2.2) abfragen.

4.6.3

Ein Eingang als Ausgang

Die Tatsache, dass im Falle einer Widerstandsmessung ein Widerstand gegen 5 Volt geschaltet wird bedeutet, dass über
den zu messenden extern angeschlossenen Widerstand ein Stromkreis geschlossen wird. Der Strom durch diesen Stromkreis
is relativ gering. Wenn der Eingang direkt mit Masse verbunden ist beträgt der Gesamtwiderstand 3.2 kΩ und es fließt ein
Strom von I = 5V /3.2 kΩ = 1, 5625mA.

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.19: Anschluss einer LED an Eingang I1 des ftDuino
Dieser Strom reicht zwar nicht, um eine Lampe oder gar einen Motor zu betreiben. Aber eine Leuchtdiode kann man damit
schwach zum Leuchten bringen. Schließt man eine Leuchtdiode direkt zwischen einem Eingang und Masse an und schaltet
den Eingang auf Widerstandsmessung, so wird die LED ganz leicht leuchten.
Der tatsächliche Strom wird noch deutlich unter den vorausgesagten 1,5mA liegen, da zum einen direkt an der Leuchtdiode
die sogenannte Vorwärtsspannung von ca. 0,7V abfällt und über den Widerständen daher nur eine Spannung von etwas über
vier Volt anliegt.
Zum anderen fragt die Ftduino-Bibliothek im Hintergrund alle acht Eingänge ab und aktiviert jeden Eingang dabei nur 1/8
der Zeit. Es fließt im Mittel daher auch nur 1/8 des Stroms.
Die FtduinoSimple-Bibliothek schaltet ebenfalls die Widerstände ein und zwar für den jeweils zuletzt aktivierten Eingang.
Dieser Widerstand ist dann dauerhaft aktiviert, bis ein anderer Eingang angefragt wurd. Das folgenden Code-Fragment lässt
eine LED an Eingang I1 im Sekundentakt blinken.
1
2
3
4
5
6
7
8
9
10
11

4.7

# include < FtduinoSimple .h >
void loop () {
// lies Wert von Eingang I1 , aktiviert Widerstand auf I1
ftduino . input_get ( Ftduino :: I1 ) ;
delay (1000) ;
// lies Wert von Eingang I2 , deaktiviert Widerstand auf I1
// ( und aktiviert ihn auf I2 )
ftduino . input_get ( Ftduino :: I2 ) ;
delay (1000) ;
}

Temperaturmessung

Schwierigkeitsgrad:

50

Kapitel 4. Experimente

Fischertechnik vertreibt unter der Artikelnummer 364377 einen sogenannten NTC. Dieses unscheinbare Bauteil liegt einigen
Robotics-Baukästen bei.
Ein NTC ist ein elektrischer Widerstand, der seinen Wert abhängig von der Umgebungstemperatur ändert. Er eignet sich
daher zur Temperaturmessung. NTC steht dabei für “Negativer-Temperatur-Coeffizient”, was bedeutet, dass der ohmsche
Widerstand mit steigender Temperatur sinkt. NTCs werden im Deutschen auch als Heißleiter bezeichnet, da ihre Leitfähigkeit
mit der Temperatur steigt.
Der Nennwiderstand RN eines NTCs wird in der Regel bei einer Temperatur von 25 °C (298,15 K) angegeben. Der für den
fischertechnik-Sensor angegebene Wert ist 1.5 kΩ. Der ohmsche Widerstand beträgt bei 25 °C also 1.5 kΩ.

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.20: Anschluss des Temperaturensors an Eingang I1

4.7.1

Sketch Temperature

Der folgende Sketch findet sich bei installierter ftDuino-Unterstützung im Menü der Arduino-IDE unter Datei .
Beispiele . Ftduino . Temperature .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

//
// Temperaure . ino
//
// Abfrage eines fisch ertechni k Temperatur - Widerstands an Eingang I1
//
// ( c ) 2018 by Till Harbaum < till@harbaum . org >
//
# include < Ftduino .h >
# include < math .h >

// F ü r Fliesspunkt - Arithmetik

# define
# define
# define
# define

//
//
//
//

K2C 273.15
B 3900.0
R_N 1500.0
T_N ( K2C + 25.0)

float r2deg ( uint16_t r ) {
if ( r == 0) return NAN ;

Offset Kelvin nach Grad Celsius
sog . B - Wert des Sensors
Widerstand bei 25 Grad Celsius R e f e r e n z t e m p e r a t u r
R e f e r e n z t e m p e r a t u r in Kelvin

// ein Widerstand von 0 Ohm ergibt keine sinnvolle Temperatur

// Widerstand in Kelvin umrechnen
float t = T_N * B / ( B + T_N * log ( r / R_N ) ) ;
// Kelvin in Grad Celsius umrechnen
return t - K2C ;

//
}

// alternativ : Kelvin in Grad Fahrenheit umrechnen
return t * 9 / 5 - 459.67;

void setup () {
// LED i nitialis ieren
pinMode ( LED_BUILTIN , OUTPUT ) ;

7 fischertechnik-Datenbank:

https://ft-datenbank.de/search.php?keyword=36437

4.7. Temperaturmessung

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

51

digitalWrite ( LED_BUILTIN , LOW ) ;
Serial . begin (115200) ;
while (! Serial ) ;
ftduino . init () ;
// Die T e m p e r a t u r m e s s u n g erfolgt mit einem
ftduino . input _set_mo de ( Ftduino :: I1 , Ftduino :: RESISTANCE ) ;
}
void loop () {
uint16_t r = ftduino . input_get ( Ftduino :: I1 ) ;
Serial . print ( " I1 : " ) ;
Serial . print ( r2deg ( r ) ) ;
Serial . println ( " Grad Celsius " ) ;
delay (1000) ;
}

Sketchbeschreibung
Der Temperatur-Sketch verwendet an einigen Stellen sogenannte Fließkommazahlen, um Temperaturen zu speichern. So
wird die in der Computertechnik verwendete interne Darstellung von nicht-ganzzahligen Werten (Dezimalbrüchen) genannt.
Der Sketch bindet dafür in Zeile 10 die Datei math.h ein, um dem Sketch Zugriff auf Fließkommafunktionen zu geben. Zur
Speicherung der Fließkommazahlen wird der Datentyp float z.B. in Zeile 21 verwendet.
Da der zur Temperaturmessung verwendete Sensor ein Widerstand ist wird in der setup()-Funktion in Zeile 41 der Eingang
I1 des ftDuino auf Widerstandsmessung eingestellt.
Der eigentlich Widerstandswert wird in Zeile 45 von Eingang I1 ausgelesen und in der ganzzahligen Variablen r abgelegt.
Während der Ausgabe des Wertes in Zeile 48 wird die Funktion r2deg() aufgerufen. Diese Funktion befindet sich in den
Zeilen 17 bis 28. Sie nimmt einen ganzzahligen Widerstandswert in Ohm entgegen und liefert eine Temperatur in Grad
Celsius als Fließkommawert zurück.
Zunächst erfolgt in Zeile 21 die Umrechnung des Widerstands in Kelvin. Dazu wird neben dem Widerstand RN bei 25 °C
auch der sogenannte B-Wert des Sensors benötigt. Dieser Wert beschreibt das Verhalten des Sensors außerhalb des 25 °CPunkts und wie stark dabei der Widerstand auf Temperaturänderungen reagiert. Dieser Wert liegt bei dem von fischertechik
vertriebenen Sensor bei 3900.
Für NTCs gilt näherungsweise8 :
1
T

=

1
TN

+

1
B

RT
ln( R
)⇔T =
N

TN ∗B
R
B+TN ∗ln( R T )
N

mit
ˆ T . . . aktuelle Temperatur
ˆ TN . . . Nenntemperatur (üblicherweise 25 °C)
ˆ B . . . B-Wert
ˆ RT . . . Widerstand bei aktueller Temperatur
ˆ RN . . . Widerstand bei Nenntemperatur

Nach der Umrechung liegt die Temperatur in Kelvin vor. Zur Umrechung in Grad Celsius muss Zeile 24 lediglich eine
Konstante abgezogen werden. Eine Umrechnung in Grad Fahrenheit wäre etwas komplexer und ist beispielhaft in Zeile 27
dargestellt.
Die Genauigkeit der Temperaturmessung ist direkt von der Genauigkeit der Widerstandsmessung abhängig und diese ist wie
in Abschnitt 1.2.5 erklärt von der Spannungsversorgung abhängig. Zur Temperaturmessung sollte der ftDuino daher aus
einer 9v-Quelle mit Spannung versorgt werden. Eine Versorgung nur über die USB-Schnittstelle ist nicht ausreichend.
8 https://de.wikipedia.org/wiki/Hei%C3%9Fleiter

52

4.8

Kapitel 4. Experimente

Ausgänge an, aus oder nichts davon?

Schwierigkeitsgrad:
Einen Ausgang kann man ein- oder ausschalten, das ist die gängige Sichtweise. Dass es aber noch einen weiteren Zustand
gibt ist auf den ersten Blick vielleicht nicht offensichtlich.

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
+9V

I8

C3
+9V

C4

Abbildung 4.21: Zwei Lampen an Ausgang O1
Die Ausgänge des ftDuino lassen sich in drei Zustände schalten: Ftduino::HI, Ftduino::LO und Ftduino::OFF.
Am offensichtlichsten ist der Zustand Ftduino::HI. In diesem Zustand wird der entsprechende Ausgang ftDuino-intern mit
der 9-Volt-Versorgungspannung verbunden. Ist an diesem Ausgang eine Lampe oder ein Motor so angeschlossen, dass der
zweite Anschluss an Masse liegt, so fließt ein Strom von der 9V-Quelle über den Ausgang durch Lampe oder Motor zur
Masse. Der Motor dreht sich und die Lampe leuchtet. Im abgebildeten Beispiel leuchtet die rote Lampe.
Im Zustand Ftduino::LO ist der entsprechende Ausgang mit Masse verbunden. Eine wieder mit dem zweiten Anschluss
an Masse angeschlossene Lampe wird nun nicht mehr leuchten, da beide Anschlüsse der Lampe auf Masse liegen und die
Spannung zwischen beiden Anschlüssen daher 0 Volt beträgt. Schließt man den zweiten Anschluss der Lampe aber an 9
Volt an, so leuchtet sie nun. Der Strom fließt von der Spannungsversorgung des ftDuino über den 9-V-Anschluss, durch die
Lampe und schließlich über den auf Masse liegenden Ausgang. Im abgebildeten Beispiel leuchtet nun die blaue Lampe.
Der dritte Zustand ist schließlich der Zustand Ftduino::OFF. In diesem Fall ist der Ausgang komplett offen. Er ist weder
mit Masse noch mit 9 Volt verbunden und es fließt kein Strom über ihn. Als Resultat leuchtet nun weder die rote noch die
blaue Lampe. Dieser Zustand wird oft auch mit dem englischen Begriff “tristate” bezeichnet und entsprechende Ausgänge
an Halbleitern als “tristate-fähig”. Im Deutschen beschreibt der Begriff “hochohmig” diesen dritten Zustand recht gut.
Der folgende Sketch wechselt im Sekundentakt zwischen den drei Zuständen. Man kann diesen Effekt zum Beispiel ausnutzen,
um zwei Motoren oder Lampen an einem Ausgang unabhängig zu steuern, um Ausgänge zu sparen. Allerdings lassen sich
bei dieser Verschaltung niemals beide Lampen gleichtzeitig auf voller Helligkeit betreiben.

4.8.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Sketch OnOffTristate
/*
OnOffTristate - der dritte Zustand
*/
# include < FtduinoSimple .h >
void setup () { }
// Die Loop - Funktion wird endlos immer und immer wieder ausgef ü hrt
void loop () {
// Ausgang O1 auf 9 V schalten
ftduino . output_set ( Ftduino :: O1 , Ftduino :: HI ) ;
delay (1000) ;
// Ausgang O1 auf Masse schalten
ftduino . output_set ( Ftduino :: O1 , Ftduino :: LO ) ;
delay (1000) ;

4.9. Aktive Motorbremse

17
18
19
20

4.8.2

53

// Ausgang O1 unbeschaltet lassen
ftduino . output_set ( Ftduino :: O1 , Ftduino :: OFF ) ;
delay (1000) ;
}

Leckströme

Ganz korrekt ist die Aussage, dass im hochohmigen bzw. Tristate-Zustand kein Strom fließt nicht. Über die Leistungsendstufen und deren interne Schutzschaltungen fließt oft trotzdem ein geringer Strom. In einigen Fällen wird dies sogar bewusst
getan, um z.B. mit Hilfe dieses geringen Stromflusses das Vorhandensein eines angeschlossenen Verbauchers feststellen zu
können. Diese sogenannten Leckströme wurden in Abschnitt 4.1.1 bereits beobachtet.
Ersetzt man die zwei Lampen im aktuellen Modell durch zwei Leuchtdioden, so wird man feststellen, dass die vom Ausgang
nach Masse angeschlossene LED immer dann leicht glimmt, wenn der entsprechende Ausgang hochohmig geschaltet ist.
Nur wenn der Ausgang auf Masse geschaltet ist leuchtet die LED nicht. Man kann also direkt an der LED die drei Zustände
unterscheiden.

4.9

Aktive Motorbremse

Schwierigkeitsgrad:
Das Abschalten eines Motors scheint rein elektrisch trivial zu sein. Sobald der Motor von der Spannungsversorgung getrennt
wird bleibt er stehen. Im Wesentlichen stimmt das auch so.
Physikalisch bedeutet die Trennung von der Spannungsversorgung lediglich, dass dem Motor keine weitere Engergie zugeführt
wird. Dass das letztlich dazu führt, dass der Motor anhält liegt daran, dass die in der Rotation des Motors gespeicherte
Energie langsam durch Reibung z.B. in den Lagern der Motorwelle verloren geht. Wie lange es dauert, bis der Motor auf
diese Weise zum Stillstand kommt hängt wesentlich vom Aufbau des Motors und der Qualität seiner Lager ab.
Zusätzlich wirken viele Gleichstrom-Elektromotoren, wie sie auch fischertechnik einsetzt, als Generator. Werden sie gedreht,
so wird in ihren internen Elektromagneten eine Spannung induziert.

Abbildung 4.22: Der TXT-Encoder-Motor als Generator
Dieser Effekt lässt sich mit einer Leuchdiode leicht nachvollziehen. Schließt man die Leuchtdiode direkt an den Motor an
und dreht dann manuell die Motorachse, so leuchtet die Leuchtdiode auf, wenn man den Motor in die richtige Richtung
dreht und damit eine Spannung mit der für die Leuchtdiode passenen Polarität erzeugt. Man kann für diesen Versuch auch
eine Glühlampe oder gar einen zweiten Motor nehmen. Deren gegenüber einer Leuchtdiode höhere Energieaufnahe erfordert
aber ggf. ein etwas kräftigeres Drehen.
Je mehr Last ein Generator versorgen soll und je mehr Energie im entnommen werden soll, desto größer ist die mechanische
Kraft, die nötig ist, um den Generator zu drehen. Höhere Last bedeutet in diesem Fall ein geringerer elektrischer Widerstand.
Die Leuchtdiode mit ihrer verleichsweise geringen Last besitzt einen hohen elektrischen Widerstand, die Glühlampe und noch
mehr der Motor besitzen einen geringen elektrischen Widerstand und belasten bzw. bremsen den Generator damit stärker.
Die größte denkbare Last ist in diesem Fall der Kurzschluss. Er hat einen minimalen elektrischen Widerstand und sorgt für
maximalen Stromfluss und damit maximale elektrische Last am Generator. Auch die Bremswirkung ist dabei maximal.
Dieser Effekt lässt sich nutzen, um einen Elektromotor zu bremsen. Wende beide Anschlüsse eines Motors miteinander
verbunden, so fließt ein Strom, der eine Bremswirkung entwickelt. Das wurde bereits beim Not-Aus-Modell aus Abschnitt
4.2 genutzt, um den Motor im Notfall schnell zu stoppen. Ist dagegen z.B. einer der Anschlüsse des Motors offen, so ist
kein geschlossener Stromkreis vorhanden und es fließt kein Strom und es tritt keine Bremswirkung auf. Wie groß ist dieser
Effekt aber?

54

Kapitel 4. Experimente

M

M

gebremst

ungebremst

Abbildung 4.23: Elektrisch gebremster und ungebremster Elektromotor

Der fischertechnik-Encoder-Motor enthält eine Möglichkeit zur Drehzahlmessung wie schon im PWM-Experiment in Abschnitt 4.3 genutzt. Das Bremsverhalten dieses Motors lässt sich daher experimentell gut verfolgen.

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.24: Anschluss des TXT-Encoder-Motors an die Anschlüsse M1 und C1
Das Beispiel Datei . Beispiele . Ftduino . MotorBrake lässt den Motor an Ausgang M1 alle fünf Sekunden für drei
Umdrehungen laufen und misst dann für eine weitere Sekunde, wieviele weitere Impule der Encoder an Eingang C1 liefert,
nachdem er die drei Umdrehungen vollendet hat und abgeschaltet wurde.
Die Funktion motor counter set brake() (siehe Abschnitt 7.2.9) wird dabei im Wechsel so eingerufen, dass der Motor
frei ausläuft bzw. dass er aktiv gebremst wird.

Abbildung 4.25: Ausgabe bei Verwendung des TXT-Encoder-Motors
Wie in Abbildung 4.25 zu sehen macht die aktive Bremse einen deutlichen Unterschied. Während der Encoder-Motor
ungebremst noch für weitere 90 Impulse weiter dreht, also fast 1,5 volle Umdrehungen, kommt er bei aktiber Bremse bereits
nach fünf weiteren Impulse zum Stillstand. Das entspricht lediglich knapp 1/13 Umdrehung.

4.10. USB-Tastatur

4.10

55

USB-Tastatur

Schwierigkeitsgrad:
Der ftDuino ist nicht vom klassischen Arduino Uno abgeleitet, sondern vom Arduino Leonardo. Der wesentliche technische Unterschied zwischen beiden Arduinos liegt in der Tatsache, dass der Arduino Uno einen seperaten Chip für die
USB-Kommunikation mit dem PC verwendet, während diese Aufgabe beim Arduino Leonardo allein dem ATmega32u4Mikrocontroller zufällt.
In den meisten Fällen macht das keinen Unterschied und die meisten Sketches laufen auf beiden Arduinos gleichermaßen. Es
gibt allerdings sehr große Unterschiede in den Möglichkeiten, die sich mit beiden Arduinos bei der USB-Anbindung bieten.
Während der USB-Chip im Uno auf das Anlegen eines COM:-Ports beschränkt ist zeigt sich der Leonardo und damit auch
der ftDuino sehr viel flexibler und der ftDuino kann sich unter anderem gegenüber einem PC als USB-Tastatur ausgeben.
Da die Ausgänge des ftDuino bei diesem Modell nicht verwendet werden reicht die Stromversorgung über USB und es ist
keine weitere Versorgung über Batterie oder Netzteil nötig.

Reset

3
2

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.26: Tastatur-Nachricht

4.10.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Sketch USB/KeyboardMessage

/*
K ey bo ar d Me ss ag e - USB - Tastatur
Der ftDuino gibt sich als USB - Tastatur aus und " tippt " eine Nachricht , sobald
ein Taster an Eingang I1 f ü r mindestens 10 Millisekunden gedr ü ckt wird .
Basierend auf dem Sketch :
http :// www . arduino . cc / en / Tutorial / Ke y bo ar dM e ss ag e
Dieser Beispielcode ist Public - Domain .
*/
# include < FtduinoSimple .h >
# include < Keyboard .h >
unsigned long la st B ut to nE v en t = 0;
uint16_t p r e v i o u s B u t t o n S t a t e = Ftduino :: OFF ;

// for checking the state of a pushButton

void setup () {
// initialize control over the keyboard :
Keyboard . begin () ;
}
void loop () {
// Taste an Eingang I1 auslesen
uint16_t buttonState = ftduino . input_get ( Ftduino :: I1 ) ;
// Hat sich der Zustand der Taste ge ä ndert ?
if ( buttonState != p r e v i o u s B u t t o n S t a t e ) {
// ja , Zeit des Wechsels merken

56

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

Kapitel 4. Experimente

l as tB ut t on Ev en t = millis () ;
// und den neuen Zustand merken , damit wir weitere
// Ä nderungen erkennen k ö nnen
p r e v i o u s B u t t o n S t a t e = buttonState ;
}
// Gibt es ein unbear beitetes Eregnis und hat sich der Zustand der Taste seitdem
// f ü r mehr als 10 Millisekunden nicht ge ä ndert ?
if ( l a st Bu tt o nE ve nt && (( millis () - l a st Bu tt o nE ve nt ) > 10) ) {
// Zeit dieses Ereignisses vergessen
l as tB ut t on Ev en t = 0;
// Taste wurde gedr ü ckt
if ( buttonState ) {
// Nachricht " tippen "
Keyboard . println ( " Hallo vom ftDuino ! " ) ;
}
}
}

Sketchbeschreibung
Die Arduino-IDE bringt bereits Bibliotheken mit, um USB-Geräte wie Mäuse und Tastaturen umzusetzen. Der eigentliche
Sketch bleibt so sehr einfach und die komplizieten USB-Detail bleiben in den Bibliotheken verborgen. Entsprechend kurz ist
auch dieser Sketch.
In der setup()-Funktion muss lediglich die Methode Keyboard.begin() aufgerunfen werden, um beim Start des ftDuino
alle USB-settigen Vorkehrungen zu treffen, so dass der ftDuino vom PC als USB-Tastatur erkannt wird. Allerdings verfügt
diese Tastatur zunächst über keine Tasten, so dass man kaum merkt, dass der PC nun über eine zusätzliche Tastatur zu
verfügen meint.
Um die Tastatur mit Leben zu füllen muss in der loop()-Funktion bei Bedarf ein entsprechendes Tastensignal erzeugt und
an den PC gesendet werden. In den Zeilen 25 bis 35 des Sketches wird ein Taster an Eingang I1 abgefragt und sichergestellt,
dass nur Tastendrücke über 10ms Länge als solche erkannt werden (mehr Details zu diesem sogenannten Entprellen findet
sich in Abschnitt 4.12).
Immer wenn die Taste an I1 gedrückt wurde, werden die Sketchzeilen 45 und folgende ausgeführt. Hier wird die Funktion
Keyboard.println() aus der Arduino-Keyboard-Bibliothek aufgerufen und ein Text an den PC gesendet. Für den PC sieht
es so aus, als würde der Text vom Anwender auf der Tastatur getippt 9 .
Die Möglichkeit, Nachrichten direkt als Tastatureingaben zu senden kann sehr praktisch sein, erlaubt sie doch ohne weitere
Programmierung auf dem PC, die automatische Eingabe z.B. vom Messwerten in eine Tabelle oder ähnlich. Natürlich lässt
sich diese Fähigkeit aber auch für allerlei Schabernack nutzen, indem der ftDuino zeitgesteuert oder auf andere Ereignisse
reagierend den überraschten Anwender mit unerwarteten Texteingaben irritiert. Bei solchen Späßen sollte man immer eine
ordentliche Portion Vorsicht walten lassen, da der falsche Tastendruck zur falschen Zeit leicht einen Datenverlust zur Folge
haben kann.

4.11

USB-GamePad

Schwierigkeitsgrad:
Aus der PC-Sicht ist der Unterschied zwischen einer USB-Tastatur und einen USB-Joystick oder -Gamepad minimal. Beide
nutzen das sogenannte USB-HID-Protokoll (HID = Human Interface Device, also ein Schnittstellengerät für Menschen).
Arduino-seitig gibt es aber den fundamentalen Unterschied, dass die Arduino-Umgebung zwar vorgefertigte Bibliotheksfunktionen für Tastaturen mitbringt, für Gamepads und Joysticks aber nicht. Um trotzdem ein USB-Gamepad zu implementieren
ist daher im Sketch sehr viel mehr Aufwand zu treiben.
9 Weitere Informationen und tiefergehenden Erklärungen zu den Arduino-Bibliotheken zur Maus- und Tastaturnachbildung finden sich unter
https://www.arduino.cc/en/Reference/MouseKeyboard

4.11. USB-GamePad

57

3
2

Reset

2

3
2

3

1

3
1
2

1

3
2

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

3
2

1

C2
I²C

I7
I8

1

+9V

C3
+9V

C4

Abbildung 4.27: GamePad mit vier Richtungstasten und zwei Feuerknöpfen

4.11.1

Sketch USB/GamePad

Das entsprechende Beispiel findet sich unter Datei . Beispiele . FtduinoSimple . USB . GamePad . Dieser Sketch besteht aus drei Dateien. Während GamePad.ino den eigentlichen Sketch enthält implementieren HidGamePad.cpp und
HidGamePad.h denjenigen Teil der Gamepad-Unterstützung, die die Arduino-IDE nicht bietet. Interessant ist vor allem die
hidReportDescriptor-Struktur in der Datei HidGamePad.cpp.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

static const uint8_t _ h i d R e p o r t D e s c r i p t o r [] PROGMEM = {
0 x05 , 0 x01 ,
// USAGE_PAGE ( Generic Desktop )
0 x09 , 0 x05 ,
// USAGE ( Gamepad )
0 x85 , REPORT_ID ,
// REPORT_ID (3)
0 xa1 , 0 x01 ,
// COLLECTION ( Application )
0 x09 , 0 x01 ,
//
USAGE ( Pointer )
0 xa1 , 0 x00 ,
//
COLLECTION ( Physical )
0 x09 , 0 x30 ,
//
USAGE ( X )
0 x09 , 0 x31 ,
//
USAGE ( Y )
0 x15 , 0 x00 ,
//
L OG I CA L_ MI N IM UM (0)
0 x26 , 0 xff , 0 x00 ,
//
LO G IC AL _M A XI MU M (255)
0 x35 , 0 x00 ,
//
P H Y S I C AL _ M I N I M U M (0)
0 x46 , 0 xff , 0 x00 ,
//
P H Y S I C A L _ M A X I M U M (255)
0 x75 , 0 x08 ,
//
REPORT_SIZE (8)
0 x95 , 0 x02 ,
//
REPORT_COUNT (2)
0 x81 , 0 x02 ,
//
INPUT ( Data , Var , Abs )
0 xc0 ,
//
EN D_COLLE CTION
0 x05 , 0 x09 ,
//
USAGE_PAGE ( Button )
0 x19 , 0 x01 ,
//
USAGE_MINIMUM ( Button 1)
0 x29 , 0 x02 ,
//
USAGE_MAXIMUM ( Button 2)
0 x15 , 0 x00 ,
//
L OG I CA L_ MI N IM UM (0)
0 x25 , 0 x01 ,
//
L OG I CA L_ MA X IM UM (1)
0 x95 , 0 x02 ,
//
REPORT_COUNT (2)
0 x75 , 0 x01 ,
//
REPORT_SIZE (1)
0 x81 , 0 x02 ,
//
INPUT ( Data , Var , Abs )
0 x95 , 0 x06 ,
//
REPORT_COUNT (6)
0 x81 , 0 x03 ,
//
INPUT ( Const , Var , Abs )
0 xc0
// END_COL LECTION
};

Diese vergleichweise kryptische Struktur beschreibt die Fähigkeiten eines USB-HID-Geräts10 . Sie beschreibt, um welche Art
Gerät es sich handelt und im Falle eines Joysticks über was für Achsen und Tasten er verfügt.
In diesem Fall meldet das Gerät, dass es über zwei Achsen X und Y verfügt, die jede einen Wertebereich von 0 bis 255
abdecken. Weiterhin gibt es zwei Buttons, die jeweils nur den Zustand an und aus kennen. Für einen einfachen Joystick
reicht diese Beschreibung. Es ist aber leicht möglich, die Beschreibung zu erweitern und zusätzliche Achsen und Tasten
vorzusehen. Mit den insgesamt acht analogen und den vier digitalen Eingängen verfügt der ftDuino über ausreichend
Verbindungsmöglichkeiten für komplexe Eingabegeräte.
Übliche HID-Geräte sind Tastaturen, Mäuse und Joysticks bzw. Gamepads. Aber die Spezifikation der sogenannten HID10 Mehr

Info unter http://www.usb.org/developers/hidpage/

58

Kapitel 4. Experimente

Usage-Tabellen11 sieht wesentlich originellere Eingabegeräte für diverse Sport-, VR-, Simulations- und Medinzingeräte und
vieles mehr vor. Und natürlich ist mit den Ausgängen des ftDuino auch die Implementierung von Rückmeldungen über
Lampen oder Motoren in Form von z.B. Force-Feedback möglich.

4.12

Entprellen

Schwierigkeitsgrad:
In einigen der vorherigen Sketches wurde unerwartet viel Aufwand betrieben, um Taster abzufragen. Im Pwm-Sketch aus
Abschnitt 4.3.1 wurde in den Zeilen 35 und 51 eine Verzögerung von einer Millisekunde eingebaut und im KeyboardMessageSketch in Abschnitt 4.10 wurde in den Zeilen 31 und 39-41 ebenfalls die Zeit erfasst und in die Auswertung des Tastendrucks
eingefügt. Die Frage, warum das nötig ist soll etwas näher betrachtet werden.
Der Grund für diese Verwendung von Zeiten bei der Auswertung von einzelnen Tastendrücken ist das sogenannte “Prellen”.
Mechanische Taster bestehen aus zwei Metallkontakten, die entweder getrennt sind oder sich berühren. In Ruhe sind die
Kontakte getrennt und wenn der Taster betätigt wird, dann sorgt eine Mechanik dafür, dass die beiden Metallkontakte in
Berührung kommen und der Kontakt geschlossen wird.
Folgender Sketch fragt kontinuierlich einen Taster an Eingang I1 ab und gibt auf dem COM:-Port eine Meldung aus, wenn
sich der Zustand ändert. Zusätzlich zählt er mit, wie oft sich der Zustand insgesamt bereits geändert hat.

Reset

3
2

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

Abbildung 4.28: Entprellen

4.12.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Sketch Debounce

/*
Debounce
Demonstriert Tastenprellen
*/
# include < FtduinoSimple .h >
// die setup - Funktion wird einmal beim Start aufgerufen
void setup () {
Serial . begin (9600) ;
while (! Serial ) ;

// warte auf USB - Verbindung

Serial . println ( " ftDuino Tastenprell - Beispiel " ) ;
}
uint8_t le tz t er _z us t an d = false ;
uint8_t wec hselzae hler = 0;
// die loop - Funktion wird immer wieder aufgerufen

11 http://www.usb.org/developers/hidpage/Hut1

12v2.pdf

C3
+9V

C4

4.12. Entprellen

22
23
24
25
26
27
28
29
30
31
32
33

59

void loop () {
uint8_t zustand = ftduino . input_get ( Ftduino :: I1 ) ;
if ( zustand != l e tz te r_ z us ta nd ) {
wechs elzaehl er = wec hselzae hler + 1;
Serial . print ( " I1 " ) ;
Serial . print ( wechs elzaehle r ) ;
Serial . println ( " mal ge ä ndert " ) ;
l et zt er _ zu st an d = zustand ;

// Taster auslesen

// Hat der Zustand sich ge ä ndert ?
// Ja , Z ä hler rum eins erh ö hen
// und eine Meldung ausgeben

// neuen Zustand als letzten merken

}
}

Sketchbeschreibung
In den Zeilen 10 is 16 wird wie schon beim ComPort-Beispiel aus Abschnitt 3.3 die Ausgabe an den PC vorbereitet und für
den seriellen Monitor eine Nachricht ausgegeben.
In Zeile 23 wird kontinuierlich der Eingang I1 abgefragt. Hat sich sein Zustand gegenüber dem in der Variablen letzter zustand gespeicherten geändert, so wird dies in Zeile 25 festgestellt. In der Folge wird die Variable
wechselzaehler erhöht und der neue Wert in den Zeilen 28 bis 30 ausgegeben.

Aufgabe 1: Es zählt zuviel
Etwas merkwürdiges passiert, wenn man den Sketch auf den ftDuino lädt und ausprobiert: Sobald die Taste gedrückt wird
erscheinen gleich mehrere Meldungen über Zustandsänderungen des Eingangs und auch der Zähler zählt wesentlich weiter
als erwartet. Was passiert hier?
Das Problem ist, dass im Moment des Schaltens der Kontakt nicht sofort perfekt schließt. Stattdessen berühren sich die
Metallflächen kurz, federn dann für ein paar Mikrosekunden zurück und öffnen sich wieder für einen sehr kurzen Moment.
Erst nach mehreren Federvorgängen kommen die Kontakte zur Ruhe und sind dauerhaft geschlossen.

Lösung 1:
Die einfachste Lösung des Problems liegt darin, ein klein wenig zu warten, bevor man nach einem Schaltereignis ein weiteres
akzeptiert. Das erreicht man zum Beispiel, indem man nach Zeile 31 zusätzlich etwas wartet, wie es auch im Pwm-Sketch
aus Abschnitt 4.3.1 getan wurde.
31
32
33

l et zt er _ zu st a nd = zustand ;
delay (10) ;

// neuen Zustand als letzten merken
// warte zehn Millisekunden

}

Nach dieser Änderung zählt der Sketch tatsächlich nur noch einzelne Tastendrücke. Diese einfache Lösung hat aber einen
Nachteil: Die Ausführung des gesamten Sketches wird bei jeden Tastendruck für zehn Millisekunden pausiert. Hat der Sketch
noch andere Aufgaben zu erledigen, dann wird die Verarbeitung dieser Aufgaben ebenfalls für diese zehn Millisekunden
unterbrochen. Je nach verwendetem Taster lässt sich die Zeit auf unter eine Millisekunde verkürzen. Aber bei zu kurzer
Wartezeit werden wieder falsche Ereignisse erkannt.
Eleganter ist es daher, bei jedem Ereignis mit der Funktion millis() einen Zeitstempel aus dem Systemzeitzähler zu
nehmen und erst dann ein Eregnis als gültig zu erkennen, wenn das letzte Ereignis länger als 10 Millisekunden zurück liegt.
Der KeyboardMessage-Sketch aus Abschnitt 4.10 löst das Problem auf genau diese Weise.

Aufgabe 2: Was passiert denn nun genau?
Wie lange der Taster prellt und wie er sich genau verhält konnte wir bisher nur vermuten. Lässt sich der ftDuino nutzen,
um etwas genauer auf das Schaltverhalten des Tasters zu schauen?

60

Kapitel 4. Experimente

Lösung 2:
Um Signalverläufe zu veranschaulichen verfügt die Arduino-IDE über ein sehr einfaches aber interessantes Werkzeug: Den
sogenannten “seriellen Plotter” er findet sich im Menü unter Werkzeuge . Serieller Plotter und öffnet wie der serielle
Monitor ein eigenes Fenstern. Aber statt einen per COM:-Port empfangenen Text direkt anzuzeigen interpretiert der serielle
Plotter die eingehenden Daten Zeile für Zeile als Werte, die grafisch in einer Kurve dargestellt (geplottet) werden.
Das folgende Beispiel ist unter Datei . Beispiele . FtduinoSimple . BounceVisu zu finden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

/*
BounceVisu
visualisiert Tastenprellen
*/
# include < FtduinoSimple .h >
# define EVENT_TIME 480
// 480 us
uint8_t event [ EVENT_TIME ];
// die setup - Funktion wird einmal beim Start aufgerufen
void setup () {
Serial . begin (9600) ;
while (! Serial ) ;
// warte auf USB - Verbindung
}
// die loop - Funktion wird immer wieder aufgerufen
void loop () {
// Warte bis Taster gedr ü ckt
if ( ftduino . input_get ( Ftduino :: I1 ) ) {
// hole 480 Mikrosekunden lang im M i K r o s e k u n d e n t a k t je einen Eingangswert
for ( uint16_t i =0; i < EVENT_TIME ; i ++) {
event [ i ] = ftduino . input_get ( Ftduino :: I1 ) ;
_delay_us (1) ;
}
// gib zun ä chst 20 Nullen aus
for ( uint16_t i =0; i <20; i ++)
Serial . println (0) ;
// gib die eingelesenen 480 Werte aus
for ( uint16_t i =0; i < EVENT_TIME ; i ++)
Serial . println ( event [ i ]) ;
// Warte eine Sekunde
delay (1000) ;
}
}

Der Sketch wartet in Zeile 22 darauf, dass die Taste an Eingang I1 gedrückt wird. Daraufhin zeichnet er für eine kurze Weile
den Zustand des Eingang I1 auf. In Zeile 9 ist festgelegt, dass 480 Werte aufgezeichent werden. Zwischen zwei Aufzeichnungen wird in Zeile 27 jeweils eine Mikrosekunde gewartet, so dass insgesamt über 480 Mikrosekunden aufgezeichnet wird.
Ist die Aufzeichnung vollständig, dann werden zunächst 20 Zeilen Nullen ausgegeben und danach die vorher aufgezeichneten
480 Werte, so dass insgesamt 500 Werte ausgegeben werden. Die ersten 20 Werte representieren den Zustand vor der
Aufzeichnung, als der Taster noch nicht gedrückt wurde.
Die insgesamt 500 Werte stellt der serielle Plotter als Kurve dar. Der Wert ist null, wenn der Kontakt als offen erkannt wird
und eins, sobald der Kontakt geschlossen ist. Man sieht in der Grafik, wie der Taster zunächst ca. 40 Mikrosekunden lang
mehrfach öffnet und schließt, dann liegt das Signal über 100 Mikrosekunden stabil an, bevor der Kontakt noch ein paar mal
öffnet, um schließlich nach insgesamt 200 Mikrosekunden stabil geschlossen zu bleiben. Die in Lösung 1 eingesetzte Pause
kann also auf gute 200 Mikrosekunden reduziert werden, ohne dass das Prellen Auswirkungen hätte.
Es ist nötig, die Werte vor der Ausgabe komplett zu erfassen und zu speichern, da die Übermittlung der Zeichen an den
PC vergleichsweise viel Zeit in Anspruch nimmt. Würden die Werte sofort an den PC übermittelt, dann wäre die Auflösung
von einer Mikrosekunde nicht zu erreichen, da die Datenübermittlung selbst schon länger dauert. Tatsächlich dauert auch

4.13. Nutzung des I2 C-Bus

61

Abbildung 4.29: Verlauf des Prellens im seriellen Plotter

das Auslesen des Eingangs I1 etwas Zeit und das Zeiterhalten unser Messung ist nicht sehr genau. Es genügt aber, um die
prinzipiellen Abläufe darzustellen.

4.13

Nutzung des I2 C-Bus

Schwierigkeitsgrad:
Wie in Abschnitt 1.2.6 beschrieben verfügt der ftDuino über einen I2 C-Anschluss. In der Arduino-Welt ist der I2 C-Bus
äußerst beliebt, denn er erlaubt den einfach Anschluss einer Vielzahl von preisgünstigen Erweiterungsbausteinen.
Der ftDuino wird mit einer Schutzkappe auf dem I2 C-Anschluss ausgeliefert wie in Abschnitt 1.2.6 abgebildet. Diese Kappe
muss vor Benutzung des I2 C-Anschlusses entfernt werden.
Mit wenig Aufwand lassen sich die meisten Sensoren mit einem passenden Anschlusskabel für den ftDuino versehen. In
Abbildung 4.30 ist beispielhaft die Verkabelung einer typischen im Online-Handel günstig erhältlichen MPU6050-SensorPlatine dargestellt. Der Sensor ist damit direkt an den ftDuino anschließbar.

GND
SCL
SDA
XDA
XCL
ADO

MPU-6050 ITG/MPU

VCC

INT

(a) Verdrahtungsschema

(b) fertiger Sensor

Abbildung 4.30: MPU6050-Sensor mit Anschlusskabel für den ftDuino
Um den jeweiligen Sensor in eigenen Projekten zu verwenden sind in der Regel zusätzliche Code-Routinen oder Bibliotheken
nötig. Die große Verbreitung der Arduino-Plattform führt dazu, dass man zu praktisch jedem gängigen Sensor mit wenig
Suche passende Beispiele und Code-Bibliotheken findet12 .
12 Eine

große Sammlung von Sensorbibliotheken findet sich unter https://github.com/ControlEverythingCommunity.

62

Kapitel 4. Experimente

Abbildung 4.31: Diverse I2 C-Sensoren mit passendem Anschlusskabel an den ftDuino

4.13.1

Sketch I2C/I2cScanner

Für einen schnellen Test, ob die elektrische Verbindung zum Sensor korrekt ist reicht aber in der Regel ein einfacher Test
der I2 C-Kommunikation aus. Unter Datei . Beispiele . FtduinoSimple . I2C . I2cScanner findet sich ein einfaches
I2 C-Testprogramm, das am I2 C-Bus nach angeschlossenen Sensoren sucht und deren Adresse ausgibt. Die jeweilige Adresse
eines Sensors wird in der Regel vom Sensorhersteller fest vergeben. Im Falle des MPU-6050 ist dies die Adresse 0x68. Diese
Adresse wird bei korrektem Anschluss des Sensors angezeigt.

Abbildung 4.32: Ausgabe von I2cScanner bei angeschlossenem MPU-6050

4.13.2

MPU-6050-Sensor

Für den MPU6050 liefert die ftDuino-Umgebung ein eigenes Beispiel mit. Der Beispiel-Sketch unter Datei . Beispiele .
FtduinoSimple . I2C . MPU6050Test liest die Beschelunigungswerte aus dem MPU-6050 aus und gibt sie auf dem
seriellen Monitor aus.

Abbildung 4.33: Ausgabe von MPU6050Test

4.13. Nutzung des I2 C-Bus

4.13.3

63

OLED-Display

Eine weitere naheliegenden Anwendung des I2 C-Anschlusses ist der Anschluss eines kleinen Displays, mit dem z.B. direkt
am ftDuino Messwerte ausgegeben werden können.
Für wenig Geld gibt es im Online-Handel OLED-Displays mit 0,96 Zoll Bilddiagonale. Mit einer Größe von etwas unter
3∗3cm2 eignen sich diese Displays auch sehr gut für den Einbau in ein entsprechendes fischertechnik-kompatibles Gehäuse
13
.

VCC GND SCL SDA

SDA SCL GND VCC
Ad d re s s S e l e c t

0x7A

0

0x7B

128x64 OLED

(a) Vorderseite

(b) Rückseite

(c) im Gehäuse

Abbildung 4.34: OLED-Display mit Anschlusskabel für den ftDuino
Beim Anlöten des Kabels muss man sich unbedingt am Aufdruck auf der Display-Platine und nicht an den Skizzen hier
orientieren, da es in der Anschlussbelegung Unterschiede zwischen den ansonsten baugleichen Displays gibt.
Dieses Display verwendet als Display-Controller-Baustein den SSD130614 von Solomon Systech. Diese Display-Sorte ist im
Arduino-Umfeld sehr beliebt und passende Bibliotheken gibt es im Internet1516 .
Wichtig: Wie viele andere I2 C-Sensoren auch ist das OLED-Display nicht ftDuino-spezifisch, sondern wird auch in anderen
Arduino-Projekten eingesetzt. Daher ist dessen Unterstützung kein Teil der ftDuino-Installation, sondern es müssen die o.g.
Adafruit-Bibliotheken unbedingt seperat installiert werden. Anderfalls wird die Übresetzung des Sketches mit einer Meldung
der Art “fatal error: Adafruit GFX.h: No such file or directory” oder ähnlich abgebrochen.
Zum Displaytest bringt die Adafruit SSD1306-Bibliothek unter
Datei . Beispiele . Adafruit SSD1306 .
ssd1306 128x64 i2c ein Beispiel. Erscheint vor dem Download die Meldung “Height incorrect, please fix
Adafruit SSD1306.h!”, dann muss in der Datei Adafruit SSD1306.h folgende Änderung vorgenommen werden, um
die Unterstützung des 128x64-Displays zu aktivieren:
72
73
74
75
76

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
# define SSD1 306_128_ 64
//
# define SS D1306_12 8_32
//
# define SSD1306_96_16
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */

13 https://www.thingiverse.com/thing:2542260
14 Datenblatt

des SSD1306: https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
https://github.com/adafruit/Adafruit SSD1306
16 Adafruit-GFX-Bibliothek: https://github.com/adafruit/Adafruit-GFX-Library

15 Adafruit-SSD1306-Bibliothek:

64

Kapitel 4. Experimente

Zusätzlich muss im Sketch selbst die I2 C-Adresse von 0x3D nach 0x3C angepasst werden:
60
61
62

// by default , we ’ ll generate the high voltage from the 3.3 v line internally ! ( neat !)
display . begin ( SSD1306_SWITCHCAPVCC , 0 x3C ) ; // initialize with the I2C addr 0 x3D ( for the
128 x64 )
// init done

Die ftDuino-Installation selbst bringt ebenfalls ein Beispiel mit, das dieses Display verwendet. Das Shootduino-Spiel findet
sich unter Datei . Beispiele . FtduinoSimple . Shootduino . Das Spiel erwartet drei Taster an den Eingängen I1,
I2 und I3 zur Steuerung des Raumschiffs und ggf. eine Lampe an O1.

4.13.4

VL53L0X LIDAR-Distanzsensor

Fischertechnik liefert einen Ultraschallsensor zur Distanzmessung, der wie in Abschnitt 1.2.6 gezeigt auch am ftDuino
betrieben werden kann. Dieser Ultraschallsensor sendet einen Ultraschallimpuls aus und misst die Laufzeit, bis die Schallwelle
ein Hinternis erreicht und zum Sensor zurück reflektiert. Aus der Laufzeit und der bekannten Schallgeschwindigkeit lässt
sich so die Distanz bestimmen.
In der Arduino-Welt gibt es eine interessante Alternative in Form des VL53L0X-Laser-Distanzsensors. Das Funktionsprinzip
gleicht dem des Ultraschallsensors, allerdings kommt kein Schall, sondern Laserlicht zu Einsatz. Der VL53L0X lässt sich
recht leicht über I2 C mit dem ftDuino verbinden.

VIN

SCL
SDA
GPIO01

GYVL53L0XV2

GND

XSHUT

Abbildung 4.35: Anschlussschema des VL53L0X an den ftDuino
Ein passendes Gehäuse zum selbst-drucken findet sich im ftDuino-Repository17 .

Abbildung 4.36: VL53L0X in 3D-gedrucktem Gehäuse
Wie für fast alle üblichen I2 C-Sensoren findet man auch beim VL53L0X bereits fertige Arduino-Bibliotheken und -Skeches
im Internet18 .
17 VL53L0X-Gehäuse:
18 Adafruit-Bibliothek

https://github.com/harbaum/ftduino/tree/master/addons/vl53l0x
für den VL53L0X: https://github.com/adafruit/Adafruit VL53L0X

4.13. Nutzung des I2 C-Bus

4.13.5

65

ftDuino als I2 C-Client und Kopplung zweier ftDuinos

Der ftDuino kann nicht nur andere Geräte über den I2 C-Bus ansprechen, er kann sich selbst auch als passives Gerät am Bus
ausgeben, um von einem anderen Gerät angesprochen zu werden.
Am einfachsten lässt sich diese Möglichkeit nutzen, wenn zwei ftDuinos direkt über I2 C gekoppelt werden.
9 Volt-Versorgung für beide Geräte

Reset

3
2

1

Reset

I1

O1 O2

I1

O1 O2

I2

O3 O4

I2

O3 O4

I3

O5 O6

I3

O5 O6

I4

O7 O8

I4

O7 O8

I5

C1

I5

C1

I6

C2

I6

C3

I7

C4

I8

I²C

I7
I8

+9V

+9V

I²C-Master

C2
I²C
+9V

C3
+9V

C4

I²C-Slave

Abbildung 4.37: Kopplung zweier ftDuinos über I2 C
Es wird dazu eine 1:1-Verbindung zwischen den beiden I2 C-Anschlüssen der beteiligten Controller hergestellt. Ein Controller muss in diesem Aufbau als Master konfiguriert werden, einer als Slave. Enstprechende Beispiel-Sketches finden sich
unter Datei . Beispiele . FtduinoSimple . I2C . I2cMaster und Datei . Beispiele . FtduinoSimple . I2C .
I2cSlave .
Der Master fragt kontinuierlich einen an Eingang I1 angeschlossenen Taster ab und sendet den Zustand des Tasters über
I2 C an den zweiten, als Slave konfigurierten ftDuino. Dieser schaltet dann eine Lampe an Ausgang O1 entsprechend ein oder
aus.
Die Spannungsversorgung des Masters kann dabei über die I2 C-Verbindung erfolgen. Lediglich der Slave muss direkt mit 9
Volt versorgt sein, um die Lampe am Ausgang steuern zu können. Die Versorgung über I2 C entspricht der Versorgung über
USB mit den bekannten Einschränkungen wie in Abschnitt 1.2.5 beschrieben.
Erweiterter I2cSlave
Neben dem einfachen Beispiel Datei . Beispiele . FtduinoSimple . I2C . I2cSlave , das auf der funktionsreduzierten FtduinoSimple-Bibliothek aufbaut befindet sich unter Datei . Beispiele . Ftduino . I2C . I2cSlave ein auf der
vollwertigen Bibliothek aufbauendes Beispiel, das die meisten Ein- und Ausgabefähigkeiten des ftDuino über I2 C verfügbar
macht.
Dieser erweiterte Sketch eignet sich als Basis für komplexe Modelle. Das hier abgebildete Beispiel verwendet drei ftDuinos
zur Erweiterung des Master-ftDuino um weitere 24 Aus- und 36 Eingänge.
Der erste ftDuino im Bild ganz links bildet den Master, gefolgt von den drei Slaves. Auf dem ersten Slave läuft das unveränderte Beispiel aus Datei . Beispiele . Ftduino . I2C . I2cSlave . Für die weiteren Slaves muss die I2 C-Adresse
im Sketch jeweils angepasst werden. Das geschieht, indem in Zeile 16 im I2cSlave-Sketch die Adresse 43 ersetzt wird
durch 44 bzw 45 für die beiden weiteren Slaves.
13
14
15
16
17
18
19
20
21

void setup () {
pinMode ( LED_BUILTIN , OUTPUT ) ; // LED i nitialis ieren
Wire . begin (43) ;
// tritt I2C - Bus an Adresse #43 als " Slave " bei
Wire . onReceive ( receiveEvent ) ; // Auf Schreib - Ereignisse registrieren
Wire . onRequest ( requestEvent ) ; // Auf Lese - Ereignisse registrieren
ftduino . init () ;

66

Kapitel 4. Experimente

I²C-Master

9 Volt-Versorgung für alle Geräte

Reset

3
2

1

I²C-Slave #43
Reset

I²C-Slave #44

I²C-Slave #45

Reset

Reset

I1

O1 O2

I1

O1 O2

I1

O1 O2

I1

O1 O2

I2

O3 O4

I2

O3 O4

I2

O3 O4

I2

O3 O4

I3

O5 O6

I3

O5 O6

I3

O5 O6

I3

O5 O6

I4

O7 O8

I4

O7 O8

I4

O7 O8

I4

O7 O8

I5

C1

I5

C1

I5

C1

I5

C1

I6

C2

I6

C2

I6

C2

I6

C3

I7

C3

I7

C3

I7

C4

I8

C4

I8

C4

I8

I²C

I7
I8

+9V

+9V

I²C
+9V

+9V

I²C
+9V

+9V

C2
I²C
+9V

C3
+9V

C4

Abbildung 4.38: Kopplung von vier ftDuinos über I2 C

22
23
24

// alle Ausg ä nge sind hochohmig
memset ( output_mode , 0 , sizeof ( output_mode ) ) ;
}

Der Master enthält in diesem Fall die gesamte eigentliche Programmlogik und die Slaves nehmen fundamentale Steuerbefehle
über I2 C entgegen. Der Master-Sketch findet sich unter Datei . Beispiele . Ftduino . I2C . I2cMaster . In Zeile 12
sind dort die Adressen 43, 44 und 45 der drei Slaves bereits eingestellt. Sollen mehr oder weniger Slaves verwendet werden,
so ist die Zeile 12 entsprechend anzupassen.
9
10
11
12

// Liste der anzu steuernd en I2c - Clients , beginnend mit 0 ( der Master selbst )
// und -1 als E ndemark ierung . In diesem Fall sind drei Clients unter den Adressen
// 43 , 44 und 45 angeschlossen
static const int8_t clients [] = { 0 , 43 , 44 , 45 , -1 };

Die Stromversorgung aller vier ftDuinos kann aus einem fischertechik-Netzteil erfolgen, das an den Master angeschlossen
wird. Die Slaves werden dann vom 9-Volt-Ausgang des Masters über zweipolige fischertechnik-Kabel versorgt.

Abbildung 4.39: Vier ftDuinos über I2 Cgekoppelt
Das Beispiel Datei . Beispiele . Ftduino . I2C . I2cMaster eignet sich als Vorlage für komplexe Modelle. Je nach
Modell kann es aber praktischer sein, auch die Slaves zu verändern und zu erweitern. Geräte bei Modellen mit weitgehend
eigenständigen Untereinheiten (z.B. Taktstraße) kann es einfacher sein, die einzelnen Stationen jeweils von einem ftDuino
weitgehend autonom steuern zu lassen und die I2 C-Kommunikation auf das nötigste zu reduzieren, um z.B. die Ankunft
eines neuen Bauteils in der Station anzukündigen.
Die folgenden Tabelle listete die I2 C-Register, wie sie vom I2cSlave.ino für den ftDuino implementiert werden. Werte mit
vorangestelltem 0x sind in Hexadezimalschreibweise dargestellt.

4.13. Nutzung des I2 C-Bus

67

Registerbelegungen für Ausgänge O1 bis O8 bzw. M1 bis M4

0x00

0x01

0x02

0x03

0x04
0x05
0x06
0x07
0x08
0x09
0x0a
0x0b
0x0c
0x0d
0x0e
0x0f

Ausgangs-Modus O1/M1
0x0x - Betrieb als Einzelausgang
0x00 - Einzelausgang offen/hochohmig (tristate)
0x01 - Einzelausgang gegen +9V geschaltet (High)
0x02 - Einzelausgang gegen Masse geschaltet (Low)
0x1x - Ausgang mit O2 zum Motorausgang M1 gekoppelt
0x10 - Motorausgang ungebremst aus (off)
0x11 - Motorausgang gebremst aus (brake)
0x12 - Motorausgang linksdrehend an
0x13 - Motorausgang rechsdrehend an
Ausgangswert (PWM) O1/M1 von 0 (aus) bis 255 (100% an)
Der Zustand des Hardwareausgangs wird beim Schreiben
dieses Registers aktualisiert
Ausgangs-Modus O2
Der Inhalt dieses Registers wird ignoriert, wenn Ausgangs-Modus O1/M1
(Register 0x00) den Wert 0x1x enthält
0x00 - Einzelausgang offen/hochohmig (tristate)
0x01 - Einzelausgang gegen +9V geschaltet (High)
0x02 - Einzelausgang gegen Masse geschaltet (Low)
Ausgangswert (PWM) O2 von 0 (aus) bis 255 (100% an)
Der Inhalt dieses Registers wird ignoriert, wenn Ausgangs-Modus O1/M1
(Register 0x00) den Wert 0x1x enthält
Der Zustand des Hardwareausgangs wird beim Schreiben
dieses Registers aktualisiert
Ausgangs-Modus O3/M2, siehe Ausgang-Modus O1 (Register 0x00)
Ausgangswert O3/M2, siehe Ausgangwert O1 (Register 0x01)
Ausgangs-Modus O4, siehe Ausgang-Modus O2 (Register 0x02)
Ausgangswert O4, siehe Ausgangwert O2 (Register 0x03)
Ausgangs-Modus O5/M3, siehe Ausgang-Modus O1 (Register 0x00)
Ausgangswert O5/M3, siehe Ausgangwert O1 (Register 0x01)
Ausgangs-Modus O6, siehe Ausgang-Modus O2 (Register 0x02)
Ausgangswert O6, siehe Ausgangwert O2 (Register 0x03)
Ausgangs-Modus O7/M4, siehe Ausgang-Modus O1 (Register 0x00)
Ausgangswert O7/M4, siehe Ausgangwert O1 (Register 0x01)
Ausgangs-Modus O8, siehe Ausgang-Modus O2 (Register 0x02)
Ausgangswert O8, siehe Ausgangwert O2 (Register 0x03)

Registerbelegungen für Eingänge I1 bis I8

Es können maximal die beiden Bytes eines Eingangs in einem gemeinsamen I2C-Transfer gelesen werden. Jeder Eingang
muss einzeln gelesen werden.

68

0x10

0x11
0x12
0x13
0x14
0x15
0x16
0x17
0x18
0x19
0x1a
0x1b
0x1c
0x1d
0x1e
0x1f

Kapitel 4. Experimente

schreiben: Eingangs-Modus I1
0x00 - Spannung
0x01 - Widerstand
0x02 - Schalter
lesen: Eingangswert I1, Low-Byte (LSB)
lesen: Eingangswert I1, High-Byte (MSB)
Eingangs-Modus/Eingangswert I2, siehe Eingangs-Modus
Eingangswert I2, siehe Eingangswert I1 (Register 0x11)
Eingangs-Modus/Eingangswert I3, siehe Eingangs-Modus
Eingangswert I3, siehe Eingangswert I1 (Register 0x11)
Eingangs-Modus/Eingangswert I4, siehe Eingangs-Modus
Eingangswert I4, siehe Eingangswert I1 (Register 0x11)
Eingangs-Modus/Eingangswert I5, siehe Eingangs-Modus
Eingangswert I5, siehe Eingangswert I1 (Register 0x11)
Eingangs-Modus/Eingangswert I6, siehe Eingangs-Modus
Eingangswert I6, siehe Eingangswert I1 (Register 0x11)
Eingangs-Modus/Eingangswert I7, siehe Eingangs-Modus
Eingangswert I7, siehe Eingangswert I1 (Register 0x11)
Eingangs-Modus/Eingangswert I8, siehe Eingangs-Modus
Eingangswert I8, siehe Eingangswert I1 (Register 0x11)

I1 (Register 0x10)
I1 (Register 0x10)
I1 (Register 0x10)
I1 (Register 0x10)
I1 (Register 0x10)
I1 (Register 0x10)
I1 (Register 0x10)

Registerbelegungen für Zählereingänge C1 bis C4

0x20

0x21

0x22
0x24

0x25

0x26
0x28
0x29
0x2a
0x2c
0x2d
0x2e

schreiben: Zähler-Modus C1
0x00 - aus
0x01 - steigende Flanke
0x02 - fallende Flanke
0x03 - beide Flanken
0x04 - Ultraschallsensor aktivieren
lesen: Eingangszustand C1
schreiben: Zähler C1
0x00 - Zähler unverändert lassen
sonst - Zähler löschen
lesen: Zählerstand C1/Ultraschall-Distanz, Low-Byte (LSB)
Zählerstand C1/Ultraschall-Distanz, High-Byte (MSB)
schreiben: Zähler-Modus C2
0x00 - aus
0x01 - steigende Flanke
0x02 - fallende Flanke
0x03 - beide Flanken
lesen: Eingangszustand C2
schreiben: Zähler C2
0x00 - Zähler unverändert lassen
sonst - Zähler löschen
lesen: Zählerstand C2, Low-Byte (LSB)
Zählerstand C2, High-Byte (MSB)
Zähler-Modus C3, siehe Zähler-Modus C2 (Register 0x24)
Zählerstand C3, Low-Byte (LSB), siehe Zählerstand C2 (Register 0x25)
Zählerstand C3, High-Byte (MSB), siehe Zählerstand C2 (Register 0x26)
Zähler-Modus C4, siehe Zähler-Modus C2 (Register 0x24)
Zählerstand C4, Low-Byte (LSB), siehe Zählerstand C2 (Register 0x25)
Zählerstand C4, High-Byte (MSB), siehe Zählerstand C2 (Register 0x26)

4.13. Nutzung des I2 C-Bus

69

ftDuino als I2 C-Slave am PC

GND

5V

P0

P1

P2

P3

P4

P5

Natürlich lässt sich der ftDuino als I2 C-Slave nicht nur an anderen ftDuinos betreiben, sondern auch an PCs und anderen
Geräten, wenn sie mit einer entsprechenden I2 C-Schnittstelle ausgerüstet sind. Im Fall eines PCs lässt sich die nötige I2 CSchnittstelle auch mit Hilfe eines einfachen Adapters über USB nachrüsten. Ein solcher Adapter ist der i2c tiny usb19 .

VIN

(a) Verdrahtungsschema

(b) fertiger Adapter

Abbildung 4.40: Digispark/i2c tiny usb zum Anschluss an den I2 C des ftDuino
Auf einem Linux PC20 kann das Programm i2c detect verwendet werden. Mit dem Paramter -l kann man sich zunächst
eine Liste aller im PC installierten I2 C-Busse ausgeben lassen.
$ i2cdetect -l
i2c-3
unknown
i2c-1
unknown
i2c-8
i2c
i2c-6
unknown
i2c-4
unknown
i2c-2
unknown
i2c-0
unknown
i2c-9
i2c
i2c-7
unknown
i2c-5
unknown

i915 gmbus dpc
i915 gmbus vga
em2860 #0
DPDDC-B
i915 gmbus dpb
i915 gmbus panel
i915 gmbus ssc
i2c-tiny-usb at bus 001 device 023
DPDDC-C
i915 gmbus dpd

N/A
N/A
I2C adapter
N/A
N/A
N/A
N/A
I2C adapter
N/A
N/A

Der Digispark/i2c tiny usb erscheint in diesem Fall als i2c-9. Unter dieser Bus-Nummer lässt sich der I2 C-Bus des
i2c tiny usb nach Geräten absuchen.
$ i2cdetect -y 9
0 1 2 3 4
00:
-- -10: -- -- -- -- -20: -- -- -- -- -30: -- -- -- -- -40: -- -- -- -- -50: -- -- -- -- -60: -- -- -- -- -70: -- -- -- -- --

5
---------

6
---------

7
---------

8
--------

9
--------

a
--2a
-----

b
--------

c
--------

d
--------

e
--------

f
--------

In diesem Fall wurde unter Adresse $2a (dezimal 42) der auf der FtduinoSimple-Bibliothek basierende einfache I2cSlave
des ftDuino erkannt.
Im Repository21 findet sich ein Python-Beispiel, mit dem vom PC aus auf den ftDuino zugegriffen werden kann. Für die
unfangreicherer auf der Ftduino-Bibliothek basierende Variante gibt es ebenfalls ein Python-Beispiel im Repository22 .
ftDuino als I2 C-Slave am TXT
Wie im Abschnitt 4.13 erwähnt ist mit 3,3 Volt betriebene I2 C-Anschluss des fischertechnik-TXT-Controllers nicht elektrisch
kompatibel zum mit 5 Volt betriebenen I2 C-Anschluss des ftDuino.
19 Weitere

Infos zum i2c tiny usb finden sich unter https://github.com/harbaum/I2C-Tiny-USB
der Raspberry-Pi oder der fischertechnik TXT sind Linux-PCs
https://raw.githubusercontent.com/harbaum/ftduino/master/ftduino/libraries/FtduinoSimple/examples/I2C/I2cSlave/master.py
https://raw.githubusercontent.com/harbaum/ftduino/master/ftduino/libraries/Ftduino/examples/I2C/I2cSlave/master.py

20 Auch
21
22

70

Kapitel 4. Experimente

Einfacher Levelshifter
Mit Hilfe eines passenden Pegel-Wandlers kann man aber leicht die nötige Signalanpassung vornehmen. Die Elektronik dazu
ist preisgünstig im Online-Handel erhältlich. Man sollte darauf achten, dass die Elektronik die Spannungsversorgung der
3,3-Volt-Seite selbst aus der Versorgung der 5-Volt-Seite erzeugt, da der TXT selbst keine 3,3 Volt zur Verfügung stellt.

ftDuino

AV CC

BV CC
B S CL

AS CL

TXT

BS DA
AS DA
AGN D

BGN D

(a) Kabelschema

(b) Anschluss an den TXT

Abbildung 4.41: Levelshifter zur Verbindung von TXT und ftDuino

ftDuino-I2 C-Expander
Die Funktion eines Levelshifters erfüllt auch der sogenannte I2 C-Expander23 . Dieses Gerät wurde zum Einsatz am ftDuino
entworfen, kann aber auch am TXT oder TX betrieben werden.

(a) fertiges Gerät

(b) Einzelteile

Abbildung 4.42: I2 C-Expander für den ftDuino
Der I2 C-Expander stellt einen TXT-kompatiblen 10-poligen I2 C-Anschluss bereit und vier 6-polige TX- bzw. ftDuinokompatible. Die vier ftDuino-kompatiblen Anschlüsse sind 1-zu-1 verbunden und können zum Anschluss mehrerer I2 C-Geräte
an den ftDuino verwendet werden. Zusätzlich ist eine Levelshifter enthalten, der einen Anschluss an den TXT bzw. an dessen
Sensoren erlaubt. Die Spannungsversorgung des Levelshifters erfolgt vom ftDuino.
Eine passende App für die Community-Firmware des fischertechnik-TXT-Controllers findet sich im cfw-apps-Repository24 .
Da I2 C-Geräte am TXT auch unter RoboPro und der Originalfirmware angesteuert werden können lässt sich der ftDuino
auf diese Weise auch unter RoboPro als Erweiterung des TXT nutzen.
TXT-I2 C-Sensoren am ftDuino
Das Kabel zum Anschluss des ftDuino an den TXT ist nicht auf eines feste Richtung festgelegt. Es kann daher auch dazu
verwendet werden, für den TXT entworfene Sensoren an den ftDuino anzuschließen.
23 Der
24

ftDuino-I2 C-Expander: https://github.com/harbaum/ftduino/tree/master/addons/i2c-expander
https://github.com/harbaum/cfw-apps/tree/master/packages/ftDuinoI2C

4.14. WS2812B-Vollfarb-Leuchtdioden

71

Getestet wurde dies mit dem “Kombisensor 15840225 3-in-1 Orientierungssensor”26 basierend auf dem Bosch BMX055, für
den es auch fertige Arduino-Sketches gibt27 . Der Anschluss der 9-Volt-Versorgungsspannung erfolgt dabei exakt wie beim
TXT an einem der 9-Volt-Ausfänge des ftDuino.

(b) am I2 C-Expander

(a) am Levelshifter

Abbildung 4.43: Orientierungssensor von fischertechnik am ftDuino

4.14

WS2812B-Vollfarb-Leuchtdioden

Schwierigkeitsgrad:
Die Nutzung von WS2812B-Leuchtdioden am ftDuino erfordert etwas Lötarbeit sowie die Installation von Hilfs-Bibliotheken.
Dieses Projekt wird daher nur einem fortgeschrittenen Nutzer empfohlen.
Der I2 C-Anschluss des ftDuino ist zwar primät zum Anschluss von I2 C-Geräten gedacht. Da die dort angeschlossenen
Signale SDA und SCL aber auf frei benutzbaren Anschlüsse des ATmega32u4-Mikrocontrollers liegen können sie auch für
andere Signalarten zweckentfremdet werden. Ein solches Signal ist der serielle synchrone Datenstrom, wie ihn die WS2812BLeuchtdioden verwenden. Diese Lechtdioden gibt es für kleines Geld als Meterware bei diversen Online-Anbietern.

C4
+9V

C2

C3

C1

O7 O8

O5 O6

O1 O2

O3 O4

Um die interne Stromversorgung des ftDuino nicht zu überlasten sollten maximal zwei WS2812B-Leuchtdioden an der 5Volt-Versorgung des I2 C-Anschlusses des ftDuino betrieben werden. Sollen mehr Leuchtdioden verwendet werden, so ist eine
seperate externe 5-Volt-Versorgung vorzusehen.

I²C

GND
DI

GND
DO
+5V

GND
DI
+5V

GND
DO
+5V

I8

I7

I6

I5

I4

I3

I1

I2

Reset

+9V

+5V

Abbildung 4.44: Anschluss von zwei WS2812B-Vollfarb-Leuchtdioden
25 fischertechnik-Datenbank:

https://ft-datenbank.de/search.php?keyword=158402

26 https://content.ugfischer.com/cbfiles/fischer/Zulassungen/ft/158402-Kombisensor-Kurzanleitung-BMX055-2017-06-09.pdf
27 https://github.com/ControlEverythingCommunity/BMX055

72

Kapitel 4. Experimente

Jeder WS2812B-Leuchtdiodenstreifen vefügt über drei Eingangssignale: Masse, +5V und DI. Versorgungssignale Masse und
+5V werden direkt mit ihren Gegenstücken am I2 C-Anschluss verbunden. Das Signal DI steht für “Data In” und ist der
Datensignaleingang der Leuchtdioden. Der ebenfalls am anderen Ende des Leuchtdiodenstreifens vorhandene Datenausgang
(DO) darf nicht verwendet werden. Er leitet das über DI empfangene Signal gegebenenfalls an zusätzliche Leuchtdioden
weiter. Das DI-Signal kann wahlweise mit dem SCL oder SDA-Pin des I2 C-Anschluss verbunden werden. Der entsprechende
Signalname muss später im Sketch eingetragen werden.
Die Leuchtdioden sollten mit Vorsicht angeschlossen werden. Kurzschlüsse oder falsche Verbindungen können die Leuchtdioden und den ftDuino beschädigen.

4.14.1

Sketch WS2812FX

Das Beispiel zu Ansteuern der WS2812B-Leuchtdioden sowie die nötige Code-Bibliothek können beispielsweise der
WS2812BFX-Bibliothek28 entnommen werden. Andere Bibliotheken zur Absteuerung der WS2812B-Leuchtdioden dürften
gleichermaßen zu nutzen sein.
Die Installation der Bibliothek erfordert etwas Erfahrung mit der Arduino-IDE. Wurde die Bibliothek korrekt installiert, dann
finden sich diverse Beispiele unter Datei . Beispiele . WS2812FX . Das Beispiel auto mode cycle ist gut geeignet, die
Funktion der Leuchtdioden zu überprüfen.
Am Beginn des Sketches sind lediglich zwei kleine Änderungen vorzunehmen, um die Zahl und den verwendeten Anschluss
der Leuchtdioden anzupassen.
1
2
3
4
5
6

4.15

# include < WS2812FX .h >
# define LED_COUNT 2
# define LED_PIN SCL
# define TIMER_MS 5000

Musik aus dem ftDuino

Schwierigkeitsgrad:
Der ftDuino verfügt über keinen eingebauten Lautsprecher und kann daher ohne Hilfe keine Töne ausgeben. Es ist aber
problemlos möglich, einen Lautsprecher an einen der Ausgänge des ftDuino anzuschließen. Dazu eignet sich natürlich
besonders gut die fischertechnik Lautsprecherkassette 36936.

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 4.45: Anschluss der Lautsprecherkassette an den ftDuino
Wichtig ist, dass ein Vorwiderstand von mindestens 100 Ω zwischen den Lautsprecher und den ftDuino geschaltet wird.
Werden die 9 Volt des ftDuino direkt auf den Lautsprecher gelegt, dann kann der Lautsprecher sehr leicht Schaden nehmen
und erzeugte Töne wären extrem laut. Der Vorwiderstand begrenzt den maximal fließenden Strom und schützt Lautsprecher
und Gehör.
28 https://github.com/kitesurfer1404/WS2812FX

4.15. Musik aus dem ftDuino

73

Schaltet man nun den Ausgang O2 mit 50% PWM-Verhältnis ein, so kann man das PWM-Signal direkt hören.
ftduino . output_set ( Ftduino :: O2 , Ftduino :: HI , Ftduino :: MAX /2) ;

Durch das 50% PWM-Signal wird der Ausgang permanent zwischen HI und OFF umgeschaltet (siehe auch Abschnitt 4.3).
Nur wenn der Ausgang HI ist fließt ein Strom vom Ausgang über den Lautsprecher zum Masse-Anschluss. Da die PWMFrequenz der Ftduino-Bibliothek ca. 200 Hertz beträgt hört man dann einen Ton in dieser Frequenz.
Die PWM-Erzeugung wird wie im Abschnitt 4.3 beschrieben nicht über dafür vorgesehene PWM-Ausgänge des ATmega32u4Mikrocontrollers erzeugt sondern durch Signale, die der Mikrocontroller kontinuierlich über seinen SPI-Bus an die Ausgangstreiber sendet. Dieses Vorgehen ist sehr flexibel und erlaubt es, alle acht Ausgänge mit unabhängigen Signalen zu steuern,
es erfordert aber ein konstantes Mitarbeiten des Mikrocontrollers und nimmt einen gewissen Prozentsatz seiner Rechenzeit
permanent in Anspruch. Je höher die PWM-Frequenz, desto häufiger muss der Mikrocontroller die Signale ändern und desto
höher ist der Bedarf an Rechenzeit, die nicht im eigentlichen Sketch zur Verfügung steht. Bei 200 Hertz ist dieser Effekt zu
vernachlässigen. Für eine Tonerzeugung sind aber Frequenzen im Kilohertzbereich nötig. Sollen nicht nur digitale an/ausRechtecksignale sondern z.B. auch analoge Sinussignale erzeugt werden, dann sind sogar PWM-Signale im Megaherz-Bereich
nötig. Das kann der ATmega32u4 über den SPI-Bus nicht leisten.
Die MC33879-Ausgangstreiber haben jeweils zwei Eingänge29 , die am SPI-Bus vorbei direkt angesteuert werden können.
Im ftDuino liegen die meisten dieser Eingänge auf Masse, aber der für den Ausgang O2 zuständige Eingang EN6 des
Ausgangstreibers U3 ist mit dem Pin PB7 des ATmega32u4 verbunden. Damit lässt sich einer der Ausgangstransistoren des
Ausgangstreibers über diesen Pin am ATmega32u4 direkt schalten. In der Arduino-Welt hat dieser Pin die Nummer 11 und
lässt sich mit den üblichen Arduino-Funktionen schalten.
// Highside - Treiber von Ausgang O2 f ü r eine Sekunde aktivieren
pinMode (11 , OUTPUT ) ;
digitalWrite (11 , HIGH ) ;
delay (1000) ;
digitalWrite (11 , LOW ) ;

Um den Effekt am Ausgang zu sehen muss die FtduinoSimple-Bibliothek in den Sketch eingebunden sein, da die nach wie
vor nötige Initialisierung der Ausgangstreiber durch die Bibliothek erfolgt.

4.15.1

Sketch Music

Schwierigkeitsgrad:
Alternativ können auf diesen Pin auch die Arduino-Befehle zur Ton-Erzeugung angewendet werden. Der Beispielsketch unter
Datei . Beispiele . FtduinoSimple . Music nutzt dies.
// Kammerton A f ü r eine Sekunde spielen
tone (11 , 440 , 1000) ;

4.15.2

Sketch MusicPwm

Schwierigkeitsgrad:
Der verwendete Pin PB7 ist Teil des ATmega32u4-internen Timer 1. Das bedeutet, dass spezielle Hardware des ATmega32u4 zur Signalerzeugung herangezogen werden kann. Damit können Signale hoher Prequenz ganz ohne Einsatz von
Rechenleistung erzeugt werden.
Der Beispiel-Sketch Datei . Beispiele . FtduinoSimple MusicPwm nutzt das, um die exakt gleiche Melodie wie der
vorige Sketch zu erzeugen. Der Code ist deutlich kryptischer und sieht komplizierter aus. Während die Arduino-tone()Funktion aber im Hinterund in einem sogenannten Timer-Interrupt Rechenleistung benötigt, um den Ton zu erzeugen werden
die Töne in diesem Beispiel allein aus der sogenannten Timer-Hardware des ATmega32u4-Prozessors erzeugt. Lediglich zum
Ändern der Tonhöhe oder zum Stoppen der Tonausgabe ist der eigentliche Rechenteil des Prozessors verantwortlich.
In einem einfachem Musik-Beispiel wie diesem ist der Hintergrundbedarf an Rechenleistung zu vernachlässigen. Sollen aber
sehr hohe Frequenzen, z.B. im Ultraschallbereich oder höher erzeugt werden, so steigt der Bedarf an Rechenleistung im
Hintergrund, da mit höheren Frequenzen häufiger das Signal geändert werden muss. Die Verwendung der Timer-Hardware
29 EN5

und EN6, siehe http://cache.freescale.com/files/analog/doc/data sheet/MC33879.pdf

74

Kapitel 4. Experimente

hat dieses Problem nicht. Die zur Tonerzeugung nötigen Signalwechsel, also das permanente Ein- und Ausschalten des
Ausgangs in der gewünschten Ton-Frequenz wird automatisch erledigt und benötigt daher auch bei hohen Frequenzen
keinerlei Rechenzeit des Mikrocontrollers.

4.16

Der ftDuino als MIDI-Instrument

Einen Lautsprecher anzuschließen ist nur eine Art, Töne zu erzeugen. Baukastensysteme wie fischertechnik laden natürlich
ein, auf elektromechanische Weise Töne auszugeben z.B. mit Hilfe der Klangrohre aus der Dynamic-Baukastenserie.
Mit seiner flexiblen USB-Schnittstelle bietet der ftDuino eine elegante Methode, solche Fähigkeiten nutzbar zu machen. Die
sogenannte MIDI-Schnittstelle30 wurde entwickelt, um Computer und elektronische Musikinstrumente zu verbinden. Neben
der elektrisch sehr speziellen MIDI-Verbindung gibt es eine Variante von MIDI über USB. Die Arduino-Umgebung bietet
dafür die MIDIUSB-Bibliothek an, die über die Bibliotheksverwaltung der IDE direkt installiert werden kann.

Abbildung 4.46: Installation der MIDIUSB-Bibliothek in der Arduino-IDE

4.16.1

Sketch MidiInstrument

Der ftDuino-Beispielsketch unter Datei . Beispiele . FtduinoSimple . MidiInstrument nutzt diese Bibliothek, um
den ftDuino als MIDI-Gerät für den PC nutzbar zu machen. Treiber für entsprechende Geräte bringen die gängigen Betriebsysteme bereits mit und Windows, Linux und MacOS erkennen einen zum MIDI-Gerät konfigurierten ftDuino ohne weitere
Treiberinstallation als USB-Audio-Gerät.
Der ftDuino ist ein sogenanntes USB-Verbundgerät. Das bedeutet, dass er mehrere USB-Funktionen gleichzeitig umsetzen
kann. Im MIDI-Fall bedeutet das, dass er gegenüber dem PC als MIDI-Gerät erscheint und gleichzeitig weiterhin über die
USB-COM:-Schnittstelle verfügt, was speziell während der Sketchentwicklung sehr praktisch sein kann.
Ein mit dem MidiInstrument-Sketch versehener ftDuino wird z.B. von einem Linux-PC mit den gängigen MIDI-Werkzeugen
erkannt:
$ aplaymidi -l
Port
Client name
14:0
Midi Through
24:0
ftDuino

Port name
Midi Through Port-0
ftDuino MIDI 1

$ aplaymidi -p 24:0 demosong.mid
...
Der ftDuino wird eine Stimme des Songs auf einem an O2 angeschlossenen Lautsprecher abspielen und gleichzeitig auf
dem COM:-Port Informationen über die empfangenen Befehle ausgeben und damit als Basis für eine elektromechanisches
Instrument dienen.
Nur wenige MIDI-Dateien lassen sich mit diesem einfachen Setup befriedigend abspielen, weil dieses einfache Beispiel nur
monophon ist und nur einen Ton zur Zeit abspielen kann. Mehrstimmige Lieder können nicht abgespielt werden. Diese
Beschränkung lässt sich in einem mehrstimmigen mechanischen Musikmodell natürlich aufheben und ergibt sich allein aus
der sehr simplen hier verwendeten Art der Tonerzeugung.
Eine monophone Beispieldatei song.mid findet sich im Verzeichnis des Sketches.

30 MIDI,

Musical Instrument Digital Interface, https://en.wikipedia.org/wiki/MIDI

Kapitel 5

Modelle
Während in den Experimenten aus Kapitel 4 der ftDuino-Controller im Mittelpunkt stand und nur wenige externe Komponenten Verwendung fanden geht es in diesem Kapitel um komplexere Modelle. Der ftDuino spielt dabei eine untergeordnete
Rolle.
Sämtliche Modelle stammen aus aktuellen Baukästen bzw. sind nah an deren Modelle angelehnt, so dass ein Nachbau mit
dem entsprechenden Kasten mögich ist.

5.1

Automation Robots: Hochregallager

Das Modell Hochregallager stammt aus dem Baukasten “Automation Robots”. In der Originalanleitung wird der Einsatz
des TX-Controllers beschrieben. Ein Zusatzblatt beschreibt den TXT-Controller.

Abbildung 5.1: Hochregal mit ftDuino
Der Beispielsketch Datei . Beispiele . Ftduino . HighLevelRack steuert das Modell “Hochregallager” aus dem Baukasten 511933 “ROBO TX Automation Robots”. Der Anschluss des ftDuino an das Modell entspricht dabei exakt dem
Schaltplan für den TXT.
Die Bedienung erfolgt dabei aus dem seriellen Monitor vom PC aus1 .
1 Hochregal-Video

https://www.youtube.com/watch?v=Sjgv9RnBAbg

76

Kapitel 5. Modelle

Abbildung 5.2: Serielle Kommunikation mit dem Hochregal

5.2

ElectroPneumatic: Flipper

Die Eingänge des ftDuino sind auch im Schalter-Modus mit den fischertechnik-Fototransistoren kompatibel. Ein beleuchteter
Transistor liefert dann den Wahrheitswert “wahr”, ein unbeleuchter den Wert “unwahr”.

Abbildung 5.3: Flipper auf ftDuino-Basis
Der Beispiel-Sketch des Flippers aus dem ElectroPneumatic-Set findet sich unter Datei . Beispiele . Ftduino .
Pinball . Er nutzt die Fototransmistoren als Schaltereingänge für die Lichtschranken. Eine durch eine Kugel unterbrochene
Lichtschranke liefert dann den Wert “unwahr”:
if (! ftduino . input_get ( Ftduino :: I4 ) ) {
if ( millis () - loose_timer > 1000) {
// ...
}
loose_timer = millis () ;
}

Dabei wird ein Timer migeführt, der z.B. in diesem Fall dafür sorgt, dass frühestens eine Sekunde (1000 Millisekunden)
nach einem Ereignis ein weiteres Ereignis erkannt wird.
Dieser Sketch nutzt ein OLED-Display, um verbliebene Spielbälle und den Punktestand anzuzeigen2 . Da am ftDuino noch
Ausgänge frei sind können stattdessen auch Lampen oder Leuchtdioden verwendet werden.
2 Flipper-Video

https://www.youtube.com/watch?v=-zmuOhcHRbY

5.3. ROBOTICS TXT Explorer: Linienfolger

5.3

77

ROBOTICS TXT Explorer: Linienfolger

Der mobile Linienfolger ist an die Modelle des “ROBOTICS TXT Explorer”-Sets angelehnt und nutzt den “IR Spursensor”
dieses Sets.

Abbildung 5.4: Ein Linienfolger auf ftDuino-Basis
Ein passender Beispiel Sketch ist unter Datei . Beispiele . Ftduino . LineSensor zu finden. Dieser Sketch wertet
kontinuiertlich den Liniensensor aus, um eine schwarzen Linue zu folgen3 .
Der Liniensensor wird mit seinen gelben und blauen Kabeln an zwei beliebige der Eingänge I1 bis I8 angeschlossen.
Zusätzlich erfolgt über die roten und grünen Kabel die Spannungsversorgung durch den ftDuino.

Reset

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

C3
+9V

C4

Abbildung 5.5: Verdrahtunsgschema des Linienfolgers
In diesem Fall ist der Spursensor an die Eingänge I1 und I2 angeschlossen. Der Sensor liefert nahezu maximale Spannung
(ca. 9 Volt) wenn eine weiße Fläche erkannt wurd und nur wenig Millivolt, wenn die schwarze Linie erkannt wurde.
// beiden Eing ä nge auf S p a n n u n g s m e s s un g einstellen
ftduino . input _set_mo de ( Ftduino :: I1 , Ftduino :: VOLTAGE ) ;
ftduino . input _set_mo de ( Ftduino :: I2 , Ftduino :: VOLTAGE ) ;
// beide Spannungen auslesen
uint16_t linker_wert = ftduino . input_get ( Ftduino :: I1 ) ;
uint16_t rechter_wert = ftduino . input_get ( Ftduino :: I2 ) ;
// eine Spannung kleiner 1 Volt (1000 mV ) bedeutet ’ Linie erkannt ’
3 Linienfolger-Video

https://www.youtube.com/watch?v=JQ8TLt5MC9k

78

Kapitel 5. Modelle

if (( linker_wert < 1000) && ( rechter_wert < 1000) ) {
// beide Sensoren haben die Linie erkannt
// ...
}

5.4

Idas Ampel

Ein klassisches Modell ist die Ampel bzw. die Fußgängerampel. Das Modell bildet eine Bedarfsampel mit je drei Lampen für
die Autos und zwei für Fußgänger ab.
O1

O4

O2

O5

Reset

3
2

I1

1

I1

O1 O2

I2

O3 O4

I3

O5 O6

I4

O7 O8

I5

C1

I6

C2
I²C

I7
I8

+9V

O3

C3
+9V

C4

(a) Verdrahtungsschema

(b) Modell

Abbildung 5.6: Idas Ampel
Ein passender Beispiel-Sketch ist unter Datei . Beispiele . FtduinoSimple . PedestrianLight zu finden. Er implementiert die Ampel in Form eines Zustandsautomaten. Die Lichtfolge entspricht dabei dem üblichen Ablauf in acht Schritten
von “Autos haben grün, Fußgänger rot” über die Grünphase für die Fußgänger bis schließlich die Autos wieder fahren dürfen.

5.4. Idas Ampel

Zustand 0

79

Zustand 1

Taste I1

Zustand 2

5 Sekunden

Zustand 3

2 Sekunden

Zustand 4

2 Sekunden

Zustand 5

15 Sekunden

Zustand 6

2 Sekunden

Zustand 7

2 Sekunden

5 Sekunden

Abbildung 5.7: Die Zustände der Ampel

5.4.1

Zustandsautomaten

Die einfache und naheliegenden Umsetzung der Ampelsteuerung in Software bestünde aus einem Programm, das dem Verlauf
der Ampelzustände direkt folgt. Der Programmablauf stoppt, wenn auf den Tastendruck oder auf den Ablauf einer Zeit
gewartet wird und setzt fort, wenn das entsprechende Ereignis eingetreten ist. Im Folgenden ist dies exemplarisch für die
ersten zwei Zustände der Ampel dargestellt.
void loop () {
// warte auf Tastendruck
while (! ftduino . input_get ( BUTTON ) ) {
};
// Ampel schaltet ein , Autos haben gr ün , Fu ß g ä nger rot
cars_green () ;
p ed es tr i an s_ re d () ;
delay ( C A R S _ G R EE N _ P H A S E ) ;
// Autos bekommen gelb
cars_yellow () ;
delay ( YELLOW_PHASE ) ;
// ...
}

Dieses Programm ist kurz und leicht zu verstehen. Das ist eigentlich gut, hat aber einen entscheidenden Nachteil: Während
auf ein Ereignis gewartet wird stoppt der gesamte Programmablauf und es ist nicht möglich, weitere Dinge parallel zu
erledigen.
Der PedestrianLight-Sketch soll aber beispielsweise nebenbei mit der eingebauen LED des ftDuino blinken. Dies soll
unterbrechnungsfrei passieren und unabhängig davon sein, in welchem Zustand sich die eigentliche Ampel gerade befindet.
Die Lösung ist ein Zustandsautomat.
// die loop - Funktion wird immer wieder aufgerufen
void loop () {
// Zeitpunkt des n ä chsten Lichtwechsel - Ereignisses
static unsigned long next_event = 0;
// Aktueller Zustand der Amepl
static char state = 0;
// Die interne Leuchtdiode soll einmal pro Sekunde blinken
static unsigned long flash_timer = 0;
if ( millis () > flash_timer + 10)
digitalWrite ( LED_BUILTIN , LOW ) ;
if ( millis () > flash_timer + 1000) {
digitalWrite ( LED_BUILTIN , HIGH ) ;
flash_timer = millis () ;
}
// Teste ob ein Fussg ä nger im Zustand 0 ( Ampel aus ) den
// Knopf gedr ü ckt hat
if (( state == 0) && ( ftduino . input_get ( BUTTON ) ) )

80

Kapitel 5. Modelle

state = 1;

// ja -> wechsel in Zustand 1

if ( state > 0) {
// Teste , ob die eingestellte Zeit vergangen ist
if ( millis () > next_event ) {
switch ( state ) {
// Ampel wechselt in Zustand 1: Autos haben gr ün , Fussg ä nger haben rot
case 1: {
// schalte Lampen
cars_green () ;
p ed es tr i an s_ re d () ;
// setze Zeitpunkt f ü r n ä chstes Ereignis
next_event = millis () + C A R S _ G RE E N _ P H A S E ;
// setze Zustand f ü r n ä chstes Ereignis
state ++;
// K u r z s c hr e i b w e i s e f ü r " state = state + 1"
break ;
}
// Ampel wechselt in Zustand 2: Autos haben gelb , Fussg ä nger haben rot
case 2: {
cars_yellow () ;
next_event = millis () + YELLOW_PHASE ;
state ++;
break ;
}
// Ampel wechselt in Zustand 3: Autos haben rot , Fussg ä nger haben rot
case 3: {
// ...
break ;
}
// ...
}
}
}
}

Dieses Listing ist deutlich komplizierter. Aber es hat den großen Vorteil, dass an keiner Stelle aktiv gewartet wird. Stattdessen
wird die Programmausführung ständig fortgesetzt. Um trotzdem die einzelnen Ampelphasen ablaufen lassen zu können
werden zwei Variablen als Speicher angelegt (next event und state). Hier wir permanent vermerkt, in welchem Zustand
sich die Ampel befindet und wie lange dieser Zustand noch erhalten bleiben soll.
Auf diese Weise ist es möglich, die LED völlig unabhängig blinken zu lassen und ggf. auch weitere Steueraufgaben zu
erledigen.
Geschuldet ist der große Aufwand der Tatsache, dass der ftDuino über kein eigenes Betriebssystem verfügt, das mehrere
Programmteile (sogenannte Prozesse oder Threads) gleichzeitig bedienen könnte, wie es auf PCs und Smartphones z.B.
üblich ist.
Der große Vorteil des einfachen ftDuino-Ansatzes liegt in der seiner exakten Vorhersagbarkeit. Jeder kennt es vom PC oder
Smartphone, wenn das Betriebssystem im Hintergrund unerwartet “beschäftigt” ist und die Programmausführung stockt.
Was bei einer Bedienoberfläche nur lästig ist kann bei Steuer- und Regelaufgaben leicht zu einem Problem werden, wenn z.B.
ein Motor bei Erreichen einer bestimmten Position nicht schnell genug gestoppt wird. Aus diesem Grund kann der wesentlich
einfachere ftDuino auf viele Dinge schneller und vorhersagbarer reagieren als z.B. ein vom Linux-Betriebssystem angetriebener
TXT-Controller oder Raspberry-Pi. Ein weiterer positiver Effekt des nicht vorhandenen Betriebssystems ist der schnelle
Systemstart. Ein ftDuino ist sofort nach dem Einschalten voll funktionsfähig und man muss keinen Betriebssystemstart
abwarten, bevor das Gerät seine Aufgaben erfüllen kann.
Der schnelle Systemstart und das leicht vorhersagbare Verhalten sind die Hauptgründe, warum es auch im kommerziellen Umfeld immer einen Bedarf an solch einfachen Systemen wie dem ftDuino gibt, auch wenn der Einsatz komplexer,
betriebssystembasierter Lösungen mit sinkenden Hardware-Preisen auch in immer einfacheren Geräten möglich wird.

Kapitel 6

Community-Projekte
Der ftDuino ist ein echtes Community-Projekt. Er basiert auf Ideen aus der fischertechnik-Community und integriert sich
entsprechend gut in bestehende Community-Projekte. Während kommerzielle Produkte oft in Konkurrenz mit ihren eigenen
Vorgängern stehen und dem Kunden vor allem Neues geboten werden soll können es sich Community-Projekte leichter
erlauben, auch ältere und technisch in Konkurrenz stehende Systeme einzubinden.
Der ftDuino lässt sich wie in Abschnitt 4.13.5 beschrieben mit dem fischertechnik-TXT-Controller per I2 C koppeln. Auf
dem TXT kommt dabei die sogenannte Community-Firmware1 zum Einsatz. Entsprechende Programme zur Anbindung des
ftDuino per I2 Cfinden sich ebenfalls dort2 .

6.1

ftduino direct: ftDuino-Anbindung per USB an TXT und TX-Pi

Einfacher und robuster ist die Anbindung per USB an PCs, den TXT oder auch den Raspberry-Pi. Die Community stellt
dazu einen Sketch sowie eine passende Pythin-Bibliothek zur Verfügung3 .
Mit Hilfe des Sketches stellt der ftDuino seine Anschlüsse einem per USB angeschlossenen übergeordneten Gerät zur
Verfügung. Die Python-Bibliothek kann auf dem übergeordneten Gerät genutzt werden, um aus einem Python-Programm
auf die Ein- und Ausgänge des ftDuino zuzugreifen.

Abbildung 6.1: ftDuino per USB am Raspberry-Pi
1 Cfischertechnik

TXT Community-Firmware http://cfw.ftcommunity.de/ftcommunity-TXT
für die CFW https://github.com/harbaum/cfw-apps/tree/master/packages/ftDuinoI2C
3 ftduino direct-Sketch https://github.com/PeterDHabermehl/ftduino direct
2 ftDuino I2 C

82

Kapitel 6. Community-Projekte

Mit Hilfe dieser Bibliothek lassen sich bestehende Python-Programme für die Community-Firmware leicht auf die Nutzung
eines ftDuino erweitern. Besoders interessant ist dies auf Gerätem wie dem Raspberry-Pi, da diese von Haus aus keine
Schnittstelle zu fischertechnik-Sensoren und -Aktoren mitbringen.

Abbildung 6.2: startIDE auf TX-Pi mit Zugriff auf ftDuino
Programme wie startIDE4 und Brickly5 können mit Hilfe von ftduino direct auf den ftDuino zugreifen und so auf
dem Raspberry-Pi die fischertechnik-kompatiblen Anschlüsse des ftDuino nutzen.

6.2

ftDuinIO: ftDuino-Kontroll-App für TXT und TX-Pi

Die Installation des ftduino direct-Sketches auf dem ftDuino kann wie gewohnt per Arduino-IDE erfolgen, benötigt aber
einen klassischen PC. Um vom PC komplett unabhängig zu sein wurde die ftDuinIO-App für die Community-Firmware
entwickelt.

Abbildung 6.3: Die ftDuinIO-App
Die App kann auf dem fischertechnik-TXT ebenso betrieben werden wie auf dem zum TX-Pi konfigurierten Raspberry-Pi
und erlaubt es, Sketches auf den ftDuino zu laden sowie die ftduino direct-Funktionen zu testen.
4 startIDE:
5 Brickly:

https://forum.ftcommunity.de/viewtopic.php?f=33&t=4297
https://cfw.ftcommunity.de/ftcommunity-TXT/de/programming/brickly/

6.3. Brickly-Plugin: Grafische ftDuino-Programmierung in Brickly

6.3

83

Brickly-Plugin: Grafische ftDuino-Programmierung in Brickly

Brickly6 ist eine auf Googles Blockly7 basierende grafische Programmierungebung.

Abbildung 6.4: Die Brickly-Programmieroberfläche
Brickly wurde für den fischertechnik-TXT-Controller geschrieben und bringt alles mit, um dessen Ein- und Ausgänge nutzen
zu können. Brickly selbst benötigt einen leistungsfähigen Controller, um darauf zu laufen. Dies kann ein fischertechnik-TXTController oder auch ein Raspberry-Pi sein. Die Bedienung und Programmierung erfolgt dann im Web-Browser mit Hilfe
eines per WLAN verbundenen Smartphones oder PCs.
Der ftDuino selbst ist nicht leistungsfähig genug, um Brickly auszuführen. Auch die nötige WLAN-Verbindung bringt der
ftDuino nicht mit.
Stattdessen kann Brickly einen an den fischertechnik-TXT-Controller oder einen Raspberry-Pi (TX-Pi) angeschlossenen
ftDuino ansteuern. Brickly nutzt dazu die in Abschnitt 6.1 beschriebene ftduino direct-Anbindung.
Das ftDuino-plugin für Brickly8 kann in eine bestehende Brickly-Installation direkt in der Browser-Oberfläche installiert
werden.

Abbildung 6.5: Installation eines Brickly-Plugins
Danach können die ftDuino-Ein- und -Ausgänge direkt in Brickly-Programmen verwendet werden. Einem Raspberry-Pi
erschließt sich so die fischertechnik-Welt, ein TXT-Controller kann so um 20 zusätzliche Ein- und 8 Ausgänge erweitert
werden.

6.4

startIDE: Programmierung direkt auf dem TX-Pi oder TXT

Die üblichen Programmierumgebung RoboPro für den fischertechnik-TXT- und -TX-Controller benötigt einen Windows-PC
zur Programmierung. Selbst das deutlich modernere Brickly (siehe Abschnitt 6.3) ist auf ein exteres Gerät zur Programm6 Brickly-Anleitung

https://github.com/EstherMi/ft-brickly-userguide/blob/master/de/brickly/index.md
https://developers.google.com/blockly/
8 Brickly-ftDuino-Plugin https://github.com/harbaum/brickly-plugins#ftduino-io—ftduinoxml
7 Google-Blockly

84

Kapitel 6. Community-Projekte

Abbildung 6.6: Ein Brickly-Programm zur Ansteuerung des ftDuino
entwicklung angewiesen.
StartIDE9 wurde dagegen so konzipiert, dass schon der kleine Touchbildschirm des fischertechnik-TXT-Controllers oder
eines Rasapberry-Pi ausreicht, um direkt am Gerät Progamme erstellen zu können.

(a) Hauptbildschirm

(b) Funktionsauswahl

(c) IO-Konfiguration

Abbildung 6.7: Die Oberfläche der StartIDE
Die startIDE unterstützt neben den eigenen Anschlüssen des TXT auch die Anschlüsse einer ganzen Reihe per USB extern
anzuschließender Interfaces und damit u.a. auch die des ftDuino. Dazu bedient sich startIDE der bereits in Abschnitt 6.1
vorgestellten ftduino direct-Anbindung. Da die startIDE auch auf dem TX-Pi bzw. dem Raspberry-Pi läuft verleiht sie
diesem die für den Einsatz im fischertechnik-Modellen nötigen Anschlüsse.
Das Gespann TX-Pi (bzw. Raspberry-Pi), ftDuino und startIDE erlaubt damit, fischertechnik-Modelle ganz ohne PC oder
Smartphone zu programmieren.
Die ausführliche Bedienungsanleitung10 der startIDE enthält weitere Details zur Nutzung des ftDuino.

9 startIDE-Homepage:
10 startIDE-Anleitung:

https://github.com/PeterDHabermehl/startIDE/
https://github.com/PeterDHabermehl/startIDE/blob/master/ddoc/Manual 140 de.pdf

Kapitel 7

Bibliotheken
Mit dem Schaltplan aus Anhang A und entsprechendem Know-How über den verbauten ATmega32U4-Controller lassen
sich sämtliche Anschlüsse des ftDuino aus einem Arduino-Sketch ansteuern. Allerdings erfordert dieses Vorgehen einiges an
Erfahrung und führt zu vergleichsweise komplexen Arduino-Sketches, da sämtlicher Code zur Ansteuerung der diversen Einund Ausgänge im Sketch selbst implementiert werden müsste.

Abbildung 7.1: Die ftDuino-Bibliotheken in der Arduino-IDE
Der ftDuino bringt daher sogenannte Bibliotheken mit. Das sind Code-Sammlungen, die bereits fertige Routinen zum
Ansteuern der Ein- und Ausgänge des ftDuinos enthalten. Der eigentliche Arduino-Sketch wird dadurch sehr viel einfacher
und kürzer und vor allem muss der Programmierer die Askpekte der Hardware selbst gar nicht komplett verstanden haben,
da er lediglich einige einfach zu benutzende Routinen zum Zugriff auf die ftDuino-Hardware nutzt. Die Bibliotheken werden
als Teil der ftDuino-Installation in der Arduino-IDE automatisch mit installiert. Aktualisierungen dieser Bibliothekten werden
von der Arduino-IDE automatisch festgestellt und zum Update angeboten.
Trotzdem ist der direkte Zugriff natürlich weiterhin möglich. Der fortgeschtittene Programmierer kann also nach wie vor an
allen Bibliotheken vorbei direkt auf die Hardware zugreifen. Der Code der Bibliotheken ist ebenfalls frei verfügbar1 , sodass
der Anwender selbst ggf. Erweiterungen und Verbesserungen vornehmen kann.
Es gibt zwei Bibliotheken, um den ftDuino anzusteuern. Die FtduinoSimple-Bibliothek, die sehr einfach gehalten ist und
nur ein ganz rudimentäres Funktions-Set bereit stellt und die Ftduino-Bibliothek, die deutlich komplexer ist und vielfältige
Funktionen zur Signalein- und -ausgabe bietet.
1 https://raw.githubusercontent.com/harbaum/ftduino/master/ftduino/libraries

86

7.1

Kapitel 7. Bibliotheken

FtduinoSimple

Die FtduinoSimple-Bibliothek ist eine sehr einfache Bibliothek. Sie erlaubt nur die Abfrage von einfachen Digitalwerten
(an/aus) und das Ein- und Ausschalten von Ausgängen. Es ist mit ihr weder möglich, analoge Spannungen und Wiederstände
einzulesen, noch die Ausgänge mit variablen Werten zu schalten.
Die Vorteile der FtduinoSimple-Bibliothek sind:
Einfachheit Die Bibliothek bietet nur wenige sehr einfach zu nutzende Funktionen. Man kann kaum etwas falsch machen.
Geringer Speicherbedarf Die Bibliothek belegt kaum Flash- oder RAM-Speicher des ftDuino. Fast der gesamte Speicher
steht dem eigentlichen Sketch zur Verfügung.
Keine Seiteneffekte Die Bibliothek verwendet keine weitere interne Hardware des ATmega32u4-Controllers und implemetiert z.B. keine eigenen Interrupt-Handler. Die gesamte interne Hardware (Timer, Zähler, Interrupts, . . . ) steht für
eigenen Sketche zur Verfügung und man muss mit keinen unerwarteten Effekten rechnen, wenn man direkt auf die
ATmega32u4-Hardware zugreift.
Um die FtduinoSimple-Bibliothek zu nutzen muss zu Beginn eines Sketches die entsprechende Include-Zeile eingefügt
werden.
# include < FtduinoSimple .h >

7.1.1

Verwendung im Sketch

Die FtduinoSimple-Bibliothek verbirgt viele Details der Sensor- und Aktoransteuerung vor dem Nutzer und erlaubt es, mit
wenigen und einfachen Code-Zeilen die Ein- und Ausgänge in einem Sketch zu verwendet.
Folgendes Beispiel zeigt das periodische Schalten eines Ausganges mit Hilfe der FtduinoSimple-Bibliothek:
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# include < FtduinoSimple .h >
void setup () {
// keine I ni t ia li si e ru ng noetig
}
void loop () {
// Ausgang O1 einschalten
ftduino . output_set ( Ftduino :: O1 , Ftduino :: HI ) ;
delay (1000) ;
// Ausgang O1 ausschalten
ftduino . output_set ( Ftduino :: O1 , Ftduino :: LO ) ;
delay (1000) ;
}

In den Zeilen 9 und 12 wird der Ausgang O1 des ftDuino ein- bzw. ausgeschaltet. Der erste Parameter der output set()Funktion gibt dabei den zu schaltenden Ausgang an, der zwei bestimmt, ob der Ausgang ein- oder ausgeschaltet werden
soll.
Achtung: Um die Ausgänge benutzen zu können muss der ftDuino natürlich mit 9 Volt versorgt werden.
Die Eingänge des ftDuino lassen sich ebenfalls sehr einfach mit Hilfe der FtduinoSimple-Bibliothek abfragen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# include < FtduinoSimple .h >
void setup () {
// keine I ni t ia li si e ru ng noetig
}
void loop () {
// Eingang I1 einlesen
if ( ftduino . input_get ( Ftduino :: I1 ) ) {
// Ausgang O1 einschalten
ftduino . output_set ( Ftduino :: O1 , Ftduino :: HI ) ;
} else {
// Ausgang O1 ausschalten
ftduino . output_set ( Ftduino :: O1 , Ftduino :: LO ) ;
}

7.1. FtduinoSimple

16

87

}

In Zeile 9 wird der Zustand eines an den Eingang I1 angeschlossenen Schalters ermittelt. Je nachdem ob er grdrückt
(geschlossen) ist oder offen wird in den Zeilen 11 bzw. 14 der Ausgang O1 ein- oder ausgeschaltet.

7.1.2

bool input get(uint8 t ch)

Diese Funktion liest den Zustand des Eingangs ch ein. Erlaubte Werte für ch sind Ftduino::I1 bis Ftduino::I8. Der
Rückgabewert ist true, wenn der Eingang mit Masse verbunden ist und false, wenn nicht. Auf diese Weise lassen sich z.B.
leicht Taster abfragen, die zwischen dem jeweiligen Eigang und den korrespondierenden Masseanschluss daneben geschaltet
sind.
Die Auswertung des Eingangs geschiet nicht im Hintergrund, sondern erfolgt genau in dem Moment, in dem die input get()Funktion aufgerufen wird. Vor allem, wenn dabei ein anderer Port abgefragt wird als im direkt vorhergehenden Aufruf von
input get() kommt es dadurch zu einer Verzögerung von einigen Mikrosekunden, da ftDuino-intern eine Umschaltung auf
den geänderten Eingang durchgeführt werden muss.
Beispiel
// lies den Zustand einer Taste an Eingang I1
if ( ftduino . input_get ( Ftduino :: I1 ) ) {
/* ... tue etwas ... */
}

7.1.3

bool counter get state(uint8 t ch)

Diese Funktion entspricht von ihrer Wirkungsweise input get(). Allerdings wird counter get state() auf die
Zählereingänge angewandt. Der Wertebereich für ch reicht demnach von Ftduino::C1 bis Ftduino::C4.
Der Rückgabewerte ist true, wenn der Eingang mit Masse verbunden ist und false, wenn nicht.
Beispiel
// lies den Zustand einer Taste an Zaehler - Eingang C1
if ( ftduino . c o u n t e r _ g e t _ s t a t e ( Ftduino :: C1 ) ) {
/* ... tue etwas ... */
}

7.1.4

void output set(uint8 t port, uint8 t mode)

Mit der Funktion output set() können die Ausgänge O1 bis O8 gesteuert werden. Der Wertebereich für port reicht daher
von Ftduino::O1 bis Ftduino::O8.
Der Parameter mode beschreibt, in welchen Zustand der Ausgang gebracht werden soll. Mögliche Werte für mode sind
Ftduino::OFF, wenn der Ausgang komplett unbeschaltet sein soll, Ftduino::LO, wenn der Ausgang gegen Masse geschaltet
werden soll und Ftduino::HI, wenn der Ausgang auf 9 Volt geschaltet werden soll.
Beispiel
// Lampe zwischen Ausgang O1 und Masse leuchten lassn
ftduino . output_set ( Ftduino :: O1 , Ftduino :: HI ) ;

Hinweis: Ausgänge können nur verwendet werden, wenn der ftDuino mit einer 9-Volt-Versorgung verbunden ist (siehe
Abschnitt 1.2.5).

88

7.1.5

Kapitel 7. Bibliotheken

void motor set(uint8 t port, uint8 t mode)

Die Funktion motor set() bedient einen Motorausgang M1 bis M4. Motorausgänge werden durch die Kombination von zwei
Ausgängen gebildet (M1 = O1 und O2, M2 = O3 und O4, . . . ). Der Wert für port liegt daher im Bereich von Ftduino::M1
bis Ftduino::M4.
Der Parameter mode gibt an, welchen Zustand der Motorausgang annehmen soll. Mögliche Werte für mode sind
Ftduino::OFF, wenn der Motor ausgeschaltet sein soll, Ftduino::LEFT, wenn der Motor sich nach links drehen soll,
Ftduino::RIGHT, wenn der Motor sich nach rechts drehen soll und Ftduino::BRAKE, wenn der Motor gebremst werden
soll.
Der Unterschied zwischen Ftduino::OFF und Ftduino::BRAKE besteht darin, dass ein noch drehender Motor bei
Ftduino::BRAKE durch Zusammenschalten der beiden Anschlüsse aktiv gebremst wird während der Motor bei
Ftduino::OFF lediglich spannungslos geschaltet wird und langsam ausläuft.
Beispiel
// Motor an Ausgang M1 links herum laufen lassn
ftduino . motor_set ( Ftduino :: M1 , Ftduino :: LEFT ) ;

Hinweis: Ausgänge können nur verwendet werden, wenn der ftDuino mit einer 9-Volt-Versorgung verbunden ist (siehe
Abschnitt 1.2.5).

7.1.6

Beispiel-Sketches

Code-Beispiele zur Nutzung der FtduinoSimple-Bibliothek finden sich im Menü der Arduino-IDE unter Datei .
Beispiele . FtduinoSimple .

7.2

Ftduino

Die Ftduino-Bibliothek kapselt alle Funktionen der ftDuino-Hardware, sodass der Anwender bequemen Zugriff auf alle Einund Ausgänge hat, ohne sich über die konkrete technische Umsetzung Gedanken machen zu müssen.
Die Ftduino-Bibliothek benötigt selbst etwas Flash-Speicher, RAM-Speicher und Hintergrund-Rechenleistung, so dass nicht
alle Resourcen komplett dem Anwendungssketch zur Verfügung stehen. Zusätzlich macht sie Gebrauch von internen Resourcen des ATmega32u4 wie Timern und Interrupts wie jeweils bei den folgenden Funktionsbeschreibungen erwähnt.
Um die Ftduino-Bibliothek zu nutzen muss zu Beginn eines Sketches die entsprechende Include-Zeile eingefügt werden.
# include < Ftduino .h >

Zusätzlich muss vor Verwendung aller anderen Funktionen die init()-Funktion aufgerufen werden. Dies geschieht sinnvoller
Weise früh in der setup()-Funktion.
// die setup - Funktion wird einmal beim Start aufgerufen
void setup () {
// Benutzung der Ftduino - Bibliothek vorbereiten
ftduino . init () ;
}

7.2.1

Die Eingänge I1 bis I8

Die Eingänge I1 bis I8 sind mit Analogeingängen des ATmega32u4-Mikrocontrollers im ftDuino verbunden. Diese Analogeingänge werden von der ftDuino-Bibliothek permanent im Hintergrund ausgewertet, da die Analog-Wandlung eine gewisse
Zeit in Anspruch nimmt und auf diese Weise eine unerwünchte Verzögerung bei der Abfrage von Eingängen vermieden
werden kann.
Die ftDuino-Bibliothek nutzt dazu den sogenannten ADC vect-Interrupt. Die Analog-Digital-Wandler (ADCs) werden auf
eine Messrate von ca 8900 Messungen pro Sekunde eingestellt. Jeder Eingang wird zweimal abgefragt, um eine stabile

7.2. Ftduino

89

zweite Messung zu erhalten, so dass für die 8 Eingänge insgesamt 16 Messungen nötig sind. Daraus ergibt sich eine
Konvertierungsrate von ca. 560 Messungen pro Sekunde pro Eingang, die automatisch im Hintergrund erfolgen. Beim
Auslesen ist der Messwert demnach maximal ca 2 Millisekunden alt und der Wert wird ungefähr alle 2 Millisekunden
aktualisiert.
Der ftDuino kann einen sogenannte Pullup-Wiederstand an jedem der Eingänge aktivieren, so dass einer Spannungsmessung
eine Wiederstandsmessung erfolgen kann. Auch das wird von der ftDuino-Bibliothek im Hintergrund verwaltet und die
Umschaltung erfolgt automatisch vor der Messung. Sie ist auch der Grund, warum pro Kanal zwei Messungen erfolgen. Dies
erlaubt den Signalen, sich nach dem Umschaltvorgang und vor der zweiten Messung zu stabilisieren.

7.2.2

void input set mode(uint8 t ch, uint8 t mode)

Die Funktion input set mode() setzt den Messmodus des Eingangs ch. Gültige Werte für ch reichen von Ftduino::I1
bis Ftduino::I8.
Der Wert mode kann auf Ftduino::RESISTANCE, Ftduino::VOLTAGE oder Ftduino::SWITCH gesetzt werden. Die Funktion input get() liefert in der Folge Widerstandswerte in Ohm, Spannungswerte in Millivolt oder den Schaltzustand eines
Schalters als Wahrheitswert.

7.2.3

uint16 t input get(uint8 t ch)

Diese Funktion liest den aktuellen Messwert des Eingangs ch aus. Gültige Werte für ch reichen von Ftduino::I1 bis
Ftduino::I8.
Der zurückgelieferte Messwert ist ein 16-Bit-Wert. Im Falle einer Spannungsmessung wird ein Wert zwischen 0 und 10.000
zurück geliefert, was einer Spannung von 0 bis 10 Volt entspricht. Im Falle einer Widerstandsmessung wird ein Widerstandswerk von 0 bis 65535 Ohm zurück geliefert, wobei der Wert 65535 auch bei allen Wiederständen größer 65 Kiloohm geliefert
wird. Bedingt durch das Messprinzip werden die Werte oberhalb ca. 10 Kiloohm immer ungenauer. Bei einer Schaltermessung
wird nur true oder false zurück geliefert, je nachdem ob der Eingang mit weniger als 100 Ohm gegen Masse verbunden
ist (Schalter geschlossen) oder nicht.
Normalerweise liefert diese Funktion den letzten im Hintergrund ermittelten Messwert sofort zurück. Nur wenn direkt zuvor
der Messmodus des Eingangs verändert wurde, dann kann es bis zu 2 Millisekunden dauern, bis die Funktion einen gültigen
Messwert zurück liefert. Die Funktion blockiert in dem Fall die Programmausführung so lange.
Beispiel
// Widerstand an I1 auswerten
ftduino . input _set_mo de ( Ftduino :: I1 , Ftduino :: RESISTANCE ) ;
uint16_t widerstand = ftduino . input_get ( Ftduino :: I1 ) ;

7.2.4

Die Ausgänge O1 bis O8 und M1 bis M4

Die Ausgänge O1 bis O8 sind acht unabhängige verstärkte Ausgänge zum direkten Anschluss üblicher 9-Volt-Aktoren von
fischertechnik wie z.B. Lampen, Ventile und Motoren.
Je vier Ausgänge werden von einem Treiberbaustein vom Typ MC33879A2 angesteuert. Dieser Baustein enhält acht unabhängig steuerbare Leistungstransistoren. Je zwei Transistoren können einen Ausgang auf Masse schalten, auf 9 Volt
schalten oder ganz unbeschaltet lassen. Daraus ergeben sich die drei möglichen Zustände jedes Ausgangs LO (auf Masse
geschaltet), HI (auf 9 Volt geschaltet) oder OFF (unbeschaltet).
Je zwei Ausgänge Ox können zu einem Motorausgang Mx kombiniert werden. Ausgänge O1 und O2 ergeben den Motorausgang
M1, O3 und O4 den Motorausgang M2 und so weiter. Der kombinierte Motorausgang kann die vier mögliche Zustände OFF,
LEFT, RIGHT und BRAKE annehmen. In den Zuständen LEFT und RIGHT dreht ein angeschlossener Motor je nach Politär
des Anschlusses links oder rechts-herum. Im Zustand OFF sind beide Ausgänge unbeschaltet und der Motor verhält sich, als
2 Datenblatt

unter http://cache.freescale.com/files/analog/doc/data sheet/MC33879.pdf.

90

Kapitel 7. Bibliotheken

wäre er nicht angeschlossen und lässt sich z.B. relativ leicht drehen. Im Zustand BRAKE sind beiden Ausgänge auf Masse
geschaltet und ein angeschlossener Motor wird gebremst und lässt sich z.B. schwer drehen.
Die Motortreiber sind über die sogenannte SPI-Schnittstelle des ATmega32u4 angeschlossen. Beide Motortreiber sind in
Reihe geschaltet und werden bei jedem SPI-Datenstransfer beide mit Daten versorgt. Signaländerungen an den Ausgängen
und speziell die PWM-Signalerzeugung (siehe Abschnitt 4.3) zur Erzeugung von Analogsignalen an den Ausgängen erfordern eine kontinuierliche Kommunikation auf dem SPI-Bus im Hintergrund. Dazu implemetiert die Ftduino-Bibliothek
einen sogenannte SPI-Interrupt-Handler, der permament im Hintergrund läuft und permanent den Status der Motortreiber
aktualisiert.
Hinweis: Die Ausgänge lassen sich nur nutzen, wenn der ftDuino mit einer 9-Volt-Spannungsquelle verbunden ist.

7.2.5

void output set(uint8 t port, uint8 t mode, uint8 t pwm)

Diese Funktion schaltet einen Einzelausgang. Gültige Werte für port liegen im Bereich von Ftduino::O1 bis Ftduino::O8.
Der Parameter mode gibt an, in welchen Ausgangsmodus der Ausgang geschaltet werden soll. Erlaubte Werte für mode sind
Ftduino::OFF (Ausgang ist ausgeschaltet), Ftduino::LO (Ausgang ist auf Masse geschaltet) und Ftduino::HI (Ausgang
ist auf 9 Volt geschaltet).
Der pwm-Parameter gibt einen Wert für die Pulsweitenmodulation zur Erzeugung von Analogsignalen vor. Der Wert kann
von 0 (Ftduino::OFF) bis 64 (Ftduino::MAX oder Ftduino::ON) reichen, wobei 0 für aus und 64 für an steht. Eine
am Ausgang angeschlossene Lampe leuchtet bei 0 nicht und bei 64 maximal hell. Zwischenwerte erzeugen entsprechende
Zwischenwerte und eine Lampe leuchtet bei einem pwm-Wert von 32 nur mit geringer Helligkeit. Es sollten wenn Möglich die
Konstanten Ftduino::OFF, Ftduino::ON und Ftduino::MAX herangezogen werden, da diese bei einer Veränderung des
PWM-Wertebereichs z.B. in späteren Versionen der Ftduino-Bibliothek leicht angepasst werden können. Zwischenwerte
können dazu von den Konstanten abgeleitet werden (z.B. Ftduino::MAX/2).
Beispiel
// Ausgang O2 auf 50% einschalten
ftduino . output_set ( Ftduino :: O2 , Ftduino :: HI , Ftduino :: MAX /2) ;

7.2.6

void motor set(uint8 t port, uint8 t mode, uint8 t pwm)

Die Funktion motor set() schaltet einen kombinierten Motorausgang. Gültige Werte für port liegen im Bereich von
Ftduino::M1 bis Ftduino::M4.
Der Parameter mode gibt an, in welchen Ausgangsmodus der Motorausgang geschaltet werden soll. Erlaubte Werte für mode
sind Ftduino::OFF (Ausgang ist ausgeschaltet), Ftduino::LEFT (Motor dreht links), Ftduino::RIGHT (Motor dreht
rechts) und Ftduino::BRAKE (Motor wird aktiv gebremst, indem beide Einzelausgänge auf Masse geschaltet werden).
Der pwm-Parameter gibt einen Wert für die Pulsweitenmodulation zur Erzeugung von Analogsignalen vor. Der Wert kann
von 0 (Ftduino::OFF) bis 64 (Ftduino::MAX oder Ftduino::ON) reichen, wobei 0 für aus und 64 für an steht. Ein am
Ausgang angeschlossener Motor dreht in den Modi Ftduino::LEFT und Ftduino::RIGHT bei 0 nicht und bei 64 mit
maximaler Drehzahl. Zwischenwerte erzeugen entsprechende Zwischenwerte und ein Motor dreht bei einem pwm-Wert von
32 nur mit geringerer Drehzahl (für Details zum Zusammenhang zwischen Motordrehzahl und PWM-Werte siehe Abschnitt
4.3). Es sollten wenn Möglich die Konstanten Ftduino::OFF, Ftduino::ON und Ftduino::MAX herangezogen werden, da
diese bei einer Veränderung des PWM-Wertebereichs z.B. in späteren Versionen der Ftduino-Bibliothek leicht angepasst
werden können. Zwischenwerte können dazu von den Konstanten abgeleitet werden (z.B. Ftduino::MAX/2). Im Modus
Ftduino::BRAKE bestimmt der pwm-Wert, wie stark der Motor gebremst wird. Im Modus Ftduino::OFF hat der pwm-Wert
keine Bedeutung.
Beispiel
// Motor an M3 mit 1/3 G e sc hw in d ig ke it links drehen
ftduino . motor_set ( Ftduino :: M3 , Ftduino :: LEFT , Ftduino :: MAX /3) ;

7.2. Ftduino

7.2.7

91

void motor counter(uint8 t port, uint8 t mode, uint8 t pwm, uint16 t counter)

Diese Funktion dient zur Ansteuerung von Encoder-Motoren und gleicht in ihren ersten drei Parametern der motor set()Funktion. Die Bedeutung dieser Parameter ist identisch.
Der zusätzliche vierte Parameter gibt an, wieviele Impulse der Encoder-Motor laufen soll. Die Schritte werden auf dem
korrespondierenden Zählereingang gemessen, also auf Zählereingang C1 für Motorausgang M1, C2 für M2 und so weiter.
Nach Ablauf der angegebenen Impulse wird der Motor gestoppt (siehe void motor counter set brake()).
Das Zählen der Impulse und das Stoppen des Motors passieren im Hintergrund und unabhängig von der weiteren Sketchausführung. Die Zahl der pro Motorumdrehung erkannten Impulse hängt vom Motortyp ab. Die Motoren aus dem TXT
Discovery Set liefern 631/3 Impulse pro Drehung der Motorachse, die Motoren aus den ursprünglich für den TX-Controller
verkauften Sets liefern 75 Impulse pro Umdrehung.

7.2.8

bool motor counter active(uint8 t port)

Die Funktion motor counter active() liefert zurück, ob die Impulszählung für den durch port spezifizierten Motorausgang
aktiv ist. Gültige Werte von port liegen im Bereich von Ftduino::M1 bis Ftduino::M4.
Aktiv bedeutet, dass der entsprechende Motor durch den Aufruf von motor counter() gestartet wurde und der Impulszähler
bisher nicht abgelaufen ist. Mit dieser Funktion kann u.a. auf das Ablaufen der Impulszählung und das Stoppen des Motors
gewartet werden:
Beispiel
// TXT - Encodermotor an M4 f ü r drei volle Umdrehungen starten
ftduino . motor_counter ( Ftduino :: M4 , Ftduino :: LEFT , Ftduino :: MAX , 190) ;
// warten bis der Motor stoppt
while ( ftduino . m o t o r _ c o u n t e r _ a c t i v e ( Ftduino :: M4 ) ) ;
// Motor hat gestoppt

7.2.9

void motor counter set brake(uint8 t port, bool on)

Diese Funktion bestimmt das Bremsverhaltren des Motors an Ausgang port, wenn er durch die Funktion motor counter()
gestartet wird.
Wird der Parameter on auf wahr (true) gesetzt, so wird der Motor nach Ablauf der Zeit aktiv gebremst. Ist er unwahr
(false), so wird der Motor lediglich abgeschaltet und er läuft ungebremst aus. Die Standardeinstellung nach der Initialisierung der Bibliothek ist wahr, die aktive Bremsung ist also aktiviert.
In beiden Fällen läuft der Motor nach. Im gebremsten Fall läuft ein Encoder-Motor aus dem TXT-Discovery-Set unbelastet
ca. 5 Impulse nach (ca. 1/10 Umdrehung bzw. 28,5°). Im ungebremsten Fall läuft der gleiche Motor ca. 90 Impulse (ca. 11/2
Umdrehungen) nach.
Da die Zähler nach dem Stoppen des Encoders weiterlaufen ist der Nachlauf auch per Programm messbar:
Beispiel
// Bremse f ü r Ausgang M4 abschalten
ftduino . m o t o r _ c o u n t e r _ s e t _ b r a k e ( Ftduino :: M4 , false ) ;
// TXT - Encodermotor an M4 f ü r drei volle Umdrehungen starten
ftduino . motor_counter ( Ftduino :: M4 , Ftduino :: LEFT , Ftduino :: MAX , 190) ;
// warten bis der Motor stoppt
while ( ftduino . m o t o r _ c o u n t e r _ a c t i v e ( Ftduino :: M4 ) ) ;
// etwas l ä nger warten , um dem Motor Zeit zum Nachlaufen zu geben
delay (500) ;
// Z ä hlerstand ausgeben
Serial . println ( ftduino . counter_get ( Ftduino :: C4 ) ) ;

92

Kapitel 7. Bibliotheken

7.2.10

Die Zählereingänge C1 bis C4

Die Zählereingänge arbeiten im Gegensatz zu den Analogeingängen rein digital. Sie untescheiden nur, ob der jeweilige Eingang
auf Masse geschaltet ist oder nicht. Dies geschieht üblicherweise durch einen Tester, der zwischen dem Zählereingang und
seinem korrespondierenden Masseanschluss angeschlossen ist oder einem Encodermotor, dessen Endoderausgang mit dem
Zählereingang verbunden ist. Die Zählereingänge haben interne Pull-Up-Widerstände. Das bedeutet, dass sie vom ftDuino
als “high” bzw mit hohem Signalpegel erkannt werden, wenn kein Signal anliegt weil z.B. ein angeschlossender Taster nicht
gedrückt ist. Ist der Taster geschlossen, dann schaltet er den Eingang auf Masse, was von ftDuino als “low” erkannt wird.
Die vier Zählereingänge sind direkt mit einem Interrupt-fähigen Eingang am ATmega32u4 verbunden. Technisch ist damit
eine Reaktion im Bereich von mehreren hundertausend Zählimpulsen pro Sekunde möglich. Werden aber z.B. Tastendrücke
gezählt, so wird das unvermeidliche Prellen (siehe Abschnitt 4.12) zu verfälschten Ergebnissen führen. Aus diesem Grund führt
die Ftduino-Bibliothek im Hintergrund eine Filterungg durch und begrenzt die minimale Ereignislänge auf eine Millisekunde.
Kürzere Ereignisse werden nicht gezählt.
Nach Systemstart sind alle vier Zähler genullt und deaktiviert. Eregnisse an den Eingängen verändern die Zähler also nicht.
Zusätzlich erlaubt der Zählereingang C1 den Anschluss des fischertechnik ROBO TX Ultraschall-Distanzsensors 133009 wie
in Abschnitt 1.2.6 dargestellt.

7.2.11

void counter set mode(uint8 t ch, uint8 t mode)

Diese Funktion setzt den Betriebsmodus eines Zählereingangs. Gültige Werte für ch reichen von Ftduino::C1 bis
Ftduino::C4.
Wird der mode-Wert auf auf Ftduino::C EDGE NONE gesetzt, dann werden keine Signalwechsel gezählt und der Zähler ist
deaktiviert. Dies ist der Startzustand.
Wird mode auf Ftduino::C EDGE RISING gesetzt, so werden steigende Signalflanken, also Wechsel des Eingangssignals von
Masse auf eine höhere Spannung, gezählt. Dies passiert z.B. wenn ein angeschlossener Taster losgelassen (geöffnet) wird.
Ein mode-Wert von Ftduino::C EDGE FALLING führt dazu, dass fallende Signalflanken, also Wechsel des Eingangssignals
von einer höheren Spannung auf Masse, gezählt werden, was z.B. dann geschieht, wenn ein angeschlossener Taster gedrückt
(geschlossen) wird.
Wird der mode-Wert schließlich auf Ftduino::C EDGE ANY gesetzt, so führen beide Signaländerungsrichtungen dazu, dass
der Zähler erhöht wird. Sowohl das Drücken, als auch das Loslassen einen Testers wird dann z.B. gezählt.

7.2.12

uint16 t counter get(uint8 t ch)

Diese Funktion liefert den aktuellen Zählerstand zurück. Gültige Werte für ch liegen im Bereich von Ftduino::C1 und
Ftduino::C4.
Der maximale Wert, der zurück geliefert wird ist 65535. Wird dieser Wert überschritten, dann springt der Zähler wieder auf
0 zurück.

7.2.13

void counter clear(uint8 t ch)

Mit Hilfe der Funktion counter clear() kann der Zählerstand auf Null gesetzt werden. Gültige Werte für ch liegen im
Bereich von Ftduino::C1 und Ftduino::C4.
Beispiel
// Eine Sekunde lang steigende ( low - nach - high ) Impulse an Eingang C1 z ä hlen
ftduino . c o u n t e r _s e t _ m o d e ( Ftduino :: C1 , Ftduino :: C_EDGE_RISING ) ;
ftduino . counter_clear ( Ftduino :: C1 ) ;
delay (1000) ;
uint16_t impulse = ftduino . counter_get ( Ftduino :: C1 ) ;

7.2. Ftduino

7.2.14

93

bool counter get state(uint8 t ch)

Der Zustand der Zählereingänge kann auch direkt mit der Funktion counter get state() abgefragt werden. Die Werte
für ch müssen im Bereich von Ftduino::C1 bis Ftduino::C4 liegen.
Diese Funktion liefert wahr (true) zurück, wenn der Eingang mit Masse verbunden ist und unwahr (false) wenn er offen
ist.
Es findet bei dieser Funktion keine Filterung statt, so dass z.B. Tastenprellen nicht unterdrückt wird. Es können auf diese
Weise digitale Signale mit einer sehr hohen Frequenz erfasst werden.

7.2.15

void ultrasonic enable(bool ena)

An Zählereingang C1 kann alternativ der fischertechnik ROBO TX Ultraschall-Distanzsensors 133009 wie in Abschnitt 1.2.6
dargestellt betrieben werden. Die Funktion ultrasonic enable() aktiviert die Unterstützung für den Sensor, wenn der
Parameter ena auf wahr (true) gesetzt wird und deaktiviert sie, wenn er auf unwahr (false) gesetzt wird.
Wird die Unterstützung für den Ultraschallsensor aktiviert, so wird die Zählfunktion des Eingangs C1 automatisch deaktiviert.
Ist der Ultraschallsensor aktiviert, so wird er kontinuierlich ca. zweimal je Sekunde im Hintergrund ausgewertet. Der jeweils
aktuelle Messwert ist daher maximal 500 Millisekunden alt.

7.2.16

int16 t ultrasonic get()

Die Funktion ultrasonic get() liefert den Messwert eines an Zählereingang C1 angeschlossenen Disanzsensors in Zentimetern zurück. Wurde seit aktivierung kein gültiger Messwert vom Sensor empfangen, so wird als Distanz -1 zurück geliefert.
Dies geschieht auch, wenn kein Sensor angeschlossen ist.
Der Sensor selbst arbeitet im Bereich von 0 bis 1023 Zentimeter.
Beispiel
// Distanzensor an Eingang C1 abfragen
ftduino . u l t r a s o n i c _ e n a b l e ( true ) ;
delay (1000) ;
// eine Sekunde Zeit f ü r erste Messung geben
int16_t distanz = ftduino . ultraso nic_get () ;

Kapitel 8

Selbstbau
Es ist möglich, einen ftDuino manuell zu bauen. Die ersten Prototypen sind so entstanden. Bei manuellem Aufbau bietet es
sich an, funktionsgruppenweise vorzugehen und jeweils die Funktionsfähigkeit schrittweise sicher zu stellen.
Basis für den Selbstbau ist die industriell gefertigte Platine aus den Anhängen B und C basierend auf dem Schaltplan
entsprechend Anhang A.

8.1

Erste Baustufe Spannungsversorgung“
”

D7

C3

C2

C9
R33

R14
C4

IC1

C22 R37

C25

C5

C12

L1
C11

D16 C23
U4

C20

C24

C21

ftDuino
(c) 2017 by Till Harbaum
V1.1
6
1
2

R30

R31

T1

R42

R38
R40

R41

R44

D11

C1

R34

D9
R27

C16

R32

C13

R26
D10

R23 R22
R25

R24

R21

C18

R36

D12

C10
R29

R20
R18
R19

C15

R39

D8
R15

R16
R17

D15
C17
U3

U1

D13

R11 R10

Q1

R8

R13

R12

D6

C6
D5

C19

R7
R3
R4

D4

D3

D14

10

C8

JMP1

D2

U2

2
1

C14

R6

R5

SV2

D1

R9

R1
R2

R28

PB1

R35 LED2

C7

J1

LED1
121

Im ersten Schritt wird die Spannungsversorgung aufgebaut. Sie besteht aus den Kondensatoren C6 bis C11 sowie C14, den
Dioden D1 und D3 bis D5 sowie dem Spannungsregler U2 und der Sicherung F1. Die Spannungsversorungs-Leuchtdiode (siehe
Abschnitt 1.2.4) LED2 mit zugehörigem Vorwiderstand R35 werden ebenfalls montiert. Die Spule L1 sowie der Kondensator
C1 können auch bereits installiert werden.

R43
R45

SV1

Abbildung 8.1: Komponenten der Spannungsversorung
Die 9V-Steckbuchse 121 sowie die beiden Bundhülsen 9VIN+ und 9VIN- und die USB-Buchse J1 werden ebenfalls jetzt
schon bestückt.

8.1. Erste Baustufe Spannungsversorgung“
”

8.1.1

95

Bauteile-Polarität

Bei folgenden Bauteilen ist auf die Polarität zu achten: D1 und D3 bis D5, C6 bis C8 und C14 sowie LED2.
Der positive Anschluss der Kondensatoren ist durch einen aufgedruckten Balken oder Streifen gekennzeichnet. Im
Bestückungsplan ist dieser Anschluss ebenfalls durch einen Balken und zusätzlich durch abgeschrägte Ecken markiert.

(a) Tantal-Kondensator

(b) Diode

Anode

-

Kathode

+

Anode

+

Kathode

Die verschiedenen Dioden des ftDuino nutzen unterschiedliche Symbole beim Bestückungsdruck. Aber auch hier ist sowohl
auf der Diode selbst als auch auf dem Bestückungssymbol ein Balken auf der Seite der Kathode vorhanden.

(c) Leuchtdiode

Abbildung 8.2: Schaltplansymbol, Bauteilepolarität und Bestückungssymbol
Bei den Leuchtdioden (LEDs) ist es etwas schwieriger, die korrekte Polarität zu bestimmen. Auf der Unterseite der LED ist
üblicherweise ein Dreieck oder ein T“ aufgedruckt, das jeweils in Richtung Kathode weist.
”
Die Polarität von Leuchtdioden kann man mit einem einfachen Multimeter im Dioden-Test-Modus überprüfen. Bringt man
die Anode der LED mit dem roten Multimeterkabel und die Kathode mit dem schwarzen Kabel in Kontakt, so leuchtet die
LED schwach.
Sind alle Komponenten der Spannungsversorgung bestückt, dann sollte die grüne LED leuchten, sobald der USB-Stecker
eingesteckt wird oder sobald 9 Volt über die Bundhülsen oder den 9-V-Rundstecker eingespeist werden.
Leuchtet die LED in mindestens einem der Fälle nicht, so kann man mit Hilfe eines Multimeters leicht verfolgen, wo die
Spannung noch vorhanden ist und wo nicht mehr. Wahrscheinlichste Fehler liegen in der Polarität der Dioden oder der LED.

8.1.2

Kontroll-Messungen

Bei einer 9-Volt-Versorgung muss an den zwischen Pin 1 und 2 des I2 C-Anschlusses am noch unbestückten Wannenstecker
SV1 eine Spannung von 5 Volt (±0,4 Volt) messbar sein. Auf keinen Fall darf mit der Bestückung des Mikrocontrollers
fortgefahren werden, wenn hier eine deutlich zu hohe Spannung gemessen wird.
Ebenfalls bei einer Versorgung aus einer 9-Volt-Quelle sollten an den bisher unbestückten beiden unteren 9-Volt-Ausgängen
nahezu 9 Volt zu messen sein. Etwas Spannungsverlust gegenüber der Quelle tritt durch die Dioden D3 bzw. D4 und der
Diode D5 auf.
Zwischen den Pads 14 und 7 am bisher unbestückten IC1 muss bei reiner USB-Versorgung eine Spannung von etwas
unter 5 Volt zu messen sein. Ist das nicht der Fall, dann besitzt der Spannungsregler U2 keine sogenannte Body-Diode
(der empfohlene MCP 1755S hat diese) und die Funktion dieser Diode muss durch D6 extern nachgerüstet werden. Bei
Verwendung des empfohlenden MCP 1755S kann D6 ersatzlos entfallen.
Die Diode D5 verhindert, dass der Strom über die Body-Diode zu den Ausgangstreiber des ftDuino gelangt. Andernfalls
würden die Ausgänge des ftDuino auch aus einer USB-5-Volt-Versorgung gespeist, was ggf. eine Überlastung des USB
und/oder der Body-Diode zur Folge hätte.

96

Kapitel 8. Selbstbau

8.2

Zweite Baustufe Mikrocontroller“
”

D7

C3

C2

C4

IC1

D8

D16 C23
U4

C20

C24

C21

C25
C12

L1
C11

ftDuino
(c) 2017 by Till Harbaum
V1.1
6
1
2

R30

R31

T1

R38
R40

R42

R41

R44

R26

C22 R37

R36

C5
C13

R39

D12
D11

R32

C1

R34

D9
R27

C16

C10
R29

R21

D10

R23 R22
R25

R24

C18

U1

R14

R20
R18
R19

C15

C9

R15

R16
R17

D15
C17
U3

R33
D13

R11 R10

Q1

R8

R13

R12

D6

C6
D5

C19

R7
R3
R4

D4

D3

D14

10

C8

JMP1

D2

U2

2
1

C14

R6

R5

SV2

D1

R9

R1
R2

R28

PB1

R35 LED2

C7

J1

LED1
121

Ist die Spannungsversorgung sichergestellt und vor allem liegen auch im 9-Volt-Betrieb am I2 C-Anschluss stabile 5 Volt an,
dann kann mit dem Mikrocontroller U1 fortgefahren werden.

R43
R45

SV1

Abbildung 8.3: Komponenten des Mikrocontrollers
Auch der Mikrocontroller darf nicht verpolt werden, was in diesem Fall heisst, dass er korrekt orientiert aufgelötet werden
muss. Sowohl auf der Platine als auch auf dem Chip-Gehäuse findet sich in einer Ecke eine runde Markierung bzw. Vertiefung.
Diese Markierung verweist auf den Pin 1 des Mikrocontrollers und bestimmt die korrekte Orientierung. Ist U1 verlötet werden
direkt daneben C5 und R29 montiert.
Die übrigen in dieser Baustufe zu montierenden Komponenten beinhalten die Reset-Logik bestehend aus Taster PB1, sowie
Diode D2 und Wiederstand R9. Kondensator C4 und die Widerstände R5 und R6 vervollständigen die USB-Schaltung. Den
16-MHz-Systemtakt erzeugen der Quartz Q1 mit den Kondensatoren C2 und C3.
Der I2 C-Anschluss SV1 mit seinen Pullup-Widerständen R30 und R31 kann evenfalls jetzt bestückt werden.
Die Leuchtdiode LED1 mit ihrem Vorwiderstand R28 wird direkt vom Mikrocontroller angesteuert und wird ebenfalls jetzt
montiert. Bei der Leuchtdiode muss wieder auf korrekte Polarität geachtet werden.
Der sogenannte ISP-Steckverbinder SV2 wird lediglich zum einmaligen Aufspielen des Bootloaders (siehe Abschnitt 1.2.1
benötigt und muss nicht unbedingt fest montiert werden, wenn das Standardgehäuse genutzt werden soll, da es im Gehäuse
keinen Auschnitt für diesen Steckverbinder gibt. Die frei verfügbare Druckvorlage1 hat einen entsprechenden Ausschnitt und
kann auch bei fest montiertem SV2 genutzt werden.

8.2.1

Funktionstest des Mikrocontrollers

Der Mikrocontroller wird von Atmel (bzw. Microchip) mit einem USB-Bootloader2 ausgeliefert. Beim Anschluss an einen
PC sollte der Mikrocontroller daher vom PC als Gerät namens ATm32U4DFU erkannt werden. Ist das der Fall, dann sind die
wesentlichen Komponenten funktionsfähig. Dass Windows keinen Treiber für dieses Gerät hat kann ignoriert werden.
Der DFU-Bootloader ist nicht kompatibel zur Arduino-IDE und die Arduino-IDE bringt ihren eigenen Bootloader mit. Dieser
wird einmalig mit einem Programmiergerät über den Steckverbinder SV2 eingespielt ( gebrannt“).
”
Zum Brennen des Arduino-Bootloaders unerstützt die Arduino-IDE eine ganze Reihe von Programmiergeräten. Es reicht eine
einfache Variante, wie der USBasp3 . Der USBasp wird per USB mit dem PC und über das 10-polige Flachbandkabel mit
1 Gehäusedruckvorlage

https://github.com/harbaum/ftduino/tree/master/case
http://www.atmel.com/Images/doc7618.pdf
3 USBasp - USB programmer for Atmel AVR controllers, http://www.fischl.de/usbasp/
2 DFU-Bootloader,

8.3. Dritte Baustufe Eingänge“
”

97

Abbildung 8.4: Brennen des Bootloaders über die Arduino-IDE
SV2 des ftDuino verbunden. Ist SV2 nicht bestückt, so kann man einen entsprechenden Stecker lose in die Platine stecken
und leicht so verkannten, dass alle Kontakte hergestellt werden. Der eigentliche Flashvorgang dauert nur wenige Sekunden
und man kann den Stecker problemlos so lange leicht verkanntet festhalten.
Nach dem Brennen sollte der ftDuino unter diesem Namen vom Betriebssystems des PC erkannt werden. Er sollte sich von der
Arduino-IDE ansprechen und mit einem Sketch programmieren lassen. Es bietet sich für einen ersten Test der Blink-Sketch
unter Datei . Beispiele . FtduinoSimple . Blink an, da die dafür nötige LED1 ebenfalls gerade montiert wurde.

8.3

Dritte Baustufe Eingänge“
”

D7

C3

C2

C9
R33

R14
C4

IC1

C22 R37

C25

C5

C12

L1
C11

D16 C23
U4

C20

C24

C21

ftDuino
(c) 2017 by Till Harbaum
V1.1
6
1
2

R30

R31

T1

R42

R38
R40

R41

R44

D11

C1

R34

D9
R27

C16

R32

C13

R26
D10

R23 R22
R25

R24

R21

C18

R36

D12

C10
R29

R20
R18
R19

C15

R39

D8
R15

R16
R17

D15
C17
U3

U1

D13

R11 R10

Q1

R8

R13

R12

D6

C6
D5

C19

R7
R3
R4

D4

D3

D14

10

C8

JMP1

D2

U2

2
1

C14

R6

R5

SV2

D1

R9

R1
R2

R28

PB1

R35 LED2

C7

J1

LED1
121

Die dritte Baustufe ist sehr einfach zu löten und besteht primär aus Widerständen, die zum Schutz der Eingänge verwendet
werden.

R43
R45

SV1

Abbildung 8.5: Komponenten der Eingänge
Die Komponenten der Analogeingänge I1 bis I8 sowie der Zählereingänge C1 bis C4 werden gleichtzeitig montiert.
Die Bestückung beginnt mit den Widerständen ganz links und IC1 nach deren Montage die Eingänge I1 bis I8 vollständig
sind.

98

Kapitel 8. Selbstbau

Im zweiten Schritt werden dann die Widerstände R36 bis R46 sowie der Transistor T1 bestückt, was die Zählereingänge
vervollständigt. Die Triggerschaltung für den Ultraschall-Entferungsmesser (siehe Abschnitt 1.2.6) ist damit auch vollständig.
Mit einem passenden Testprogramm sollte nun jeder Eingang einzeln getestet werden, um auch Kurzschlüsse zwischden
den Eingängen zu erkennen. Sollte ein Eingang nicht ie gewünscht funktionieren, so kommt als Fehlerquelle auch der
Mikrocontroller aus Baustufe 2 in Betracht.

8.4

Vierte Baustufe Ausgänge“
”

D7

C3

C2

C9
R33

R14
C4

IC1

C22 R37

C25

C5

C12

L1
C11

D16 C23
U4

C20

C24

C21

ftDuino
(c) 2017 by Till Harbaum
V1.1
6
1
2

R30

R31

T1

R42

R38
R40

R41

R44

D11

C1

R34

D9
R27

C16

R32

C13

R26
D10

R23 R22
R25

R24

R21

C18

R36

D12

C10
R29

R20
R18
R19

C15

R39

D8
R15

R16
R17

D15
C17
U3

U1

D13

R11 R10

Q1

R8

R13

R12

D6

C6
D5

C19

R7
R3
R4

D4

D3

D14

10

C8

JMP1

D2

U2

2
1

C14

R6

R5

SV2

D1

R9

R1
R2

R28

PB1

R35 LED2

C7

J1

LED1
121

In der vierten und letzten Baustufe werden die Komponenten montiert, die zum Betrieb der Ausgänge benötigt werden.

R43
R45

SV1

Abbildung 8.6: Komponenten der Ausgänge
Die Leistungstreiber U3 und U4 sollten zuerst bestückt werden, da sie nicht ganz einfach zu löten sind. Vor allem sollten die
Bundhülsen nicht bestückt sein, da sie den Zugang zu den Anschlusspads der Treiber sehr erschweren.
Ergänzt werden die Treiber durch nur wenige Widerstände und Kondesatoren.
Auch die Ausgänge sollte einzel getestet werden, um sicherzustellen, dass keine Kürzschlüsse zwischen den Ausgängen
existieren.

Anhang A: Schaltplan

Abbildung A.1: Schaltplan ftDuino Version 1.1

D7

C3

C2

C9

R14
C4

IC1

C22 R37

D16 C23
U4

C20

C24

C21

C5

C12

L1

1
2

R30

R31

R42
R44

ftDuino
(c) 2017 by Till Harbaum
V1.1
6

T1

C25

C11

D11

C1

R34

D9
R27

C16

R32

C13

R26
D10

R23 R22
R25

R24

R21

C18

R36

D12

C10
R29

R20
R18
R19

C15

R43
R45

SV1

Abbildung B.1: Platinenlayout ftDuino Version 1.1

R38
R40
R39

D8
R15

R16
R17

D15
C17
U3

U1

R33
D13

R11 R10

Q1

R8

R13

R12

D6

C6
D5

C19

R7
R3
R4

D4

D3

D14

10

C8

JMP1

D2

U2

2
1

C14

R6

R5

SV2

D1

R9

R1
R2

R28

PB1

R35 LED2

C7

J1

LED1
121

Anhang B: Platinenlayout

R41

D7

C3

C2

C9

R14
C4

IC1

C22 R37

D16 C23
U4

C20

C24

C21

C5

C12

L1

1
2

R30

R31

R42
R44

ftDuino
(c) 2017 by Till Harbaum
V1.1
6

T1

C25

C11

D11

C1

R34

D9
R27

C16

R32

C13

R26
D10

R23 R22
R25

R24

R21

C18

R36

D12

C10
R29

R20
R18
R19

C15

R43
R45

SV1

Abbildung C.1: Bestückungsplan ftDuino Version 1.1

R38
R40
R39

D8
R15

R16
R17

D15
C17
U3

U1

R33
D13

R11 R10

Q1

R8

R13

R12

D6

C6
D5

C19

R7
R3
R4

D4

D3

D14

10

C8

JMP1

D2

U2

2
1

C14

R6

R5

SV2

D1

R9

R1
R2

R28

PB1

R35 LED2

C7

J1

LED1
121

Anhang C: Bestückungsplan

R41

Anhang D: Maße
82mm
4 2 ,7 5

19 ,3 7 5
4

12

4
10

9

7
7,5

7

82mm

3,5

8

33
16
45
7,5

10

3, 5

2

Abbildung D.1: Maße A ftDuino Version 1.1

1
4

1,25
3

1 2
2
1,5

3,5
+0,4
3,5+2

5
3,5
3
1,75

Abbildung D.2: Maße B ftDuino Version 1.1

4,5

221

Anhang E: Gehäuse

Abbildung E.1: Untere Gehäuseschale

Abbildung E.2: Obere Gehäuseschale



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : No
Page Count                      : 103
Page Mode                       : UseOutlines
Author                          : 
Title                           : 
Subject                         : 
Creator                         : LaTeX with hyperref package
Producer                        : pdfTeX-1.40.18
Create Date                     : 2018:06:08 20:12:32+02:00
Modify Date                     : 2018:06:08 20:12:32+02:00
Trapped                         : False
PTEX Fullbanner                 : This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3
EXIF Metadata provided by EXIF.tools

Navigation menu