Calliope2.1 und Calli!bot2e Problem mit Antrieb

Ich versuche mit dem Roboter und der Stoßstange unter MakeCode den Roboter anzusteuern.
Ich habe das mit 2 Dauerhaft-Bereichen realisiert.
Eine davon steuert einfach nur die LEDs am Boden des Fahrzeugs an, solange das Fahrzeug gestartet ist.
Die andere steuert das Fahrzeug. Mit 2 ineinandergeschachtelten Wenn-Bedingungen. Die erste für den Start an sich, die 2. für die Stoßstangen-Sensoren und die entsprechende Reaktionen der Antriebsräder.
Das funktioniert meist auch ganz gut. Leider schaltet der Roboter hin und wieder einfach auf volle Geschwindigkeit, obwohl ich dies nicht angesteuert habe. Hin und wieder geht auch ein Antrieb gar nicht an, obwohl er angesteuert wird. Ich habe die entsprechenden Programmteile über die LEDs signalisiert, so dass ich sicher bin, was passieren sollte aber leider irgendwie nicht passiert.
Habe mein Programm schon diverse Male umgestellt und mit mehreren Geschwindigkeiten herumexperimentiert. Leider alles ohne Erfolg. Vielleicht passiert es mit höheren Geschwindigkeiten nicht ganz so oft, bzw. bei voller Geschwindigkeit sieht man auch nicht mehr, ob er diese außer der Reihe ansteuert.
Falls da jemand eine Idee hat, würde mich über Hinweise freuen…
Die neueste Firmware habe ich auf den Calliope aufgespielt und die passende Erweiterung (Calli:bot 2E) habe ich verwendet.

Du darfst den i2c-Bus nicht aus verschiedenen Ereignissen heraus aufrufen. Bei mehreren Dauerhaft Schleifen oder der grünen alle xx ms Schleife kommt es zu Kollisionen. Und alles, was auf dem Calli:bot drauf ist, wird über i2c angesteuert.

Das gilt übrigens auch für den Kompass-Lage-Sensor. Winkel und Beschleunigung müsste auch in der selben Schleife abgefragt werden.

Entferne die Schleife für die LEDs und baue den Code mit in die andere Schleife rein. Es sollte möglich sein, in einer zweiten Schleife Variablen zu setzen, die dann in einer einzigen „i2c-Schleife“ ausgewertet werden.

Das muss ich noch updaten:

25.10. Die Readme Seite und die Erweiterung i2c ist aktualisiert. Interessant ist auch i2c-Scan. Damit können alle aktiven i2c-Adressen am Bus gefunden werden, auch die internen.

Vielleicht kann mir noch jemand helfen, wie ich bei den Blöcken als Parameter eine Variable anzeigen kann, die erst entsteht wenn man die Blöcke benutzt? Also dort wo man Löcher sieht, wo eigentlich ein Buffer rein muss. Mit shadow gelingt das mit Funktionen, aber nicht mit Variablen, (die noch gar nicht da sind).
image

1 „Gefällt mir“

vielen Dank für die schnelle Reaktion.
Ich bau meinen Ablauf entsprechend um.

ich bin am Verzweifeln mit dem MakeCode Editor. Jedes Mal wenn ich von Python auf Blöcke zurückschalte, sind die Motor-Ansteuerungen mit Vorwärts/Rückwärts defekt, da es anscheinend Probleme mit den Umlauten beim Konvertieren gibt. Bisher habe ich leider keine Möglichkeit gefunden das in den Einstellungen anzupassen…

Versuche es mal mit der Erweiterung vom M. Klein. Er hat die Umlaute in den Enums repariert.

MKleinSB/pxt-callibot

MKleinSB/pxt-callibot: Extension for the Calliope mini Calli:bot 1 and 2 (github.com)

super, vielen Dank.
Ich hab jetzt meinen Ablauf umgestellt. Alles in einem Ablauf. Leider immer noch mit den gleichen Problemen.
Sollten die Aufrufe für die LEDs und die für Antriebe auch nur einmal am Ende des Ablaufs erfolgen? Aktuell habe ich einfach mal 2 Schrittketten eingebaut. Zuerst die für die LEDs, dann die für die Antriebe.
Das Gefährt wehrt sich :face_with_raised_eyebrow:

Ich habe jetzt das ganze noch mit der neuen Erweiterung gemacht. Das Umstellen von Python auf Blöcke funktioniert jetzt tadellos.
Vielen Dank dafür!
Leider immer noch das gleiche Verhalten bei den Antrieben…

Habe überlegt, obe es noch an der Pin0 / Pin3 / KnopfA/B Abfrage liegen könnte.
Diese nutze ich zum Einstellen der Geschwindigkeit und zum Eun- und Ausschalten.
Habe sie temporär entfernt, leider ohne Verbesserung.
Poste hier mal meinen Code:

Start = 0
Geschwindigkeit = 0
ZeitAktuell = 0
BelDauer = 0
ZeitBelWechsel = 0
SchrittnummerGlobal = 0
SchrittNummerLED = 0
BelBlau = 0
BelGruen = 0
BelRot = 0
SchrittnummerGlobalAlt = 0
SchrittnummerLEDAlt = 0

def on_button_a():
global Start
Start = 0
input.on_button_event(Button.A, input.button_event_click(), on_button_a)

def on_button_b():
global Start
Start = 1
input.on_button_event(Button.B, input.button_event_click(), on_button_b)

def on_pin_touch_p0():
global Geschwindigkeit
Geschwindigkeit = Geschwindigkeit - 4
if Geschwindigkeit < 0:
Geschwindigkeit = 0
input.on_pin_touch_event(TouchPin.P0, input.button_event_down(), on_pin_touch_p0)

def on_pin_touch_p3():
global Geschwindigkeit
Geschwindigkeit = Geschwindigkeit + 4
if Geschwindigkeit > 100:
Geschwindigkeit = 100
input.on_pin_touch_event(TouchPin.P3, input.button_event_down(), on_pin_touch_p3)

def on_forever():
global ZeitAktuell, BelDauer, Geschwindigkeit, Start, SchrittnummerGlobal, BelBlau, BelGruen, BelRot, SchrittNummerLED, ZeitBelWechsel, SchrittnummerGlobalAlt, SchrittnummerLEDAlt
ZeitAktuell = control.millis()
BelDauer = ZeitAktuell - ZeitBelWechsel
if SchrittnummerGlobal == 0:
calliBot2.motor_stop(C2Motor.BEIDE, C2Stop.BREMSEN)
Geschwindigkeit = 20
Start = 0
basic.set_led_color(0x00ff00)
basic.show_string(„ON“)
SchrittnummerGlobal = 10
elif SchrittnummerGlobal == 10:
if Start == 1:
basic.show_icon(IconNames.HAPPY)
if calliBot2.read_bumper_sensor(C2Sensor.RECHTS, C2State.AN) and calliBot2.read_bumper_sensor(C2Sensor.LINKS, C2State.AN):
calliBot2.set_led(C2Motor.LINKS, True)
calliBot2.set_led(C2Motor.RECHTS, True)
calliBot2.motor(C2Motor.LINKS, C2Dir.RUECKWAERTS, Geschwindigkeit)
calliBot2.motor(C2Motor.RECHTS, C2Dir.RUECKWAERTS, Geschwindigkeit)
basic.pause(500)
calliBot2.motor(C2Motor.LINKS, C2Dir.VORWAERTS, Geschwindigkeit)
calliBot2.motor(C2Motor.RECHTS, C2Dir.RUECKWAERTS, Geschwindigkeit)
basic.pause(400)
elif calliBot2.read_bumper_sensor(C2Sensor.RECHTS, C2State.AN):
calliBot2.motor_stop(C2Motor.RECHTS, C2Stop.BREMSEN)
calliBot2.motor(C2Motor.LINKS, C2Dir.RUECKWAERTS, Geschwindigkeit)
calliBot2.set_led(C2Motor.LINKS, False)
calliBot2.set_led(C2Motor.RECHTS, True)
elif calliBot2.read_bumper_sensor(C2Sensor.LINKS, C2State.AN):
calliBot2.motor_stop(C2Motor.LINKS, C2Stop.BREMSEN)
calliBot2.motor(C2Motor.RECHTS, C2Dir.RUECKWAERTS, Geschwindigkeit)
calliBot2.set_led(C2Motor.LINKS, True)
calliBot2.set_led(C2Motor.RECHTS, False)
else:
calliBot2.motor(C2Motor.LINKS, C2Dir.VORWAERTS, Geschwindigkeit)
calliBot2.motor(C2Motor.RECHTS, C2Dir.VORWAERTS, Geschwindigkeit)
calliBot2.set_led(C2Motor.LINKS, False)
calliBot2.set_led(C2Motor.RECHTS, False)
if SchrittNummerLED == 1:
if Start == 1:
BelBlau = 0
BelGruen = 0
BelRot = 16
SchrittNummerLED = 2
SchrittNummerLED = 2
ZeitBelWechsel = control.millis()
elif SchrittNummerLED == 2:
calliBot2.set_rgb_led(C2RgbLed.LV, BelRot, BelGruen, BelBlau)
calliBot2.set_rgb_led(C2RgbLed.RV, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.LH, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.RH, 0, 0, 0)
if BelDauer >= 10:
SchrittNummerLED = 3
ZeitBelWechsel = control.millis()
elif SchrittNummerLED == 3:
calliBot2.set_rgb_led(C2RgbLed.LV, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.RV, BelRot, BelGruen, BelBlau)
calliBot2.set_rgb_led(C2RgbLed.LH, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.RH, 0, 0, 0)
if BelDauer >= 10:
SchrittNummerLED = 4
ZeitBelWechsel = control.millis()
elif SchrittNummerLED == 4:
calliBot2.set_rgb_led(C2RgbLed.LV, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.RV, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.RH, BelRot, BelGruen, BelBlau)
calliBot2.set_rgb_led(C2RgbLed.LH, 0, 0, 0)
if BelDauer >= 10:
SchrittNummerLED = 5
ZeitBelWechsel = control.millis()
elif SchrittNummerLED == 5:
calliBot2.set_rgb_led(C2RgbLed.LV, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.RV, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.RH, 0, 0, 0)
calliBot2.set_rgb_led(C2RgbLed.LH, BelRot, BelGruen, BelBlau)
if BelDauer >= 10:
SchrittNummerLED = 2
ZeitBelWechsel = control.millis()
if BelRot > 0:
BelBlau = 0
BelGruen = 16
BelRot = 0
elif BelGruen > 0:
BelBlau = 16
BelGruen = 0
BelRot = 0
elif BelBlau > 0:
BelBlau = 0
BelGruen = 0
BelRot = 16
else:
calliBot2.set_rgb_led(C2RgbLed.ALL, 0, 0, 0)
if Start == 0:
BelBlau = 0
BelGruen = 0
BelRot = 0
SchrittNummerLED = 1
calliBot2.set_rgb_led(C2RgbLed.LV, BelRot, BelGruen, BelBlau)
calliBot2.set_rgb_led(C2RgbLed.RV, BelRot, BelGruen, BelBlau)
calliBot2.set_rgb_led(C2RgbLed.LH, BelRot, BelGruen, BelBlau)
calliBot2.set_rgb_led(C2RgbLed.RH, BelRot, BelGruen, BelBlau)
calliBot2.motor_stop(C2Motor.BEIDE, C2Stop.BREMSEN)
if Geschwindigkeit > 96:
basic.show_leds(„“"
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
„“„)
elif Geschwindigkeit > 92:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# # # # #
# # # # .
„“„)
elif Geschwindigkeit > 88:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# # # # #
# # # . .
„“„)
elif Geschwindigkeit > 84:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# # # # #
# # . . .
„“„)
elif Geschwindigkeit > 80:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# # # # #
# . . . .
„“„)
elif Geschwindigkeit > 76:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# # # # #
. . . . .
„“„)
elif Geschwindigkeit > 72:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# # # # .
. . . . .
„“„)
elif Geschwindigkeit > 68:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# # # . .
. . . . .
„“„)
elif Geschwindigkeit > 64:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# # . . .
. . . . .
„“„)
elif Geschwindigkeit > 60:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
# . . . .
. . . . .
„“„)
elif Geschwindigkeit > 56:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # #
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 52:
basic.show_leds(“„“
# # # # #
# # # # #
# # # # .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 48:
basic.show_leds(“„“
# # # # #
# # # # #
# # # . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 44:
basic.show_leds(“„“
# # # # #
# # # # #
# # . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 40:
basic.show_leds(“„“
# # # # #
# # # # #
# . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 36:
basic.show_leds(“„“
# # # # #
# # # # #
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 32:
basic.show_leds(“„“
# # # # #
# # # # .
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 28:
basic.show_leds(“„“
# # # # #
# # # . .
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 24:
basic.show_leds(“„“
# # # # #
# # . . .
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 20:
basic.show_leds(“„“
# # # # #
# . . . .
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 16:
basic.show_leds(“„“
# # # # #
. . . . .
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 12:
basic.show_leds(“„“
# # # # .
. . . . .
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 8:
basic.show_leds(“„“
# # # . .
. . . . .
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 4:
basic.show_leds(“„“
# # . . .
. . . . .
. . . . .
. . . . .
. . . . .
„“„)
elif Geschwindigkeit > 0:
basic.show_leds(“„“
# . . . .
. . . . .
. . . . .
. . . . .
. . . . .
„“„)
else:
basic.show_leds(“„“
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
„“")
SchrittnummerGlobalAlt = SchrittnummerGlobal
SchrittnummerLEDAlt = SchrittNummerLED
basic.forever(on_forever)

Du könntest in MakeCode oben auf das Symbol Projekt teilen
image
klicken und dann den Link hier posten. Der sieht ungefähr so aus:
https://makecode.calliope.cc/_xyz
Dann können wir dein Projekt mit einem Klick sehen.

Ok, danke für den Hinweis:

So, ein Problem hab ich gefunden. Der angezeigte Smiley im Fahr-Betrieb hat das ganze ziemlich ausgebremst.
Leider fährt manchmal ein Antrieb immer noch nicht und manchmal fährt der Bot einfach mit 100%.

Hab noch vermutet, dass die Pause-Befehle eventuell noch zu Problemem führen und hab die Pausen jetzt auch über die Schrittkette gelöst.
Das hatte allerdings keinen Einfluss.
Ich habe jetzt noch nach meiner Richtungsänderung noch ein „Stoppe Motor beide auslaufend“ eingefügt, bevor ich wieder vorwärts fahre. Das hat geholfen. Das Problem dass nur noch ein Antrieb angeht, ist damit gelöst.
Lediglich das Problem, dass der Bot hin und wieder mit hoher Geschwindigkeit fährt besteht weiterhin

Schön, wie geduldig du bist.
Die Anzeige in der 5x5 LED Matrix dauert extrem lange, die würde ich in einer Schleife, die Echtzeit simuliert, nicht verwenden. Weil davon der i2c-Bus nicht betroffen ist, könnte das in einer zweiten Schleife stehen. Da würde ich nicht dauerhaft nehmen, sondern z.B. alle 1000 ms.

Wie fährt denn das Modell, wenn nichts angezeigt wird? Auch die LEDs auf dem Modell würde ich mal weg lassen, um nur die Motoren zu testen.

Es gibt unter LED einen Block Zeichne Säulendiagramm, der könnte das vereinfachen. Habe ich noch nicht probiert.

Wenn zu schnell auf den i2c-Bus gehämmert wird, kann der Datenpakete verschlucken. Auch braucht Hardware manchmal Millisekunden, bis so ein Kommando verarbeitet ist, bevor das nächste akzeptiert wird. Es ist auch nicht effektiv, jedes Byte einzeln zu übertragen, so wie das programmiert ist.

Ich würde versuchen zwischen den kritischen Blöcken, die z.B. den Motor steuern, kurze Pausen einzuschieben. 50ms kann schon reichen.

Danke für Deine Erleuterungen.
Ich habe den Calliope ausprobiert, weil meine Tochter in der 4. Klasse damit ankam.
Den Calli:bot fand ich ganz nett, um auch etwas Anschauliches zu haben.
Ich habe allerdings nicht mit so vielen Schwierigkeiten gerechnet, da ich davon ausgegangen bin, dass das Ganze „Schülertauglich“ wäre.
So wie ich das sehe, muss, dass das Ganze auch wirklich „Schülertauglich“ wird, ich eine Ansteuerung finden, die stabil läuft und etwas sicherer ist bei der Signalübertragung.
Ich muss mich also noch wesentlich tiefer und eingehender mit dem Thema befassen…
Vorerst läuft der Bot aber soweit, dass meine Kids sich damit beschäftigen.
Ich versuch mal ein Video zu machen…

1 „Gefällt mir“

ist das Fahrzeug gestoppt, kann die Geschwindigkeit mit den P0 / P3 eingestellt werden. Das ganze in 4% Schritten und auf den LEDs visualisiert. Mit den Tastern am Calliope wird das Fahrzeug gestartet / gestoppt

Ich mache selbst Ganztagsangebot mit Calliope in 4 Schulen. Calliope sind überall in ausreichenden Stückzahlen vorhanden - und werden im Unterricht nicht genutzt. Dazu müssten sie erst mal „Werkenlehrerinnentauglich“ sein. Welche Werken-Lehrerin hat jemals programmiert? Ich schätze sehr, wenn das im Einzelfall mal passen sollte. Es wird aber auch nicht die Gelegenheit genutzt, Experten mit in den Unterricht zu holen, die sich mit so was auskennen.

Im Gymnasium waren bei vielen Batterieboxen die schwarzen Kabel raus gerissen und die Batterien leer + ausgelaufen. Da wurden sie wohl doch benutzt.

„Schülertauglich“ gilt wohl nur für den Calliope mini, wie er geliefert wird. Die ganzen MakeCode Erweiterungen hinterlassen bei mir den Eindruck, dass sie einmal in die Welt gesetzt wurden und dann nicht mehr gepflegt werden. Schließlich sind das alles Privatpersonen, die sich einmal engagiert haben und dann keine Zeit mehr haben. Das soll keine Kritik sein, aber man muss das einordnen und kann keinen Support erwarten.

In den pädagogischen Anleitungen wird auch meistens Roberta benutzt, da ist das Thema Erweiterungen sehr übersichtlich. MakeCode scheint für die Hobbybastler wie Du und ich geeignet zu sein, und Open Roberta für die Pädagogen. Schüler sind da flexibel.

Genau wie du schreibst: „Ich muss mich mit dem Thema befassen.“ habe ich mich erinnert, dass ich Programmierer bin und dann habe ich mich nach 3 Jahren Calliope mit Schülern in den Sommerferien (alleine) mit GitHub beschäftigt und meine Erweiterungen und Blöcke selber programmiert. Das war dann viel einfacher als erwartet… Ich kann es empfehlen.

Meine eigenen Erweiterungen für Hardware laufen dann im Dauertest und ich bin überrascht, dass es tatsächlich funktionieren kann. Das Problem ist wohl die Software. Und da sind die Programmierer unter uns gefragt.

Schüler lernen sehr schnell nach einem gedruckten Schnappschuss die Blöcke nach zu bauen. Die Übertragung per Bluetooth scheitert dann aber meistens nicht an den Schülern, sondern wieder an fehlerhafter … Software.

Ich hab mir das Thema mit den Erweiterungen angeschaut. Sieht auf jeden Fall machbar aus, nur muss ich schauen, wieviel Zeit ich in meiner Freizeit wirklich in das Thema investieren kann und möchte. Ich hab das Thema beruflich schon an der Backe… (Softwareentwicklung für Sondermaschinen)…
Ich habe auf jeden Fall noch ein paar Projekte geplant, werde also auf jeden Fall dran bleiben (Meine Fischertechnik Computing Modelle warten auch noch auf ein Revival. Calli:bot hat auch noch Sensoren, die noch benutzt werden sollen…)
Auch wenn der Calliope eher schülertauglich ist, haben meine Kids deutlich mehr Interesse, sobald sich auch etwas bewegt. Beim Calliope alleine waren sie nicht sehr ausdauernd.
Der Calli:bot war, auch wenn’s Anlaufschwierigkeiten gab, eine gute Erweiterung, um das Ineresse für das Thema aufrecht zu erhalten. Sobald sie mit ihm interagieren konnten, hat sie das begeistert. Und mir hat es auch Spass gemacht. Mal etwas Anderes…

Eben habe ich Rückmeldung von Herrn Knobloch von Knotech erhalten: Am Thema mit der hohen Geschwindigkeit (schnell Fahren) sind sie dran…das war also nicht auf meiner Seite.

GitHub - spsprofi/Callibot_V1: Calliope mit Calli:Bot 2E

1 „Gefällt mir“