2017-12-06 22 views
0

[code] [1]ラズベリーパイのグローブパイ振動センサーを接続するためのgroovepiがあります。私はfollwingコマンドを使用して、私のラズベリーパイの上に溝ソフトウェアをダウンロードした:溝振動センサーとラズベリーパイとの通信

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

私は次のエラーを取得しています:

$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" 

この後、私は、私は、フォルダ内のときに私のラズベリーパイを再起動し、 :私が使用したコードは

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" 

私は何が間違っているのか教えてもらえますか?ありがとうございました!

+0

エラーで参照されているコードを含めてください。そのエラーに関するStackOverflowには既にいくつかの記事がありますが、コードを見ずに、あなたの状況に該当するものがあるかどうかはわかりません。 – Taegost

+0

お返事ありがとうございます。私は私のポストにコードを追加して確認してください。 –

+0

これは進歩だが、問題を浮き彫りにしていない。エラーがgrovepi.pyによって生成されているようですが、そのソース、特に227行を含むメソッドにアクセスできますか? – Taegost

答えて

2

あなたはgrovepiコードを見れば、このようなanalogRead機能を見て:あなたはそれが戻っread_i2c_blockからではなく、一連のいくつかの種類を期待していた最後の行、上の例外を見ている

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はこのようになっていることを参照してください。

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モジュールにいくつかの問題があります。まず、(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 

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

+0

お元気ですか?回。 –

+0

あなた自身のコードでIOErrorをキャッチしているからです。あなたのwhileループでtry/exceptを取り除いてください。 – larsks

+0

私はやりましたが、私はまだ同じエラーを受けています –