Ultraschallsensor am Calliope


#1

Ich möchte einen Grove US-Sensor als Kollisionsschutz für ein Automodell verwenden.
Leider gelingt mir nicht mein erstelltes Programm in den Text einzufügen.
Wie geht das?
Mein Problem ist, wenn ich die Messung mit der z.B. Taste A starte funktioniert alles wunderbar.
Wenn ich das Programm aber mit “dauerhaft” beginne, dauert es etwa 30s, bis sich bei neuer Entfernung der Messwert ändert.
Könnt ihr mir da bitte helfen?

Danke für eure Bemühungen, Hans-Gerhard


#2

Hallo Hans-Gerhard!
Verwendest Du Nepo von OpenRoberta oder Makecode?
Ah, wohl makecode: rechte maustaste in einem freien feld klicken, Screenshot herunterladen auswählen und hier dann hohladen auswählen. Oder (besser) auf Javascript klicken, Text mit der Maus markieren, Strg+C (Text kopieren) Strg+V um den Text hier ins Forum zu kopieren.


#3

Hallo klmi,
danke für die schnelle Antwort.
Nachfolgend das erstellte Programm.
Mein Problem habe ich ja schon beschrieben.
Ob das mit dem Hochladen der Blöcke funktioniert hat bin ich mir nicht sicher.
Kannst mich ja bitte diesbezüglich auch informieren.
Danke,
Hans-Gerhard

let a = 0
pins.onPulsed(DigitalPin.C16, PulseValue.High, () => {
a = pins.pulseDuration() / 58
basic.showNumber(a)
pins.setPull(DigitalPin.C16, PinPullMode.PullNone)
if (a < 20) {
basic.setLedColor(Colors.Red)
} else {
basic.setLedColor(Colors.Green)
}
})
basic.forever(() => {
a = 0
basic.pause(20)
pins.digitalWritePin(DigitalPin.C16, 0)
control.waitMicros(2)
pins.digitalWritePin(DigitalPin.C16, 1)
control.waitMicros(11)
pins.digitalWritePin(DigitalPin.C16, 0)
pins.setEvents(DigitalPin.C16, PinEventType.Pulse)
})


#4

Ziehe einfach den Inhalt der dauerhaft-Schleife in den Block “Beim Start”. Sonst wird er ja dauernd parallel zu deiner Pulse Abfrage ausgeführt. Du benötigst den Kram aber nur 1x zu Beginn oder?


#5

Hallo klmi,
dein Vorschlag nur “Beim Start” entspricht doch wohl meinem Versuch mit “Taste A”, wo ja alles i.O. ist.
Ich möchte aber den Block in eine Modellautosteuerung integrieren, wo bei einem Hindernis das Auto stehen soll.
Vielleicht hast du da eine Idee?

Hans-Gerhard


#6

Sorry, ich würde alles in eine Schleife schreiben. Leider finde ich meinen Ultraschallsensor zum testen nicht. Ich meine die Zeile “Stelle Pin …” sollte weg, die ist glaube ich nur zum Auslösen eines Events, musst du halt testen. Ich hatte das damals in Nepo implementiert.

mini-Screenshot(2)


#7

Hallo klmi,
mit deinem Programmvorschlag erhalte ich jetzt bei jeder Entfernungsänderung auch sofort eine Anzeigeänderung.
Leider sind die angezeigten Entfernungswerte zu gering.
Da muss doch ev. etwas mit der ausgewerteten Impulsdauer nicht stimmen.
Bei meiner alten Programmvariante stimmten die Messwerte.
Hast du da noch eine Idee.
Habe heute nachmittag unsere Arbeitsgemeinschaft mit Schülern, da kann ich aber jetzt zumindest mit deiner Hilfe das Prinzip zeigen.
Danke,
Hans-Gerhard


#8

So, Sensor gefunden:

let Impulsdauer = 0
let Entfernung = 0
basic.forever(() => {
Entfernung = 0
Impulsdauer = 0
pins.digitalWritePin(DigitalPin.C16, 0)
control.waitMicros(2)
pins.digitalWritePin(DigitalPin.C16, 1)
control.waitMicros(10)
pins.digitalWritePin(DigitalPin.C16, 0)
Impulsdauer = pins.pulseIn(DigitalPin.C16, PulseValue.High)
Entfernung = Impulsdauer * 153 / 29 / 2 / 100
basic.showNumber(Entfernung)
pins.setPull(DigitalPin.C16, PinPullMode.PullNone)
})

Oder das Grove-Paket verwenden!


#9

Hallo klmi,
danke für die neue Version.
Funktioniert super.
Die Berechnung der Entfernung aus der Impulsdauer ist mir aber leider unklar.
Das mit geteilt durch 58 unter Berücksichtigung von Schallgeschwindigkeit und doppelter Laufstrecke in der Urversion hatte ich ja verstanden.
Kannst du mich da bitte noch aufklären?
Danke,
Hans-Gerhard


#10

Die Werte bei /58 weichen bei mir sehr von der wirklichen Entfernung ab. Ich hab dann mal beim Grove-Paket geschaut nach deren Berechnung und die haben dass so kompliziert berechnet.
Das Problem sind ja beim Mini auch die Rundungsfehler. Wenn ich die Zahl erst mit 153 multipliziere teile ich dann eine goße Zahl durch eine kleinere Zahl -> Die Nachkommastelle wird kleiner. Bei : 2 teile ich durch noch eine kleinere Zahl. Und durch 100 verschiebt ja nur das Komma um 2 Stellen.
(So erkläre ich mir die komplizierte Berechnung)
Und der Wert ist bei mir genauer als bei der anderen Berechnung. (Ob meine Ausführung stimmt oder nicht)

Viele Grüße

Michael


#11

Hallo klmi,
jetzt funktioniert zumindest der Einsatz des US-Sensors zur Entfernungsmessung.
Die Integration als Kollisionsschutz bei der Autosteuerung wartet noch.
Hans-Gerhard


#12

Hallo klmi,
bei der Integration des oben aufgeführten Programmes zur US-Entfernungsmessung in die zu realisierende Motorsteuerung hatte ich das Problem, dass in undefinierten zeitlichen Abständen auch bei größeren Messabständen die Entfernung Null ausgegeben wurde und bei Auswertung dann das Programm auf Kolossion entschied, obwohl im Überwachungsbereich kein Gegenstand vorhanden war.
Mit Verwendung des Grove-US-Block war diese Problem behoben.


Leider bin ich nicht in der Lage nachzuvollziehen, wie der Block programmiert ist.
Gibt es da eine Möglichkeit?
Nochmals Danke,
Hans-Gerhard


#13

Gehe statt Blöcke auf Javascript, Explorer > aufklicken
Grove aufklicken, main.ts klicken


#14

Hallo klmi,
verstehe ich leider noch nicht.
Was meinst du mit Explorer > aufklicken usw…?
Wie mache ich das?
Hans-Gerhard


#15

Hallo klmi,
konnte doch deinen Weg nachvollziehen.
Ist aber z.Z. alles noch wie Böhmische Dörfer.
Entschuldigung.
Hans-Gerhard


#16

jetzt hab ichs aber schon mühevoll gemalt :wink: