Page 1 of 1

MCP23017 16-bit IO Expander

Posted: Tue Dec 24, 2019 11:39 pm
by mcauser
I created a library for the MCP23017 16-bit IO expander.
https://github.com/mcauser/micropython-mcp23017

Image

Re: MCP23017 16-bit IO Expander

Posted: Tue Dec 24, 2019 11:42 pm
by mcauser
Designed to work on my TinyPICO ESP32.
Might need some trimming to fit on an ESP8266.

It provides 3 interfaces for setting the registers.
Could be split up into separate versions and further optimised to fit on smaller boards.

Re: MCP23017 16-bit IO Expander

Posted: Tue Apr 07, 2020 5:15 pm
by dentex
Hello!
I realized that this library doesn't work with my cheap ESP8266 (Lolin, nodeMCU whatever) board.

Do you have any hint for that "trim"?

Thanks.

Re: MCP23017 16-bit IO Expander

Posted: Tue Apr 07, 2020 9:28 pm
by mcauser
Hi @dentex,

While creating the driver, I came up with 3 interfaces and I was going pick the most useful and maybe retire the others, or make alternate versions, so you can pick the one that works best for your needs.

1. The list interface, where each item represents a pin and has methods for reading input/setting output.
2. The method interface, where you have a single method for configuring the pin, and have to provide the pin number.
3. The property interface, where you can configure entire 8 or 16bit registers.

List was supposed to be for simplicity for people coming from Arduino. Configures one pin at a time.

Method combines all of the list methods as optional arguments and you need to give it a pin number. Lets you configure more features.

Property was so you could configure entire registers in one call. Where Method lets you configure all registers of a pin, Property lets you configure all pins of a register. I think it's cleaner, but you need to understand how the registers work.

Which interface / pattern would best suit your needs?

The mcp23008 is pretty much half of this mcp23017. As in, it only has 1 port. So I could make this a bit more generic and cover both ICs.

Re: MCP23017 16-bit IO Expander

Posted: Wed Apr 08, 2020 6:55 am
by dentex
Thanks for the explanation!
Would have been great to arrive at the point to choose what method to use.
Unfortunately I can't define the mcp object to start with:

Code: Select all

mcp = mcp23017.MCP23017(i2c, 0x20) 
The above always fails with a:

Code: Select all

AttributeError: 'module' object has no attribute 'MPC23017'
I'm using pins D1 and D2, being GPIO 5 and 4 for SCL and SDA, but I tried also other pins.
Today I'll have a look at this again. I'll double check all the wiring, to be sure I'm not missing anything.

Thanks.

Re: MCP23017 16-bit IO Expander

Posted: Wed Apr 08, 2020 7:19 am
by mcauser
I have an ESP8266 handy. I'll try to make it fit.
Those pins are fine for I2C, however, you'll need some pull ups.
Consider using D3 and D4 as they already have 10k's (to set the correct boot mode). Side effect is, D4 is also used by the LED so it will flicker on data. Maybe use it for the I2C clock.

Re: MCP23017 16-bit IO Expander

Posted: Thu Apr 09, 2020 4:34 am
by mcauser
It fits on my ESP8266 (4MB Wemos D1 Mini) running MicroPython v1.12-337, on both FAT and Littlefs v2

The mcp23017.py file takes up 16k.
If I convert all those spaces to tabs, it takes up 13k.
Cross compile it and upload as mcp23017.mpy and it takes up 4k.

Code: Select all

from machine import Pin, I2C
import mcp23017
i2c = I2C(scl=Pin(4), sda=Pin(0)) # On the D1 mini, D4=GPIO2, D3=GPIO0
mcp = mcp23017.MCP23017(i2c, 0x20)