Sonntag, 12. Januar 2014

Tag 4 - I²C auf Anhieb

Ich habe schon erwähnt, daß im Sortiment auch ein Kompassmodul CMPS10 ist, mit dem man eben die Richtung, aber auch Neigung erfragen kann. Das kompakte Ding lässt sich über I²C, Seriell und PWM abfragen. Ich habe keine Ahnung was das alles bedeutet. Weiß aber, daß die Himbeere I²C kann und bringe sie dazu, daß sie das auch will:
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
Falls sich in der Raspberry Installation die Datei "/etc/modprobe.d/raspi-blacklist.conf" befindet, muss man dort außerdem zwei Zeilen deaktivieren bzw. entfernen:
#blacklist spi-bcm2708
#blacklist i2c-bcm2708
Dann das Früchtchen neu starten und mit dem Befehl "sudo i2cdetect -y 1" gucken, ob das grundsätzlich erstmal funktioniert. Da erscheint dann eine Art Adresstabelle mit einer Menge Striche. Soweit gut.


Jetzt müssen wir den CMPS10 an die Beere 
knoten. Im Datenblatt findet sich u.a. nebenstehende Grafik: Ground, 3.3V, SDA (Daten) und SCL (Signal) finden sich auch am Raspberry - also ran damit. Die Adresstabelle sieht jetzt plötzlich anders aus:

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

Hurra, da erscheint der Sensor mit der Adresse 0x60. Läuft. Es ist mir fast schon unheimlich, wie einfach das ganze zu bewerkstelligen ist. Aber weiter im Text: Abfrage des Sensors mit Python.

Im Netz finde ich bei Daniel eine kleine Anleitung, wie man einen Drucksensor per I²C abfragt und ein weiteres Code-Beispiel (allerdings in C) für die Abfrage des CMPS10. Ich schaue nochmal ins Datenblatt, werfe alles zusammen und voilà! folgendes Script spuckt die gewünschten Werte aus:
import smbus
import time
bus = smbus.SMBus(1)
device = 0x60
    
while True:
  try:
    b1 = bus.read_byte_data(device, 0x02)
    b2 = bus.read_byte_data(device, 0x03)
    pitch = bus.read_byte_data(device, 0x04)
    roll = bus.read_byte_data(device, 0x05)
    pitch = pitch-256 if pitch > 127 else pitch
    roll = roll-256 if roll > 127 else roll
    print int(((b1 << 8) + b2) / 10), pitch, roll
    time.sleep(0.1)
  except:
    print "abbruch"
    break
Die Werte von Pitch (Nicken) und Roll (Rollen) sind vorzeichenbehaftet und müssen daher entsprechend "geschoben" werden. Die beiden Bytes B1 und B2 bilden laut Datenblatt zusammen einen Wert von 0 bis 3599 (also 0-359.9 Grad). Den bastel ich in der "print"-Zeile zusammen und kürze die Nachkommastelle weg. Läuft!

1 Kommentar: