Motion Kit V2 mit Bluetooth steuern

Ich habe den Calliope V1.3 auf ein Motion Kit V2 gesteckt und programmiere ihn mit MakeCode. Beim Start stelle ich ein Muster auf der LED-Matrix dar. Beim Druck auf Taste A fahre ich eine vordefinierte Strecke. Soweit funktioniert das. Wenn ich nun die Bluetooth-Erweiterung lade, wird das Muster auf den LEDs nach dem Start verändert und er reagiert nicht auf den Tastendruck. Bluetooth funktioniert auch ohne Motion Kit nicht. Ist die Bluetooth-Erweiterung nicht mit dem V1.3 oder dem Motion Kit kompatibel?
Als Workaround hatte ich MakeCode für Micro:Bit ausprobiert, da funktioniert Bluetooth, aber ich kann das Motion Kit nicht ansteuern.

Hallo Feli,
ich denke dass das Problem auftritt weil zu wenig Speicher für die Bluetootherweiterung vorhanden ist. Verzichte mal auf jegliche Ausgaben über die LED-Matrix und verwende stattdessen die RGB-LED.
Kannst ja mal den Code per Link teilen.

Viel Spaß und guten Rutsch

Michael

Hallo Michael,
Folgendes hab ich jetzt probiert:

Das hat nach dem Pairen genau einmal funktioniert, die LED wurde rot, nachdem ich 1 gesendet hab. Dann hat es nicht mehr funktioniert.
Senden tu ich übrigens vom Handy mit einer AppInventor-App, die mit dem Micro:Bit-Workaround funktioniert.
Happy new year
Feli

Ohje, da passe ich.
Habe ewig versucht was mit dem App-Inventor am Calliope zum Laufen zu bringen.
Am Speicher liegt es auf jeden Fall nicht.

Hallo Feli,

probier es doch mal mit diesem Projekt Bluerobot (ich habe nur die Einstellungen verkleinert). Vielleicht geht es damit schon besser?

Wie hast du das mit App-Inventor denn gemacht? Ich habe den schon sehr lange nicht mehr ausprobiert, es würde mich aber total interessieren, wie das funktioniert. Hast du einen Link zu einer Anleitung oder so?

Hallo Jörn,
ich glaube, das mit dem Appinventor ist ein Missverständnis, ich hab damit nicht den Calliope programmiert, sondern das Bluetooth-Gegenstück auf dem Handy. Man kann sich dort mit einem Google-Account unter https://ai2.appinventor.mit.edu/ einloggen und gleich loslegen. Ich wollte meine App als Beispiel mitschicken, darf aber als neuer User keine Dateien anhängen.
Unter Deinem Link sehe ich nur ein leeres Projekt ohne Bluetooth-Erweiterung, ist da was schiefgegangen oder sehe ich nur nicht, worauf’s ankommt?

Hallo Feli,

da sollte dein Projekt drin stecken. Es gibt aber einen Konflikt mit den Einstellungen und deshalb ist da dann irgendwie alles gelöscht. Sorry! Jetzt aber nochmal: Bluerobot :slight_smile:
Da würde es mich interessieren, ob das besser klappt. Ansonsten wäre es auch eine Möglichkeit mit einer älteren MakeCode-Version das Programm auszuprobieren. Die früheren Versionen gehen sparsamer mit dem Speicher um.

Ja, das funktioniert! Allerdings nur, bis ich die MotionKit-Erweiterung lade, dann nicht mehr. Die Reaktion erfolgt meistens erst nach dem nächsten Senden, aber das kann ich wahrscheinlich auf der Sendeseite beheben…
Hast du jetzt nur das partielle flashen in den Projekteinstellungen ausgeschaltet oder noch was, das ich nicht sehe?

Meinst du, dass das Programm ganz am Anfang (nach Reset) erst kurz funktioniert und sich dann aufhängt?

In der Erweiterung MotionKit V2 ist eine Hintergrund Schleife, die I²C aufruft. Das führt in der Regel dazu, dass sich der I²C Bus aufhängt, weil der kein MultiThreading verträgt. I²C Aufrufe dürfen immer nur in einem einzigen Thread gemacht werden.

Es gibt einige Erweiterungen, die das nicht berücksichtigen und nach kurzer Zeit hängen bleiben. Das Calliope Programm läuft noch, nur die Erweiterungen können über I²C nicht mehr mit den Registern in der Hardware kommunizieren. Dann ist der komplette I²C Bus gestört und andere Erweiterungen, die vorher noch funktionierten, hängen auch.


    basic.forever(() => {
        if (irFlag == 1) {
            let buf = readData(0x2B, 4);
            let data = buf[3] | (buf[2] << 8) | (buf[1] << 16) | (buf[0] << 24);
            if (data != 0){
                irCallback(irKeyValueConversion(data));
            }
        }
        if (ltFlag == 1) {
            let data = readData(0x1D, 1)[0];
            switch(ltStatus) {
                case 0x11: if(data & 0x01) { ltCallback();break }
                case 0x12: if(!(data & 0x01)) { ltCallback(); break }
                case 0x13: if (data & 0x02) { ltCallback(); break }
                case 0x14: if (!(data & 0x02)) { ltCallback(); break }
            }
        }
        basic.pause(100);
    })

Ja, es funktioniert einmal nach dem Reset, aber nur wenn ich 1 sende, bei 2 und 3 nicht. Wenn ich Deinen Code in main.ts einbau, funktioniert die Verbindung gar nicht mehr (war das so vorgesehen?)

Nein, das ist der Ausschnitt aus der Erweiterung MotionKit V2, Datei maqueen.ts, der den Fehler nach meiner Vermutung verursacht.

Diese Dauer-Schleife greift im Hintergrund auf den I²C Bus zu, weil readData aufgerufen wird. Wenn dann ein normaler Block auf den Bus will, passiert sozusagen ein Verkehrsunfall. Da kommt man nur noch mit Reset raus.

Seltsam ist, dass in dem Code nicht drin steht, wer das programmiert hat.
Calliope verkauft zwar Motion Kit, aber der Link zur Information ist ein 404 Fehler. Ich kenne CalliBot. Was ist der Unterschied?