web-dev-qa-db-ja.com

RaspberryPiでPython smbusを使用する-構文と混同される

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)

enter image description here

更新#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と通信するのは運が悪いと思います。

4
M-V

あなたの例と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")

それでうまくいくはずです。

0
MangoBoy

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

0
a.Dippel