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