#実現したこと
I2Cで接続している、IOエキスパンダー MCP23017を使って、タクトスイッチが押されているか取得する。
押していたら1、そうでなければ0を出力
pigpioを使用。
とりあえず、GPA0-7まで入力として使い、プルアップもしておく。
#試したこと・困っていること
下のを実行しました。数値が押していたら0xfe(254)、そうでなければ0xff(255)が出力されてしまいました。
Python3
1import pigpio 2 3ICADDR = 0x20 4 5REG_IODIRA = 0x00 #IO setting for A 6REG_GPPUA = 0x0c #PullUp for A 7REG_GPIOA = 0x12 #IN A 8REG_OLATA = 0x14 #OUT A 9 10pi = pigpio.pi() 11hndl = pi.i2c_open(1, ICADDR) 12 13#IO setting 14#i2c_write_byte_data(handle、reg、byte_val) 15pi.i2c_write_byte_data(hndl,REG_IODIRA,0xff) #Aの全部、入力にする 16 17#pullup 18#i2c_write_byte_data(handle、reg、byte_val) 19pi.i2c_write_byte_data(hndl,REG_GPPUA,0xff) #とりあえずAの全てプルアップします。 20 21while True: 22 print (pi.i2c_read_i2c_block_data(hndl,REG_GPIOA,0x01))
#追記1
data = pi.i2c_read_i2c_block_data(hndl,REG_GPIOA,0x1) print(hex(~data&0xff))
にしたところ
Traceback (most recent call last): File "python-osc.py", line 35, in <module> print(hex(~data&0xff)) TypeError: bad operand type for unary ~: 'tuple'
このようなエラーになりました。
dataの出力される情報が良くないと思い、dataを変えました
Python3
1data = pi.i2c_read_byte_data(hndl,REG_GPIOA) 2print(hex(~data&0xff))
すると
Python
10x0 #何も押していない 20x1 #ボタン1を押している時 30x2 #ボタン2を押している時 40x3 #ボタン1とボタン2を同時に押している時
と出力されました。
たぶん、入力するポートを**pi.i2c_read_byte_data()**では指定できないからだと思います。
他に、
Python
1data = pi.i2c_read_byte_data(hndl,0x01)#ポート1だけ読み込むの意味 2print(hex(~data&0xff))
では、エラーが出なかったけど、数値が変更されずでした。
回答1件
あなたの回答
tips
プレビュー