2016-12-21 5 views
1

Ich kaufte ein MCP23017 für meinen Raspberry Pi, um die GPIO-Pins zu erhöhen.Die Informationen von MCP23017 mit Python erhalten

enter image description here

Ich habe es zur Zeit installiert und ich versuche, die zusätzlichen Pins zu bekommen, die ich habe; GPB0-GPB7 auf der linken Seite und GPA0-GPA7 auf der rechten Seite, um meine Gebote zu erfüllen.

muss ich sie mit Eingangspins setzen einen HIGH und LOW-Status zu lesen, und fügen Sie die Pull-up-Widerstände zu ihnen, aber das ist so weit wie ich bekommen haben:

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) 

Wenn ich versuche zu lesen der Wert, es gibt mir seltsame Zahlen, und ich kann kaum eine Erklärung auf den Hexidecimals und den Binärzahlen finden, und es wirft mich total ab. Das Datenblatt scheint wie Chinesisch zu mir ..

Jede Hilfe würde WIRKLICH geschätzt werden!

+0

Haben Sie Widerstände auf A0, A1 nach unten ziehen haben, und A2? –

+0

A0 A1 und A2 sind alle 3 mit Masse verbunden. – user5740843

+0

Möglicherweise müssen Sie das Bit 'SEQOP' im Register 'IOCON' setzen. Standardmäßig ist der sequenzielle Vorgang aktiviert, bei dem der Adresszeiger inkrementiert wird. Was ist die Ausgabe von 'sudo i2cdetect -y 0' und' sudo i2cdetect -y 1'? –

Antwort

1

Dieses Skript schaltet die internen Pull-Up-Widerstände für GPIOA und GPIOB ein. Dann werden die Werte aller Register einmal pro Sekunde gedruckt. Sie können den Ausgang verwenden, um zu sehen, wie sich die Registerwerte ändern, wenn Sie die Eingänge ändern.

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" 

Ausgabe

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

ich auf einer Adafruit LCD Keypad Kit die MCP23017 verwenden, so dass einige der Stifte gezogen durch den Vorstand niedrig sind.

den Portlegendes Werte

Jeder Port hat 8 GPIO-Pins. Wenn alle Pins für einen Port auf "high" gesetzt sind, ist der Hexadezimalwert für den Port 0xFF. Wenn ein Pin niedrig gezogen wird, ist das Bit für diesen Pin Null. Zum Beispiel, wenn GPA0 niedrig gezogen wird, wird das GPIOA Register einen Wert von 0xFE hat:

1111 1110 = 0xFE 
+0

danke dafür! Ich kann sehen, dass sich die Werte ändern, wenn ich einige der Pins A oder B mit GND berühre. Gibt es eine Möglichkeit zu erkennen, welche Pins mit GND verbunden sind? – user5740843

+0

Ich habe einen Abschnitt zum Lesen von Portwerten hinzugefügt. –

Verwandte Themen