Raspberry Piでpython-smbusを使用して、I2Cを使用してMMA7660加速度計チップと通信しようとしています。
以下のコードでは、チップのレジスタ0x00、0x01、0x02、および0x03を読み取っていますが、すべてについてまったく同じ値を取得しています。値を見て、チップを傾けると、それらはすべてレジスタ0x00、X値レジスタに対応していることがわかります。
出力:
...
1 1 1 2
3 3 3 3
1 1 1 1
59 60 60 60
51 51 51 51
58 58 58 58
3 3 3 3
62 62 62 62
58 58 58 58
62 62 62 62
...
コード:
import smbus
import time
bus = smbus.SMBus(1)
# I2C address for MMA7660
addr = 0x4C
try:
bus.write_byte_data(addr, 0x07, 0x00)
bus.write_byte_data(addr, 0x06, 0x10)
bus.write_byte_data(addr, 0x08, 0x00)
bus.write_byte_data(addr, 0x07, 0x01)
except IOError, err:
print err
while True:
try:
x = bus.read_byte_data(addr,0x00)
y = bus.read_byte_data(addr,0x01)
z = bus.read_byte_data(addr,0x02)
tr = bus.read_byte_data(addr,0x03)
print x, y, z, tr
time.sleep(0.25)
except:
print 'exiting...'
break
Smbus構文で何か問題がありますか?私はドキュメントを見ました ここ 。
チップが機能することを確認しました。Arduinoを使用して、上記と同じ順序でレジスタを設定することで、チップと正常に通信できます。
アップデート#1(2013年6月28日):
Sylvainのコメントによると、次のコードのSDA/SCL行のオシロスコープ出力を添付しています。
bus.write_byte(addr, 0x01)
print bus.read_byte(addr)
更新#2:
RaspberryPiのI2Cには既知の問題があると思います。「RepeatedStart」はありません。
https://raspberrypi.stackexchange.com/questions/7138/mma8452-i2c-module
Linux SMBus仕様によると:
SMBus Read Byte: i2c_smbus_read_byte_data()
============================================
This reads a single byte from a device, from a designated register.
The register is specified through the Comm byte.
S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P
しかし、私がそれを試したとき、osciiloscopeは繰り返し開始(S)の前にSTOP(P)をはっきりと示しています。
したがって、PiでI2Cハードウェアを使用してMMA7760と通信するのは運が悪いと思います。
あなたの例とMMA7455用に書かれたクラスを見た後、私は次のように書くことができました。
import smbus
import time
import os
import math
# Define a class for the accelerometer readings
class MMA7660():
bus = smbus.SMBus(1)
def __init__(self):
self.bus.write_byte_data(0x4c, 0x07, 0x00) # Setup the Mode
self.bus.write_byte_data(0x4c, 0x06, 0x10) # Calibrate
self.bus.write_byte_data(0x4c, 0x08, 0x00) # Calibrate
self.bus.write_byte_data(0x4c, 0x07, 0x01) # Calibrate
def getValueX(self):
return self.bus.read_byte_data(0x4c, 0x00)
def getValueY(self):
return self.bus.read_byte_data(0x4c, 0x01)
def getValueZ(self):
return self.bus.read_byte_data(0x4c, 0x02)
mma = MMA7660()
for a in range(1000):
x = mma.getValueX()
y = mma.getValueY()
z = mma.getValueZ()
print("X=", x)
print("Y=", y)
print("Z=", z)
time.sleep(0.2)
os.system("clear")
それでうまくいくはずです。
Raspberry Pi I2Cカーネルドライバーは、特定の時間の繰り返し起動をサポートしていませんでした。ただし、I2Cカーネルドライバーが更新され、繰り返し起動がサポートされるようになりました。ただし、この機能は明示的にアクティブ化する必要があります。
結合された転送を 'に設定するには'
Sudo sh -c '/bin/echo Y > /sys/module/i2c_bcm2708/parameters/combined'
複合転送を設定するには 'オフ'
Sudo sh -c '/bin/echo N > /sys/module/i2c_bcm2708/parameters/combined'
ここにある情報: http://raspberrypi.znix.com/hipidocs/topic_i2c_rs_and_cs.htm