INTRODUCCIÓN
¿Has pensado usar una firmado para su proyecto Arduino , sólo para descubrir que el dispositivo que desea utilizar no está soportado por una firmado? Este artículo demuestra el enfoque paso a paso solía añadir soporte motor paso a paso a PyMata y a su asociado Arduino Sketch, FirmataPlus. Después de leer este tutorial debe ser listo para extender una firmado para su dispositivo.
Antes de comenzar - algunos antecedentes sobre una Arduino/firmado
¿Qué es una firmado? Citando la página web de una firmado, "una firmado es un protocolo genérico para la comunicación con microcontroladores de software en un equipo host".
Arduino Firmata utiliza una interfaz en serie para transportar información tanto comandos como informe entre un microcontrolador Arduino y un ordenador, normalmente utilizando un enlace serie/USB a una velocidad de 57600 bps. Los datos transferidos a través de este enlace están binarios en la naturaleza y el protocolo está implementado en un modelo decliente/servidor .
El lado del servidor se carga a un microcontrolador Arduino en la forma de un Arduino Sketch. El bosquejo de StandardFirmata , incluido con el IDE de Arduino, controla los pernos de la entrada-salida de Arduino, como mandado por el cliente, e informa de cambios de entrada de pin, así como otra información del informe al cliente. FirmataPlus es una versión ampliada de StandardFIrmata.
El Arduino cliente utilizada para este artículo es PyMata. Es una aplicación de Python que se ejecuta en un PC. Tanto envía comandos a y recibe informes desde el servidor de Arduino.
¿Por qué utilizar una firmado?
Microcontroladores Arduino son maravillosos dispositivos, pero procesador y memoria recursos son algo limitados. Para aplicaciones intensivas de memoria o procesador, es a menudo más remedio a la descarga de la demanda de recursos en una PC para la solicitud tener éxito.
Pero eso no es la única razón para usar StandardFirmata. Al desarrollar aplicaciones de Arduino de peso ligeros, un PC puede proporcionar herramientas y capacidades de depuración no directamente sobre un microcontrolador Arduino. Usando un "fijo" cliente y servidor ayuda a aislar la variabilidad para una aplicación de PC, donde se es más fácil de administrar. Una vez que se perfecciona la aplicación, puede ser traducido a un independiente personalizada, Arduino Sketch.
¿Por qué utilizar PyMata?
En el momento de escribir esto, PyMata es el sólo Python cliente que implementa el protocolo completo de StandardFirmata. Es una biblioteca multiplataforma que soporta sistemas operativos Windows, MAC y Linux fuera de la caja!
Además, PyMata fue diseñado para que los usuarios podrían fácilmente extendido para apoyar adicionales sensores y actuadores, actualmente no soportados por StandardFirmata.
No mucho después PyMata fue publicado inicialmente, fue ampliado para apoyar la biblioteca de tono de Arduino y soporta hasta seis simultánea HC-SR04 sonar distancia sensores de tipo. Las extensiones de lado del servidor para que estas características se encuentran en FirmataPlus.
Resumen del PyMata de cliente y el servidor de FirmataPlus
PyMata es una aplicación de Python de multiproceso de alto rendimiento. Su "hilo de comando" traduce las llamadas de API de usuario en los mensajes de protocolo una firmado y remite estos mensajes para el microcontrolador de Arduino. El hilo de"reportero" recibe, interpreta y actúa sobre los mensajes de una firmado recibidos desde el microcontrolador de Arduino.
Una versión personalizada de StandardFirmata, llamado FirmataPlus, se incluye con la distribución de PyMata . Actualmente, agrega lo siguiente a StandardFirmata:
- Una interfaz de dispositivo piezoeléctrico usando la biblioteca de tono de Arduino
- Soporte para múltiples sensores de distancia por ultrasonidos mediante la biblioteca de NewPing
- Soporte limitado (Arduino Uno sólo) para codificadores rotatorios utilizando la biblioteca de codificador rotatorio de adafruit
- Función para imprimir valores internos del bosquejo a la consola de Python de la impresión de una depuración.
Comprender la representación de los datos de una firmado
Una firmado utiliza un interfaz serie de comunicaciones al transporte de datos a y desde el Arduino. El protocolo de comunicaciones una firmado se deriva el protocolo MIDI que utiliza uno o más bytes de 7 bits para representar datos. Porque 7 bits puede contener un máximo de 128, un elemento de datos que tiene un valor mayor que 128, debe ser "desarmado" en múltiples trozos de bytes de 7 bits antes de ser calcular referencias a través del enlace de datos. Por Convención, el byte menos significativo (LSB) de un elemento de datos se envía en primer lugar, seguido por los componentes cada vez más importantes del elemento de datos. El el byte más significativo (MSB) del elemento de datos es el dato último artículo enviado.
Por ejemplo, si un parámetro llamado max_distance con un valor decimal de 525 debe ser enviado a través del enlace serial, primero necesita a "desmontar" en trozos de 7 bits.
Esta es una discusión de cómo esto se logra:
El valor de 525 decimal es equivalente al valor hexadecimal de 0x20D, un valor de 2 bytes. Para obtener el LSB, enmascaran el valor por AND'ing con 0x7F. Las implementaciones de "C" y Python se muestran a continuación:
// "C" implementation to isolate LSB int max_distance_LSB = max_distance & 0x7f ; // mask the lower byte # Python implementation to isolate LSB max_distance_LSB = max_distance & 0x7F # mask the lower byte
Después de enmascarar, max_distance_LSB contendrá 0x0d. 0x20D & 0x7F = 0x0D
A continuación, tenemos que aislar el MSB para este valor de 2 bytes. Para ello, cambiará el valor de 0x20D a la derecha, 7 lugares.
// "C" implementation to isolate MSB of 2 byte value int max_distance_MSB = max_distance >> 7 ; // shift the high order byte # Python implementation to isoloate MSB of 2 byte value max_distance_MSB = max_distance >> 7 # shift to get the upper byte
Después de cambiar de puesto, max_distance_MSB contendrá un valor de 0 x 04.
Cuando se recibieron los datos referencias "chunkified", es necesario montarlo en un solo valor. Aquí es cómo se vuelve a montar los datos en "C" y Python
// "C" implementation to reassemble the 2 byte, // 7 bit values into a single value int max_distance = argv[0] + (argv[1] << 7) ; # Python implementation to reassemble the 2 byte, # 7 bit values into a single value max_distance = data[0] + (data[1] << 7)
Después del reensamblaje, el valor nuevo es igual a 525 decimal o hexadecimal 0x20D.
Este procesos de desmontaje y montaje se pueden realizar por el cliente o el servidor.