stefanet
Posts: 13
Joined: Tue Jan 22, 2013 1:42 pm

MCP230XX library problem

Tue Feb 26, 2013 8:30 am

Hi guys,

i have a problem with adafruit_mcp230xx python libraries from github.

My code is

Code: Select all

try:
    from Adafruit_MCP230xx import Adafruit_MCP230XX
    import sys, time
    """
    The MCP23017 has 16 pins - A0 thru A7 + B0 thru B7. A0 is called 0 in the library, and A7 is called 7, then B0 continues from there as is called 8 and finally B7 is pin 15

    """

    # Base variable settings
    OUTPUT = 0
    INPUT = 1
    DISABLE = 0
    ENABLE = 1

    sensor = 8 # GPB0
    door = 9 # GPB1
    door_led = 11 # GPB3

    mcp = Adafruit_MCP230XX( busnum = 1, address = 0x20, num_gpios = 16 )

    # GPIO MCP230xx OUTPUT settings
    mcp.config( door_led, OUTPUT)

    # GPIO MCP230xx Input settings with Pull-UP resistor
    mcp.pullup( sensor, 1 )
    mcp.pullup( door, 1 )

    while ( True ):
        # Pir Sensor
        if not mcp.input( sensor ):
            print "Sensor:" + str( mcp.input( sensor ) )

        # Magnetic Door switch
        if not mcp.input( door ):
            print "Door:" + str( mcp.input( door ) )
            mcp.output( door_led, ENABLE )

        time.sleep(0.3)
except KeyboardInterrupt:
    sys.exit(127)
When i run it I have the following error:

Code: Select all

Traceback (most recent call last):
  File "switch.py", line 31, in <module>
    if not mcp.input( sensor ):
  File "/root/Adafruit_MCP230xx.py", line 118, in input
    assert self.direction & (1 << pin) != 0, "Pin %s not set to input" % pin
AssertionError: Pin 8 not set to input
If I comment out the mcp output settings, it works fine.
Why? Where is my error?
It seems to loose the input settings. I'm confused.

Following another code correctly runned

Code: Select all

# -*- coding: iso-8859-15 -*-
try:
    from Adafruit_MCP230xx import Adafruit_MCP230XX
    import re, sys, time
    """
    The MCP23017 has 16 pins - A0 thru A7 + B0 thru B7. A0 is called 0 in the library, and A7 is called 7, then B0 continues from there as is called 8 and finally B7 is pin 15

    mapping
    pin1 = col2 = gpio7 => col[1] = 7
    pin3 = col1 = gpio5 => col[0] = 5
    pin5 = col3 = gpio3 => col[2] = 3
    pin2 = raw1 = gpio6 => raw[0] = 6
    pin4 = raw4 = gpio4 => raw[3] = 4
    pin6 = raw3 = gpio2 => raw[2] = 2
    pin7 = raw2 = gpio1 => raw[1] = 1

    """

    # Base variable settings
    OUTPUT = 0
    INPUT = 1
    code = ""

    # keypad array settings
    raw = [ 6, 1, 2, 4 ]
    col = [ 5, 7, 3 ]
    keypad = [ [ '1', '2', '3' ] , [ '4', '5', '6' ], [ '7', '8', '9' ], [ '*', '0', '#' ] ]

    mcp = Adafruit_MCP230XX( busnum = 1, address = 0x20, num_gpios = 16 )
    # GPIO MCP230xx OUTPUT settings
    for gp_out in col:
        mcp.config( gp_out, OUTPUT)

    # GPIO MCP230xx Input settings with Pull-UP resistor
    for gp_in in raw:
        mcp.pullup( gp_in, 1 )

    while ( True ):
        # Base column settings
        for gp_out in col:
            mcp.output( gp_out, 1) # 
        # Column scans
        for col_sel in col:
            # set column to 0 value
            mcp.output(col_sel, 0)

            # Raw scans
            for raw_sel in raw:
                if mcp.input(raw_sel) == 0: # Key pressed
                    value = keypad [ raw.index(raw_sel)][ col.index(col_sel) ] # get key value
                    code += value # building code
                    #print "|" + code + "| - " + str(raw.index(raw_sel)) + ":" + str(col.index(col_sel))

                    if re.search( '^(\d|#)', code ): # If not start with '*' reset code variable: code must start with '*'
                        code = ""
                    if re.search( '(\*(\d+)#)', code ): # Ok code between '*' and '#'
                        print re.match( '.*(\*(\d+)#)', code ).group(2)
                        code = ""

                    while mcp.input(raw_sel) == 0: # wait until key released
                        time.sleep(0.1)

        time.sleep(0.1)

except KeyboardInterrupt:
    sys.exit(127)
Why?

Regards,
Stefano

-rst-
Posts: 1316
Joined: Thu Nov 01, 2012 12:12 pm
Location: Dublin, Ireland

Re: MCP230XX library problem

Tue Feb 26, 2013 1:49 pm

Would it maybe need a call:

Code: Select all

mcp.config( sensor, INPUT)
(no experience in that library, just an 'educated' guess quickly reading the code)
http://raspberrycompote.blogspot.com/ - Low-level graphics and 'Coding Gold Dust'

stefanet
Posts: 13
Joined: Tue Jan 22, 2013 1:42 pm

Re: MCP230XX library problem

Tue Feb 26, 2013 2:02 pm

if i use

Code: Select all

mcp.config( sensor, INPUT)
mcp.pullup( sensor, 1)
I receive an error message.
I don't remember it and I cannot test it now but the pullup command set the pin to input mode and enable the internal resistor.

stefanet
Posts: 13
Joined: Tue Jan 22, 2013 1:42 pm

Re: MCP230XX library problem

Wed Feb 27, 2013 8:19 am

The error is the same

Code: Select all

Traceback (most recent call last):
  File "switch.py", line 31, in <module>
    if not mcp.input( sensor ):
  File "/root/Adafruit_MCP230xx.py", line 118, in input
    assert self.direction & (1 << pin) != 0, "Pin %s not set to input" % pin
AssertionError: Pin 8 not set to input

-rst-
Posts: 1316
Joined: Thu Nov 01, 2012 12:12 pm
Location: Dublin, Ireland

Re: MCP230XX library problem

Wed Feb 27, 2013 1:39 pm

That is rather odd... Looking at this http://learn.adafruit.com/mcp230xx-gpio ... he-library the pullup() should be enough... of course there is the possibility there is a bug in the library code.
http://raspberrycompote.blogspot.com/ - Low-level graphics and 'Coding Gold Dust'

Return to “Python”