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.