Ultraschallsensor am Calliope

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

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.

1 „Gefällt mir“

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)
})

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?

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

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)

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

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!

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

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

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

1 „Gefällt mir“

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

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

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

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

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

Hallo zusammen,
bin neu hier im Forum … und versuche gerade einen ganzen Schwung Grove Sensoren zum laufen zu bekommen.
Der “Grove Ultraschallsensor 3,3V/5V” funktioniert echt klasse. Er zeigt die gemessene Strecke in cm sehr zuverlässig an.
Nun habe ich mir den Grove Line Finder v1.1 vorgenommen. - Hier wird es schon schwieriger…zumindest kann ich Ihm analoge Werte entlocken aber keine schwatz/weiß Erkennung.
Vielleicht hat hier jemand Erfahrung?
Besten Dank schon im voraus…
Gruß Dirk

Hallo zusammen,
ich hab mich jetzt auch mal mit dem Thema beschäftigt und eine Lösung ohne Grove mit dem HC-SR04P und Nepo gebaut. Der HC-SR04P (Nur auf der Rückseite aufgedruckt) hat im Gegensatz zum HC-SR04 keinen eingebauten Oszillator, d.h. jede Messung muss getriggert werden. Der Sensor kann auch mit 3 V Spannung betrieben werden Als Antwort kommt die Laufzeit der 40kHz Messpulse in Mikrosekunden. Für eine Distanz von 1 cm beträgt die Laufzeit 1.000.000 us / 34.300 cm (Schallgeschwindigkeit) = 29,15 us. Das ganze noch multipliziert mit 2 (Hin- und Rückweg) ergibt den Wert von 58,3 us pro cm Distanz zu einem Objekt.
Man kann den Sensor (Trigger und Echo) sowohl an die 4 Außenpins P0 - P3 anschließen oder an die lange Steckleiste, wobei es aber nicht mit den doppelt belegten Pins C0 - C3 und C16 - C19 funktioniert. Allerdings verhält sich bei Anschluss an C4 - C8 und C10 - C13 das 5x5 Matrix Display etwas “merkwürdig”, da dann abhängig vom Pin einige LED’s leuchten - wer kann mir das bitte erklären?
Besten Dank schon mal und Grüße an alle!
Hubert
HC-SR04Pv
HC-SR04Ph

Hier die Erklärung für dich:
Die von dir genannten Pins sind doppelt belegt, d.h. sie dienen eigentlich zur Ansteuerung des LED-Displays. Du kannst sie aber auch wie normale Pins ansteuern. Dann gibt es halt schöne Muster auf dem Display. In Makecode kannst Du das Display ausschalten dann fällt das nicht auf.
Der Sensor müsste eigentlich auch mit C1 und C2, sowie C16 und C17 funktionieren. Hm.

1 „Gefällt mir“

Vielen Dank, so etwas habe ich vermutet
Die Anschlüsse C1 bis C3 und C13 bis C15 sind mit NEPO nicht auswählbar. Bei C16 und C17 kommt als Pulszeit immer nur der Wert -1 :thinking: