Micropython und Radio

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Heute wollte ich eine Fernbedienung für meinen Roboter bauen, an sich kein großes Ding.
Radio-Modul importieren, die eine Seite sendet, die andere empfängt.

Nun bekomme fast nur ValueError-Exception(ist kein String bereits bei der Zuweisung) wenn ich receive verwende. Wartet er hingegen 100ms zuvor, ist die Rate nahezu 0.
Andere Beispiele warten gar nicht, keine Ahnung wie das zusammengeht.

Hat jemand eine Idee? :K

Code:
Sender

Code: Alles auswählen

import radio
from microbit import display, button_a, button_b

direction = {"00": " ", "11": "^", "10": "L", "01": "R"}
radio.config(channel=19)  
radio.on()
while True:
    actors = "".join([
        "1" if button_a.is_pressed() else "0",
        "1" if button_b.is_pressed() else "0"
        ])
        
    print(actors)
    
    radio.send(actors)
    display.show(direction[actors])
Receiver

Code: Alles auswählen

import radio
from microbit import display, sleep

direction = {"00": " ", "11": "^", "10": "L", "01": "R"}
radio.config(channel=19)
radio.on()
while True:
# required otherwise many ValueError exceptions during receiving
    sleep(100)

    try:
        command = radio.receive()
    except ValueError:
        command = "00"

    if command in direction:
        print(direction[command])
        display.show(direction[command])
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also abgesehen davon das du ziemlich verschwenderisch mit den resourcen umgehst sehe ich erstmal nix. Aber ein dickes String join mit list comprehension um am Ende zwei Bits zu übertragen, und beim Empfänger dann einen dict lookup - das würde ich anders lösen. Einfach ein Byte reicht, und mit etwas bitshifts und Maskierungen prüfen welche gesetzt sind.

Falls das nicht hilft: ich habe gerade erst am WE den uP Interpreter geforkt und mein eigenes C-Modul geschrieben, weil mein esp8266 beim timing sonst nicht präzise genug war. Und muss sagen ich bin vom Aufbau sehr beeindruckt - der Code ist gut lesbar, und alle meine Fragen wurden dadurch, oder den es ESP beantwortet. Kannst also mal reinschauen, ist nicht gefährlich :D

Und auf die Idee bin ich durch das sehr gute uP eigene Forum gekommen. Da würde ich es sonst mal versuchen.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Klar hätte man das auch mit Bitmasken lösen können, aber ob ein oder zwei Bytes machen keinen Unterschied und lesbarer über die serielle Konsole ist das allemal.
Leider finde ich zu dem ganzen bbc micro kaum brauchbare Dokus, intern wird Micropython 1.79 mit obskuren Patchlevel gefahren.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Unterschied ist nicht im Protokoll, sondern in der Menge von Code und dynamischen Allokationen die dein Code braucht um es zu erzeugen und auseinander zu pulen. Aber dein Roboter vor der Wand, nicht meiner ;)

Meinst du das uP hier: https://github.com/bbcmicrobit/micropyt ... ter/source ?

Das hier ist Teil des receive codes: https://github.com/bbcmicrobit/micropyt ... o.cpp#L266

Da wird ein value error geworfen. Musst mal schauen wer das aufruft, und natürlich würde ich mal simplen Test sende code schreiben & gucken, ob das was verbessert.

Nachtrag: und natürlich auch auf der Sender Seite abspecken. Aus debugging Gründen natürlich.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Danke, so läuft's recht brauchbar. Entwickeln mit diesen Teilen ist irgendwie ziemlich viel Try and Error.


Sender:

Code: Alles auswählen

import radio
from microbit import display, button_a, button_b

direction = {0b11: "^", 0b10: "L", 0b01: "R"}
radio.config(channel=19)
radio.on()
while True:
    display.show(" ")
    actors = 0b00
    actors |= ((2 if button_a.is_pressed() else 0) |
               (1 if button_b.is_pressed() else 0))

    actors = bytes([actors])
    print(actors)

    if actors[0] in direction:
        radio.send(actors)
        display.show(direction[actors[0]])
Empfänger:

Code: Alles auswählen

import radio
from microbit import display

direction = {0b11: "^", 0b10: "L", 0b01: "R"}
radio.config(channel=19)
radio.on()
while True:
    display.show(" ")
    command = radio.receive_bytes()
    if command:
        print(command)

    if command and len(command) == 4 and command[3] in direction:
        display.show(direction[command[3]])
Theoretisch könnte man noch an der Sendeleistung und Geschwindigkeit drehen.
Viel bringen tut's nicht.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Antworten