Das folgende Tutorial demonstriert wie Bricks und Bricklets mit der Programmierschnittstelle verwendet werden können.
Im ersten Teil wird ein DC Brick verwendet, um einen Motor zu steuern. Danach wird der Aufbau erweitert, um die Geschwindigkeit des Motors über ein Dreh-Potentiometer regeln zu können, indem ein Rotary Poti Bricklet angeschlossen wird. Schlussendlich wird gezeigt, wie durch das Stapeln von Bricks die Verkabelung minimiert wird und wie die Kommunikation über drahtlose oder kabelgebundene Schnittstellen abläuft.
Der DC Brick dient hier als Beispiel. Die beschriebenen Konzept gelten aber für alle Bricks. Hier ist eine Übersicht über alle verfügbaren Bricks.
Um den DC Brick testen zu können, müssen Brick Daemon und Brick Viewer installiert sein (für Installationsanleitungen hier bzw. hier klicken). Der Brick Viewer muss mit dem Brick Daemon durch Klicken des "Connect"-Knopf des Brick Viewers verbunden sein.
Der Brick Daemon bildet eine Brücke zwischen Bricks/Bricklets und den programmiersprachenspezifischen API Bindings. Der Brick Viewer bietet eine graphische Oberfläche zu Testzwecken.
Nach der Installation kann das Basteln losgehen! Zuerst müssen ein Motor und eine Stromversorgung (z.B. eine Batterie), wie auf dem folgenden Bild gezeigt, angeschlossen werden. Es kann z.B. auch ein Servo Brick mit einem Servomotor anstatt eines DC Bricks mit Gleichstrommotor verwendet werden.
Jetzt muss der Brick per USB an den PC angeschlossen werden. Einen Moment später sollte im Brick Viewer ein neuer Tab namens "DC Brick" auftauchen. Nach Auswahl dieses Tabs sollte der Brick Viewer so aussehen:
Auf der rechten Seite wird die externe Eingangsspannung unter "External Voltage", der Stromverbrauch des angeschlossenen Motors unter "Current Consumption" und die aktuelle Geschwindigkeit als Tachometer angezeigt. Die Regler auf der linken Seite ermöglichen es die Geschwindigkeit, Beschleunigung und PWM-Frequenz für den Motor einzustellen. Um die Treiberstufe und damit die Ansteuerung des Motors zu aktivieren, muss das "Enable DC Motor"-Häkchen gesetzt werden.
Der DC Brick mit Motor und Stromquelle ist getestet, es kann nun ein erstes eigenes Programm, dass den DC Brick steuert, geschrieben werden.
Das eigene Programm kann mit jeder der unterstützten Programmiersprachen geschrieben werden. In diesem Tutorial wird Python verwendet.
Dieses Tutorial sollte es ermöglichen, zusammen mit den Beispielen in den API Dokumentationen der verschiedenen Produkte, jeden Brick mit allen unterstützen Programmiersprachen zu verwenden.
Im Folgenden wird angenommen, dass die Grundlagen der gewählten Programmiersprache bekannt und die notwendigen Entwicklungswerkzeuge bereits installiert sind.
Als erstes müssen API Bindings für die entsprechenden Programmiersprache installiert werden. Passende Anleitungen dazu gibt es hier.
Dann muss ein neuer Ordner für das DC Brick-Testprojekt erstellt und eines der Beispiele für den DC Brick als Ausgangspunkt in diesen Ordner heruntergeladen werden.
Nun folgt ein Blick auf example_configuration.py
:
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 | #!/usr/bin/env python
# -*- coding: utf-8 -*-
HOST = "localhost"
PORT = 4223
UID = "XXYYZZ" # Change XXYYZZ to the UID of your DC Brick
import time
from tinkerforge.ip_connection import IPConnection
from tinkerforge.brick_dc import BrickDC
if __name__ == "__main__":
ipcon = IPConnection() # Create IP connection
dc = BrickDC(UID, ipcon) # Create device object
ipcon.connect(HOST, PORT) # Connect to brickd
# Don't use device before ipcon is connected
dc.set_drive_mode(dc.DRIVE_MODE_DRIVE_COAST)
dc.set_pwm_frequency(10000) # Use PWM frequency of 10 kHz
dc.set_acceleration(4096) # Slow acceleration (12.5 %/s)
dc.set_velocity(32767) # Full speed forward (100 %)
dc.enable() # Enable motor power
input("Press key to exit\n") # Use raw_input() in Python 2
# Stop motor before disabling motor power
dc.set_acceleration(16384) # Fast decceleration (50 %/s) for stopping
dc.set_velocity(0) # Request motor stop
time.sleep(2) # Wait for motor to actually stop: velocity (100 %) / decceleration (50 %/s) = 2 s
dc.disable() # Disable motor power
ipcon.disconnect()
|
Zeile 14 erstellt ein IP-Connection-Objekt.
Zeile 15 erzeugt ein DC Brick Objekt, über welches der eigentliche DC Brick
gesteuert werden kann. Dabei müssen die eindeutige Identifikationsnummer (UID)
des DC Bricks (in diesem Falle steht sie in Zeile 6), sowie das ipcon
Objekt übergeben werden.
Bemerkung
Die einfachste Möglichkeit, die UID eines Bricks zu ermitteln, ist über der Brick Viewer. Wenn der Brick über USB an den PC angeschlossen ist, zeigt der Brick Viewer dessen UID im "Setup"-Tab an.
In Zeile 17 wird die IP-Connection verbunden. Es ist möglich, das Programm auf einem anderen PC, als dem, auf dem der Brick Daemon läuft, auszuführen. Zum Beispiel kann das Programm für ein Smartphone geschrieben werden, das den Brick steuert, der am PC angeschlossen ist.
Die Zeile 20-24 konfigurieren den DC Brick und lassen den Motor mit voller Geschwindigkeit vorwärts laufen.
Die Zeile 26 sorgen dafür, dass das Programm weiter läuft, bis die Enter-Taste gedrückt wird. Danach wird der Motor abgeschaltet.
In Zeile 29-32 wird der Motor gestoppt und danach abgeschaltet.
Dieses Python-Skript oder eines der anderen Beispiele kann nun ausgeführt, oder als Ausgangspunkt für ein eigenes Projekt verwendet werden.
Bemerkung
Eine vollständige Beschreibung der API und weitere Beispiele finden sich auch der Beschreibungsseite jedes Produkts. Im Falle des DC Bricks hier.
Bricklets können genutzt werden, um die Fähigkeiten von Bricks zu erweitern. Hier findet sich eine Übersicht über alle verfügbaren Bricklets.
Um ein Bricklet nutzen zu können, muss es über das mitgelieferte Kabel an einen Brick angeschlossen werden, wobei der Brick währenddessen nicht mit Strom versorgt werden darf.
Als Beispiel dient ein Rotary Poti Bricklet und der DC Brick aus dem ersten Teil des Tutorials. Die Konzepte gelten aber für alle Bricks und Bricklets.
Zuerst muss das Rotary Poti Bricklet an den DC Brick, wie im folgenden Bild gezeigt, angeschlossen werden.
Wenn jetzt der DC Brick über USB angeschlossen wird, taucht neben dem "DC Brick"-Tab ein "Rotary Poti Bricklet"-Tab im Brick Viewer auf. Im Tab wird die aktuelle Position des Potentiometers dargestellt, die sich abhängig von der Drehung ändert.
Um das Rotary Poti Bricklet in das Projekt aufzunehmen kann nun das Programm so abgeändert werden, dass die Position des Potentiometers die Geschwindigkeit des Motors bestimmt. Das abgeänderte Programm sieht wie folgt aus (Download):
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 42 43 44 45 | #!/usr/bin/env python
# -*- coding: utf-8 -*-
HOST = "localhost"
PORT = 4223
UID_DC = "XXYYZZ" # Change to the UID of your DC Brick
UID_POTI = "XYZ" # Change to the UID of your Rotary Poti Bricklet
from tinkerforge.ip_connection import IPConnection
from tinkerforge.brick_dc import BrickDC
from tinkerforge.bricklet_rotary_poti import BrickletRotaryPoti
dc = None
# Callback function for position callback (parameter has range -150 to 150)
def cb_position(position):
velocity = 32767 // 2 * position // 150 # Velocity: -32767/32767
print('Set Position/Velocity: ' + str(position) + '/' + str(velocity))
dc.set_velocity(velocity)
if __name__ == "__main__":
ipcon = IPConnection() # Create IP connection
dc = BrickDC(UID_DC, ipcon) # Create DC brick device object
poti = BrickletRotaryPoti(UID_POTI, ipcon) # Create rotary poti device object
ipcon.connect(HOST, PORT) # Connect to brickd
poti.set_position_callback_period(50) # set callback period to 50ms
poti.register_callback(poti.CALLBACK_POSITION, cb_position)
dc.enable() # Enable motor power
dc.set_acceleration(0xFFFF) # Full acceleration
input('Press Enter to exit\n') # Use raw_input() in Python 2
# Stop motor before disabling motor power
dc.set_acceleration(16384) # Fast decceleration (50 %/s) for stopping
dc.set_velocity(0) # Request motor stop
time.sleep(2) # Wait for motor to actually stop: velocity (100 %) / decceleration (50 %/s) = 2 s
dc.disable() # Disable motor power
ipcon.disconnect()
|
Die Zeile 4-7 sind die typische Konfiguration. Die UIDs müssen die der verwendeten Bricks und Bricklets sein.
Die Zeile 24-29 erstellen die IP-Connection zum Brick Daemon. Die Brick- und Bricklet-Objekte werden erzeugt.
Das Rotary Poti Bricklet wird so konfiguriert, das die Funktion cb_position
jedes Mal aufgerufen wird, wenn sich die Position des Potentiometers ändert.
Zeile 31 stellt diesen Callback so ein, dass er mit einer Periode von
50 ms ausgelöst wird, wenn sich die Position ändert. Wenn sich die Position nicht
ändert werden keine Callbacks ausgelöst. Dieses Vorgehen ist effizient, es wird
nur die unbedingt notwendige USB-Bandbreite verwendet.
Die Callback-Funktion wird in Zeile 32 registriert. cb_position
(definiert in den Zeile 16-21) setzt abhängig von der aktuelle Position des
Potentiometers eine neue Geschwindigkeit für den Motor.
Die Zeile 34-35 schalten die Motorsteuerung ein und setzen die Beschleunigung auf Maximum. Dadurch kann die Motorgeschwindigkeit den Änderungen der Potentiometerposition direkt folgen.
Die Zeile 37 sorgt dafür, dass das Programm weiter läuft, bis die Enter-Taste gedrückt wird.
In Zeile 40-34 wird der Motor gestoppt und danach abgeschaltet.
Um Verkabelung und Raum zu sparen, können Bricks gestapelt werden. Der unterste Brick eines Stapels muss ein Master Brick sein. Dieser kümmert sich um das Routen von Nachrichten zwischen PC und allen Stapelteilnehmern. Nachrichten vom PC werden per USB, oder über eine Master Extension an den Stapel übertragen.
Das Stapeln ist transparent, das bedeutet, dass keine Änderungen am Programm notwendig sind, um zwischen mehreren einzelner Bricks und einem Stapel aus den selben Bricks mit nur einer USB-Verbindung zu wechseln. Die USB-Verbindung muss zum untersten Master Brick bestehen.
Ein Stapel kann mehrere Master Bricks enthalten. Dabei agiert aber nur der unterste Master Brick als Master des Stapels und kümmert sich um das Routen von Nachrichten. Die anderen Master Bricks im Stapel können genutzt werden, um mehr Bricklets an den Stapel anzuschließen.
Der Master des Stapels versorgt alle Teilnehmer des Stapels über seine USB-Verbindung mit in Summe maximal 500mA. Die Motorspannung kann bei jedem Motortreiber-Brick über seinen schwarzen Stromversorgungsstecker auf der Platine eingespeist werden. Um nochmal Verkabelung zu sparen und den Stapel mit mehr Strom versorgen zu können, kann eine Stromversorgung unter den Stapel gesteckt werden (unter den Master des Stapels). Von dort stellt sie die 5V bereit, die von Bricks und Bricklets benötigt werden. Motortreiber-Bricks, deren Motorspannung nicht über ihren eigenen schwarzen Stromversorgungsstecker eingespeist wird, beziehen die Motorspannung direkt von der Versorgung der Stromversorgungsplatine. Wenn also die Stromversorgungsplatine mit 20V gespeist wird, dann stehen diese 20V den Motortreiber-Brick auch als Motorspannung zur Verfügung.
Da bei Verwendung einer Stromversorgung im Stapel die USB-Verbindung nicht mehr für die Stromversorgung verwendet wird, erlaubt dieser Aufbau die Verwendung von Bricks an Embedded Boards, die ansonsten nicht in der Lage wären, den Stapel mit ausreichend Strom zu versorgen.
Der Master des Stapels kann die externe Versorgungsspannung der Stromversorgung, sowie den Stromverbrauch des gesamten Stapels, messen.
Bemerkung
Jeder Motortreiber-Brick schaltet automatisch zwischen externer Versorgung über seinen eigenen schwarzen Stromversorgungsstecker und Versorgung über den Stapel um. Das bedeutet, dass, wenn ein Motor zuvor extern versorgt wurde, ein Abstecken oder Abschalten der externen Versorgung dazu führt, dass der Motor dann direkt über den Stapel versorgt wird. Dies sollte unbedingt bedacht werden!
Im Folgenden wird der bisherigen Aufbau aus DC Brick und Rotary Poti Bricklet um einen Master Brick und eine Step-Down Power Supply erweitert.
Bemerkung
Die weiße Ecke jedes Bricks zeigt an, in welcher Ausrichtung zwei Bricks zusammengesteckt werden können.
Der bisherige Stapel muss nun, wie in folgendem Bild dargestellt, (von unten nach oben) aus Step-Down Power Supply mit angeschlossener Batterie, einem Master Brick mit angeschlossenem Rotary Poti Bricklet und einem DC Brick mit angeschlossenem Motor aufgebaut werden.
Einen Moment nachdem der Master Brick über USB an den PC angeschlossen wurde, sollte der Brick Viewer Tabs für den Master Brick, den DC Brick und das Rotary Poti Bricklet anzeigen. Auf dem Master Brick sollte eine von Null verschiedene Strom- und Spannungsmessung zu sehen sein.
Das Stapeln von Bricks ist für die API transparent, daher kann das Programm aus dem vorherigen Abschnitt ohne Änderungen weiterverwendet werden!
Die bisher gezeigten Stapel in diesem Tutorial sind nicht besonders spannend, sie sparen vornehmlich Verkabelung und Platz ein. Aber das Stapelkonzept kann mehr. Es erlaubt Master Extensions auf den Stapel zu stecken, um die Kommunikationsmöglichkeiten des Stapels über USB hinaus zu erweitern, zum Beispiel durch RS485, Wi-Fi oder Ethernet.
Um einen RS485-Bus zwischen zwei Stapeln zu bauen, werden noch ein Master Brick und zwei RS485 Extensions zusätzlich zu den bisher verwendeten Teilen benötigt. Auf jeden Master Brick wird jeweils eine RS485 Extension gesteckt und die beiden Extensions passend miteinander verkabelt. Jetzt muss noch das Rotary Poti Bricklet an den neu zusammengesteckten Stapel angeschlossen werden.
Als nächster Schritt muss jetzt jeder Stapel einzeln über USB am PC angeschlossen und konfiguriert werden. Die Details dazu sind in der RS485 Dokumentation beschrieben. Wichtig ist, dass nach der Konfiguration der RS485 Slave vor dem RS485 Master gestartet wird.
Jetzt sollten im Brick Viewer die zwei Master Bricks, das Rotary Poti Bricklet und der DC Brick auftauchen. Wenn das der Fall ist, kann jetzt das vorherige Programm ohne Änderung weiterverwendet werden.