Phytonizando el proyecto PicUSB

El proyecto PicUSB lo encontré cuando buscaba una forma de comunicar a un PIC con una PC por medio del estándar USB directamente y no por medio de la emulación CDC (PDF) que crea un puerto RS232 virtual.

Proyecto original

Los archivos del proyecto los bajé hace mucho tiempo  de aquí pero el driver usado es una versión vieja que no soporta windows 7 (debido a las limitaciones propias del driver y la librería de microchip). Este ejemplo está basado en otro proyecto que sí funciona en Windows Vista en la dirección http://www.todopic.com.ar/foros/index.php?topic=2260.0 está la nueva versión y esta hecha por “J1M”.
Lo que hice fue lo mismo que hizo el autor del post gu1llermo en Visual C pero en python: tomar de la API de microchip mpusbapi.dll versión 1.0.0.0 las funciones para comunicarse con el PIC. Las funciones se pueden tomar del código fuente proporcionado por gu1llermo o desde el archivo funciones_dll.txt.
Si se tiene instalado mingw instalado en Windows, se pueden obtener los nombres de las funciones con:
objdump -p mpusbapi.dll
El proyecto original utiliza una aplicación llamada PicUSB que se muestra a continuación:

Al presionar el botón Nro. de dispositivos busca los dispositivos conectados que tengan el valor PID = 0925 y VID = 1231, si encuentra alguno entonces se mostrará un 1 al lado, si no, mostrará un 0. En la primer caja de texto se escribe un valor que representa a un comando, si el número escrito es 1 el LED conectado al PIC se enciende, si es un 2 el LED  se apaga, el comando enviado aparece al lado. Las cajas de texto restantes contienen “parámetros”, que son solo números que al ser enviados con el botón Transmite2 regresa su valor multiplicado por 2.

El circuito original es el siguiente:


Pero este circuito tiene algunos problemas: no siempre funciona y a veces deja de funcionar completamente.

Introducción al estándar USB

USB (Universal Serial Bus) es un estándar desarrollado a mediados de los 90’s que define los cables, conectores y protocolos usados para la conexión, comunicación y alimentación entre computadoras y dispositivos electrónicos.

Componentes del Bus

Las comunicaciones USB necesitan una computadora host con soporte USB. La computadora host es una PC u otra computadora que posea un controlador de host USB y un concentrador de raíz. El concentrador de raíz o root hub es el primer hub al que se le conecta cualquier dispositivo USB y esta embebido en el controlador de host.

El controlador de host da formato a los datos par la transmisión en el bus y traduce los datos recibidos a un formato que los componentes del sistema operativo puedan entender.

El concentrador de raíz y el controlador de host juntos, detectan los dispositivos conectados y desconectados, se encargan de las peticiones de SALIDA del controlador de host, y pasan datos entre los dispositivos y el controlador host. Además del concentrador de raíz,  el bus puede tener uno o mas hubs externos.

Topología

La topología o arreglo de las conexiones en el bus, es de tipo estrella con niveles. En el centro de cada estrella esta un hub, y cada conexión al hub es un punto en la estrella. El concentrador de raíz esta en el host. Un hub externo tiene una conexión ascendente (lado del host) para la conexión con el host y una o más conectores o conexiones internas descendentes (lado del dispositivo) hacia los dispositivos embebidos.

Hasta 5 hubs externos se pueden conectar en serie con un limite de 127 periféricos y hubs incluyendo el concentrador de raíz. Sin embargo, los límites de ancho de banda y de programación (scheduling) pueden prevenir que un solo controlador host se comunique con esta cantidad de dispositivos. Para incrementar el ancho de banda disponible para los dispositivos USB, muchas PC’s tienen múltiples controladores de host, cada uno controlando independientemente un Bus.

Prueba del acelerómetro BMA180 con PIC y PyQwt

En este ejemplo se tomarán como base los ejemplos anteriores. Así que, tendremos tres gráficas indicando las aceleraciones en tiempo real con su respectivo valor numérico, pero además, un indicador de interrupción y un termómetro.
Comenzaremos con la breakout board de Sparkfun. Esta placa tiene todos los pines del BMA180 separados y dos capacitores como filtros.

Descripción de los pines

VDD: Alimentación del sensor.
GND: Conexión a tierra.
INT: Salida Digital. Indica si un evento de interrupción ha ocurrido. Lógica positiva.
CS: Entrada digital.Chip select. Corresponde al pin CSB. Cuando este pin esta a 0V, se activa la funcionalidad SPI.
SCK: Entrada digital. Entrada de la señal de reloj.
SDO: Entrada/salida digital. Salida SPI o configuración de la dirección I2C.
SDI: Entrada/salida digital. Entrada SPI o datos seriales I2C.
VIO: Entrada de alimentación digital. Corresponde al pin VDDIO. La interfaz serial con el microcontrolador puede manejar voltajes diferentes que la alimentación del sensor. Por ejemplo, el sensor pude ser alimentado a 2.0V y la interfaz serie puede trabajar a 3.6V.