Publicidad

viernes, 2 de diciembre de 2016

Controlar tu arduino desde la PC mediante comandos de texto

En muchas ocasiones durante el desarrollo de proyectos con arduino te habrás topado con la necesidad de controlar tu arduino desde la PC. Ya sea desde una aplicación realizada a la medida o simplemente desde el monitor serial de arduino. Por ejemplo podemos realizar acciones tan sencillas como encender un led y llegar a cosas más complejas como cambiar la dirección IP de nuestro ethernet shield sin necesidad de reprogramar el sketch o cambiar los parámetros de un algoritmo de control en tiempo de ejecución, etc.
Existen varios enfoques para controlar tu arduino desde la PC, sin embargo en esta entrada presentamos un método que permite la mayor flexibilidad desde nuestro punto de vista. Te presentamos una librería que  hemos desarrollado y que nos permite emular la experiencia de la “consola” o “terminal” de un sistema operativo en un PC de escritorio, pero esta vez ejecutandose dentro de cualquier microcontrolador que disponga de un compilador de C. Esto permite cambiar parámetros, solicitar la ejecución de programas (funciones) y cambiar configuraciones y parámetros del programa mientras este se ejecuta. Para comprobar y entender el funcionamiento básico de esta librería controlaremos un led RGB desde el puerto serie de la PC.
En la foto de portada vemos el circuito de prueba de un led RGB conectado al arduino. Podemos controlar arduino desde la PC mediante comandos de texto y cambiar el color mostrado en el LED RGB a voluntad.

Conceptos básicos

Un LED RGB es un dispositivo que en un solo encapsulado contiene 3 diodos emisores de luz. Cada uno de estos emisores de luz corresponde a uno de los colores básicos (Rojo, Verde y Azul). Por lo que podemos representar prácticamente todos los colores conocidos.
controlar_tu_arduino_desde_la_PC_led_rgb
Este tipo de led se encuentran en varias configuraciones. Nosotros vamos a requerir un led RGB con cátodo común, es decir que la tierra o negativo de cada led esta conectado a un único pin. Por lo tanto debemos aplicar un voltaje positivo a cada uno de los otros pines para encender cada led individual. Existe la configuración opuesta, en la que el ánodo es común y por lo tanto debemos conectar a tierra los otros pines para encender cada diodo.

La librería “shell” para arduino

Esta librería permite controlar nuestros programas y dispositivos con simples comandos de texto de manera similar a la terminal en Mac OSX o linux y la linea de comandos de Windows. Los comandos pueden transmitirse al microcontrolador mediante un puerto serie, un socket TCP/IP o una conexión USB CDC.
La librería puede descargarse desde github en el enlace que se muestra a continuación. Si deseas saber como se realiza la instalación de una librería de arduino puedes consultar este otro tutoríal.
github_logo

Uso de la librería “Shell” para controlar tu arduino desde la PC

Para utilizar la librería debemos llamar al principio de nuestro programa o sketch a la función de inicialización shell_init() que le dice a la librería que funciones debe usar para leer y escribir sobre el medio (serial, TCP/IP, etc.) Estas funciones deben ser provistas por el usuario (programador). En el caso de arduino, creamos unas funciones (wrappers ) que “envuelven” a los métodos write() y read() de la clase Serial y simplemente redirigen los datos desde y hacia nuestra librería. El ultimo parámetro (nulo o 0 en este caso) permite definir un mensaje personalizado de bienvenida, que aparece al principio de la terminal, antes de que se solicite cualquier comando.
Luego, el usuario debe asociar los comandos y las funciones, es decir, indicamos una cadena que al recibirse en el puerto serie causará que la librería invoque a la función correspondiente. Esto se hace llamando a la función shell_register() que acepta por una parte un apuntador a función y la cadena correspondiente al comando. Se hace de la siguiente forma:
Finalmente, dentro del ciclo principal de cada aplicación, el programador debe asegurarse de llamar a la función shell_task(), ya que dentro de esta se procesan los caracteres recibidos y es la encargada de ejecutar las funciones que asociamos a cada cadena.
Los programas (funciones) que implementan cada uno de los comandos se deben escribir con el prototipo estándar de C para una utilidad de linea de comandos y reciben los parámetros para realizar su función de manera análoga. Por ejemplo esta es la función que ejecutaríamos al escribir “mycommand” y presionar la tecla enter:
Como podemos ver la función solamente imprime la cadena “Ejecutando mycommand” y luego retorna, sin embargo, podemos crear funciones que afecten prácticamente cualquier aspecto del funcionamiento del programa o que realicen cualquier acción. El resultado del ejemplo mostrado aquí es el siguiente:
libreria_shell_ejemplo_basico
Este ejemplo lo podemos encontrar listo para compilarse y probarse en la carpeta “Ejemplos>Shell>Shell_Basic” una vez que hemos instalado nuestra librería.
Por ejemplo podemos crear comandos para prender/apagar un led, mover un motor, o leer un sensor. A continuación estudiaremos un ejemplo que nos permite controlar un led RGB con la PC.

Materiales necesarios.

Diagrama de conexiones Controlar LED RGB desde la PC

La siguiente ilustración muestra como debemos efectuar las conexiones para el ejemplo que vamos a cargar en nuestro arduino a continuación. Utilizamos un LED RGB de cátodo común con sus respectivas resistencias de 330 ohms.
arduino_con_led_RGB
La vista detallada de las conexiones y el circuito armado es la siguiente:
controlar_tu_arduino_desde_la_PC_led_rgb_conexiones
Considera lo siguiente al armar el circuito:
  • El pin más largo del led es el común.
  • El pin más largo se conecta a tierra (pin GND de Arduino).
  • Se utilizan los pines de conexión 3, 5 y 6 por que son salidas PWM de la tarjeta Arduino UNO

Ejemplo: Controlar led RGB desde la PC

Este sketch de ejemplo controla un led RGB para cambiar el color y brillo del led enviamos el comando:
rgbled 100 100 100
Al finalizar de escribir el comando debemos enviar los caracteres CR y LF (ASCII). Con esto controlamos las componentes RGB del led. El primer número es el componente rojo, el segundo el verde y el tercero el azul. El sketch que implementa el control del led RGB mediante comandos de texto es el siguiente:
Nótese que hemos omitido todas las comprobaciones sobre los datos recibidos, incluso si se han proporcionado las 3 componentes de color, todo esto en favor de la simplicidad. Sin embargo, si hemos mostrado algunas características de la librería “Shell” como la capacidad de imprimir texto con formato usando la función shell_printf(). Hemos destacado esto en color amarillo en el código más arriba.
El resultado del ejemplo anterior es el siguiente visto en el monitor serial de arduino:
control_de_led_rgb_con_Arduino_y_pc

Conclusiones

La librería shell.h permite controlar tu arduino desde la PC mediante el puerto serial o  ethernet fácilmente. En esta entrada hemos realizado un proyecto básico que nos permite saber como funciona la librería y los pasos necesarios para asociar comandos con las cadenas de texto. También pudimos observar que los parámetros pasados a las funciones invocadas por la librería, son exactamente iguales que el estándar para una utilidad de linea de comandos en C o C++. Por lo que para muchos programadores más experimentados será fácil acostumbrarse a escribir programas para la plataforma arduino y microcontroladores.

Diagrama de pines Arduino (Pinout)

¿Cuantas veces no te ha pasado que la serigrafía en la placa de arduino no explica lo suficiente sobre las funciones de cada pin? Bueno, sabemos lo incómodo que puede resultar y mientras navegábamos por el foro de arduino encontramos la solución a este problema. Notamos que un usuario hizo un excelente trabajo realizando el diagrama de pines Arduino. En esta entrada del blog, compartimos con ustedes este excelente trabajo que vale la pena imprimir y tener a la mano como referencia en nuestro banco de trabajo.

Diagrama de Pines Arduino Uno R3 (mapa de pines)

El arduino uno es por mucho la placa arduino más popular, este es el diagrama de las funciones asociadas a cada uno de los pines. Conviene tenerlo impreso y siempre cerca de nuestro arduino favorito.
Diagrama de Pines Arduino Uno R3

Diagrama de Pines Arduino Mega 2560 R3 (mapa de pines)

El arduino mega es el siguiente paso cuando hemos dominado el Arduino UNO R3, dispone de muchos más pines de I/O y mucha más memoria RAM y Flash. Aquí tienes el diagrama de pines correspondiente.
diagrama_de_pines_arduino_mega_2560

Diagrama de Pines Arduino  Nano (mapa de pines)

El arduino nano dispone del mismo microcontrolador que el arduino UNO, pero viene en un paquete mucho más pequeño y es amigable con el protoboard. La distribución de sus pines es la siguiente:diagrama_de_pines_arduino_nano

Diagrama de Pines Arduino Leonardo (mapa de pines)

El arduino leonardo se caracteriza por integrar en un solo chip la interfaz USB y el microcontrolador (ATMEGA32U4). Puede funcionar como ratón, memoria USB y virtualmente cualquier otro periférico USB que se nos ocurra.
diagrama_de_pines_leonardo

Diagrama de Pines Arduino Micro (mapa de pines)

El arduino micro es la versión miniatura del arduino leonardo, al igual que este incluye un ATMEGA32U4 que es ideal para aplicaciones con conectividad USB. Su diseño favorece el uso del protoboard.
diagrama_de_pines_micro

Diagrama de Pines Arduino Yun (mapa de pines)

El arduino Yun integra un procesador que corre linux y un microcontrolador ATMEGA32U4. Es ideal para aplicaciones que requieren conectividad a internet y/o servicios web.
diagrama_de_pines_arduino_yun

Descargar todos los diagramas en formato PDF y enlaces

Programación inalámbrica de Arduino por Bluetooth

En este artículo vamos a enseñarte como puedes realizar la programación inalámbrica de Arduino por Bluetooth, es decir, como puedes cargar tus sketch a la placa ¡Sin cables!. Esto puede ser útil si requieres que tu arduino se encuentre lejos de tu lugar de trabajo (escondido en un gabinete, por ejemplo), en campo: para actualizar el firmware de placas que no son fácilmente accesibles, o simplemente no te agrada tener una gran cantidad de cables en tu área de trabajo.
Hay que aclarar que la programación inalámbrica de arduino por bluetooth tiene sus pros y contras, ya que la velocidad de carga del sketch será mucho menor, sin embargo, para realizar pruebas de programas pequeños (led blink, por ejemplo) o para realizar alguna actualización esporádica de firmware, puede resultar la solución ideal.
Para esta experiencia estaremos usando uno de nuestros módulos bluetooth HC-05, ya que este módulo se comercializa con un PCB que expone el pin “Status”. Este pin puede configurarse para cambiar a estado bajo cuando abrimos la conexión al puerto serie bluetooth, lo cual nos proporciona la forma ideal de activar el reset (y comenzar el funcionamiento del bootloader) del arduino.
En la foto de portada observamos el circuito que utilizaremos armado sobre un protoboard, pero que podemos armar de forma más definitiva usando un proto shield.

Configurando el módulo HC-05 para la Programación inalámbrica de Arduino por Bluetooth

Antes de que el HC-05 funcione como un programador, debemos configurar el módulo para que se comporte como lo esperamos. Debemos asegurarnos que el módulo tenga los siguientes parámetros ajustados:
  • En el caso de Arduino UNO con Optiboot: UART configurada a 115200 baudios, 8 bits, 1 bit de parada, sin paridad
  • En el caso de Arduino Duemilanove / Decimilia: UART configurada a 56700 baudios, 8 bits, 1 bit de parada, sin paridad
  • Configurar la polaridad del pin de state para la polaridad adecuada
Ya explicamos en otra entrada el funcionamiento del módulo bluetooth HC-05 y como entrar al modo de configuración. Por lo que solamente dejamos la secuencia de comandos que debemos introducir para poner a funcionar el módulo como “Programador Inalámbrico” para tu arduino. Si hay dudas, te recomendamos revisar nuestra otra entrada que aborda con más profundidad el tema de la configuración del bluetooth HC-05.
Los comandos a enviar al HC-05 para configurarlo son los siguientes:
Linea por linea lo que hacemos es lo siguiente:
  1. Restaurar la configuración de fabrica
  2. Configurar en modo esclavo (puente serial transparente desde la PC)
  3. Configurar la polaridad del pin 32 (etiquetado como State en nuestros módulos) del módulo HC-05 para que vaya a estado bajo cuando un dispositivo se conecte al módulo
  4. Configurar el baudrate a la velocidad del bootloader
  5. Salir del modo de configuración e iniciar la operación normal del módulo HC-05
Si eres curioso, puedes consultar la hoja de datos del bluetooth HC-05 para ver los detalles de cada comando utilizado.
En esta foto podemos ver que un adaptador USB a TTL puede ser de gran ayuda para configurar el módulo bluetooth HC-05, conectándolo al puerto USB de la computadora.

Conexión del Bluetooth HC-05 para la Programación inalámbrica de Arduino por Bluetooth

Conectaremos los pines TX y RX del bluetooth a los pines RX y TX del arduino respectivamente (van cruzados). El pin status del bluetooth pasará a funcionar como reset y debemos conectarlo al pin “reset” del arduino a través de un capacitor cerámico de 100 nF. Las resistencias que se muestran en el circuito son para reducir el voltaje del pin TX (salida de 5 volts) de arduino a algo cercano a 3.3 Volts, que es el nivel lógico que admite el módulo bluetooth. Las conexiones van como se muestra en la siguiente imagen:Circuito para la programación inalámbrica de Arduino por Bluetooth
Una vez que tengamos armado el circuito puede verse de la siguiente manera en un protoboard.
programacion_inalambrica_de_arduino_por_bluetooth_01
En este momento ya tenemos el hardware listo para intentar realizar la programación de Arduino por Bluetooth. Por lo que podemos abrir nuestro IDE y realizar el proceso de forma habitual, veremos que es muy similar a lo que haríamos para cargar un sketch mediante un cable USB. Cabe destacar que cada vez que un dispositivo bluetooth se enlace con el módulo se va a producir el reset del arduino, dado que el pin de “Status” cambiará a estado bajo. Hay que considerar esto, si deseamos que, por ejemplo, se conserve el estado de las salidas digitales (se pierde en el reset).

Programación inalámbrica de Arduino por Bluetooth

Una vez que ya tenemos el módulo bluetooth configurado y el circuito montado, podemos intentar la programación inalámbrica de Arduino por Bluetooth por primera vez. En este punto vamos a asumir que ya tenemos el módulo HC-05 emparejado con nuestra PC y tenemos el puerto serie sobre bluetooth mostrándose correctamente en nuestro administrador de dispositivos, la forma de hacer esto varía de acuerdo al sistema operativo y no lo vamos a incluir aquí. Pero debemos revisar que en el administrador de dispositivos de windows se muestre correctamente los puertos serie virtuales de bluetooth, como se muestra a continuación:
programacion_inalambrica_de_arduino_por_bluetooth_00
Abrimos el IDE de arduino como es habitual y seleccionamos el nuevo puerto serie que se creo cuando emparejamos el bluetooth con la PC.
programacion_inalambrica_de_arduino_por_bluetooth_01
Abrimos el sketch de “LedBlink” que se encuentra en la carpeta de ejemplos y presionamos el botón “Cargar” para comenzar la descarga del programa a la tarjeta arduino.
programacion_inalambrica_de_arduino_por_bluetooth_02
La carga del programa debería transcurrir de forma normal, hasta que se comience a ejecutar el código cargado en el arduino. Si hay errores puede deberse a que conectamos alguna de las señales incorrectamente o que no configuramos correctamente la polaridad del pin “state”.
NOTA: Si por algún motivo el sketch no se puede grabar en el arduino, hay que experimentar con el valor del capacitor, normalmente es buena idea aumentar su valor hasta garantizar que el arduino se resetea de manera correcta al abrir el puerto serie sobre bluetooth. Los valores recomendamos son de 100 nF a 1 uF.

Conclusiones

  • La Programación inalámbrica de Arduino por Bluetooth es una buena alternativa cuando no tenemos a la mano la tarjeta para conectarla al puerto USB de la computadora
  • Podemos convertir cualquier arduino en una placa inalámbrica, capaz de ser programada a distancia mediante bluetooth. Incluso podemos utilizar solamente el ATMEGA328 con el módulo bluetooth dentro de algún desarrollo.
  • El baudrate esta fijo en 115200 baudios, por que es la velocidad de descarga para optiboot (bootloader de arduino UNO).
  • Cualquier sketch que desee transmitir información a la PC mediante bluetooth (por ejemplo con Serial.write()), debe hacerlo utilizando la velocidad de 115200 baudios, ya que el bluetooth permanecerá configurado de esa forma.
  • La carga de los sketch puede durar más si se usa bluetooth, al parecer se debe a la sobrecarga de los protocolos involucrados en la transmisión inalámbrica.
  • Recordemos que cada vez que nos conectemos con un dispositivo bluetooth al arduino, este se va a reiniciar.

Publicidad