Ultraschall Sensor HC-SR04 an Pokeys - WIE

Ich möchte gerne meinen Zisternen Füllstand erfassen und habe mir, da ja sowohl IPS als auch Pokeys im Haus sind, mir im fernen China einen Ultraschall Entfernungsmesser bestellt.
Kostet nur ein paar Cent dort.

Wenns funktioniert sind auch wasserfeste Geräte zu haben.

Es handelt sich um den HC-SR04.
Datenblätter gibts wie Sand am Meer und auch am Arduino wird der unterstützt.
Ich hab aber halt einen Pokeys - und keinen Plan wie man dort Zeitabläufe messen könnte.

Es gibt 2 Pins

  • Trigger
  • Echo
    Vom Prinzip her triggert man den Sensor - sprich man sendet ein Startsignal.
    Und wartet dann bis das gesendete Echo kommt - wobei die Dauer des Echos der Entfernung entspricht

Läuft das irgend wie mit PoBlocks oder muss man da selbst Hand anlegen?
Ich danke euch…

Mit Poblock nicht möglich, schon versucht.

Ich habe mal was mit µP und US-Wandler gemacht, raten kann ich Dir, wenn Du es mit Pokeys machen willst, zu einer Füllstandserfassung mit Drucksensor.

Ist auch die preiswerteste Variante, Sensor kostet um 16 Teuronen, wenn Du noch eine Einperlpumpe zusätzlich nutzt nochmal eine Luftpumpe und einen LeistungsFET.

Gruß Helmut

Hallo Helmut
ich hab den Poscope Support befragt - es sollte schon funktionieren.
Ich versteh allerdings den übermittelten Code nicht…

Hi, Hans

PoKeys57 series devices feature a special ‚digital counter capture mode‘ on pins 41-44. With it, one can measure the pulse length with the resolution of 1/25th of a microsecond.

I have attached an example project for PoBlocks that demonstrates capturing pulse width on pin 41 - first configure a digital counter input on this pin using PoKeys application first (select both rising and falling trigger dges).

Leider konnte ich die XML Datei nicht anhängen. XML sind wohl gültige Dateien. Beim Hochladen kommt allerdings die Meldung dass diese ungültig wäre…Somit kommt diese als Text.

FilteredCapture-1.XML


<?xml version="1.0" encoding="UTF-8"?>
<PoBlocks>
    <Project>
        <Reset_core_on_startup>true</Reset_core_on_startup>
        <Auto_start>false</Auto_start>
        <Author></Author>
        <Auto_reload_project>false</Auto_reload_project>
        <Project_name></Project_name>
        <Disable_division_by_zero_exception>false</Disable_division_by_zero_exception>
        <Date></Date>
        <Target_device>1</Target_device>
        <Cycle_time>1</Cycle_time>
        <BlocksCount>7</BlocksCount>
        <LinksCount>5</LinksCount>
    </Project>
    <Blocks>
        <block ID="0" type="555" position="-60/260">
            <Name>Clock source</Name>
            <Half_time_m_period>250</Half_time_m_period>
            <Show_dynamic_input>false</Show_dynamic_input>
        </block>
        <block ID="1" type="602" position="120/270">
            <Name>Send pulse</Name>
        </block>
        <block ID="2" type="602" position="120/350">
            <Name>Observation window</Name>
        </block>
        <block ID="3" type="1100" position="280/410">
            <Name>Custom PoIL</Name>
            <hideInputs>0</hideInputs>
            <hideOutputs>2</hideOutputs>
            <hideMemory_bits>0</hideMemory_bits>
            <hideMemory_int8>0</hideMemory_int8>
            <hideMemory_int16>0</hideMemory_int16>
            <hideMemory_int32>0</hideMemory_int32>
            <hideVariables>on1 : OUTPUT(1,int32)
off1 : OUTPUT(2,int32)</hideVariables>
            <hideCode># Capture 1
LOAD Dh04E0
STORE on1

LOAD Dh04F0
STORE off1
</hideCode>
        </block>
        <block ID="4" type="501" position="280/340">
            <Name>Falling edge</Name>
        </block>
        <block ID="5" type="106" position="420/410">
            <Name>Filtered pulse</Name>
            <Default_value>0</Default_value>
            <Bi_m_directional>false</Bi_m_directional>
            <Retain_on_reset>false</Retain_on_reset>
            <Initial_value>0</Initial_value>
        </block>
        <block ID="6" type="1000" position="330/310">
            <Name>Comment</Name>
            <Comment>Capture the pulse width at the end of observation window</Comment>
        </block>
    </Blocks>
    <Links>
        <link ID="0">
            <source type="port" blockID="0" portID="0"/>
            <destination blockID="1" portID="0"/>
            <anchors>
                <anchor ID="0" position="20/260"/>
            </anchors>
        </link>
        <link ID="1">
            <source type="link" linkID="0" anchorID="0"/>
            <destination blockID="2" portID="0"/>
            <anchors/>
        </link>
        <link ID="2">
            <source type="port" blockID="2" portID="0"/>
            <destination blockID="4" portID="0"/>
            <anchors/>
        </link>
        <link ID="3">
            <source type="port" blockID="4" portID="0"/>
            <destination blockID="5" portID="1"/>
            <anchors/>
        </link>
        <link ID="4">
            <source type="port" blockID="3" portID="0"/>
            <destination blockID="5" portID="0"/>
            <anchors/>
        </link>
    </Links>
    <Constants>
        <constant blockID="1" portID="1" value="5" valueF="0"/>
        <constant blockID="2" portID="1" value="10" valueF="0"/>
    </Constants>
    <Shared/>
</PoBlocks>


:wink:
Na denn probiere mal aus, das XML-File mußt in Poblock laden und ins Modul übertragen.
Gruß Helmut

So wie ich es sehe mußt Du den Triggereingang des US-Modules mit 40ms Triggern mit (zB Pin1) und an den beschriebenen Pins (zB Pin41) den Abstand zwischen den steigenden und fallenden Flanken des Echo-Pin messen.
Dann umrechnen in cm.

Näheres zB in diesem PDF

Gruß Helmut

Hallo Helmut,
ich hab das versucht - theoretisch funktioniert das schon - das Ergebnis passt halt nicht.

Mein Problem - ich raff nicht wie das Programm funktioniert.
Ich check nicht was im Custom Poil geschieht - hab auch in der Doku nichts gefunden.

Ein zweites Problem dürfte sein dass vermutlich die gesamte Zeit nach dem Trigger gemessen wird und nicht nur nach dem Anstieg der Flanke am ECHO-Port bis zum Abfall.

Wobei ich auch nicht weiß ob da eine Zeit in Millisekunden rauskommt oder ein Zähler welcher die Anzahl an 1/25th Mikrosekunden angibt (Zitat: one can measure the pulse length with the resolution of 1/25th of a microsecond.)

Hast du eine Idee wie man das umbauen kann so dass nur das ECHO Signal gemessen wird?

Ich danke dir ganz herzlich und wünsche auch ein gutes Jahr 2016!
Hans

Du darfst nicht das PRG nehmen, dass der Support gepostet hat, das ist, glaube ich, nur ein Beispiel.
Oder Du fragst ihn selbst wo Trigger und Echo ran kommen :wink:
Poste doch mal Dein XML-File
Gruß Helmut

Hallo Helmut,
das Programm vom Support passt grundsätzlich schon.

Ich habs nur insofern erweitert als dass:

  • ich den Trigger-Port auf PIN-3 gehängt hab
  • den Ausgang noch dividiere (dann sollte die Ausgabe in CM sein).

Der Echo hängt wie vom Support vorgeschlagen am PIN 41

Es kommt auch eine Ausgabe daher die sich auch abhängig vom „Hindernis“ verändert. Aber es stimmt halt nicht.

Lg,
Hans

UltraSonic.zip (1.13 KB)

Hallo Hans,
ich habe den Matevz mal gebeten mir den PoiL-Code zu erklären, ich kann nichts mit diesen beiden Hexadr. anfangen

Wenn, dann müßte auch der zweite Pin des PoiL-Block eine Bedeutung haben?..?

Überhaupt, ob es eine Befehlserklärung oder Beispiele über die Handhabung im PoiL-Block gibt.
Edit: Gibt ein PDF, hatte ich auch schonmal gesehen :wink: aber vergessen.

Gruß Helmut

Ich habe Antwort bekommen, Du mußt vorher im Pokeys Config den Pin41 zum Eingang machen und er muß zum Counter mit abfallender und steigender Flanke gemacht sein.

Dann steht an Out1 die Länge des ON pulse und an Out2 die Länge des Off Pulse.

Da mußt Du mal aussuchen welche Länge zum Weg passt. Die Umrechnung Schallgeschwindigkeit hattest Du ja schon, glaube ich.

Der Support hat noch viel vor 2016, schreibt er :wink:

Gruß Helmut

Hallo Helmut,

da du einen guten Draht zum Support hast…

…kannst du die bei Gelegenheit mal Fragen ob es möglich wäre MQTT zu implementieren?

Hatte dem Support vor 4 Wochen mal ne Mail dazu geschrieben, aber bisher noch keine Antwort bekommen.

Danke und Sorry fürs OT.

Über diese MQTT-Geschichte, glaube ich, würde er nicht nachdenken, eher über Modbus-Master, RS485 oder CAN.

Polabs hat den Fokus mit dem Pokeys-Modul eher auf CNC. So’n guten Draht habe ich nun auch nicht :wink: Andere User berichten auch von gutem Support, bei Fragen.

Gruß Helmut

Hallo Helmut,
konnte dir der Support erklären was der POIL-Code macht. Bzw. in welchem PDF hast du das was gefunden?

Wobei ich noch immer nicht schnalle was da wirklich rauskommt.
Hast du eine Idee welche Einheit da rauskommen soll (Ticks, Microsekunden etc)?

Ich hab folgende Beispiele:
Abstand ca. 20-25cm
on1 = 37000
off1 = 49900123

Abstand ca. 52-55cm
on1 = 77140
off1 = 49900123

Ich kann auch selbst den Support befragen.
Wobei sich der Wert 49900123 sehr wohl ein bisserl ändert - ich hab ihn nur der Lesbarkeit halber hinten mit xxx123 angegeben.

Danke,
Hans

Hallo Hans,
hier die genaue Antwort:

The PoIL is specified in the PoIL.pdf document (which you can find in the PoKeys installation folder, but I also attached the latest version of it).
This example uses a special feature of PoKeys devices that enables the digital counter inputs on pins 41-44 to capture the length of the ON and OFF signal states (both rising and falling edge triggering must be enabled for the counter). The on1 output will therefore output the length of the ON pulse state, while the off1 will output the length of the OFF pulse state (both measured in 1/25th of the microsecond).

Im Moment ist meine Zeit etwas knapp, sonst würde ich es mal aufbauen. Wobei sich Dein On1 Wert doch plausible anschaut :wink:

Gruß Helmut

Hallo Helmut,
das mit der knappen Zeit kenne ich :slight_smile:

Jaja, 2016 haben sie noch viel vor - ich hab seit 2 Jahren ein paar PoPLC-58 herumliegen - evtl. tut sich auch da was. Vorsichtige Anfragen ergeben ja keine Antwort mehr. 2014 meinten sie noch dass 2015 das Jahr des PoPLC-58 wird…

Aber mit dieser Antwort wird es ein bisserl klarer…

Das POIL.PDF kannte ich - selbst wenn ich dort nachlese werde ich nicht schlau was gemacht wird. Ich kann schon ein bisserl Assembler. Im Prinzip wird von „irgendwo“ was gelesen und dann zur Verfügung gestellt. Nur ich kann nicht finden wie ich von diesen Adressen Dh04E0 und Dh04F0 auf den Port 41 rising und falling edge komme…wobei auch das nicht stimmen dürfte - siehe später

Zumindest komme ich nun insoferne klar als dass die Ausgabe die Anzahl in 1/25 Mikrosekunden ist.
Wenn eine Mikrosekunde gemessen wird kommt also der Wert 25 daher.
In weiterer Folge muss ich den gelieferten Wert durch 25 dividieren um einen Wert in Mikrosekunden zu erhalten.
Und diesen Wert dann nochmals durch 58 dividieren um einen Wert in cm zu erhalten.
Und das Ergebnis schaut tatsächlich korrekt aus.

Mein Versuch mit einem „DIV 25“ gleich im POIL liefert „natürlich“ eine Fehlermeldung -> ein paar aussagekräftige Beispiele wären schon ein Hit.

Wobei ich die Ausgabe von Off1 noch immer nicht verstehe - das ist eigentlich immer der Takt vom Clock-Source. Wenn ich z.b. alle 10 Sek. eine Messung mache kommen dort 10.000.000 Mikrosekunden raus.

Wobei sich ein Problem ergibt.
Wenn ich den Sensor einfach abstecke bzw. dieser halt kaputt wird dann erhalte ich als Ergebnis immer den zuletzt gemessenen Wert. Was nicht so gut ist.

Aber alles in allem ein Erfolg.
Lg,
Hans