Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Laderegler Test Tueftler Seite

K (Anschluss über I2C Kabel)
Zeile 11: Zeile 11:
 
[[Bild:srf10stecker.gif|framed|center|Eine Stiftleiste erleichtert den Anschluss]]
 
[[Bild:srf10stecker.gif|framed|center|Eine Stiftleiste erleichtert den Anschluss]]
  
 +
 +
==Beisspielprogramm um Entfernungen zu messen==
  
 
<pre>
 
<pre>
Zeile 161: Zeile 163:
  
 
</pre>
 
</pre>
 +
 +
 +
==Beisspielprogramm 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.
 +
 +
<pre>
 +
'###################################################
 +
'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
 +
</pre>
 +
 +
  
 
==Siehe auch==
 
==Siehe auch==
 
* [[RN-Control]]
 
* [[RN-Control]]
  
 +
 +
==Weblinks==
 +
*  [http://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=310 SRF10 Deutsches und englisches Datenblatt]
  
 
[[Kategorie:Quellcode Bascom]]
 
[[Kategorie:Quellcode Bascom]]
 
[[Kategorie:Robotikeinstieg]]
 
[[Kategorie:Robotikeinstieg]]
 
[[Kategorie:Praxis]]
 
[[Kategorie:Praxis]]

Version vom 24. Februar 2006, 17:10 Uhr

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


Beisspielprogramm 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


Beisspielprogramm 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