Aus RN-Wissen.de
Version vom 24. Februar 2006, 17:16 Uhr von Frank (Diskussion | Beiträge) (Anschluss über I2C Kabel: Ultraschall)

Wechseln zu: Navigation, Suche
Rasenmaehroboter Test

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.


Anschluss über I2C Kabel

Anschluß ist recht einfach


Eine Stiftleiste erleichtert den Anschluss

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


Siehe auch

Weblinks


LiFePO4 Speicher Test