-
SRF02 Hexcode
Hallo zusammen
für meinen kleinen SRF02 suche ich gerade den Hexcode um den anzusteuern. Leider finde ich nur komplette Programme wo die einzelnen Hexzahlen für die Steuerung irgendwo versteckt sind.
Soweit ich das Datenblatt verstehe:
Adresse: 0xE0
Starten: 0x51
Aber wie kann ich die Register ansprechen? Die werden nicht als Hexzahlen angegeben :-(
Hat jemand die Lösung?
-
Hallo Hanno,
das Leseregister wird einfach mit "2" abgefragt, bei Slave_read das Slave-Id +1 nicht vergessen:
...
waitms 65
I2cstart
I2cwbyte 0xE0 (dec 224)
I2cwbyte 2 (dec)
I2cstop
I2cstart
I2crbyte Slaveid_read
... High Byte abfragen, ACK
....Low Byte abfragen, NAck
I2cstop
Damit liest Du automatisch ab Register 2, danach auch gleich das Register3 mit aus.
Dann wird es hier im Beispiel an die Funktion zum zusammen fügen übergeben, der aus den beiden Byte-Werten einen Integer macht und dann den richtigen Entfernungswert ausgibt.
(Die Beispieldateien in Bascom fürs RN_Control von:
http://www.shop.robotikhardware.de/s...roducts_id=168 )
-
@Hexplorer funktioniert so leider nicht, denn ich verwende gerade keinen µC sondern meinen i2c adapter. daher brauche ich alles genau in Hexwerten.
Allerdings glaube ich, dass ich im Moment noch daran scheitere den Sensor überhaupt messen zu lassen, denn wenn ich das richtig verstehe müsste die LED bei jeder Messung aufleuchten. Sprich es würde sich ein sehr schneller blinken ergeben, wenn der Sensor misst. Nur leider leuchtet meine LED gerade mal beim Einschalten kurz (Adresscodierung) auf und dann tut sie gar nichts mehr.
Bisher habe ich es mit dem Adapter noch nicht geschafft Sensoren auszulesen, nur schreiben klappt ganz wunderbar.
Ich versteh einfach nicht wie oder was mit diesen "Register" gemeint ist. bzw. an welcher Position ich auslesen muss.
-
Naja, der Hexwert für dezimal 2 ist ... 0x02 , oder;) Und Slave-Id_read = 0xE1 (dec 225)
Aber dann musst du dein ergebnis noch selbst ausrechnen, weil es ja nur als 2 einzelne bytes reinkommt.
Vermutlich auch hier wieder das Problem das der I²C Adapter nicht selbst die PullUps verbaut hat? Hast Du welche eingefügt?
-
Der Adapter hat Pull ups verbaut, daran liegt es nicht.
Wenn ich S E0 00 51 P sende dann bekomm ich auch drei mal Ack zurück.
Danach versuche ich S E1 ??? P und bekomme nur scheinbar willkührliche Hexwerte zurück und "Wrong command"
- - - Aktualisiert - - -
Huch warum dass? Ich dachte das Register 0x00 ist für den Befehl zuständig
Muss ich vor jeder Abfrage des Messwerts ein Befehl 51 schicken?
Abgesehen davon will ich ja noch auslesen, aber irgendwie bekomm ich da keine vernünftigen Werte angezeigt .
-
versuche mal einzeln rasuzuholen: S E1 03 P und dann noch S E1 04 P. Ich kenn mich mit TerminalI²C nicht so aus, ich würde selbst das RN-Control programm vorziehen. Kann sein das du nur ein Register zur Zeit lesen kannst?
-
Mhm nein eigentlich nicht. Allerdings habe ich jetzt scheinbar eine Lösung gefunden. Zumindest bekomme ich bei S E1 04 P folgende Anzeige:
05 00 1B 00
So ganz versteh ich jetzt die Umrechnung in die Entfernung nicht: denn
Register 0: 05
Register 1: 00
Register 2: 1B
Register 3: 00
Stimmt das so?
-
Du musst insgesammt 3 pakete senden, einmal um die messung zu starten, dann um das Register das du auslesen willst festzulesen und dann ein read um die daten zu lesen.
also
S ID 0 51h P (kp woher die 0 kommt, steht so im datenblatt)
dann Register festlegen:
S ID 2 P
und dann das lesen:
S ID+1 ack und nack und stop (keine ahnung, wie das bei deinem i2c dingens geht)
Alles von hier Seite 6
http://www.robotikhardware.de/download/srf02doku.pdf
E: Am einfachsten wäre wohl register 1 auszulesen, denn das sollte immer 0x80 zurück senden, wenn das klappt, würde ich weiter versuchen.
Also dann mit S ID 1 P
S ID+1 nack P
-
Hallo robin,
geht ein wenig einfacher zum Glück. Ich kann S E1 23 p alle Register auslesen und anzeigen. Es kommt dann sowas:
KKK05 00 1D 00 0F 00 00 00 00 00 00 00 32 04 00 BB 06 0B 05 0F 00 00 00 00 00 05 51 32 8B 00 1E 37 FF FF AF
Wobei KKK die Bestätigung für S E0 0 51 p ist danach kommt immer 00 (egal wie weit der Abstand ist) und dann ändert sich 1D je nach Abstand zum Hindernis. Der Rest bleibt gleich zubindest bis 32 04...
ich vermute sehr stark, dass sich der Längenwert in den 1D verbirgt wobei ich aber noch nicht weiß wie die Umrechnung ist? Wir der Wert gleich direkt in cm angegeben und ich muss nur 1D in Dezimal konvertieren?
Würde bisher ganz gut hinkommen bei kleinen Werten zwischen 15 und 30cm
EDIT: Passt auch für große Werte. Ist zwar noch nicht die eleganteste Lösung aber sie funktioniert.
- - - Aktualisiert - - -
Danke noch mal an alle die geholfen haben. Die Erkenntnis habe ich jetzt mal im RN-Wiki festgehalten bei meinem Adapter Threat.
-
Hallo!
Ich weiß nicht ob sich Dein I²C Adapter ähnlich verhält, aber ich kann bei meinem von ELV mit folgendem String
„SE0 00 51 P L0015 SE0 01 SE1 03 P“ meine SRF08 auslesen.
Da Du nur High/Low als Entfernungsbyte ab Register 2 benötigst und 65ms Pause zwischen Start und auslesen, könnte folgende Eingabe funktionieren:
„SE0 00 51 P L0045 SE0 02 SE1 02 P“ (Ein Versuch wäre es wert)
„SE0 00 51 P“ sendet die Aufforderung zum Messen in Zentimeter.
„L0045“ wäre die Pausenzeit bei Einstellung des Adapters (Auslieferungszustand ELV) und „SE0 02 SE1 02 P“ der Lesebefehl von 2 Byte ab Register 02.
Gruß André