web-dev-qa-db-ja.com

RPiを介したアナログ読み取りにSMBusを使用中に「IOError:[Errno 5] Input / output error」

タイトルに記載されているエラーの答えを探していましたが、初めてhaaventが答えを見つけました。 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

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

17
Sudhanshu Dixit

これの原因は、リモート(SSH)で作業している可能性があります。リモートセッションを切断した後、プログラムはまだ動作しており、印刷できなくなったり、コンソールと対話することができますが、これはもう利用できません。これが私に起こったことです。

20
adimitrov

このスレッドは古いですが、出会ったすべての投稿がこの潜在的な修正に言及していないので、誰かが助けてくれることを願っています。

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

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

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

LCD=の余分なプルアップ抵抗を削除すると、問題は修正され、すべてが完全に動作するようになりました。

6
Daniel Loranger

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

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))
3
viservolf

このトピックはかなり古いことはわかっていますが、範囲外の値を入力すると、I2CとPCA9685で同じエラーが発生しました。私が考え出したのは、単にI2Cを無効にして有効にするだけでした。

  1. Sudo raspi-config
  2. '5。インターフェイスオプション
  3. 「P5 I2C」
  4. 「いいえ」
  5. 'OK'
  6. Sudo reboot now
  7. Sudo raspi-config
  8. '5。インターフェイスオプション
  9. 「P5 I2C」
  10. 'はい'
  11. 'OK'
  12. Sudo reboot now

その後、 Sudo i2cdetect -y 1はI2C PWMモジュールを再び検出します。

2
Matt G.

モデルb + rpiでI2Cを介して 7セグメントシリアルディスプレイ を駆動すると、この問題が発生しました。デバイスの設定(9600)に一致するようにボーレートを調整することで問題を修正しました。デフォルトは100000だと思います。

ボーレートを変更するために、/ etc/modprobe.d/i2c.confに次の行を追加しました。

options i2c_bcm2708 baudrate=9600

再起動後、設定が有効になったことを確認しました:

Prompt$ Sudo cat /sys/module/i2c_bcm2708/parameters/baudrate
9600

それ以来、断続的なI/Oエラーの問題はありませんでした。

2
Micah Larson

これの原因は、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.

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

i2cdetect -y [bus number]

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

2
plaes

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

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

sMBusインポートSMBusから

I2C_Bus = SMBus(1)

SLAVE_ADD = 0x8

I2C_Bus.write_byte(SLAVE_ADD、0xAA)

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

0
Alek6