Die Funk-Befehle in PXT ermöglichen das Senden und den
Empfang einfacher Datagramme. Es können wahlweise Zeichenketten, Zahlen oder Zahlenwerte
zusammen mit einem Variablennamen oder einer Einheit übertragen werden.
Das
erste Bespiel ist ganz einfach. Es sendet A oder B, je nachdem, welche
Taste gedrückt wird. Die Verbindung funktioniert sogar zwischen
Calliope und Microbit, allerdings mit einer kleinen Einschränkung, weil
die Taste B zwischen beiden nicht kompatibel ist.
Aber jetzt
kommt ein Problem: Wenn ich auch nur die kleinste Änderung mache und in
eine der beiden Platinen übertrage, geht nichts mehr. Da reicht es
schon, wenn die Taste A kein A mehr senden soll, sondern ein C. Ich
habe mich lange mit dem Problem gequält und dachte schon, ich werde
verrückt. Aber dann kam der entscheidende Hinweis von Rainer, der sich
auch damit duelliert hat: Man muss die Gruppe definieren!
Tatsächlich
wird "setze Gruppe" aber im Calliope-PXT gar nicht angeboten (dachte ich, habs einfach nicht gefunden...). Ich musste
es in JavaScript direkt eintippen oder sich über das Microbit-PXT
beschaffen.
input.onButtonPressed(Button.A, () => {
radio.sendString("A")
})
input.onButtonPressed(Button.B, () => {
radio.sendString("B")
})
radio.onDataPacketReceived(({receivedString}) => {
basic.showString(receivedString)
})
radio.setGroup(1)
radio.setTransmitPower(1)
Mit
dieser Erweiterung kann ich auch an einem der Partner ein verändertes
Programm nutzen. Da kommt natürlich die Frage auf, wie war das
eigentlich ursprünglich gemeint? Ich vermute folgendes: Bei jedem
Kompilieren wird im Hintergrund eine Funk-Gruppe (1...255) und
vermutlich die höchste Sendeleistung (7) eingesetzt. Wenn jetzt in
einer größeren Gruppe jeweils zwei zusammenarbeiten und identische
Programme verwenden, haben sie mit hoher Wahrscheinlichkeit eine andere
Gruppe als die Nachbarn, sodass eine ganze Klasse ungestört arbeiten
kann. Allerdings muss bei jeder Programmänderung das neue Hex-File in
beide Platinen übertragen werden. Erst im Nachhinein habe ich in der
PXT-Dokumentation auf der Microbit-Seite die Bestätigung gefunden: "If
you do not tell your program which group ID to use with this function,
it will figure out its own group ID by itself. If you load the very
same program onto two different micro:bits, they will be able to talk
to each other because they will have the same group ID."
Mit
etwas Nachhilfe von der Callipe-Mannschaft habe ich es doch noch
gefunden. Wenn man die Gruppe Funk öffnet, erscheint im gleichen
Augenblick "Mehr". Und da finde ich auch die Gruppe und die
Übertragungsstärke. In der
Praxis geht es nicht ohne die Angabe der Sende-Gruppe. Ich teste zum
Beispiel Änderungen nur an
der Sender-Seite, das Empfänger-Programm bleibt unverändert. Und das
funktioniert ja jetzt auch, wenn die Gruppe definiert wird.
Hier kommt eine einfache Anwendung, eine Fernsteuerung für zwei Motoren, die über die Tasten des Senders gesteuert werden.
Calliope-Sender und Empfänger
Beim
Test hat sich gezeigt, dass die minimale Sendeleistung nur eine kleine
Reichweite für Versuche auf demselben Tisch zulässt. Es ist daher
sinnvoll, die Leistung auf die Stufe 7 (+4 dBm) zu erhöhen.
let M = 0
radio.onDataPacketReceived(({receivedNumber: D}) => {
if (D == 0) {
motors.dualMotorPower(Motor.A, 0)
motors.dualMotorPower(Motor.B, 0)
}
if (D == 1) {
motors.dualMotorPower(Motor.A, 100)
motors.dualMotorPower(Motor.B, 0)
}
if (D == 2) {
motors.dualMotorPower(Motor.A, 0)
motors.dualMotorPower(Motor.B, 100)
}
if (D == 3) {
motors.dualMotorPower(Motor.A, 100)
motors.dualMotorPower(Motor.B, 100)
}
})
basic.forever(() => {
M = 0
if (input.buttonIsPressed(Button.A)) {
M = M + 1
}
if (input.buttonIsPressed(Button.B)) {
M = M + 2
}
radio.sendNumber(M)
basic.pause(100)
})
radio.setGroup(1)
radio.setTransmitPower(7)
Bei
dieser Anwendung kann ein Microbit mit dem Calliope zusammen eingesetzt
werden. Der Calliope bildet den Empfänger, weil er den Motortreiber
hat. Für den Sender reicht der Microbit. Dazu muss man das Programm
etwas kürzen und für den Microbit neu kompilieren.
Microbit-Sender
let M = 0
basic.forever(() => {
M = 0
if (input.buttonIsPressed(Button.A)) {
M = M + 1
}
if (input.buttonIsPressed(Button.B)) {
M = M + 2
}
radio.sendNumber(M)
basic.pause(100)
})
radio.setGroup(1)
radio.setTransmitPower(7)
Elektronik-Labor Projekte Microbit