18

タイトルに記載されているエラーの回答を探していましたが、まだ回答を得られなかったのは初めてです。Raspberry pi にアナログ データを読み取らせようとしていますが、ターミナル ウィンドウでコードを実行すると、「IOError: [Errno 5] Input/output error」が表示されます。

アナログデータを読み取るために使用するコードを以下に示します。PCF8591 ADCコンバーターを使用しています。

from smbus import SMBus

bus = SMBus(0)

print "read a/d press ctrl + c to stop"

bus.write_byte(0x48, 0)
lastval = -1

while True:
  reada = bus.read_byte(0x48)
  if(abs(lastval-reada) > 2):
    print(reada)
    lastval=reada

raspberry pi でバージョンが変更されたことが原因である可能性があることを理解しており、SMBus(0) を SMBus(1) に変更する必要があります。このために、改訂版ではないRPiバージョンをチェックしました。それでも、SMBus 番号を変更してプログラムを実行しようとしましたが、うまくいきませんでした。

私が得るエラーは以下のとおりです。

Traceback (most recent call last):
  File "analogread.py", line 7, in <module>
    bus.write_byte(0x48, 0)
IOError: [Errno 5] Input/output error

どんな助けでも大歓迎です。これは、実行しようとしている私のより大きなプロジェクトの基本ブロックです。ですから、私が物事をうまく機能させるほど、アプリケーションをより適切に構築できます。ありがとうございました

4

10 に答える 10

6

このスレッドは古いものですが、私が遭遇したすべての投稿がこの潜在的な修正について言及していないため、他の誰かが助けてくれることを願って結果を共有したいと思います.

同様の問題が発生しましたが、ハードウェアが異なります (MCP23017 と LCD)。

しばらく問題を追跡した後、問題はソフトウェアではなく、ハードウェアにあることがわかりました。具体的には、SCL および SDA ラインのプルアップ抵抗です。

RPI (私の場合は 3 つ) には 1.8k の抵抗があり、私の LCD にはいくつかのプルアップ抵抗も取り付けられていました (~2.2k)。LCD の実行に問題はありませんでしたが、コマンド「i2cdetect -y 1」を発行してスキャンを実行すると、MCP23017 がランダムにバスから消えて再表示されました。

LCD の余分なプルアップ抵抗を削除すると問題が解決し、すべてが完全に機能するようになりました。

于 2016-07-30T23:47:11.553 に答える
5

read/writeこれの原因は、ハードウェアが受け入れるよりも速く呼び出しをプッシュしている可能性があります。したがって、読み取り/書き込み操作の間にわずかな遅延を追加します。

from time import sleep
from smbus import SMBus

bus = SMBus(0)

bus.write_byte(0x48, 0)
sleep(0.2)  # Wait for device to actually settle down
lastval = -1

while True:
  reada = bus.read_byte(0x48)
  if(abs(lastval-reada) > 2):
    print(reada)
    lastval=reada
  sleep(0.2) # This might be not needed.

もう 1 つの可能性は、デバイスが実際にはこのアドレスに存在しないことです。したがって、タイムアウトが役に立たない場合は、i2c-tools (カスタム ソフトウェア配布を使用していない限り、パッケージ管理経由で利用できるはずです) を試して、デバイスが実際に利用可能かどうかを確認します (場合によっては、忘れたなどの配線の問題である可能性があります)。 GND):

i2cdetect -y [bus number]

なぜi2c?SMBus は基本的に、電圧レベルとタイミングがより厳密に定義された i2c バスの修正版であるためです。

于 2015-06-04T07:53:51.410 に答える
4

これらのエラーは、ランダムではあるが通常のイベントによって引き起こされ、プログラマーの制御を超えている可能性があります。

1 つのアプローチは、エラーに従う前に数回試行することです。

def try_io(call, tries=10):
    assert tries > 0
    error = None
    result = None

    while tries:
        try:
            result = call()
        except IOError as e:
            error = e
            tries -= 1
        else:
            break

    if not tries:
        raise error

    return result

try_io(lambda: bus.write_byte(0x48, 0))
于 2015-06-03T20:46:54.603 に答える
0

私の場合、この問題を引き起こしている print ステートメントがありました。その print ステートメントを削除したところ、問題は解決されました。

于 2020-04-21T05:24:22.527 に答える
0

RasPi -> ATMEGA 通信でも同じ問題が発生し、スレーブで解決しました。このエラー メッセージは、スレーブが応答しない場合に表示されます。

I2C バスに接続され、0x8 アドレスで構成された I2C スレーブを使用して、RasPi で次のコードを試しました。

SMBusインポートSMBusから

I2C_Bus = SMBus(1)

スレーブ_ADD = 0x8

I2C_Bus.write_byte(SLAVE_ADD, 0xAA)

I2C スレーブが認識できるように適切に構成されていれば、動作するはずです!

于 2015-09-17T12:33:33.520 に答える