• 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.

Pybricks Programm für Zugsteuerung gesucht

Iceman42

Neumitglied
Registriert
4 Mai 2022
Beiträge
5
Guten Abend,
ich bin heute auf der Suche nach einer Lösung für mein PowerUp Problem - 2 Motoren in einer Lok - auf das Pybricks System gestoßen. Nachdem ich nun sehr viele Seiten gelesen und durchsucht habe konnte ich zwar Hinweise auf frührere Lösungen finden. Leider sind viele dieser Seiten aus 2021 heute nicht mehr erreichbar." Error 404 "

Hat vielleicht hier jemand ein Programmbeispiel für mich mit dem ich zwei Motoren an Anschluss A und B betreiben kann ?
Wobei einer der Beiden natürlich die Richtung umkehren muss.

Anhand der Beispiele bei PyBricks ist es mir gelungen die Firmware auf den HUB zu installieren, ein Beispielprogramm zu laden dass beide Motoren ansteuert und bei Port B die Richtung umkehrt.

Was mir nicht klar ist, wie steuere ich das ganze jetzt mit der Fernbedienung und wie lade ich das Programm dauerhaft in den HUB ?

Wer mag darf mir auch gerne ein vielleicht bestehendes Programm zur Verfügung stellen.

Freundliche Grüße
Patrik
 

Iceman42

Neumitglied
Registriert
4 Mai 2022
Beiträge
5
PS: Es gibt auf der Seite von Pybricks ja auch ein Beispielprogramm für die Nutzung der Fernbedienung, wenn ich diese Zeilen Code aber verwenden will bricht Pybricks mit Errormeldung ab.
 

Ts__

Eisenbahner
Registriert
6 Jan. 2016
Beiträge
2.539
Ort
Zwickau / Sachsen
PyBricks hat in letzter Zeit recht viel geändert, so dass alte Programme nicht mehr laufen und alte Dokus auch nicht mehr stimmen,
Aber ich habe PyBricks immer noch im Einsatz und nutze es gerne.

Hier ein Codebeispiel für eine einfache Loksteuerung mit Fernbedienung:
- PyBricks 3.2 (also aktuell)
- 1x Lego PU CityHub
- 2x Lego PU Boost Interactive Motor mit Drehzahlrückmeldung an Port A und Port B, Motor an Port B wird mit geänderter Drehrichtung angesteuert
- 1x Lego PU Fernbedienung

Die Abfrage/Behandlung der Fernbedienung im Beispiel stammt von Werner / @Lok24 . Werner hatte lange Zeit ein sehr nützliches Programm für eine vielseitige Lokansteuerung in PyBricks bereitgestellt. Leider scheint Werner es nicht mehr auf PyBricks 3.2 angepasst zu haben. Daher habe ich das Programm von Werner hier nicht verliinkt.

Code:
# DR V100.4: 2x Boost-Motor an CityHub Port A/B
# Ts__ V01 2023-03-10
# Code fuer Abfrage Fernbedienung stammt von Werner / Lok24

from pybricks.pupdevices import DCMotor, Motor, Remote
from pybricks.tools import wait
from pybricks.hubs import CityHub
from pybricks.parameters import * # alle Parameter importieren

print("Start")

# Einstellungen
# 1 rpm = 6 deg/s
# 1 deg/s = 1/6 rpm
ts_v_max = 1350 # deg/s
ts_acc_max = 200 # deg/s/s
ts_v_factor = ts_v_max / 100
watchdog = True  # "True" or "False": Stop motors when loosing remote connection

ts_motor_1 = Motor(Port.A)
ts_motor_1.control.limits(ts_v_max, ts_acc_max)
ts_motor_2 = Motor(Port.B)
ts_motor_2.control.limits(ts_v_max, ts_acc_max)
ts_FB_A_UP = "A+"
ts_FB_A_DOWN = "A-"
ts_FB_A_STOP = "A0"
ts_FB_B_UP = "B+"
ts_FB_B_DOWN = "B-"
ts_FB_B_STOP = "B0"
ts_FB_SWITCH = "CENTER"
ts_hub = CityHub()

ts_v = 0
ts_v_alt = 0

# Color and brightness of Hub LEDs
LEDconn = Color.GREEN*0.3       # if Hub connected, color * brightness
LEDnotconn = Color.RED*0.5      # if Hub is not connect, color * brightness
remoteTimeout =10   # hub waits x seconds for remote connect after starting hub
remoteName = ""     # connect this remote only

ts_hub.light.on(Color.RED)
print (ts_hub.system.name())
try:
    remote = Remote(name=remoteName,timeout=remoteTimeout*1000)
except OSError as ex:
    ts_hub.system.shutdown()
print (remote.name())

# --- Fernbedienung abfragen ---

def Ts_FB_abfragen():

    global ts_v

    if CheckButton(ts_FB_A_UP) and not CheckButton(ts_FB_A_STOP) :
        ts_v = ts_v + 10
        if ts_v > 100 : ts_v = 100
        Ts_Fahren()
        if ts_v == 0 :
            Ts_Stop()
            wait(750)
        wait(250)

    if CheckButton(ts_FB_A_DOWN) and not CheckButton(ts_FB_A_STOP) :
        ts_v = ts_v - 10
        if ts_v < -100 : ts_v = -100
        Ts_Fahren()
        if ts_v == 0 :
            Ts_Stop()
            wait(750)
        wait(250)

    if CheckButton(ts_FB_A_STOP) :
        Ts_Stop()
        wait(250)

def Ts_Fahren():

    global ts_v
    global ts_v_alt
    global ts_v_factor

    print("V: ", ts_v)
    print("rpm: ", ts_motor_1.speed() )
    if ts_v != ts_v_alt and ts_v != 0 :
        ts_motor_1.run(ts_v*ts_v_factor)
        ts_motor_2.run(ts_v*ts_v_factor*-1)
        ts_v_alt = ts_v

def Ts_Stop():

    global ts_v
    global ts_v_alt

    ts_v = 0
    ts_v_alt = 0
    ts_motor_1.stop()
    ts_motor_2.stop()

# ----CheckButton -------------------------------------------

def CheckButton(x):
    try:
        button = remote.buttons.pressed()
        if x == "A+"  : x = Button.LEFT_PLUS
        if x == "A-" : x = Button.LEFT_MINUS
        if x == "A0"  : x = Button.LEFT

        if x == "B+"  : x = Button.RIGHT_PLUS
        if x == "B-" : x = Button.RIGHT_MINUS
        if x == "B0"  : x = Button.RIGHT
   
        if x == "CENTER"  : x = Button.CENTER
       
        if x in button:
            return True
        else:
            return False
    except:
        return()

while True:

        # --- Fernbedienung koppeln ( Code von Werner/Lok24 ) ---
    try:
        button = remote.buttons.pressed()
        ts_hub.light.on(LEDconn)
        remoteConnected = True
    except OSError as ex:
        ts_hub.light.on(LEDnotconn)
        print("Remote not connected")
        remoteConnected = False
     
        if watchdog == True:
           Ts_Stop()
           ts_hub.system.shutdown()

        try:
            # reconnect remote
            remote = Remote(timeout=1000)
            wait(100)
            print("Remote reconnected")
            remoteConnected = True
        except OSError as ex:
            print("Remote not connected")
       
    Ts_FB_abfragen()

    wait(10)
   
print("Ende")

Das Programm entstand als QuickAndDirty-Test für den Fahrtest meiner V100.4. Wenn du jetzt zb 2 Zug-Motoren einsetz, musst du das Programm anpassen und die Motoren-Klasse DCMotor statt Klasse Motor verwenden.
Das Programm ist sicher nicht die Lösung für alle Fälle und perfekt. Es war nur ein schneller Test, um die Lok fahrbereit zu haben. Aber als Beispiel, wie PyBricks mit Fernbedienung funktioniert, sollte es reichen....

Was mir nicht klar ist, wie steuere ich das ganze jetzt mit der Fernbedienung und wie lade ich das Programm dauerhaft in den HUB ?

Wenn du die Firmware PyBricks 3.2 auf dem HUB aufgespielt hast und das Programm im Browser mit Verbindung zum HUB getestet hast, ist das Programm auch dauerhaft auf dem HUB. Früher musstest du die PyBricks Firmware mit gesetzten Haken "mit Programm" auf dem HUB aufspielen, das ist bei PyBricks 3.2 nicht mehr nötig.

PyBricks Standalone Betrieb (mit auf dem HUB aufgespielter Firmware/Programm):

- HUB einschalten, LED müsste blau leuchten
- 2. Druck auf den HUB startet das Programm: LED leuchtet rot
- in den nächsten 10 Sekunden die Fernbedienung einschalten: HUB leuchtet grün und das Programm läuft
- wenn man das nicht in den 10 Sekunden macht: HUB schaltet sich ab

Fragen können gerne gestellt werden, dann sollten Probleme auch lösbar sein.

Thomas
 
Zuletzt bearbeitet:

Iceman42

Neumitglied
Registriert
4 Mai 2022
Beiträge
5
Hallo Thomas,
erst einmal vielen Dank. Ich denke das bringt mich ein gutes Stück weiter. Ich habe jetzt einfach die Zeile:

ts_motor_1 = DCMotor(Port.A)
ts_motor_1.control.limits(ts_v_max, ts_acc_max)
ts_motor_2 = DCMotor(Port.B )
ts_motor_2.control.limits(ts_v_max, ts_acc_max)

eingefügt. Nun kommt eine Fehlermeldung

AttributeError: 'DCMotor' object has no attribute 'control'
>>> ts_motor_2 = DCMotor(Port.B )
>>> ts_motor_2.control.limits(ts_v_max, ts_acc_max)

Ich vermute es liegt daran dass der Eisenbahnmotor keine Rückmeldung gibt. Aber es ist 30 Jahre her das ich das letzte mal etwas programmiert habe :)

Ich arbeite mich dann jetzt mal ein und hoffe ich kann alle Fehlerhaften Codezeilen für den Zugmotor so ändern dass ich es zum laufen bekomme.

Also nochmal vielen Dank !
Grüße
Patrik

PS: Falls ich es hin bekomme lade ich auch gerne den Code hier wieder für alle hoch. Ich wundere mich ein bisschen, dass nicht jeder das mit Pybricks macht. Habe im Forum gelesen dass manche das Kabel abschneiden und verdreht zusammenlöten nur um die Laufrichtung des Motors umzudrehen. Dann doch lieber umprogrammieren :)
 

Ts__

Eisenbahner
Registriert
6 Jan. 2016
Beiträge
2.539
Ort
Zwickau / Sachsen
Hallo Patrik,

Ich vermute es liegt daran dass der Eisenbahnmotor keine Rückmeldung gibt.

Ja, auch.

für den DCMotor solltest du auch die Zeile mit den Controls weglassen können

und die Zeilen

ts_motor_1.run(ts_v*ts_v_factor)
ts_motor_2.run(ts_v*ts_v_factor*-1)

müssen auch geändert werden. Die Klasse DCMotor kennt kein .run

ts_motor_1.duty(ts_v)
ts_motor_2.duty(ts_v*-1)

Probiere das mal.

Thomas

Ps:

diese Zeile bitte auch auskommentieren oder löschen, die dient nur für die Anzeige der Geschwindikeit auf dem PC beim testen und kann nicht mit DCMotoren funktionieren

print("rpm: ", ts_motor_1.speed() )
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Wenn du jetzt zb 2 Zug-Motoren einsetz, musst du das Programm anpassen und die Motoren-Klasse DCMotor statt Klasse Motor verwenden.
Genau, das hatte mein "Ur-Programm" selbsttätig gemacht, indem es die Ports abscannt .
Und dann auch das
ts_v_max = 1350 # deg/s
automatisch angepasst, denn das ist bei verschiedenen Motoren unterschiedlich.
 

Ts__

Eisenbahner
Registriert
6 Jan. 2016
Beiträge
2.539
Ort
Zwickau / Sachsen
Klar Werner. Ich hätte auch dein flexibles Programm als Antwort verlinkt. Aber du schreibst bei 1000 Steine, das es nicht mehr mit PyBricks 3.2 funktioniert. Und damit wäre der Link hier keine Hilfe gewesen.

Ich selbst brauche kein flexibles Programm und habe daher nicht den für mich überflüssigen Ballast drin. Ich weis ja, welche Motoren ich angeschlossen habe.
Ich habe nur hier helfen wollen und keine Antwort auf alle nichtgestellten Fragen geben wollen ;-)

Für Anfänger war dein Programm definitiv eine große Hilfe und auch mir war der Fernbedienungscode eine Hilfe. Danke dafür.

Thomas
 

Iceman42

Neumitglied
Registriert
4 Mai 2022
Beiträge
5
Guten Morgen,
auch dafür vielen Dank an euch Beide. Muss jetzt aber erst einmal auf die Arbeit, werde mich heute Nachmittag dann nochmal dran machen.
Schöne Woche und einen geruhsamen Montag.
Grüße
Patrik
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Hallo,

ich habe jetzt die Version 2.9 mal unten angehängt.

Die Idee des Programms ist eigentlich, universell zu sein und alle Parameter "oben" zusammenzufassen.
Normalerweise würde man hier eigene Klassen oder Routinen in Dateien ablegen und die dann via Import ins eigene Programm übernehmen.
Ob das mit dem neuen Editor möglich ist? keine Ahnung.

Außerdem müsste mal jemand mit Ahnung von python und OOP da "durchfegen", einiges ist eher -hm - wild.
Wenn Interesse daran besteht evtl einen Thread dazu aufmachen, oder den hier weiter nutzen?

Python:
# -----------------------------------------------
# MotorControl
#
# uses https://code.pybricks.com/ , LEGO City hub, LEGO remote control
# connect 1 or 2 motors of any kind to Port A and/or B
#
# Version 2_9
# -----------------------------------------------/
from pybricks.parameters import * # Color

# -----------------------------------------------
#  Set user defined values
# -----------------------------------------------

# define the two profiles
# profil_x = (minimun speed,maximum Speed,accelerate in steps of ..., wait for next acceleration(in ms)

Profil_A = (20,100,10,100)  #min,max,step,acc
Profil_B = (10,500,5,200)   #min,max,step,acc

# define direction of motors

dirMotorA = 1       # Direction 1 or -1
dirMotorB = -1       # Direction 1 or -1

autoacc = False      # accelarate continously when holding butten

# -----------------------------------------------
#  Set general values
# -----------------------------------------------

# assign buttons to function1
# syntax: function = "name"
# name may  be "A+","A-","A0","B+","B-","B0","CENTER"

UP = "A+"
DOWN = "A-"
STOP = "A0"
SWITCH = "CENTER"

mode=1              # start with function number...
watchdog = False    # "True" or "False": Stop motors when loosing remote connection
remoteTimeout =10   # hub waits x seconds for remote connect after starting hub
remoteName = ""     # connect this remote only

# Color and brightness of Hub LEDs
LEDconn = Color.GREEN*0.3       # if Hub connected, color * brightness
LEDnotconn = Color.RED*0.5      # if Hub is not connect, color * brightness

LED_A = Color.GREEN*0.3       # Remote Profil_A, color * brightness
LED_B = Color.RED*0.5      # Remote Profil_B, color * brightness

# -----------------------------------------------
#  Import classes and functions
# -----------------------------------------------

from pybricks.pupdevices import DCMotor, Motor, Remote
from pybricks.parameters import Port, Stop, Button, Color
from pybricks.hubs import CityHub
from pybricks.tools import wait, StopWatch
from pybricks.iodevices import PUPDevice
from uerrno import ENODEV

# -----------------------------------------------
#  function 1 / drive motors
# -----------------------------------------------

def function1():

    vmax = profile[mode].vmax
    vmin = profile[mode].vmin
    accdelay =  profile[mode].acc
    step = profile[mode].step
 
    global v
  
    if CheckButton(UP) and not CheckButton(STOP) :
        for x in range (1, step + 1):
            v = v + 1
            if v > vmax :
                v = vmax
            if v > 0 and v < vmin:   
                v = vmin
            if abs(v) < vmin:
                v = 0
            drive()
            wait (accdelay) 
            if v==0:
                break
        # further acceleration if button keeps pressed
        while autoacc == False and CheckButton(UP) :   
            wait (100)
        # avoid changing direction when reaching "0"     
        while v == 0 and  CheckButton(UP): 
            wait (100)

    if CheckButton(DOWN) and not CheckButton(STOP):
        for x in range (1, step + 1):
            v = v-1
            if v < vmax*-1 :
                v = vmax*-1
            if v < 0 and v > vmin*-1:   
                v = vmin*-1
            if abs(v) < vmin :
                v = 0   
            drive()
            wait (accdelay) 
            if v==0:
                break
        # further acceleration if button keeps pressed
        while autoacc == False and CheckButton(DOWN) :   
            wait (100)
        # avoid changing direction when reaching "0"
        while v == 0 and  CheckButton(DOWN) :   
            wait (100)
 
    if CheckButton(STOP):
        v = 0
        drive()
        wait (100)   
        
class setprofile():
    def __init__(self,pr):
        self.vmin=pr[0]
        self.vmax=pr[1]
        self.step=pr[2]
        self.acc=pr[3]

profile = [0,0,0]
profile[1] = setprofile(Profil_A)
profile[2] = setprofile(Profil_B)

# -----------------------------------------------
#  function 2
# -----------------------------------------------
          
'''
def function2():
    if CheckButton(UP):
        timer[1].set(3000)
    if timer[1].check():
        print("Do something")
'''

# -----------------------------------------------
# general program routines and classes
# -----------------------------------------------

# ----CheckButton -------------------------------------------

def CheckButton(x):
    try:
        button = remote.buttons.pressed()
        if x == "A+"  : x = Button.LEFT_PLUS
        if x == "A-" : x = Button.LEFT_MINUS
        if x == "A0"  : x = Button.LEFT

        if x == "B+"  : x = Button.RIGHT_PLUS
        if x == "B-" : x = Button.RIGHT_MINUS
        if x == "B0"  : x = Button.RIGHT
    
        if x == "CENTER"  : x = Button.CENTER
        
        if x in button:
            return True
        else:
            return False
    except:
        return()

# ----delay -------------------------------------------

class delay:
    def __init__(self,id,time=0,watch=StopWatch(),busy=False):
        self.id=id
        self.time=time
        self.watch=watch
        self.busy=busy
        print ("Init Timer",id)
    # set a timer       
    def set(self,x):
        if  self.busy == False:
            self.busy = True
            self.watch.reset()
            self.time = x
            print("Timer",timer[1].id, "set to",x)
    #check if timer is reached, then return "True"
    def check(self):
        if self.busy == True:
            if self.watch.time() > self.time:
                self.busy = False
                self.time=0
                print("Timer",timer[1].id, "stopped")
                return(True)
        else:
            return(False)

# ----drive -------------------------------------------

def drive():
    global vold
    global v
    print (v)
    if vold != v:
        # for each motor 1,2
        for x in range(1,3):
            # set speed and direction
            s = v*round(motor[x].getDir())
            # real motor commands depending on motor type
            if motor[x].getType() == "Motor" :
                motor[x].obj.run(s*motor[x].getSpeed()) #  in 2.7
            if motor[x].getType() == "DCMotor" :
                motor[x].obj.dc(s)
            if v == 0 and motor[x].getType() != "---": 
                print("stop",x)
                motor[x].obj.stop()     
            #if motor[x].getDir() != 0 and motor[x].getType() == "DCMotor" : motor[x].obj.dc(s)
        vold = v
            
# ----portcheck -------------------------------------------

def portcheck(i):
    # list of motors, 1 +2 contain string "DC"
    devices = {
    1: "Wedo 2.0 DC Motor",
    2: "Train DC Motor",
    38: "BOOST Interactive Motor",
    46: "Technic Large Motor",
    47: "Technic Extra Large Motor",
    48: "SPIKE Medium Angular Motor",
    49: "SPIKE Large Angular Motor",
    75: "Technic Medium Angular Motor",
    76: "Technic Large Angular Motor",
}
    port = motor[i].getPort()
    # Try to get the device, if it is attached.
    try:
        device = PUPDevice(port)
    except OSError as ex:
        if ex.args[0] == ENODEV:
            # No device found on this port.
            motor[i].setType("---")
            print(port, ": not connected")
            return ("---")
        else:
            raise

    # Get the device id
    id = device.info()['id']
    
    # Look up the name.
    try:
        # get the attributes for tacho motors
        if "Motor" in devices[id] and not("DC" in devices[id]):
            motor[i].setType("Motor")
            motor[i].obj = Motor(port)

            #new in 2.7
            # if motor[x].getDir() != 0 and motor[x].getType() == "Motor" : motor[x].obj.run(s*motor[x].getSpeed()) #  in 2.7
            devs_max_speed = {38:1530,46:1890,47:1980,48:1367,49:1278,75:1367,76:1278 }
            dspeed = devs_max_speed.get(PUPDevice(port).info()['id'], 1000)
            motor[i].obj.stop()
            motor[i].obj.control.limits(speed=dspeed,acceleration=10000)
            motor[i].setSpeed(dspeed/100*0.9)

        # and set type for simple DC Motors   
        if "DC" in devices[id]:
            motor[i].setType("DCMotor")
            motor[i].obj = DCMotor(port)
            
    except KeyError:
        motor[i].stype("unkown")
        print(port, ":", "Unknown device with ID", id)
    wait(100)   
    print ("--")
    print(port, ":", devices[id], motor[i].getType(),motor[i].getSpeed(),motor[i].getAcc())

# ---- device  -------------------------------------------
    
class device():
    # store the device infos for each motor
    def __init__(self,port,dir):
        self.port = port
        self.dir = dir
        self.type=""
        self.speed=99
        self.acc=99
        self.obj=""
                
    def setType(self,x) : self.type = x
    def setSpeed(self,x): self.speed = x
    def setAcc(self,x)  : self.acc = x
    
    def getType(self)   : return self.type
    def getPort(self)   : return self.port
    def getDir(self)    : return self.dir
    def getSpeed(self)  : return self.speed
    def getAcc(self)    : return self.acc

# -----------------------------------------------
# globals
# -----------------------------------------------

v = 0
vold = 0
#remoteConnected = False

# -----------------------------------------------
# Ininitialize
# -----------------------------------------------

hub = CityHub()

#define timers
timer = [0,0,0]
timer[1] = delay(1)
timer[2] = delay(2)
          
#define motors
motor = [0,0,0]
motor[1] = device(Port.A,dirMotorA)
motor[2] = device(Port.B,dirMotorB)

# get the port properties
portcheck(1)
portcheck(2)   

# -----------------------------------------------
# remote connect
# -----------------------------------------------

hub.light.on(Color.RED)
print (hub.system.name())
try:
    remote = Remote(name=remoteName,timeout=remoteTimeout*1000)
except OSError as ex:
    hub.system.shutdown()

# -----------------------------------------------
# main loop
# -----------------------------------------------

while True:
  
    # --check if remote is connected ---------------------------------
    
    try:
        button = remote.buttons.pressed()
        hub.light.on(LEDconn)
        remoteConnected = True
    except OSError as ex:
        hub.light.on(LEDnotconn)
        print("Remote not connected")
        remoteConnected = False
      
        if watchdog == True:
            v=0
            drive()
        try:
            # reconnect remote
            remote = Remote(timeout=1000)
            wait(100)
            print("Remote reconnected")
            remoteConnected = True
        except OSError as ex:
            print("Remote not connected")

            
    if CheckButton(SWITCH):
        mode = mode+1
        if mode > 2:
            mode = 1
        print (mode)
        if mode == 1 : remote.light.on(LED_A)
        if mode == 2 : remote.light.on(LED_B)   
  
        while CheckButton(SWITCH):
            button = remote.buttons.pressed()
            wait (100)

    if mode == 1 : function1()     
    if mode == 2 : function1()
    
    wait(10)
 

mick29

Meister
Registriert
26 Jan. 2015
Beiträge
2.747
Ort
Krumbach
Außerdem müsste mal jemand mit Ahnung von python und OOP da "durchfegen", einiges ist eher -hm - wild.
Wenn Interesse daran besteht evtl einen Thread dazu aufmachen, oder den hier weiter nutzen?
Hab zwar kaum Ahnung von Python aber würde dennoch gern drüberschauen (Hab anderweitig schon Programmiererfahrung sammeln dürfen). Denke aber da wäre ein eigener Thread angebracht. Das ist hier mMn zu viel des Guten ;)
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Leider scheint Werner es nicht mehr auf PyBricks 3.2 angepasst zu haben. Daher habe ich das Programm von Werner hier nicht verliinkt.
Doch, ich glaube schon, das o.a. 2.9 sollte tun.
Der Fehler war WIMRE nur, dass motor(port) plötzlich nicht mehr unterstützt wurde von pybricks 3.2
Und das war in Prog-Version 2.7.
V 2.8 wurde glaube ich nie von mir released.

Wie gesagt, ich habe das wegen mangeldem Interesse nicht weiter verfolgt.
Auf GitHub wo das ja auch zu finden war hat sich überhaupt niemand gemeldet, und auch "Pendelzug" und "Batteriekasten" hat glaube ich nie jemand probiert.
 
Oben