Hallo Calliope Team,
da es bei Nutzung der aktuellen Version der Firmware für den 2.1 ein paar Probleme mit den am Grove-Connector angeschlossenen Erweiterungen gibt, wollte ich mal anfragen, ob man zu Testzwecken irgendwo die alte Firmware noch einmal downloaden und testen kann.
Z.B. funktioniert der Grove-Ultrasonic-Ranger von Seeedstudio nicht betriebsstabil. Er sendet mit der derzeit zur Verfügung stehenden Grove-SW-Erweiterung oft eine „0“ als Messwert, auf dem MotionKit auch öfter „-1“.
Danke und viele Grüße,
Tim
Bitte immer angeben:
Versionsnummer auf dem mini: 2.1
Betriebssystem: jlinkobcalliopemini_v21_230822
Benutzter Editor: MakeCode
Hey Tim,
vielleicht hilft dir der Beitrag von Lutz weiter. Er hat alte Firmware auf seiner Seite verlinkt.
https://forum.calliope.cc/t/fehler-mit-calliope-v2-0-und-macbook-air-m2/2930/11
Ralf
Die Firmware vom Calliope ist ganz sicher die falsche Stelle, um solche Fehler zu suchen. Das Betriebssystem ist gar nicht darin enthalten und wird erst mit der HEX Datei übertragen. Jeder Editor lädt sein eigenes Betriebssystem auf den Calliope.
Und von einem Ultraschall Sensor kannst du auch nicht zu viel erwarten. Er (oder die Software) liefert regelmäßig ungültige Werte, die der Programmierer aussortieren muss.
Den Code der Grove Erweiterung findest du im schwarzen Explorer. Den kannst du selber nachbauen und optimieren. So eine 20 Microsekunden Pause ist nicht immer genau, weil sie durch andere Threads gestört werden kann. Es funktioniert vielleicht, wenn der Calliope gar nichts anderes macht. Und so wurde es auch vom ersten Programmierer getestet, möglicherweise auch nicht mit einem Calliope…
export function measureDistance(pin: DigitalPin, unit: DistanceUnit): number {
let duration = 0;
let range = 0;
const boardVersionDivider = ((control.ramSize() > 64000) ? 29 : 44); // CODAL = 29, DAL = 44
const distanceUnitDivider = (unit == DistanceUnit.cm ? 1 : 2.54); // cm = 1, inch = 2.54
pins.digitalWritePin(pin, 0);
control.waitMicros(2);
pins.digitalWritePin(pin, 1);
control.waitMicros(20);
pins.digitalWritePin(pin, 0);
duration = pins.pulseIn(pin, PulseValue.High, 50000); // Max duration 50 ms
range = Math.round(duration * 153 / boardVersionDivider / 2 / 100 / distanceUnitDivider);
if (range > 0) distanceBackup = range;
else range = distanceBackup;
basic.pause(50);
return range;
}
Der Code vom Motion Kit ist auch zu sehen. Hier werden beide Parameter ignoriert. Es wird nicht der Ultraschallsensor abgefragt, sondern über I2C der Controller auf dem Motion Kit. Was der mit dem Ultraschallsensor macht, wissen wir nicht. Bei Werten außerhalb 1..399 cm wird -1 zurück gegeben.
//% weight=95
//% blockId=maqueen_ultrasonic block="Ultraschallsensor |%unit "
export function ultrasonic(unit: DistanceUnit, maxCmDistance = 500): number {
let integer = readData(0x28, 2);
let distance = integer[0] << 8 | integer[1];
return (distance > 399 || distance < 1) ? -1 : distance;
}
Calliope Erweiterungen haben meistens eine Lebensgeschichte, dass viele „Programmierer“ voneinander abgeschrieben haben und niemand hat den Code verstanden. Diese Funktion ist ein typisches Beispiel dafür. Beide Parameter sind überflüssig, einer ist nur als Block zu sehen.
Auch gibt es Blöcke für Infrarot. Auf der Calliope Seite gibt es aber keine Idee, was ich damit machen soll.
Wenn dann der Code funktioniert und das Modell fährt, ärgerst du dich, dass die Entfernung nur geradeaus richtig gemessen wird und an schräge Hindernisse fährt es an.
Ich habe einen Ultraschallsensor gefunden, der auch schräg gute Ergebnisse liefert und direkt über I2C angeschlossen wird. Den Schall erzeugt und empfängt der selber und es wird eine fertige Zahl in Zentimeter geliefert.