0

[コード][1]ラズベリー パイのグローブ パイ振動センサーを接続するためのグルーブ ピがあります。次のコマンドを使用して、ラズベリー パイにグルーブ ソフトウェアをダウンロードしました。

$cd /home/pi/Desktop
$ sudo git clone https://github.com/DexterInd/GrovePi
$ cd /home/pi/Desktop/GrovePi/Script
$ sudo chmod +x install.sh
$ sudo ./install.sh
$ sudo pip install grovepi"

この後、ラズベリーパイを再起動し、フォルダー内で次のようにしました。

$cd/home/pi/Desktop/GrovePi/Software/Python
$sudo python grove_piezo_vibration_sensor.py

次のエラーが表示されます:

Trceback (most recent call last):

File "grove_piezo_vibration_sensor.py", line 49, in <module>
    print(grovepi.analogRead(piezo))
File "/home/pi/Desktop/GrovePi/Software/Python/grovepi.py", line 227, in analogRead
    return number[1] * 256 +number[2]
TypeError: 'int' object has no attribute '__getitem__'

私が使用したコードは次のとおりです。

import time
import grovepi
# Connect the Grove Piezo Vibration Sensor to analog port A0
# OUT,NC,VCC,GND
piezo = 0

grovepi.pinMode(piezo,"INPUT")

while True:
    try:
        # When vibration is detected, the sensor outputs a logic high signal
        print grovepi.analogRead(piezo)
        time.sleep(.5)

    except IOError:
        print "Error"

私が間違っていることを教えてください。ありがとうございました!

4

1 に答える 1

2

grovepi コードを見ると、analogRead関数は次のようになります。

def analogRead(pin):
    write_i2c_block(address, aRead_cmd + [pin, unused, unused])
    read_i2c_byte(address)
    number = read_i2c_block(address)
    return number[1] * 256 + number[2]

最後の行に例外が見られます。何らかのシーケンスが返されることを期待していましたread_i2c_blockが、代わりに単一の整数が返されました。コードの他の部分を見ると、read_i2c_block次のようになっていることがわかります。

def read_i2c_block(address):
    for i in range(retries):
        try:
            return bus.read_i2c_block_data(address, 1)
        except IOError:
            if debug:
                print ("IOError")
    return -1

read_i2c_block_dataこれで、 (smbusモジュールから) 常にリストが返されるように見えます。つまり、上記の関数から単一の整数を取得する唯一の方法は、IOError例外が発生した場合です。exception IOErrorこれはブロックによってマスクされ、関数は を返し-1ます。

モジュール内のこのコードには多くの問題がありgrovepiます。read_i2c_blockまず、 (関数などの)呼び出しはすべて、戻り値analogReadをチェックする必要があります。-1第 2 に、例外には問題の原因を示す情報が含まれている可能性が高いため、このように例外をマスクしてもあまり役に立ちません。上記のコードを次のものに置き換えることを検討してください。

    for i in range(retries):
        try:
            return bus.read_i2c_block_data(address, 1)
        except IOError:
            if debug:
                raise

そして、デバッグモードを有効にします。それは次のようになります。

import grovepi
grovepi.debug = 1

コードを実行すると、例外が表示されます。エラーに関する詳細が含まれているかどうかを確認します。

于 2017-12-06T14:38:36.827 に答える