Funkverbindungen mit PXT    

           
Elektronik-Labor   Projekte   Microbit 



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