2016-12-21 16 views
1

GPIOピンを増やすためにRaspberry Pi用にMCP23017を購入しました。MCP23017からPythonで情報を取得する

enter image description here

私は現在、それをインストールしていると私は私が持っている余分なピンを取得しようとしています。右側のGPB0-GPB7と右側のGPA0-GPA7に入札してください。

は私がHIGHとLOWの状態を読み取るために入力ピンにそれらを設定し、それらへのプルアップ抵抗を追加する必要があるが、これは私の知る限り得ているようです。

import smbus 
import time 

bus = smbus.SMBus(1) # As I'm using an newer RPi. 

DEVICE = 0x20 # this is what it shows when I check it. 
IODIRA = 0x00 
GPIOA = 0x12 

bus.write_byte_data(DEVICE,IODIRA,0xFF) 
bus.write_byte_data(DEVICE,0x0C,0xff) 

value = bus.read_byte_data(DEVICE,GPIOA) 

私は読んしよう値は、それは私に奇妙な数字を与える、と私はほとんどHexidecimalsとバイナリ数についての説明を見つけることができ、それは強制的に私を投げている。データシートは私にとっては中国語のようです。

本当に助けになるでしょう!

+0

あなたはA0、A1、およびA2上のプルダウン抵抗がありますか? –

+0

A0 A1およびA2はすべて3つがグランドに接続されています。 – user5740843

+0

'IOCON'レジスタに' SEQOP'ビットをセットする必要があるかもしれません。デフォルトでは、順次操作が有効になっており、アドレスポインタがインクリメントされます。また、 'sudo i2cdetect -y 0'と' sudo i2cdetect -y 1'の出力はどうですか? –

答えて

1

このスクリプトは、GPIOAとGPIOBの内部プルアップ抵抗をオンにします。次に、すべてのレジスタの値を1秒に1回印刷します。入力を変更すると、出力を使用してレジスタ値を変更することができます。

import smbus 
import time 

DEVICE = 0x20 

address_map = { 
    0x00: 'IODIRA', 0x01: 'IODIRB', 0x02: 'IPOLA', 0x03: 'IPOLB', 
    0x04: 'GPINTENA', 0x05: 'GPINTENB', 0x06: 'DEFVALA', 0x07: 'DEVFALB', 
    0x08: 'INTCONA', 0x09: 'INTCONB', 0x0a: 'IOCON', 0x0b: 'IOCON', 
    0x0c: 'GPPUA', 0x0d: 'GPPUB', 0x0e: 'INTFA', 0x0f: 'INTFB', 
    0x10: 'INTCAPA', 0x11: 'INTCAPB', 0x12: 'GPIOA', 0x13: 'GPIOB', 
    0x14: 'OLATA', 0x15: 'OLATB' 
} 
register_map = {value: key for key, value in address_map.iteritems()} 
max_len = max(len(key) for key in register_map) 

def print_values(bus): 
    print "-" * 20 
    for addr in address_map: 
     value = bus.read_byte_data(DEVICE, addr) 
     print "%-*s = 0x%02X" % (max_len, address_map[addr], value) 

bus = smbus.SMBus(1) 
bus.write_byte_data(DEVICE, register_map['GPPUA'], 0xFF) 
bus.write_byte_data(DEVICE, register_map['GPPUB'], 0xFF) 

counter = 0 
try: 
    while True: 
     print_values(bus) 
     counter += 1 
     print "counter = %s" % counter 
     time.sleep(1.0) 
except KeyboardInterrupt: 
    print "Keyboard interrupt" 

出力例

-------------------- 
IODIRA = 0xFF 
IODIRB = 0xFF 
IPOLA = 0x00 
IPOLB = 0x00 
GPINTENA = 0x00 
GPINTENB = 0x00 
DEFVALA = 0x00 
DEVFALB = 0x00 
INTCONA = 0x00 
INTCONB = 0x00 
IOCON = 0x00 
IOCON = 0x00 
GPPUA = 0xFF 
GPPUB = 0xFF 
INTFA = 0x00 
INTFB = 0x00 
INTCAPA = 0x00 
INTCAPB = 0x00 
GPIOA = 0xFF 
GPIOB = 0xE9 
OLATA = 0x00 
OLATB = 0x00 
counter = 3 

私はAdafruit LCD Keypad KitにMCP23017を使用していますので、ピンのいくつかは、ボードによってLに引き下げられています。ポートを理解

各ポートは8本のGPIOピンを持っている値。ポートのすべてのピンがハイに引き上げられた場合、ポートの16進値は0xFFになります。ピンをローにすると、そのピンのビットはゼロになります。 GPA0が低く引っ張られた場合、GPIOAレジスタが0xFEの値を持つことになります。

1111 1110 = 0xFE 
+0

ありがとう!私はAまたはBのピンのいくつかをGNDで触れると値が変化するのを見ることができます。どのピンがGNDに接続されているかを検出する方法はありますか? – user5740843

+0

ポート値の読み方についてのセクションを追加しました。 –

関連する問題