Dieses Beispielprogramm demonstriert wie man das beliebte Ultraschallmodul SRF10 an einem Board wie RN-Control nutzt. Die Bilder veranschaulichen zudem wie man ein solches Modul an den I2C-Bus anschließt. Das Programm funktioniert natürlich auch auf ähnlichen Boards mit ATMega32 (z.B. RNBFRA-Board)
Die Funktionen sind übersichtlich in Unterroutinen gekapselt, so das die Einbindung in eigene Programme bequem möglich ist.
Inhaltsverzeichnis
Anschluss über I2C Kabel
Beispielprogramm um Entfernungen zu messen
'################################################### 'srf10_ultraschallbeispiel2.bas 'für 'RoboterNetz Board RN-CONTROL (ab Version 1.1) 'und das SRF10 Ultraschallmodul für Entfernungsmessung 'Datenblatt zu SRF10: 'http://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=310 'Bezug: Robotikhardware.de 'Aufgabe: ' Gibt die Entfernung von Objekten in Zentimetern aus ' Die Messungen werden mit fest vorgegebenen Verstärkungsfaktor ' ermittelt 'Autor: Frank (Roboternetz) 'Weitere Beispiele und Beschreibung der Hardware 'unter http://www.Roboternetz.de oder robotikhardware.de '####################################################### Declare Function Srf10_entfernung(byval Srf10_slaveid As Byte) As Integer Declare Sub Srf10_reichweite(byval Srf10_slaveid As Byte , Byval Reichweite As Word) Declare Sub Srf10_verstaerkung(byval Srf10_slaveid As Byte , Byval Srf10_verstaerkung As Byte) Declare Function Srf10_firmware(byval Srf10_slaveid As Byte) As Byte $regfile = "m32def.dat" $framesize = 42 $swstack = 42 $hwstack = 42 $crystal = 16000000 'Quarzfrequenz $baud = 9600 Config Scl = Portc.0 'Ports fuer IIC-Bus Config Sda = Portc.1 Dim Entfernung As Integer Wait 3 'Warte 3 Sekunden I2cinit Print "SRF10 Testprogramm " Print "SRF 10 Firmware Version:" ; Srf10_firmware(&He0) Srf10_reichweite &HE0 , 1000 'Reichweite in Zentimetern festlegen Srf10_verstaerkung &HE0 , 10 'Verstärkungsfaktor Do Entfernung = Srf10_entfernung(&He0) Print "Entfernung:" ; Entfernung ; "cm" Wait 1 Loop End Function Srf10_entfernung(byval Srf10_slaveid As Byte) As Integer Local LoB As Byte Local Hib As Byte Local Firmware As Byte Local Temp As Byte Local Srf10_slaveid_read As Byte Srf10_slaveid_read = Srf10_slaveid + 1 'Messvorgang in starten I2cstart I2cwbyte Srf10_slaveid I2cwbyte 0 I2cwbyte 81 in Zentimetern messen I2cstop Warteaufmessung: Waitms 1 Firmware = Srf10_firmware(&He0) If Firmware = 255 Then Goto Warteaufmessung I2cstart I2cwbyte Srf10_slaveid I2cwbyte 2 'Leseregister festlegen I2cstop I2cstart I2cwbyte Srf10_slaveid_read I2crbyte Hib , Ack I2crbyte Lob , Nack I2cstop Srf10_entfernung = Makeint(lob , Hib) End Function 'Messreichweite in cm festlegen Sub Srf10_reichweite(byval Srf10_slaveid As Byte , Byval Reichweite As Word) Local Wert As Word Local Temp As Byte Wert = Reichweite / 4 'Ungefähre Registerberechnung Temp = Low(wert) I2cstart I2cwbyte Srf10_slaveid I2cwbyte 2 'Register I2cwbyte Temp I2cstop End Sub 'Verstärung festlegen Sub Srf10_verstaerkung(byval Srf10_slaveid As Byte , Byval Srf10_verstaerkung As Byte) I2cstart I2cwbyte Srf10_slaveid I2cwbyte 1 'Register I2cwbyte Srf10_verstaerkung I2cstop End Sub Function Srf10_firmware(byval Srf10_slaveid As Byte) As Byte Local Firmware As Byte Local Srf10_slaveid_read As Byte Srf10_slaveid_read = Srf10_slaveid + 1 I2cstart I2cwbyte Srf10_slaveid I2cwbyte 0 'Leseregister festlegen I2cstop I2cstart I2cwbyte Srf10_slaveid_read I2crbyte Firmware , Nack I2cstop Srf10_firmware = Firmware End Function
Beispielprogramm um günstigen Verstärkungsfaktor zu finden
Das nachfolgende Programm ist nahezu identisch mit dem vorherigen. Hier werden nur in einer Schleife unterschiedliche Verstärkungsfaktoren für die Messungen genutzt. Das Programm eignet sich daher vorallem dazu den richtigen Faktor für die entsprechende Umgebung zu finden. In kleinen Räumen mit vielen Gegenständen kann ein niedrigere Faktor, also eine niedrigere Empfindlichkeit sinnvoll sein.
'################################################### 'srf10_ultraschallbeispiel1.bas 'für 'RoboterNetz Board RN-CONTROL (ab Version 1.1) 'und das SRF10 Ultraschallmodul für Entfernungsmessung 'Datenblatt zu SRF10: 'http://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=310 'Aufgabe: ' Gibt die Entfernung von Objekten in Zentimetern aus ' Die Messungen werden mit verschiedenen Verstärkungsfaktoren ' durchgeführt und die Ergebnisse in Zentimetern über RS232 ' ausgegeben. Das Programm eignet sich ideal um den optimalen ' Verstärkungsfaktor zu finden 'Autor: Frank (Roboternetz) 'Weitere Beispiele und Beschreibung der Hardware 'unter http://www.Roboternetz.de oder robotikhardware.de '####################################################### Declare Function Srf10_entfernung(byval Srf10_slaveid As Byte) As Integer Declare Sub Srf10_reichweite(byval Srf10_slaveid As Byte , Byval Reichweite As Word) Declare Sub Srf10_verstaerkung(byval Srf10_slaveid As Byte , Byval Srf10_verstaerkung As Byte) Declare Function Srf10_firmware(byval Srf10_slaveid As Byte) As Byte $regfile = "m32def.dat" $framesize = 42 $swstack = 42 $hwstack = 42 $crystal = 16000000 'Quarzfrequenz $baud = 9600 Config Scl = Portc.0 'Ports fuer IIC-Bus Config Sda = Portc.1 Dim Entfernung As Integer Dim V As Byte Wait 3 'Warte 3 Sekunden I2cinit Print "SRF10 Testprogramm " Print "SRF 10 Firmware Version:" ; Srf10_firmware(&He0) Srf10_reichweite &HE0 , 1000 'Reichweite in Zentimetern festlegen V = 1 Do Entfernung = Srf10_entfernung(&He0) Srf10_verstaerkung &HE0 , V 'Verstärkungsfaktor Print "Verstärkung:" ; V ; " " ; "Entfernung:" ; Entfernung ; "cm" V = V + 3 Wait 1 Loop End Function Srf10_entfernung(byval Srf10_slaveid As Byte) As Integer Local Lob As Byte Local Hib As Byte Local Firmware As Byte Local Temp As Byte Local Srf10_slaveid_read As Byte Srf10_slaveid_read = Srf10_slaveid + 1 'Messvorgang in starten I2cstart I2cwbyte Srf10_slaveid I2cwbyte 0 I2cwbyte 81 'in Zentimetern messen I2cstop Warteaufmessung: Waitms 1 Firmware = Srf10_firmware(&He0) If Firmware = 255 Then Goto Warteaufmessung I2cstart I2cwbyte Srf10_slaveid I2cwbyte 2 'Leseregister festlegen I2cstop I2cstart I2cwbyte Srf10_slaveid_read I2crbyte Hib , Ack I2crbyte Lob , Nack I2cstop Srf10_entfernung = Makeint(lob , Hib) End Function 'Messreichweite in cm festlegen Sub Srf10_reichweite(byval Srf10_slaveid As Byte , Byval Reichweite As Word) Local Wert As Word Local Temp As Byte Wert = Reichweite / 4 'Ungefähre Registerberechnung Temp = Low(wert) I2cstart I2cwbyte Srf10_slaveid I2cwbyte 2 'Register I2cwbyte Temp I2cstop End Sub 'Verstärung festlegen Sub Srf10_verstaerkung(byval Srf10_slaveid As Byte , Byval Srf10_verstaerkung As Byte) I2cstart I2cwbyte Srf10_slaveid I2cwbyte 1 'Register I2cwbyte Srf10_verstaerkung I2cstop End Sub Function Srf10_firmware(byval Srf10_slaveid As Byte) As Byte Local Firmware As Byte Local Srf10_slaveid_read As Byte Srf10_slaveid_read = Srf10_slaveid + 1 I2cstart I2cwbyte Srf10_slaveid I2cwbyte 0 'Leseregister festlegen I2cstop I2cstart I2cwbyte Srf10_slaveid_read I2crbyte Firmware , Nack I2cstop Srf10_firmware = Firmware End Function