Adresse des SRF08-Ultraschallsensor ändern

Nach Auslieferung ist jeder SRF08-Ultraschallsensor auf die I2c-Adresse 0x70 voreingestellt. Möchte man mehr als einen SRF08-Sensor gleichzeitig einsetzten, muss die Adresse des Ultraschallsensors ändern. In der technischen Dokumentation ist dies exakt beschrieben.

Um die Adresse zu ändern, darf man nur einen SRF08-Sensor am Bus anschließen. Nun schickt man die folgende Dreiersequenz (0xA0, 0xAA, 0xA5) gefolgt von der neuen Adresse (bspw. 0xF2) an die aktuelle Adresse (0xE0) des Sensors. Hierbei gilt es die richtige Reihenfolge der vier Schreibvorgänge einzuhalten und keine weiteren Befehle in die Sequenz einzubauen.

Bei der Suche nach der richtigen Vorgehensweise bin ich auf den Blogeintrag von Long Hoang zum selben Thema gestoßen. Er benutzt für die Adressänderung einen Atmega Microcontroller und die Programmiersprache C. Ich habe hier allerdings einen Raspberry Pi und Python!?

Mit dem Befehl

sudo i2cdetect -y 1

kann festgestellt werden, welche Adressen am I2C-Bus 1 (Raspberry Pi Revision 2) belegt sind. Die folgende Ausgabe auf der Konsole zeigt die Adressbelegung.

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --

Man sieht sehr gut, dass die Adresse 0x20 (Slice of PI I/O) und die Adresse 0x70 (SRF08-Sensor) belegt ist.

Mit dem folgenden Python-Code kann die Adresse nun geändert werden.

#!/usr/bin/env python3

'''
Created on 18.02.2014

@author: Sebastian Aust
@contact: code@ryanthara.de
@copyright: Copyright (C) 2014  Sebastian Aust

This program set the address of a srf08 ultrasonic sensor.
Copyright (C) 2014  Sebastian Aust

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

Dieses Programm ist Freie Software: Sie koennen es unter den Bedingungen
der GNU General Public License, wie von der Free Software Foundation,
Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren
veroeffentlichten Version, weiterverbreiten und/oder modifizieren.

Dieses Programm wird in der Hoffnung, dass es nuetzlich sein wird, aber
OHNE JEDE GEWAEHRLEISTUNG, bereitgestellt; sogar ohne die implizite
Gewaehrleistung der MARKTFĄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
Siehe die GNU General Public License fuer weitere Details.

Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>.
'''
# Using the quick2wire module for I2C access
import quick2wire.i2c as i2c

# Using the time module for sleeping
import time

# Address of the SRF08 ultrasonic sensor on the I2C bus (default 0X70)
# the new address is changed by a left bitshift (e.g. 0x73 << 1 = 0xE6)
addressOld = 0x70

addressNew = 0xE6

# Register number within the SRF08 that contains the command register
command_register = 0

# create an I2CMaster object which will close the bus automatically at the end
with i2c.I2CMaster() as bus:
    # write the sequence (0xA0, 0xAA, 0xA5, 0xF2 ) separate to the comannd_register 
    bus.transaction(i2c.writing_bytes(addressOld, command_register, 0xA0))
    time.sleep(0.065)

    bus.transaction(i2c.writing_bytes(addressOld, command_register, 0xAA))
    time.sleep(0.065)

    bus.transaction(i2c.writing_bytes(addressOld, command_register, 0xA5))
    time.sleep(0.065)

    bus.transaction(i2c.writing_bytes(addressOld, command_register, addressNew))
    time.sleep(0.065)

    # print the address change
    print("Changed address to: %s" % addressNew)

2 thoughts on “Adresse des SRF08-Ultraschallsensor ändern

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.