lunes, 11 de abril de 2016

Configurar entradas y salidas digitales del expansor MCP23017

Para este tutorial se recomienda visitar los anteriores tutoriales:
Instalación de glade y gladevcp
Gui básica Glade

Antes de  utilizar la librería hal de MCP23017, se va a realizar una prueba utilizando un pequeño programa hecho en Python.

import time
from drivers.MCP23017 import MCP23017 as MCP

mcp = MCP(0x27,1,False)

mcp.init()

for i in range(0,8):
    mcp.setDir(MCP.PORT_A, i, MCP.DIR_OUT)
    mcp.setDir(MCP.PORT_B, i, MCP.DIR_OUT)

while True:
  
    for i in range(0,8): 
        mcp.setValue(MCP.PORT_A,i,1)
        mcp.setValue(MCP.PORT_B,i,1)
    mcp.write()
    time.sleep(1)

    for i in range(0,8):
        mcp.setValue(MCP.PORT_A,i,0)
        mcp.setValue(MCP.PORT_B,i,0)
    mcp.write()
    time.sleep(1)


Si se obtiene el siguiente error, hay que modificar la librería MCP23017.py.

Traceback (most recent call last):
  File "mcp23017.py", line 23, in <module>
    mcp.write()
  File "/usr/lib/python2.7/dist-packages/drivers/MCP23017.py", line 158, in write
    self.updateValue(i, self.port[i].value)
  File "/usr/lib/python2.7/dist-packages/drivers/MCP23017.py", line 119, in updateValue
    self.i2c.write_byte_data(self.address, reg, value)
IOError: [Errno 121] Remote I/O error

El error sucede por no inicializar de forma correcta las interrupciones. Para solucionar hay que aumentar lo siguiente a la librería MCP23017.py.

sudo nano /usr/lib/python2.7/dist-packages/drivers/MCP23017.py

    def init(self):
        config = 0
        config |= self.__MCP23017_IOCON_BANK1
        config |= self.__MCP23017_IOCON_MIRROR_DIS
        config |= self.__MCP23017_IOCON_SEQOP_DIS
        config |= self.__MCP23017_IOCON_DISSLW_EN
        config |= self.__MCP23017_IOCON_HAEN_EN
        config |= self.__MCP23017_IOCON_ODR_DIS
        config |= self.__MCP23017_IOCON_INTPOL_HIGH
        
        self.i2c.write_byte_data(self.address, self.__MCP23017_REG_IOCON, config)
        
        for i in range(0, 2):
            ##### Interrupt defaults
            # Disable interrupts on all pins by default
            reg = self.portBase[i] + self.__MCP23017_REG_GPINTEN
            self.i2c.write_byte_data(self.address, reg, 0x00)
            # Interrupt on change register set to compare to previous value by default
            reg = self.portBase[i] + self.__MCP23017_REG_INTCON
            self.i2c.write_byte_data(self.address, reg, 0x00)
            # Interrupt compare value registers
            reg = self.portBase[i] + self.__MCP23017_REG_DEFVAL
            self.i2c.write_byte_data(self.address, reg, 0x00)
            # Clear any interrupts to start fresh
            reg = self.portBase[i] + self.__MCP23017_REG_GPIO
            self.i2c.read_byte_data(self.address, reg)
            # Enable all latches
            reg = self.portBase[i] + self.__MCP23017_REG_OLAT
            self.i2c.write_byte_data(self.address, reg, 0xFF)

            self.port[i].reset()
            self.portOld[i].reset()
            self.updateDir(i, self.port[i].dir)
            self.updatePullup(i, self.port[i].pullup)
            self.updateValue(i, self.port[i].value)


Para utilizar las interrupciones del MCP23017, revisar el siguiente link:

MCP23017 Interrupciones.

Para detectar la dirección i2c ejecutar:

En el caso de estar conectado al pin P9.19 y P9.20.

i2cdetect -y -r 1

 
Si se desea usar los pines P9.17 y P9.18, hay que exportar el Device Tree Overlay del I2C1.

sudo nano BB-I2C1-00A0.dts

Copiar el código DTS.

BB-I2C1-00A0.dts

Compilar Device Tree Overlay.

dtc -O dtb -o BB-I2C1-00A0.dtbo -b 0 -@ BB-I2C1-00A0.dts

Mover a "/lib/firmware" y Ejecutar.

sudo mv BB-I2C1-00A0.dtbo /lib/firmware/
sudo su
cd /lib/firmware/
echo BB-I2C1 > /sys/devices/bone_capemgr.9/slots
cat /sys/devices/bone_capemgr.9/slots

Ahora ya se puede usar I2C_1 en el bus 2.

i2cdetect -l
i2cdetect -y -r 2



En el terminal ejecutar halrun para visualizar los pines que creará el componente hal_gpio_mcp23017.

halrun
loadusr -Wn buttons hal_gpio_mcp23017 -n buttons -b 1 -a 39 -op A00,B00 -ip B01
show pin 

buttons es el nombre con el que se crearán los pines hal, -b indica el bus del i2c (puede ser 0, 1 o 2) en este caso se ocupa el i2c de los pines P9.19 y P9.20, -a 39 indica que se esta usando la dirección i2c 0x27 (39) conectado A0,A1,A2 a VCC, -op indican las salidas que se van a usar y -ip las entradas que se usarán.

Activar buttons.A.out-00.

setp buttons.A.out-00 1
show pin 
exit


Para probar algunas entradas y salidas del MCP23017, se va a crear una GUI simple con Glade. En la GUI se pondrá 2 HAL_ToggleButton y 2 HAL_LED. Los HAL_ToggleButton tienen el nombre de boton0 y boton1; los HAL_LED tienen el nombre de LED0 y LED1. Se ha guardado con el nombre de InputOutputGPIO.glade.


Se ha creado un archivo hal para realizar las conexiones correspondientes con los botones y los led´s.

sudo nano InputOutputGPIO.hal

#Outputs
net boton0 InputOutputGPIO.boton0 buttons.A.out-00 InputOutputGPIO.LED0
net boton1 InputOutputGPIO.boton1 buttons.B.out-00 InputOutputGPIO.LED1
#Input
net boton-info <= buttons.B.in-01
net boton-info => gmoccapy.v-button-7 

EL pin GPB1 está conectado a un interuptor infrarrojo que hace la función de pulsador para activar y desactivar el boton de info de gmoccapy_lcd7. Las salidas GPA0 y GPB0, están conectadas a LED´s para visualizar el funcionamiento al pulsar el boton HAL_ToggleButton.

Lo siguiente es incluir el archivo  .hal y .glade en el archivo .ini.

[DISPLAY]

# Name of display program, e.g., tkemc
#DISPLAY =               tkemc
#DISPLAY =              axis
DISPLAY =              gmoccapy_lcd7

EMBED_TAB_NAME = Boton
EMBED_TAB_LOCATION = box_left
EMBED_TAB_COMMAND = gladevcp -g 80x80+10+10 -H InputOutputGPIO.hal InputOutputGPIO.glade

La Gui se abrirá en una ventana de 80x80 pixeles y se recorrerá 10 en X y 10 en Y pixeles.

Lo último es iniciar el componente hal MCP23017 en el arhivo .hal principal.

loadusr -Wn buttons hal_gpio_mcp23017 -n buttons -b 1 -a 39 -op A00,B00 -ip B01

Si se desea agregar más MCP23017 se debe cambiar el nombre y dirección del i2c.

loadusr -Wn buttons1 hal_gpio_mcp23017 -n buttons1 -b 1 -a 32 -op A03,A05,B00 -ip B01,A00

buttons es el nombre con el que se crearán los pines hal, -b indica el bus del i2c (puede ser 0, 1 o 2) en este caso se ocupa el i2c de los pines P9.19 y P9.20, -a 39 indica que se esta usando la dirección i2c 0x27 (39) conectado A0,A1,A2 a VCC, -op indican las salidas que se van a usar y -ip las entradas que se usarán.




InputOutputGPIO.glade.





No hay comentarios.:

Publicar un comentario