Forum: Mikrocontroller und Digitale Elektronik Konfiguration Ultraschallsensor SRF02 mit Codesys


von Bianca P. (bianca_p)


Lesenswert?

Hallo,

ich möchte gerne drei Ultraschallsensoren (SRF02) mit dem Raspberry PI 3 
auswerten. Der Sensor ist über den I2C-Bus mit dem Raspberry verbunden.

In Codesys (V3.5 Patch SP11 Patch 4) verwende ich bereits das "Codesys 
Control for Raspberry PI - Package", auch die Bibliothek "Raspberry I2C 
SRF02" habe ich schon hinzugefügt.
Nun würde ich die Sensoren gerne konfigurieren. Ich möchte den 
Entfernungswert umstellen (Auswahl zwischen Inches, Zentimeter und 
Sekunden sollte laut Datenblätter möglich sein). Da ich drei Sensoren 
verwende, muss ich auch die I2C Slave ID Adresse der einzelnen Sensoren 
ändern.

Hat jemand Erfahrung damit? Welche Möglichkeiten gibt es hierzu bzw. 
kann ich irgendwie auf die einzelnen Register der Sensoren zugreifen?

Ich freue mich über jede Antwort, bin schon etwas verzweifelt.

Danke im Voraus

Bianca

von void (Gast)


Lesenswert?

Vielleicht hilft dir dieses Dokument (srf02doku.pdf)
www.mikrocontroller-elektronik.de/?projekt-download=489

Bianca P. schrieb:
> kann ich irgendwie auf die einzelnen Register der Sensoren zugreifen

Ja, über I2C oder über UART.

> Nun würde ich die Sensoren gerne konfigurieren. Ich möchte den
> Entfernungswert umstellen (Auswahl zwischen Inches, Zentimeter und
> Sekunden sollte laut Datenblätter möglich sein).

Siehe Kapitel "I2C Mode Ansteuerung" komplett mit Beispiel-Code für 
Messvorgang in Zentimeter. Umstellung auf Messen in Inches oder 
Mikrosekunden siehe Befehlscode-Tabelle direkt über dem Beispiel-Code.

> die I2C Slave ID Adresse der einzelnen Sensoren ändern.

Siehe Kapitel "Änderung der I2C Slave ID".

von Bianca P. (bianca_p)


Lesenswert?

Vielen Dank für die Antwort!

Aber wie kann ich über Strukturierten Text oder Kontaktplan in Codesys 
die jeweiligen Register eines Sensors ansprechen?

von void (Gast)


Lesenswert?

Bianca P. schrieb:
> Aber wie kann ich über Strukturierten Text oder Kontaktplan in Codesys
> die jeweiligen Register eines Sensors ansprechen?

Ich dachte das wäre eine legitime Frage,
aber nach einer 2min Internet-Suche "Codesys Raspberrypi I2C"
fühle ich mir von dir veralbert.

Generell geht das so:
1) Programmiersprache lernen: Strukturierten Text oder KOP
2) Anleitung für Codesys auf deiner Target Platform (RPi) lesen
3) I2C Treiber für Codesys auf RPi finden oder selber schreiben
4) Mit I2C den Ultraschallsensoren (SRF02) ansprechen


Jetzt muss ich aber feststellen, dass der Hersteller Codesys auf seiner 
Webseite folgende Information hat:
https://store.codesys.com/codesys-control-for-raspberry-pi-sl.html
-> dort Button: <Download Erste Schritte (.pdf)>

(Datei raspberrypi_codesysv3_firststeps_de.pdf | direkt link: 
https://store.codesys.com/attachments/files/download/id/4119/)

Zitat Kapitel 3.8:
1
"I2CExample.project
2
3
In diesem Beispiel wurde
4
folgende Hardware angeschaltet:
5
• SRF02 (Ultraschall-Entfernungssensor) [...]
6
Die für die Anbindung verantwortlichen Bibliotheken I2C_* werden als Sourcecode zur Verfügung gestellt und können als Beispiel für andere Anschaltungen dienen. Basis für die Kommunikation über I2C ist die Bibliothek RaspberryPiPeripherals, deren Schnittstellen dokumentiert sind."

Du verzweifelst also gerade daran das mitgelieferte Beispiel-Projekt auf 
exakt der vom Hersteller verwendeten Hardware zu benutzten?
Welche Probleme hast du denn damit?

von Bianca P. (bianca_p)


Lesenswert?

Die Datei "raspberrypi_codesysv3_firststeps_de.pdf" als auch das 
Beispielprojekt "I2CExample.project" ist mir bereits bekannt.

Da ich jedoch 3 dieser Sensoren verwenden möchte, muss ich deren I2C 
Slave ID Adresse ändern. Momentan bekomme ich immer nur ein Signal eines 
einzelnen Sensors, da allen dieselbe Adresse zugeordnet ist.

So muss ich laut dem Dokument "srf02doku.pdf" von
www.mikrocontroller-elektronik.de/?projekt-download=489
das Register 0 jedes Sensors mit vier Befehlen in 50ms-Abständen 
beschreiben um diese zu ändern.

Ich weiß aber nicht wie ich auf dieses Register zugreifen kann.
In Codesys stehen mir aber nur:

- SRF02.AfterReadInputs
- SRF02.BeforeWriteOutputs
- SRF02.lrDistance  -->  Distanz, wie im Beispielprojekt verwendet
- SRF02.lrMaxDistance
- SRF02.lrMinDistance
- SRF02.Operational
- SRF02.read
- SRF02.read8
- SRF02.ReadRegister
- SRF02.usiAdress  -->  Adresse, die im Gerätebaum für den Sensor 
eingetragen ist
- SRF02.write
- SRF02.write8
- SRF02.writeBits
- SRF02.NewMeasurement
- SRF02.xValid

zur Verfügung.

Kann ich mittels dieser Funktionen irgendwie die Adresse der Sensoren 
ändern?

von Tek (Gast)


Lesenswert?

Hier findest Du die i2c lib Doku:
https://help.codesys.com/webapp/GEELYL4ecFL7fdIms34rwxJy3EI%2Ffld-i2c;product=RaspberryPiPeripherals;version=3.5.11.0

Mit i2c.write8 sollte man die Register wie in srf02doku.pdf dokumentiert 
beschreiben können um die ID zu ändern.

von void (Gast)


Lesenswert?

Tek hat schon ganz richtig gesagt wie es geht.


Bianca P. schrieb:
> Ich weiß aber nicht wie ich auf dieses Register zugreifen kann.

Wegen dem Lerneffekt vielleicht einmal anders herum.
Bianca, in dem dir bekannten Beispielprojekt wird u.a. erfolgreich ein 
Messvorgang gestartet.

Fragen die du dir beantworten solltest:
Wie lautet der Code aus dem Beispielprojekt um eine Messung zu starten?
Um eine Messung zu starten wird welcher Wert(Befehlscode) in welches 
Register geschrieben?
Was musst du daran ändern, einen anderen Wert in das Register 0 zu 
schreiben?
Was musst du ändern um eine Sequenz von Werten (0xA0, 0xAA, 0xA5, "ID") 
nacheinander in das Register 0 zu schreiben?

von Bianca P. (bianca_p)


Lesenswert?

Ok danke, das hilft mir schon etwas weiter.

Jedoch, dem Beispielprojekt kann ich nicht viel Information entnehmen, 
es werden nicht einzelne Register beschrieben oder ausgelesen, sondern 
nur die Variable "lrDistance" des Funktionsbausteines "SRF02" auf die 
lokale Variable übertragen:

lrDistance := SRF02.lrDistance;

... das ist die einzige Zeile im ganzen Beispielprojekt, die den 
Ultraschallsensor betrifft. Ich kann damit zwar die Distanz eines 
Sensors auslesen, jedoch hilft mir das Projekt nicht zum ändern einer 
I2C-ID weiter.

von NPI (Gast)


Lesenswert?

Hallo Bianca,

Ich verstehe genau was du meinst. Codesys für RaspberryPi ist eine viel 
zu komplizierte Entwicklungsumgebung. Ich habe die Version V3.5 SP12.
Vorneweg - ich programmiere seit 30 Jahren in LabWindows CVI. Ebenfalls 
eine hochkomplexe Umgebung.

Ich hänge genau an der selben Stelle fest. Du kannst den Quellcode von 
SRF02 ansehen. Ein Doppelklick auf den Eintrag im Gerätebaum I2CMaster 
öffnet das E/A Abbild. Hier kannst du in Zeile "I2C-Bus Parameter" in 
Feld "Wert" die Adresse des Bausteines eintragen.  Ein Rechtskick in 
PLC_PRG auf den Aufruf "SRF02.lrDistance" Öffnet den Main Quellcode. In 
der Library selektiere Raspberry I2C SRF02. Unten erscheint 
SRF02_Supersonic. Im Zweig connector sind die Funktionen AfterReadInputs 
und BeforeWriteOutputs. Ein Doppelklick darauf öffnet auch diesen 
Quellcode. Das ist ja alles Toll, aber editieren kann man diesen 
Quellcode nicht.

Was man machen kann, ist im Gerätebaum eine weitere Instanz von SRF02 
anhängen. Diese heißt dann "SRF02_1". In PLC_PRG lautet es dann 
lrDistance := SRF_02_1.lrDistance;

So, wenn jetzt Jemand VERSTÄNDLICH erklären kann, wie man weiter 
vorgeht, wird die Gemeinde jubeln...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.