2016-12-21 10 views
1

Я купил MCP23017 для моей малины Pi, чтобы увеличить контакты GPIO.Получение информации от MCP23017 с Python

enter image description here

Я в настоящее время установлен, и я пытаюсь получить дополнительные контакты, которые у меня есть; GPB0-GPB7 слева и GPA0-GPA7 справа для выполнения моих ставок.

Мне нужно установить их на входные контакты для чтения высокого и низкого статуса, и добавьте тянуть резисторы к ним, но это, насколько я получил:

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

Возможно, вам придется установить бит 'SEQOP' в регистре' IOCON'. По умолчанию включена последовательная операция, которая увеличивает указатель адреса. Кроме того, что такое вывод 'sudo i2cdetect -y 0' и' sudo i2cdetect -y 1'? –

ответ

1

Этот скрипт включит внутренние подтягивающие резисторы для GPIOA и GPIOB. Затем он будет печатать значения всех регистров один раз в секунду. Вы можете использовать выход для просмотра значений регистра при изменении входов.

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 

Я использую MCP23017 на Adafruit LCD Keypad Kit, так что некоторые из штырьков быть надвинутой на борту.

Понимание порта Значения

Каждый порт имеет 8 GPIO булавки. Если все контакты для порта вытягиваются высоко, шестнадцатеричное значение для порта будет 0xFF. Если контакт вытащен на низком уровне, бит для этого вывода будет равен нулю. Например, если GPA0 вытягивается низкий регистр GPIOA будет иметь значение 0xFE:

1111 1110 = 0xFE 
+0

спасибо за это! Я вижу, что значения меняются, когда я касаюсь некоторых контактов A или B с GND. Есть ли способ определить, какие контакты подключаются к GND? – user5740843

+0

Я добавил раздел о том, как читать значения порта. –

 Смежные вопросы

  • Нет связанных вопросов^_^