• Herzlich willkommen!

    Das Team von »Doctor Brick« heißt Euch herzlich willkommen und wünscht Euch viel Spaß hier!
    »Doctor Brick« ist eine anerkannte Community (RLOC) für erwachsene LEGO Enthusiasten, auch AFOLs (= Adult Fans Of LEGO) genannt.
    Wir können uns hier über alle Belange des LEGO Hobbys austauschen wie z.B. Set- und Teilefragen, Vorstellung und Rezensionen von Legobauten.
    Bitte beachtet die Nutzungsbedingungen und den Verhaltensleitfaden.

grawuli

Urgestein
Registriert
2 Mai 2018
Beiträge
1.440
Ort
Minga
Hallo Zusammen,

ich habe mich die letzten Wochen intensiver mit pyBricks beschäftigt und möchte hier meine Programme in lockerer Folge vorstellen.

Für die Programmierung und den Download der Programme auf einen PU-Hub verwende ich Visual Studio Code von Microsoft, da diese IDE einfach mehr Funktionen für die Bearbeitung mehrerer Module bereit stellt. Die Web-App von pyBricks verwende ich zum Laden der Firmware und zum testen.

Wie man Visual Studio Code für die Benutzung mit pyBricks einrichtet > Klick mich

Der Download von Programmen auf einen TechnicHub macht noch Probleme > Klick mich Hier muss man einfach stur bleiben und den Download immer wieder anstossen.

Download friert ein.png

Als erstes ein Programm zur Steuerung von maximal 4 Motoren an einem PU-Hub.

In dem Programm verwende ich Routinen aus der Dokumentation von pyBricks.

- Remote > Namen vergeben, LED-Farbe setzen, gedrückten Button ermitteln > Klick mich

- Hub mit Remote verbinden > Klick mich

- Angeschlossene Motoren überprüfen, Parameter > Klick mich


Die Funktionen/Klassen/Variablen sind in Module aufgeteilt um das steuernde Modul übersichtlicher zu halten.

- Steuerung > main_technichub_with_4_engines.py > Keine Änderung notwendig


- Programm initialisieren > myCfgProgramm.py

Änderungen sind eventuell in der Funktion _create_devices notwendig:

Code:
# Attribute für Motoren definieren
# Erlaubt sind Motoren mit 
# - gleicher Übersetzung ins Langsame oder Schnelle und
# - vom gleichen Typ
_dict_device_1 = {"port": "A", "direction": "+", "gear": [12, 36], "type": 47}
_dict_device_2 = {"port": "B", "direction": "-", "gear": [12, 36], "type": 47}
_dict_device_3 = {"port": "C", "direction": "-", "gear": [12, 36], "type": 47}
_dict_device_4 = {"port": "D", "direction": "+", "gear": [12, 36], "type": 47}
Die Bedeutung der Parameter kann der Dokumention auf der pyBricks-Seite nachgelesen werden.
- Klasse DCMotor
- Klasse Motor

Code:
# Anzahl angeschlossener Motoren
_cnt_devices = 4
Werden weniger als 4 Motoren angeschlossen, muss die Variable _cnt_devices entsprechend angepasst werden.

Code:
# Instanz erstellen
myGlobals.myModell = myModel(myGlobals.max_steps,
                                     myGlobals.max_speed,
                                     myGlobals.time_4_stop,
                                     device_1 = _dict_device_1,
                                     device_2 = _dict_device_2,
                                     device_3 = _dict_device_3,
                                     device_4 = _dict_device_4)
Werden weniger als 4 Motoren angeschlossen, müssen die Parameter device_1 bis device_4 entsprechend entfernt werden.

- Klassen > myClasses.py > Keine Änderung notwendig

- Modulübergreifende Definitionen > myGlobals.py

Block > Gültige Buttons
Code:
# Im Programm benutzte Remote-Buttons
BTN_INCREASE_SPEED = {Button.LEFT_PLUS}
BTN_CHANGE_DIRECTION = {Button.LEFT}
BTN_DECREASE_SPEED = {Button.LEFT_MINUS}
BTN_EMERGENCY = {Button.CENTER}
In diesem Block werden die benutzten Buttons definiert.
Da ich schon immer mit der linken Hand die Geschwindigkeit für RC-Modelle reguliere, habe ich auch hier die linken Buttons definiert.
- Geschwindigkeit erhöhen > linker Plus-Button
- Geschwindigkeit verringern > linker Minus-Button
- Richtung ändern > linker Button (rot)

Wenn irgendetwas schief geht, kann mit dem grünen Button das Modell gestoppt werden.

Wird der grüne Button ein zweitesmal gedrückt, wird das Programm beendet.

Die Buttons können hier nach belieben geändert werden. Ein Button darf nur einmal vergeben werden.

Block > Farben für Hub/Remote
Code:
# Farben für Hub-/Remote-LED
COLOR_HUB_DEFAULT = Color.BLUE
COLOR_MAX_SPEED = Color.BLUE
COLOR_MIN_SPEED = Color.BLUE
COLOR_FORWARD = Color.CYAN
COLOR_BACKWARD = Color.VIOLET
COLOR_BTN_NOT_USED = Color.WHITE
COLOR_EMERGENCY = Color.MAGENTA
COLOR_RED_BUTTON = Color.RED
COLOR_BTN_ERROR = Color.ORANGE
COLOR_EVERYTHING_IS_OK = Color.GREEN
Die Farben sollen dem Anwender ein Feedback geben, welche Taste zuletzt gedrückt wurde.

Block > Remote definieren
Code:
# Remote
REMOTE_NAME = "MBr_Rmt_1"               # = Name des Remote-Controllers
REMOTE_TIME_2_CONNECT = 10000           # = Wartezeit für den 1-ten Versuch in ms
REMOTE_TIME_2_RECONNECT = 5000          # = Wartezeit für den 2-ten Versuch in ms
connect_remote = StopWatch()            # = Timer
COLOR_TIMER_COUNTDOWN = Color.MAGENTA   # = Farbe wird immer heller
Damit sich das Programm immer mit der richtigen Fernsteuerung verbindet, sucht es nach einer Fernsteuerung mit dem Namen MBr_Rmt_1. Gerade bei Ausstellungen wichtig, aber auch zu Hause, wenn mehrere Modelle gleichzeitig bewegt werden sollen. Die nächsten beiden Einstellungen werden für den Parameter time_out verwendet.

Block > Einstellungen für die Motoren
Code:
# Werte zur Motorsteuerung
max_steps = 20                          # = Anzahl Stufen um die maximale Geschwindigkeit zu erreichen
max_speed = 400                         # = maximale Geschwindigkeit
time_4_stop = 900                       # = Zeitspanne für das normale Anhalten in ms
dsp_speed_4_engines = False             # = aktuelle Geschwindigkeit der Motoren anzeigen > True/False
Die Einstellungen für die Motoren sind abhängig vom benutzten Modell und den eingesetzten Motoren und der verwendeten Parameter.

Block > Variablen, die während der Laufzeit geändert werden
Code:
# ###################################################################
# Ab hier bitte nur noch schauen und nichts ändern
# ###################################################################
ERROR = -99999                          # = allgemeiner Fehler
# Variablen, die während der Laufzeit geändert werden
myHub = None                            # = pyBricks-Objekt
myHubName = ""                          # = Hub-Bezeichnung
myModell = None                         # = Instanz der Klasse myModel
Remote = None                           # = pyBricks-Objekt
emergency_btn_pressed = False           # = Center-Button wurde gedrückt > alle Motoren sofort stoppen
red_button = False                      # = Notfall > alles stoppen > Hub ausschalten
forward = True                          # = Modell fährt vorwärts > True/False
backward = False                        # = Modell fährt rückwärts > True/False
color_change_direction = Color.BROWN    # = Fahrtrichtung an Remote-LED anzeigen
In diesem Block sollten keine Änderungen gemacht.

Bei Fehlern in der Definition gibt es entsprechende Hinweise.

Meldung - I kon Remote ned findn.png
Der Kontakt zu Remote MBr_Rmt_1 hat nicht geklappt


Meldung - Alles ok.png
Meldungen, wenn alles ok ist/war.

Keine Angst, nicht alle Meldungen und Kommentare sind in der Sprache meiner Eltern. Alle Doc-Strings sind in der ersten Fremdsprache, die ich gelernt habe, verfasst.

Im Anhang ist das Programm zu finden.

Und jetzt viel Spass beim Erforschen des Programmes.

Im nächsten Programm dreht sich alles um LEDs und wie die aktuellen Einstellungen im Hub-Speicher abgelegt werden und beim nächsten Start des Programms die LEDs wieder eingeschaltet werden.
 

Anhänge

  • main_pu-hub_with_maximal_4_engines.zip
    14,6 KB · Aufrufe: 5

grawuli

Urgestein
Registriert
2 Mai 2018
Beiträge
1.440
Ort
Minga
Hallo Zusammen,

das heutige Programm beschäftigt sich wie bereits angekündigt nur mit LEDs und könnte eventuell für die Beleuchtung eines Gebäudes genutzt werden. Die eingestellte Leuchtkraft der LEDs kann gespeichert werden. Wird das Programm gestartet, werden die Werte ausgelesen und die LEDs eingeschaltet.

Das Programm habe ich im Vergleich zum ersten etwas umstrukturiert und die Module umbenannt.

Ich werde im folgenden nur auf größere Änderungen im Vergleich zum ersten Programm eingehen.

Zuerst ein paar Anmerkungen zum Modul globals.py.

Block > Gültige Buttons
Code:
# Im Programm benutzte Remote-Buttons
BTN_NXT_LED = {Button.LEFT_PLUS}
BTN_SAV_LED_BRIGHTNESS = {Button.LEFT}
BTN_PRV_LED = {Button.LEFT_MINUS}
BTN_EXIT_PROGRAMM = {Button.CENTER}
BTN_BRIGHTER_LED = {Button.RIGHT_PLUS}
BTN_TURN_OFF_LED = {Button.RIGHT}
BTN_DIM_LED = {Button.RIGHT_MINUS}
Ich denke die Namen der Buttons sind selbsterklärend, die Funktionen sind im Programm dokumentiert.

Block > Werte zur LED-Steuerung
Code:
# Werte zur LED-Steuerung
max_steps = 20                          # = Anzahl Stufen um die maximale Helligkeit zu erreichen
max_brightness = 100                    # = maximale Helligkeit
dsp_values_4_lights = False             # = aktuelle Einstellungen anzeigen > True/False
Gültige Werte für die Variable max_brightness können der Dokumentation entnommen werden.


Jetzt zum Modul cfg_program.py

Import > Klasse für Hub eventuell anpassen
Code:
from pybricks.hubs import TechnicHub as theHub

Funktion > _crt_devices
Code:
#>> Benutzte Ports definieren > die Reihenfolge ist egal
# Nur Ports definieren, die auch wirklich gebraucht werden
_dict_ports = {"C": Port.C, "D": Port.D, "A": Port.A, "B": Port.B}
#>> Attribute für LEDs definieren
# Die Keys port und type sind immer zu definieren
# Fehlende Keys werden durch die entsprechenden globals-Werte ergänzt
_dict_led_1 = {"port": "C", "type": 8, "max_brightness": 90, "max_steps": 30}
_dict_led_2 = {"port": "B", "type": 8, "max_steps": 25}
_dict_led_3 = {"port": "A", "type": 8}
_dict_led_4 = {"port": "D", "type": 8}
#>> Anzahl angeschlossener LEDs
_cnt_lights = 4             #<< Anzahl LEDs anpassen
# Objekte erstellen
_rtnCode = myModell(_prtFunction,
                    ports = _dict_ports,        # = benutzte Ports
                    # Ab hier ist die Reihenfolge der Argumente egal
                    led_2 = _dict_led_2,        #<< Bei Bedarf de-/aktivieren
                    led_4 = _dict_led_4,        #<< Bei Bedarf de-/aktivieren
                    led_3 = _dict_led_3,        #<< Bei Bedarf de-/aktivieren
                    led_1 = _dict_led_1)
Hier sind eventuell die meisten Anpassungen nötig.

Im Anhang ist das Programm zu finden.

Und jetzt viel Spass beim Erforschen des Programmes.
 

Anhänge

  • main_pu-hub_with_max_4_lights.zip
    15,1 KB · Aufrufe: 2

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.729
Hallo Markus,

tolle Arbeit, vielen Dank für's Teilen.
Sehr schön die Unterteilung in verschiedene Module.

Ein paar Ideen dazu (Motor, für LED analoges):

Wäre es nicht machbar, dass die Änderungen in "myCfgProgramm.py" unnötig werden, weil die Info auch aus der "myGlobals.py" kommen?

Also dort (myGlobals.py) nur sowas wie:
_dict_device_1 = {"port": "A", "direction": "+", "gear": [12, 36], "type": 47}
_dict_device_2 = {"port": "C", "direction": "-", "gear": [12, 36], "type": 47}
hub = "Technic Hub"

und alles andere (_cnt_devices, myModel) daraus ableiten?

Wie wäre, dazu eine "GUI" in Excel zu basteln? Keine Ahnung ob da Bedarf besteht.
Also etwas:
Zwischenablage01.jpg
 

grawuli

Urgestein
Registriert
2 Mai 2018
Beiträge
1.440
Ort
Minga
Hallo Werner,

die Excel-GUI ist keine "GUI". Ich glaube diese Idee hattest Du schon mal hier zur Diskussion gestellt und soweit ich mich erinnere wurde diese Idee nicht gerade mit Beifall entgegen genommen. Ich weiß jetzt nicht, ob Du das weiter verfolgt und in einem Forum veröffentlicht hast.

Ausserdem schließt Excel alle aus, die kein Excel haben. Ich habe z.B. keine Excel-Lizenz und werde mir auch keine zulegen. In Numbers lässt sich meines Wissens so etwas nicht realisieren.

Wenn überhaupt dann eine richtige GUI, aus der dann auch das Programm auf einen Hub übertragen werden kann. Alles andere ist Stückwerk.

Alles in das Modul myGlobals.py packen dürfte auch nicht klappen, da dieses Modul von jedem anderen Modul per include komplett importiert wird. Das Programm wächst dann immer mehr ohne an Funkionalität zu gewinnen. Die maximale Programmgröße beträgt derzeit 16.244 Byte und ich habe manches Programm schon des öfteren umbauen müssen nur um irgendwo 100 Byte einzusparen.
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.729
Ich weiß jetzt nicht, ob Du das weiter verfolgt und in einem Forum veröffentlicht hast.
Nein, ich habe so was nur mal via HTML-Form realisiert.
Wenn überhaupt dann eine richtige GUI, aus der dann auch das Programm auf einen Hub übertragen werden kann. Alles andere ist Stückwerk.
Ich habe so was in .xls hier, es erstellt das komplette .zip-File, dass sich komplett importieren lässt.
Aber Du hast recht, nenne es eine "Eingabehilfe" ;-)
Alles in das Modul myGlobals.py packen dürfte auch nicht klappen,
Ich dachte nur an die drei genannten Zeilen, aber ich kenne mich damit leider nicht so aus wie Du.
 

grawuli

Urgestein
Registriert
2 Mai 2018
Beiträge
1.440
Ort
Minga
Hallo Zusammen,

das heutige Programm beschäftigt sich mit bis zu 4 Motoren an einem PU-Hub und könnte eventuell für GBCs mit mehreren Motoren genutzt werden.

Für jeden Motor kann die Drehrichtung und Geschwindigkeit individuell eingestellt werden.

Die eingestellten Werte für die Motoren (= Geschwindigkeit/ Drehrichtung) können gespeichert werden. Wird das Programm gestartet, werden die Werte ausgelesen und die Motoren asynchron gestartet. Es werden nur Motoren gestartet, deren Werte sich nicht geändert haben.

Änderungen der Werte werden nicht automatisch gespeichert.

pyBricks_pu_hub_with_max_4_individually_adjustable_engines.jpg
Belegung der Buttons (Quelle der Fernsteuerung)



Zuerst ein paar Anmerkungen zum Modul globals.py.

Block > Gültige Buttons
Code:
# Im Programm benutzte Remote-Buttons
BTN_NXT_MOTOR = {Button.LEFT_PLUS}
BTN_SAV_MOTOR_VALUES = {Button.LEFT}
BTN_PRV_MOTOR = {Button.LEFT_MINUS}
BTN_EMERGENCY = {Button.CENTER}
BTN_INCREASE_SPEED = {Button.RIGHT_PLUS}
BTN_CHANGE_DIRECTION = {Button.RIGHT}
BTN_DECREASE_SPEED = {Button.RIGHT_MINUS}
Ich denke die Namen der Buttons sind selbsterklärend, die Funktionen sind im Programm dokumentiert.

Block > Werte zur Motoren-Steuerung
Code:
# Werte zur Motorsteuerung
max_steps = 20                                  # = Anzahl Stufen um die maximale Geschwindigkeit zu erreichen
max_speed = 400                                 # = maximale Geschwindigkeit
Hier werden die Default-Werte für fehlende Werte bei der Definition der Motoren im Modul cfg_program.py hinterlegt.


Jetzt zum Modul cfg_program.py

Import > Klasse für Hub eventuell anpassen
Code:
#>> pyBricks-Module importieren
from pybricks.hubs import TechnicHub as theHub                 #<< Import des Hubs anpassen

Funktion > _crt_devices
Code:
#>> Benutzte Ports definieren > die Reihenfolge ist egal
# Nur Ports definieren, die auch wirklich gebraucht werden
_dict_pyPorts = {"A": Port.A, "D": Port.D, "C": Port.C, "B": Port.B}

#>> Attribute für Motoren definieren
# Die Keys port, direction, gear und type sind immer zu definieren
# Fehlende Keys werden durch die entsprechenden globals.Werte ergänzt
_dict_device_1 = {"port": "A", "direction": "+", "gear": [12, 36], "type": 47, "max_steps": 30}
_dict_device_2 = {"port": "B", "direction": "-", "gear": [12, 36], "type": 47, "max_speed": 380}
_dict_device_3 = {"port": "C", "direction": "-", "gear": [12, 36], "type": 47, "max_steps": 27, "max_speed": 350}
_dict_device_4 = {"port": "D", "direction": "+", "gear": [12, 36], "type": 47}

#>> Anzahl angeschlossener Motoren
_cnt_devices = 4                        #<< Anzahl Motoren anpassen

# Hub konfigurieren
_rtnCode = _myModell(_prtFunction,
                        _ports = _dict_pyPorts,                # = benutzte Ports
                        # Ab hier ist die Reihenfolge der Argumente egal
                        device_4 = _dict_device_4,             #<< Bei Bedarf de-/aktivieren
                        device_2 = _dict_device_2,             #<< Bei Bedarf de-/aktivieren
                        device_3 = _dict_device_3,             #<< Bei Bedarf de-/aktivieren
                        device_1 = _dict_device_1)             #<< Bei Bedarf de-/aktivieren
Hier sind eventuell die meisten Anpassungen nötig.


Im Anhang ist das Programm zu finden.

Und jetzt viel Spass beim Erforschen des Programmes.
 

Anhänge

  • pyBricks_pu_hub_with_max_4_individually_adjustable_engines.zip
    13 KB · Aufrufe: 1

grawuli

Urgestein
Registriert
2 Mai 2018
Beiträge
1.440
Ort
Minga
Hallo Zusammen,

bei diesem Programm ist Broadcasting das Thema. Beteiligt ist ein TechnicHub mit maximal 2 Motoren und 2 LEDs (nachfolgend Main) und ein CityHub mit 2 LEDs (nachfolgend Dependent).

Die Geschwindigkeit der Motoren und die Leuchtkraft der LEDs kann eingestellt werden, ebenso kann die Drehrichtung der Motoren geändert werden. Bei Bedarf kann die Leuchtkraft der LEDs abgespeichert werden.

Erstmal die Belegung der Buttons:

Wendezug - Belegung der Buttons.png
Belegung der Buttons (Quelle der Fernsteuerung)

Die Belegung der Buttons kann wie immer in dem Modul globals.py geändert werden (Programm Main)
Code:
# Im Programm benutzte Remote-Buttons
BTN_INCREASE_SPEED = {Button.LEFT_PLUS}
BTN_CHG_DIRECTION = {Button.LEFT}
BTN_DECREASE_SPEED = {Button.LEFT_MINUS}
BTN_EMERGENCY = {Button.CENTER}
BTN_BRIGHTER_LED = {Button.RIGHT_PLUS}
BTN_SAV_LED_BRIGHTNESS = {Button.RIGHT}
BTN_DIM_LED = {Button.RIGHT_MINUS}

Die Blöcke
- Farben für Hub-/Remote-LED
- Remote
- Werte zur Motorsteuerung
sind aus den anderen Programmen von mit bereits bekannt und werden deshalb nicht weiter kommentiert.


Block > Werte zur LED-Steuerung
Code:
max_steps_led = 25                              # = Anzahl Stufen um die maximale Helligkeit zu erreichen
max_brightness = 100                            # = maximale Helligkeit
dsp_values_4_lights = False                     # = aktuelle Einstellungen anzeigen > True/False
sav_led_brightness = True                       # = aktuelle Helligkeit speichern > True/False
day_light = True                                # = Tageslicht > True/False
day_light_multiplicator = 2                     # = Multiplikator für brightness_per_step

Die Variable day_light steuert die Tageslichtfunktion
- True > Laufen die Motoren wird das Licht automatisch mit der gewünschten Helligkeit eingeschaltet
- False > Die LEDs müssen manuell eingeschaltet werden

Die Variable day_light_multiplicator steuert die Leuchtkraft beim einschalten des Lichtes
- Leuchtkraft = max_brightness / max_steps_led * day_light_multiplicator

Block > Broadcasting-Id's
Code:
TRANSMITTER = "xYz"                             # = TX > myHub > myPUT_HUB_x
RECEIVER_2 = "zYx_2"                            # = RX_2 > CityHub > myCityHubx
TIME_4_CONTACT = 10000                          # = Wartezeit für die Kontaktaufnahme in ms

Die Broadcasting-Id's werden zur gegenseitigen Identifikation von Sender (Main) und Empfänger (Dependent) benutzt. Es werden nur Nachrichten eines bekannten Absenders (TRANSMITTER) verarbeitet. Der Empfänger prüft sowohl die Absender-Id als auch die Empfänger-Id (RECEIVER_2). Bei Programmstart muss innerhalb der definierten Zeit (TIME_4_CONTACT) ein Kontakt (Dependent muss antworten) zustande kommen. Wenn die Kontaktaufnahme erfolgreich war, wird der Hub konfiguriert und der Remote verbunden.

Block > Broadcasting-Kanäle
Code:
broadcast_channel = 1                           # = auf diesem Kanal werden Nachrichten versendet
observe_channels = [2]                          # = auf diesem Kanal/diesen Kanälen werden Nachrichten empfangen

Diese beiden Werte dürften klar sein, ansonsten empfehle ich die Dokumention.

Im Modul cfg_program.py sind die bereits bekannten Blöcke anzupassen.
Code:
from pybricks.hubs import TechnicHub as theHub
Hub definieren

Code:
_dict_ports = {"B": Port.B, "A": Port.A , "D": Port.D, "C": Port.C}
Belegte Ports

Code:
_dict_engine_1 = {"port": "C", "direction": "+", "gear": [12, 36], "type": 47}
_dict_engine_2 = {"port": "D", "direction": "-", "gear": [12, 36], "type": 47}
Motoren definieren

Code:
_dict_light_1 = {"port": "A", "type": 8}
_dict_light_2 = {"port": "B", "type": 8}
LEDs definieren

Code:
_cnt_devices = 4
Anzahl angeschlossener Motoren/LEDs

Code:
_rtnCode = myModell(_prtFunction,
                    _dict_ports,
                    engine_1 = _dict_engine_1,
                    engine_2 = _dict_engine_2,
                    light_2 = _dict_light_2,
                    light_1 = _dict_light_1)
Argumente anpassen

Modul > main.py
Code:
#>> Falls nur eine LED angeschlossen ist > anpassen
light_on_port_0 = globals.dict_lights[globals.led_ports[0]]
light_on_port_1 = globals.dict_lights[globals.led_ports[1]]
if _fwd:
    light_on_port_0.on(globals.brightness)
    light_on_port_1.off()
elif _bwd:
    light_on_port_0.off()
    light_on_port_1.on(globals.brightness)
else:
    for _port, _light in globals.dict_lights.items():
        _light.off()
In der Funktion _switch_lights muss eventuell die Variable light_on_port_1 auskommentiert werden.

Das war es zum Programm für den Main.

Noch ein paar Bemerkungen zum Programm für den Dependent.

Modul > globals.py > Block > Broadcasting-Id's
Code:
TRANSMITTER = "xYz"                             # = TX > TechnicHub > myPUT_HUB_x
RECEIVER_2 = "zYx_2"                            # = RX_2 > myHub > myCityHubx
TIME_4_CONTACT = 10000                          # = Wartezeit für die Kontaktaufnahme in ms
Diese Werte müssen mit den Definitionen im Modul globals.py des Programmes für den Main identisch sein, sonst funktioniert die Kontaktaufnahme nicht.

Code:
broadcast_channel = 2                           # = auf diesem Kanal werden Nachrichten versendet
observe_channels = [1]                          # = auf diesem Kanal/diesen Kanälen werden Nachrichten empfangen
Ebenso müssen die Kanäle passen.

Für das Modul cfg_program.py gilt das gleiche wie oben bereits beschrieben.


Auf beiden Hubs habe ich die aktuelle Firmware 3.5.0 installiert. Die beiden Hubs funktionieren/arbeiten einwandfrei. Wenn die Hubs mit dem Rechner verbunden sind, kann es sein, dass der TechnicHub nicht mehr reagiert. Das Problem ist bekannt. Wie die BLE-Verbindung auf Ausstellungen funktioniert > :unknown:


Im Anhang sind die Programme zu finden.

Und jetzt viel Spass beim Erforschen der Programme.
 

Anhänge

  • client_ble_cityhub_with_2_lights.zip
    28,3 KB · Aufrufe: 2
  • main_ble_pu-hub_with_2_engines_2_lights.zip
    39,8 KB · Aufrufe: 3

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.729
Vielleicht ist das was für dich?
Vielen Dank für den Hinweis, das klingt interessant.
Allerdings ist das für meine rudimentären Kenntnisse schon zu hoch.

Solche Zeilen machen mir Angst ;-)
blobParts.push(encoder.encode('__main__.py\x00'));

Ich bleibe bei code.pybricks.com
 

Ts__

Eisenbahner
Registriert
6 Jan. 2016
Beiträge
3.055
Ort
Zwickau / Sachsen
Oh, das hier hab ich ja bisher ganz übersehen....

Danke fürs Posten Markus. Ich hab mal nur ganz kurz drübergeschaut, vielleicht kann ich mir da was abgucken und für mich anpassen.
Testen will ich die Hub-To-Hub Kommunikation, hab dafür auch passende "Problem"-Loks, wo das eine Lösung sein könnte. Zb fahren meine LMS Class 5 / Hogwarts Express Loks mit 2 HUBs auf einer Fernbedienung, aber noch mit dem Tablet / Lego PU App in der Mitte. Und das Tablet will ich da weg haben ;-)

Thomas
 

Ts__

Eisenbahner
Registriert
6 Jan. 2016
Beiträge
3.055
Ort
Zwickau / Sachsen
Hm. Ich fürchte das vom Markus gezeigt macht was anderes....

Sicher? Ich seh da Kommunikation. Was danach passiert, ist mir völlig egal, dass mach ich mir passend ;-)
Für den ersten Blick ist das bei Markus auch für meinen Geschmack stark "aufgebläht" (nicht falsch verstehen, dass mit den aufteilen auf mehrere Dateien pro Hub hat auch Sinn und Vorteile, ist mir hier nur "too much").

Das Hub-To-Hub findest Du in dem vom mir verlinkten Motor Control.

Bestimmt.

Ich schaue mir die verschiendenen Ansätze an und suche das für mich passende raus. An Schlüsselfertigen Lösungen bin ich "nur" soweit interessiert, um zu sehen, wie etwas gemacht macht. Ich nutze das als "How to" und mach das dann so, wie ich es brauche und wünsche.
Alles was mit dem Hub und den Licht/Motoren zu tun hat, hab ich mir mit der PyBricks Doku "erarbeitet", das ist kein Hexenwerk. Schwieriger für mich sind die Themen Kommunikation mit Fernbedienung und Hub zu Hub, da die eben entweder nicht gut in der Doku beschrieben oder noch recht neu waren. Es kann aber sein, dass sich dort die Doku stark verbessert hat, ich hab da locker 1,5 Jahre nicht reingeguckt.

Thomas
 

grawuli

Urgestein
Registriert
2 Mai 2018
Beiträge
1.440
Ort
Minga
Oh, das hier hab ich ja bisher ganz übersehen....

Danke fürs Posten Markus. Ich hab mal nur ganz kurz drübergeschaut, vielleicht kann ich mir da was abgucken und für mich anpassen.
Testen will ich die Hub-To-Hub Kommunikation, hab dafür auch passende "Problem"-Loks, wo das eine Lösung sein könnte. Zb fahren meine LMS Class 5 / Hogwarts Express Loks mit 2 HUBs auf einer Fernbedienung, aber noch mit dem Tablet / Lego PU App in der Mitte. Und das Tablet will ich da weg haben ;-)

Thomas

Dann dürften die Programme im Anhang das richtige für dich sein. 2 TechnicHubs mit jeweils 2 Motoren, 2 Lichtern und Spannungsüberwachung.

Sicher? Ich seh da Kommunikation. Was danach passiert, ist mir völlig egal, dass mach ich mir passend ;-)
Für den ersten Blick ist das bei Markus auch für meinen Geschmack stark "aufgebläht" (nicht falsch verstehen, dass mit den aufteilen auf mehrere Dateien pro Hub hat auch Sinn und Vorteile, ist mir hier nur "too much").
........
Das mit dem aufgebläht ist schon richtig. Es ginge auch alles in einem Modul. Wäre dann auch kleiner und man könnte noch mehr Funktionen unterbringen.

Edit: Anhang ausgetauscht (Bugfix)
 

Anhänge

  • Archiv.zip
    82 KB · Aufrufe: 3
Zuletzt bearbeitet:

grawuli

Urgestein
Registriert
2 Mai 2018
Beiträge
1.440
Ort
Minga
Hallo @Ts__ /Thomas,

habe die Programme gerade getestet und festgestellt, dass das steuernde Programm den Stillstand (= Geschwindigkeit = 0) nicht an den Client meldet. Bitte nochmal neu abholen.
 

grawuli

Urgestein
Registriert
2 Mai 2018
Beiträge
1.440
Ort
Minga
Hallo Zusammen,

ich habe bei Tests festgestellt, dass plötzlich Fehler angezeigt werden, obwohl ich an dem pyBricks-Programm nichts geändert habe.

Vor allem treten diese Fehler immer dann auf, wenn ich ein Programm neu geladen habe und sich dieses Programm dann Werte aus dem Speicher geladen hat.

Deshalb habe ich ein kleines Programm (siehe Anhang) geschrieben, dass diesen Speicher löscht.
 

Anhänge

  • clear_storage.py.zip
    2,3 KB · Aufrufe: 2
Oben