Archivo del Autor: ecarletti

Unidad de Medición Inercial Multipropósito – IMU Razor M0 de 9DoF (parte 1)

La IMU Razor M0 de 9DoF (Unidad de Medición Inercial Multipropósito: Multi-purpose Inertial Measurement Unit = IMU) combina un microprocesador SAMD21 con un sensor MPU-9250 de 9DoF (nueve grados de libertad), creando una unidad compacta y reprogramable. Se puede programar para monitorear y registrar movimiento, transmitir ángulos de Euler por un puerto serie, o incluso para funcionar como un podómetro que cuente los pasos.

Una unidad de medición inercial o IMU (del inglés inertial measurement unit), es un dispositivo electrónico que mide e informa acerca de la velocidad, orientación y fuerzas gravitacionales de un aparato, usando una combinación de acelerómetros y giróscopos. En este caso se agrega un nivel más: un magnetómetro, que permite conocer la ubicación respecto al campo magnético terrestre. Las unidades de medición inercial se usan para maniobrar aviones, incluyendo vehículos aéreos no tripulados, entre muchos otros usos, y además naves espaciales, incluyendo transbordadores, satélites y aterrizadores. La IMU es el componente principal de los sistemas de navegación inercial usados en buques y misiles guiados entre otros. En este uso, los datos recolectados por los sensores de una IMU permiten a un computador seguir la posición del aparato, usando un método conocido como navegación por estima.

El chip MPU-9250 de 9DoF de la Razor posee tres sensores cada uno de tres ejes –un acelerómetro, un giroscopio y un magnetómetro– que le dan la capacidad de detectar aceleración lineal, velocidad de rotación angular, y vectores de campo magnético.

El microprocesador que contiene –el SAMD21G18A de Atmel–, es un microcontrolador ARM de 32-bit Cortex-M0+ compatible con Arduino, que se utiliza también en los Arduino Zero y el SAMD21 de la nueva línea MKR de mini plaquetas de Arduino.

Además del par principal de circuitos integrados, la IMU Razor de 9DoF posee un zócalo para trajeta µSD, un cargador para baterías LiPo, llave de encendido y un conector de E/S para proyectos de expansión. Viene pre-programada con un firmware de ejemplo y un bootloader compatible con el IDE de Arduino, de modo que se puede modificar el firmware según las necesidades y grabarle nuevo código a través de una conexión USB.

Este artículo provee una fuente de información para comenzar, y una guía de inicio para trabajar con la IMU de SparkFun de 9DoF Razor M0. Documentaré primero las características de hardware y firmware de la plaqueta, y a continuación, mostraré cómo usar el IDE de Arduino con la biblioteca MPU-9250 de Sparkfun para Arduino para reprogramar la IMU Razor a las necesidades de nuestros proyectos.

Materiales necesarios

La IMU Razor M0 de 9DoF está provista de todo lo que se necesita para aprovechar el sensor MPU-9250 de 9DoF. Solo harán falta unos pocos elementos –la mayoría son de esos que uno ya tiene entre sus componentes– además de la plaqueta.




Se puede utilizar un cable micro-B USB para alimentar y también para reprogramar la Razor. Si usted desea tener una placa independiente para que sea móvil, va a necesitar una batería de polímero de Litio de celda única (Lithium-polymer, o LiPo), que se puede recargar conectando la Razor 9DoF en un cargador USB o en un puerto de su PC. Además, si usted necesita registrar los datos, se debe colocar una tarjetita µSD en el zócalo de la IMU Razor. Acepta µSD de cualquier tipo.

Finalmente, puede ser necesario soldar algunos conectores si se desea aprovechar las capacidades de Entrada/Salida y de alimentación de la IMU.

Lecturas sugeridas

El fabricante ha tratado de hacer que la placa sea fácil de usar independientemente del nivel de experiencia en electrónica del usuario. Sin embargo, si desea realizar una lectura previa antes de utilizar y desarrollar programas para el el 9DoF Razor IMU M0, aquí hay algunos tutoriales que ellos recomiendan (inglés):

Giroscopio
Los giroscopios miden la velocidad de rotación alrededor de un eje y son una parte esencial para determinar la orientación en el espacio.

Acelerómetro (Bases)
Una introducción rápida a los acelerómetros, cómo funcionan y por qué se utilizan.

SAMD21
Una introducción al microprocesador Atmel ATSAMD21G18 y las placas de distribución Mini y Pro R3. Mejore sus habilidades Arduino con el potente procesador ARM Cortex M0 +.

MPU-9250
Iníciese y ponga en marcha el sensor MEMS de 9 ejes MPU-9250.

El hardware

Esta placa IMU tiene montados una cantidad de componentes sobre ambas caras del circuito impreso. La imagen muestra el lado que se define como cara superior.

El reverso de la plaqueta posee diversos conectores, además del zócalo de la microSD, la llave de encendido y LEDs para indicar diversas funciones.

Esta IMU es un diseño de hardware abierto. Se puede descargar el diagrama esquemático (en PDF), los archivos Eagle (con el diseño del circuito impreso), y ver la historia del diseño en el reservorio GitHub de Sparkfun.

Alimentando la IMU Razor M0

Esta plaqueta está diseñada para trabajar tanto alimentada desde el cable USB, o con una batería LiPo en el conector adecuado. Sólo hay que asegurarse de que la batería sea de celda simple, con un voltaje nominal de 3,7V a 4,2V.

Conecte tanto el USB como una LiPo para cargar la batería


Si se conectan ambos, el USB y la batería LiPo en la plaqueta, ésta se cargará con una corriente de hasta 450 mA. El estado de la carga lo indica el led amarillo de carga, que se apaga cuando la batería queda cargada a pleno.

Corriente de carga 450mA: La corriente máxima de carga está fijada por un resistor externo y no es modificable, al menos no con facilidad. La práctica nos dice que no es seguro cargar una batería LiPo con una corriente mayor a sus mA/h, lo que significa que no se recomienta utilizar baterías LiPo con capacidades menores a 450mAh para esta plaqueta.

Sea alimentada desde la fuente de USB, o con la batería LiPo, el voltaje es regulado a 3,3 V y se utiliza para alimentar tanto el SAMD21 como el MPU-9250. El regulador tiene una capacidad de aproximadamente 600 mA, lo que significa que debería tener suficiente resto para entregar corriente. Si lo desea puede alimentar otros dispositivos desde los pines marcados con 3V3.

Los pines VIN, VBAT y GND se pueden usar para alimentar el regulador de 3,3V de la IMU Razor en lugar de utilizar las entradas USB o el conector para la LiPo (JST). El voltaje en el pin VIN no debe exceder los 6V, y el pin VBAT solo debe conectarse a una batería LiPo de una celda.

Finalmente, el interruptor de ENCENDIDO/APAGADO en la parte inferior de la placa controla la alimentación entre ambas fuentes de entrada y el resto de los componentes de la placa. Mientras está en la posición «OFF» (Apagado), la batería LiPo seguirá en carga, pero no se debe aportar energía a ningún otro componente.

Perforaciones de pines para el SAMD21 y la alimentación

La placa tiene perforaciones preparadas para soldar conectores con tantos pines de Entrada/Salida del microcontrolador SAMD21 como se pudieron acomodar en el pequeño tamaño de la IMU Razor. Eso incluye los pines 08-13, las entradas del convertidor analógico a digital A0-A4, RX, TX, y los pines I2C, SDA y SCL.

Los pines SDA y SCL están en el mismo bus I2C que el MPU-9250, pero eso no debería ser un problema siempre que los dispositivos I2C adicionales no compartan las direcciones de 7 bits de la IMU (0x68 y 0x0C).

Usted puede soldar conectores hembra como los que tienen los Arduinos UNO y Mega, o hileras de pines macho, o directamente cablear a esos puntos de soldadura para expandir las funciones de la plaqueta. Por ejemplo, usted puede conectar un sensor BME280 directamente en el puerto I2C, y agregar detección de altitud y temperatura a su IMU.

Algunos módulos de la misma marca basados en I2C utilizan la misma
distribución de 4 pines, así que se pueden conectar directamente


El puerto de depuración single-wire = SWD (de un solo cable) del SAMD21 también está perforado en la parte superior de la placa, en caso de que se quiera programar el chip con un depurador JTAG. El pinout de este puerto coincide con el estándar del conector de depuración Cortex de 10 pines. Una «muesca» blanca indica el pin 1 de este puerto.

MPU-9250 Orientación de Acelerómetro / Giroscopio / Magnetómetro

La orientación del acelerómetro, el giroscopio y los ejes X, Y y Z del magnetómetro es determinada por la posición del MPU-9250. Para facilitar la referencia, estos vectores se han documentado con una impresión en la parte superior de la placa.

Tenga en cuenta que los ejes X e Y del magnetómetro están invertidos respecto a los del acelerómetro y el giroscopio, y que el eje Z también está invertido.

Trabajando con el firmware de ejemplo

Además de un gestor de arranque de Arduino (bootloader), el IMU también tiene cargado un ejemplo de firmware que es suficiente para demostrar, al menos, que funciona el seguimiento de movimiento del sensor, e incluso hacer un pequeño registro en una tarjeta µSD. Para comenzar a usar el firmware de ejemplo, simplemente conecte la IMU a una computadora.

Después de conectar la placa, debe aparecer como un puerto serie. En Windows, aparece como COMx y en Mac, debería verse como /dev/tty.usbserial-ABCD12.

Instalación del controlador

Usuarios de Windows 10: la primera vez que conecte el IMU Razor a su computadora, es posible que deba instalar controladores para habilitar el perfil USB de la clase de dispositivo de comunicación (CDC) de la placa.
Si su placa no aparece como un puerto COM, haga clic en el botón de abajo para descargar los controladores.

DESCARGAR DRIVERS DE WINDOWS PARA SAMD21

Para obtener ayuda para instalar los controladores, consulte las instrucciones del fabricante en la guía de conexión de Breakout SAMD21.

Después de ubicar el puerto de la placa, abra el Terminal Serie y establezca la velocidad en baudios a 115200 bps. El Monitor Serie del Arduino funciona bien para este propósito, o puede descargar alguno diferente desde aquí: programas de terminal.

Al abrir el puerto, el IMU Razor 9DoF debe comenzar inmediatamente a enviar las lecturas del acelerómetro, el giroscopio y el magnetómetro.

El formato estándar de la línea de texto es:

<timeMS>, <accelX>, <accelY>, <accelZ>, <gyroX>, <gyroY>, <gyroZ>, <magX>, <magY>, <magZ>

Esta línea se puede modificar enviando cualquiera de los siguientes comandos:

  • ESPACIADOR – Pausa/reinicio de impresión de puerto serie
  • t – Habilitar/deshabilitar las lecturas de tiempo
  • a – Habilitar/deshabilitar las lecturas del acelerómetro
  • g – Habilitar/deshabilitar las lecturas del giróscopo
  • m – Habilitar/deshabilitar las lecturas del magnetómetro
  • c – Alternar entre valores calculados o sin procesar de las lecturas
  • q – Habilitar/deshabilitar lecturas cuaternianas (qw, qx, qy y qz se muestran luego de las lecturas magnéticas)
  • e – Habilitar/deshabilitar cálculos Euler de ángulo (pitch, roll, yaw) (se muestran luego del procesamiento cuaterniano)
  • h – Habilitar/deshabililar las lecturas de encabezado
  • r – Ajustar el ritmo de registro en incrementos de 10Hz entre 1-100Hz (1, 10, 20, … 100)
  • A – Ajustar el rango de escala máxima del acelerómetro. Cicla entre ± 2, 4, 8, and 16 g.
  • G – Ajustar el rango de escala máxima del giroscopio. Cicla entre ± 250, 500, 1000, 2000 dps.
  • s – Habilitar/deshabililar el registro en tarjeta SD

Todas las configuraciones se almacenan en una memoria no volátil, por lo que al iniciar su IMU Razor 9DoF deberá tener la misma información con que la configuró anteriormente.

Además de iniciar sesión en su puerto serie, el firmware también está diseñado para registrar los datos en una tarjeta µSD, si hay una presente. Coloque una y debería tener los archivos de registro de IMU la próxima vez que conecte la tarjeta SD a su lector.

El firmware del 9DoF Razor IMU está disponible en el repositorio GitHub del producto. Para cargar el firmware, necesitará las definiciones de la placa SparkFun SAMD21 y la biblioteca SparkFun MPU-9250 DMP Arduino instalada en su máquina. Que es exactamente lo que vamos a documentar a continuación…

El IMU Razor 9DoF M0 está diseñado en base al SAMD21, el mismo procesador del Arduino Zero, lo que significa que agregar el soporte de Arduino para la placa está a solo unos clics. Esta sección describe los pasos que deberá seguir para instalar los núcleos SAMD en su biblioteca Arduino (eso suena más atemorizante de lo que realmente es).

¡Actualizar Arduino! Esta configuración requiere al menos la versión 1.6.4 o posterior e Arduino. Lo he probado en 1.8.8 y recomendaría esa versión del IDE o superior. Si está ejecutando una versión anterior de Arduino, visite arduino.cc para obtener la última y mejor versión.

Instale las placas de Arduino SAMD

Primero, deberá instalar una variedad de herramientas, que incluyen bibliotecas ARM Cortex de bajo nivel llenas de código genérico, arm-gcc para compilar su código y bossa para cargar código a través del bootloader. Estas herramientas vienen empaquetadas junto con las definiciones de la placa SAMD de Arduino para el Arduino Zero.

Para instalar las definiciones de la placa Arduino SAMD, vaya a su administrador de la placa ( Herramientas > Placa > Gestor de tarjetas … ), luego busque una entrada “Arduino SAMD Boards (32-bits ARM Cortex-M0+)”. Selecciónela e instale la última versión (actualizada recientemente a 1.6.20).

La descarga e instalación de las herramientas puede demorar un par de minutos; en particular, arm-gcc llevará más tiempo, se trata de 250 MB sin comprimir.

Una vez instalado, el texto azul «INSTALLED» debe aparecer dentro de la entrada de la lista de placas SAMD.

Instalar la definición de la placa SparkFun

Ahora que sus herramientas ARM están instaladas, se requiere un último paso de configuración para agregar soporte para las placas SparkFun SAMD. Primero, abra sus preferencias de Arduino ( Archivo > Preferencias ). A continuación, busque el cuadro de texto Gestor de URLs adicionales de Tarjetas y pegue allí el siguiente enlace:

https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_spark fun_index.json

Luego presione «OK«, y regrese al menú del Gestor de tarjetas. Debería encontrar una nueva entrada para las placas SAMD de SparkFun.

Esta instalación debería ser mucho más rápida; el trabajo pesado fue realizado en la sección anterior.

Seleccione la placa y el puerto serie

Una vez que se haya instalado la placa, debería ver algunas entradas nuevas en la lista Herramientas > Placa, incluida la Razor IMU M0 de SparkFun 9Do, en el menú «Placas SparkFun SAMD (ARM Cortex-M0 +) de 32 bits». Y finalmente, seleccione el puerto del IMI 9DoF Razor yendo al menú Herramientas > Puerto.

La plaqueta ya funcionará con el programa de ejemplo. En un próximo artículo cargaremos este programa de ejemplo, para comprobar el funcionamiento del bootloader, y podremos comenzar a realizar pruebas, cambiando el programa a gusto y escribir nuevos programas a medida de nuestro propio proyecto de detección de movimientos.

[ Continúa en la parte 2 ]



Sistema para estacionamiento de un auto y para evitar acercarse demasiado a otro vehículo

Utilizando sensores ultrasónicos, los autos modernos nos dan una útil ayuda en el momento de maniobrar, especialmente al estacionarlos en espacios limitado. Podemos hacer nuestro sistema detector con un Arduino UNO y unos pocos componentes de bajo costo


Cómo funciona el sensor ultrasónico HC-SR04

El sensor ultrasónico HC-SR04 nos permite medir distancias por medio de emisión y rebote de ultrasonidos. Para medir distancias con Arduino podemos hacerlo de diferentes maneras.

Por orden de costo, hay un sensor que mide con el rebote de un láser; luego un sensor de infrarrojos que utiliza el paralaje del regreso de un haz de luz para calcular la distancia; y por último el más barato, el sensor ultrasónico HC-SR04, muy utilizado con Arduino, que utiliza la velocidad de propagación del sonido para medir distancia.

Para que no sea molesto al oído humano, utiliza ultrasonido a una frecuencia de 40 kHz. Estas ondas sonoras tienen una frecuencia muy por encima del espectro audible por los seres humanos.
El sensor funciona como un sonar, por rebote de la onda. El emisor del HC-SR04 envía un tren de ondas ultrasónicas cuando se activa la señal de disparo (trigger). Este sonido se refleja contra el objeto y retorna. El receptor detecta el momento en que retorna la onda y lo indica en la salida eco (echo).

Midiendo el tiempo de viaje podemos calcular la distancia.

La velocidad del sonido en la atmósfera terrestre es de 343,2 m/s a 20° C de temperatura, con 50% de humedad y a nivel del mar. Si necesitamos una gran exactitud, podemos agregar al diseño sensores BMP180 o BMP280, que nos aportan datos de altitud y temperatura, e incluso agregar un medidor de humedad, y por supuesto aplicar una fórmula más compleja. Pero para este diseño no necesitamos tanta precisión.

La fórmula de la velocidad es:

velocidad = espacio/tiempo

De donde despejamos la variable espacio, que necesitamos conocer:

espacio = velocidad x tiempo

La velocidad es conocida: la del sonido. El tiempo lo obtenemos con el sensor ultrasónico. Con ambos datos, podemos calcular la incógnita: a qué distancia se encuentra un objeto.

El zumbador o buzzer

Para simular correctamente un medidor de distancia de un automóvil utilizamos un buzzer (zumbador) pasivo. No hay que confundirlo con el zumbador activo, que tiene un oscilador interno, y por lo tanto una frecuencia fija y polaridad en sus pines de conexión.

Este reproductor no tiene un rango tan amplio de emisión de sonido como el del oído humano, ni mucho menos, pero es suficiente para diferenciar la distancia con frecuencias diferentes dentro de lo que es capaz de emitir. Además de los pequeños (como el de la foto), que vienen incluidos en los kits de Arduino, hay otros con mayor diámetro de diafragma (por ejemplo en el desarme de viejos modems), que ofrecen más volumen y un rango de frecuencias más amplio.

Sistema de alerta con leds y zumbador

Si bien al maniobrar no estaremos mirando hacia un indicador, sino atentos a los tonos de aviso, agregaremos al diseño un sistema de alerta visual. Nos dará una indicación aún más efectiva de si estamos cerca o lejos de un obstáculo. Con tres leds (verde, amarillo y rojo) conseguimos determinar si estamos a distancia sin riesgo, acercándonos, o en zona de peligro. Pero se podría ampliar la indicación con más leds y más comparaciones en el programa.

Componentes:

Arduino UNO, protoboard, cables para conexiones, resistores de 330 Ω, led verde, led amarillo, led rojo, sensor ultrasónico Arduino (HC-SR04), buzzer




Circuito:

Los resistores son de 330 Ω y van en serie con los LEDs. El sensor ultrasónico se conecta a dos pines digitales, uno para el trigger o disparador y otro para el echo, o receptor. El buzzer se conecta a una salida PWM y a GND. La salida PWM entregará distintas frecuencias según la indicación del programa, por medio de la función tone().

Programando el detector de distancia

Diagrama del programa

Los umbrales para la decisión se fijan como constantes, uno para cada situación. Podemos medir la distancia con una regla y determinarlos.

■ UmbralAlejado: está en zona verde desde 50 cm a 30 cm.
■ UmbralMedio: está en zona amarilla, desde 30 cm a 10 cm.
■ UmbralCerca: está en zona roja, menos de 10 cm.

Estos umbrales no son definitivos: se pueden cambiar a gusto del usuario.

El programa debe analizar la medición dividida en 4 zonas: fuera de rango (más de 50 cm, ninguna indicación), entre 50 cm y 30 cm (zona verde), entre 30 cm y 10 cm (zona amarilla), entre 10 cm e impacto (zona roja).

■ Luego de medir la distancia se la compara con el umbral que indica fuera de rango (50 cm).
■ Si la distancia es menor a ese valor está en zona verde: se enciende el led verde y emite el tono de 2000 c/s.
■ Si la distancia es menor a 30 cm y mayor a 10 cm está en zona amarilla: enciende el led amarillo y emite el tono de 2500 c/s.
■ Si la distancia es menor a 10 cm está en zona roja: enciende el led rojo y emite el tono de 3000 c/s.

Programa

Para esta determinación de rangos, es importante buscar en la hoja de especificaciones técnicas el rango de funcionamiento del sensor de ultrasonidos que disponemos. Para este artículo se usó uno que puede medir de 2 cm a 400 cm.

Artículos relacionados:

VL53L0X: Sensor de distancia que mide por la velocidad de la luz (Time-of-Fly)

Dando a los vehículos autónomos una “visión eléctrica” más aguda

Módulo de emisor piezoeléctrico pasivo KY-006 (Kit de sensores Keyes 6)

RCWL-0516: Módulo sensor de movimiento de microondas con radar Doppler



Entendiendo ASCII en el desarrollo de lenguaje de máquina integrado

Este artículo, que sirve como preparación para una discusión de cadenas (strings) en lenguaje C, presenta el concepto de caracteres ASCII y explica dos beneficios de las técnicas de codificación basadas en ASCII.


Un microprocesador o microcontrolador es una colección compleja de circuitos que manipulan voltajes lógicos altos y voltajes lógicos bajos. Para mayor comodidad, nos referimos a estos voltajes como unos y ceros, y diseñamos los procesadores de manera que estos unos y ceros puedan manipularse en conjunto y tratarse como números binarios.

La mayoría de la gente se volvería loca o se quedaría dormida si se vieran obligados a observar el flujo interminable de números binarios dentro y fuera de un microprocesador. La tecnología computacional ha transformado la existencia humana porque estos números binarios se pueden usar para representar cosas que a las personas realmente les importan: música, fotografías o, en el caso del ASCII, letras y dígitos.

Entendiendo el ASCII

ASCII significa Código Estándar Americano para el Intercambio de Información (American Standard Code for Information Interchange = ASCII). En este código, un número binario significa exactamente un caracter, donde «caracter» se refiere a una letra mayúscula, una letra minúscula, un dígito, un signo de puntuación, o varias otras cosas que se pueden encontrar en un teclado. La siguiente tabla le brinda la «traducción» entre los números (aquí, escrita en notación decimal en lugar de binaria) y los caracteres ASCII correspondientes al alfabeto en mayúsculas y minúsculas.

(Nota: Quede claro que cuando en EEUU dicen “americano” se refieren a algo que se aplica solamente a ellos, no a toda América. Quedaba afuera, en principio, toda letra que no se usa en el inglés actual, letras con acentos, diéresis, circunflejo, tildes, y otras diferenciaciones fonéticas en otros idiomas, y por eso se creó la tabla de ASCII extendido, que está incluida más abajo).


Es esencial comprender que su microcontrolador no sabe nada acerca de las letras del inglés u otra lengua (y menos aún de los caracteres acentuados de diferentes maneras o especiales en cada idioma), los signos de puntuación o los dígitos. Su microcontrolador es una máquina muy pequeña, diseñada para procesar números binarios, y cualquier carácter que esté presente en su lenguaje de máquina (firmware) es simplemente su interpretación de los números binarios.

Se puede producir una seria confusión debido a la impresión errónea de que sus variables, o elementos de matriz, contienen realmente caracteres ASCII de una forma u otra. El desarrollo de firmware se vuelve más claro, más ágil y más flexible cuando uno se da cuenta de que los caracteres en realidad son números binarios, y se pueden almacenar, transferir y manipular como números binarios; no se convierten en caracteres ASCII hasta que esté todo listo para interpretarlos como caracteres ASCII.

ASCII Extendido

Beneficios y contras del ASCII

El ASCII es necesario para la programación humana. Hay muchas aplicaciones integradas que pueden beneficiarse del uso de caracteres ASCII, y creo que es una buena idea adquirir el hábito de reconocer situaciones en las que se puede incorporar caracteres ASCII en su código.




Un estándar ampliamente utilizado

Un beneficio innegable de ASCII es la estandarización. Los entornos de desarrollo integrado, los programas de terminal y los paquetes de software computacional comprenden el ASCII y, por lo tanto, los caracteres ASCII son una forma conveniente y efectiva de transferir y mostrar información.

En este ejemplo, una aplicación muestra una representación binaria basada en datos de un sensor:

Transferencia de datos confiable

Un beneficio más sutil, pero quizás igual de importante, es el hecho de que el ASCII proporciona un medio para representar información utilizando un conjunto restringido de números binarios. Cualquier valor numérico puede representarse mediante una secuencia de los dígitos ASCII del 0 al 9 (junto con el punto decimal ASCII si es necesario). Estos caracteres ASCII corresponden a un subconjunto muy pequeño de los 256 valores ofrecidos por un número binario de 8 bits. Pero ¿por qué esto importa?

Imagine que tiene una aplicación en la que un microcontrolador debe transferir mediciones impredecibles y altamente variables de sensores de 8 bits a una PC. Si se transfieren los datos como números binarios ordinarios, un byte individual puede contener un número cualquiera del 0 al 255. Esto nos deja sin una forma conveniente y sencilla de organizar datos o incorporar comandos en el flujo de datos, porque para transferir las mediciones en bruto solo son necesarios todos los números binarios posibles. El PC (y menos nosotros) no puede distinguir entre los datos de medición numéricos y otros tipos de información.

Si se transfieren los datos de medición utilizando caracteres ASCII en lugar de números binarios ordinarios, entran en juego los beneficios de un conjunto restringido. Solo se necesitan diez valores binarios (correspondientes a los dígitos ASCII del 0 al 9) para representar los datos numéricos, y varios otros valores binarios pueden reservarse para una funcionalidad especial, porque nunca aparecerán en los datos de medición.

Aquí, los dígitos ASCII se utilizan para transferir una lectura de temperatura. El final de cada lectura se identifica con un retorno de carro (abreviado CR = Carrier Return); el valor binario correspondiente a CR nunca aparecerá en los datos de medición.

Reducción de la eficiencia

El precio que se paga por esta estandarización y transferencia de datos mejorada es que se usa con menos eficiencia la memoria, el ancho de banda del procesador y el ancho de banda de la comunicación.

El ASCII es un sistema basado en bytes. Cada carácter requiere ocho bits, incluyendo, por ejemplo, el dígito «1», que en circunstancias binarias normales puede representarse mediante un número de 1 bit en lugar de un número de 8 bits.

En la experiencia de un programador actual, esto rara vez es un problema serio; los microcontroladores modernos tienen recursos de procesamiento y memoria que exceden con creces los requisitos de muchas aplicaciones. Sin embargo, si realmente se necesita maximizar el rendimiento o minimizar el uso de la memoria, es posible que debamos renunciar a la conveniencia de usar ASCII.

De ASCII a cadenas de caracteres

Este artículo no es solo una descripción general de ASCII sino también una introducción a la forma en que se maneja una representación basada en caracteres en el lenguaje de programación C. Nos referimos a este tipo de representación como una cadena (string), que es una secuencia o «encadenamienro» de caracteres ASCII.

Veremos más en detalle las cadenas en un próximo artículo.



Servidor web básico NodeMCU con IDE de Arduino

Diseñamos aquí un servidor HTTP básico con una placa NodeMCU con ESP8266 y el IDE de Arduino 


Para más referencia de cómo agregar la familia de plaquetas y las bibliotecas necesarias para la familia ESP, les ofrezco leer el reciente artículo ESP8266 (WiFi): Hacer que parpadee un LED desde el IDE de Arduino (más básico que este) donde se desarrollada con mucho detalle tanto que es un ESP8266 como esta instalación.

Es posible que la comunidad ESP no tenga mucho entusiasmo en programar con Arduino, y sí hacerlo con las herramientas propias de la línea del ESP8266. Y es totalmente lógico y razonable. Pero a veces es un alivio disponer de la facilidad del uso del IDE de Arduino y su lenguaje simplificado, más cuando uno está acostumbrado a estas herramientas.

Por eso se ha escrito una biblioteca (o librería) y definición de placas, para programar esta versátil y potente línea con el IDE de Arduino.

Usaremos una placa NodeMCU, que contiene un módulo ESP12E, versión 1.0, un cable USB adecuado para esta placa y una computadora conectada a Internet. El ESP8266, el chip básico del sistema, requiere una red WiFi, así que suponemos que ese tipo de conexión estará disponible.

Definición de dispositivos y librería

Necesitamos disponer del IDE de Arduino, una versión actualizada. La última que ofrece oficialmente http://arduino.cc es la 1.8.8. Si usted está trabajando con una de versión anterior a 1.8.x le recomiendo actualizar.

Copio aquí la explicación del artículo anterior. Si ya instaló en esa ocasión, no tiene que hacer todo esto y puede saltar a la sección Diseño del servido http básico, más abajo.


El ESP8266 se puede programar desde el IDE de Arduino. Para eso hay que instalar lo que se llama un plugin, en el que está incluido todo lo necesario para compilar y subir programas que fueron escritos tal como si fuesen .INO de Arduino.

Debemos incorporar librerías y los programas de manejo de las placas con el chip ESP8266 a nuestro IDE. Para hacerlo, debemos indicarle la URL desde donde se obtienen.

Para hacerlo, debemos abrir el menú Archivo, y luego Preferencias.

Veremos este panel, en la parte inferior el recuadro de texto rotulado Gestor de URLs Adicionales de Tarjetas. Dentro de él, usando copiar y pegar, se debe introducir el texto indicado aquí:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

(copie y pegue en el recuadro):

Luego pulse en el botón Ok.

Ahora debemos ir al menú Herramientas, luego Placa.

Y finalmente Gestor de Tarjetas, se abrirá una ventana como la que sigue, en la cual escribimos, en el recuadro superior de filtro/busqueda, “ESP8266” (antes de terminar de escribir ya aparecerá el Gestor de Tarjetas que buscamos, que indica que fue creado por “ESP8266 Community”. Allí pulsamos sobre Instalar:

Al abrir nuevamente Herramientas, y luego Placa, deslizamos la lista para ver lo que aparece al final de ella (abajo), y vemos que ya existen las opciones referidas a los ESP8266:

Así queda todo preparado para programar NodeMCU ESP12E desde el IDE Arduino.





Servidor HTTP básico

Este pequeño servidor que proponemos muestra el título que elijamos en nuestro navegador. Hemos elegido escribir «Saludos de Robots Argentina», pero el texto es a elección del programador.

Declaramos la librería ESP8266WiFi.h al inicio, definimos el nombre y el password de la red (la de su proveedor y la de su conexión; y un puerto.

En la función setup() inicializamos el puerto Serial. A través de él podremos monitorear desde la PC para saber a qué IP se ha conectado la placa.

Ahora se realiza la conexión a la red WiFi. Si se logra, lo indica por serie y lo veremos en el Monitor Serie del IDE.

Puesta en operación del servidor.

Mostrar por Monitor Serie la dirección IP que le ha otorgado a la placa el router de la red.

En la función loop() se comprueba si está establecida la nueva conexión. Si así es, se envía el contenido de la página web, que consta de cabeceras HTML y el contenido que deseamos para la página.

Programa completo:

Copiamos el programa en el IDE del Arduino, y ahora, antes de probar si se compila correctamente, debemos conectar la placa NodeMCU a USB y decirle al IDE de Arduino qué tipo de placa vamos a programar. Debemos elegir en Herramientas el «NodeMCU 1.0 (ESP-12E Module)». Si usted tiene otro tipo de placa con ESP8266 y sabe cómo conectarla a USB, elija en la lista su módulo correcto y todo funcionará del mismo modo. Espere a que el IDE detecte la placa y defina en que número de COM serie está.

Cargar el programa

Dentro del menú «Herramientas» cambiamos el tipo de placa por una NodeMCU 1.0 (ESP-12E Module), o el modelo que tengamos.

Al elegir y si se conecta bien indicará estos valores: frecuencia de la CPU: 80 MHz, tamaño de flash: 4M (1M SPIFFS), velocidad de carga: 115200. El puerto dependerá de la máquina (en Linux puede ser /dev/ttyUSB0 o /dev/ttyUSB1).

Determinada esta elección dispositivo y conexión COM, ya se puede cargar el programa de la manera habitual.

Al correr el programa nos indicará en qué dirección IP encontramos la página web que hemos creado en la placa. Introduciéndola en la barra de dirección del navegador, podremos verla con el mensaje que hemos elegido. Si este mensaje tuviese una parte variable, por ejemplo algún valor que varía, como el registro de un sensor de temperatura u otro indicador, y/o la hora/minuto/segundo.

Artículos relacionados: ESP8266 (WiFi): Hacer que parpadee un LED desde el IDE de Arduino



Módulo de teclado sensible al tacto TTP229

Este teclado de 16 teclas se conecta utilizando una conexión I2C (2-Wire), aunque en el chip sensor capacitivo TTP229 tiene implementada la opción de conectar solamente 8 teclas, que tienen salida directa en los pines del módulo. Son los pines marcados como OUT1 a OUT8. Las líneas marcadas SDO y SCL pertenecen a la interfaz I2C.

Características

■ Fácil de usar, calibración automática
■ LED de encendido
■ Funciona en modo 8 o 16 canales.
■ La salida puede ser configurada como activa alta o baja
■ Simple para reemplazar salidas de llaves mecánicas
■ La salida se puede conectar directamente a los pines de entrada del microcontrolador

Especificaciones

■ Voltaje de funcionamiento: 2V-5,5V
■ Tiempo de calibración de inicio: 0,5 seg.
■ Tamaño de la plaqueta: 49,3 x 64,5mm

Este módulo es una buena alternativa para reemplazar teclados mecánicos, ya que es durable, fácil de instalar (es totalmente plano), se puede proteger con una membrana en ambientes de atmósfera corrosiva, y proporciona más durabilidad en condiciones de trabajo continuado.

Puentes que definen las opciones

(Ver las opciones definibles en la tabla abajo)

EJEMPLO:

Diagrama de pines del circuito integrado TTP229

El teclado se puede configurar tanto para usar con 8 teclas como con 16. Para el primer caso, parece poco razonable usar sólo la mitad, ya que en realidad se venden módulos directamente con sólo 8 teclas, y también con 4 y hasta con una sola.

En todo caso, la división de funciones, y la multiplicidad de opciones que se pueden elegir usando una serie de puentes en la plaqueta aportan amplia funcionalidad y una buena adaptación para distintos usos.

Cuando se elige la opción de 16 teclas, se los lee por medio de una interfaz serie de 2 vías, llamada comúnmente 2-Wire en el mundo Arduino, o I2C.

Una vez conectado el hardware y descargando el código al Arduino, al pulsar los teclas se pueden observar los resultados en el Monitor Serie del IDE Arduino.

Diagrama en bloques del circuito integrado TTP229

Diagrama del módulo de teclado TTP229

PROGRAMAS DE PRUEBA

Conexión directa de las salidas de 8 teclas

Si en alguna ocasión se necesita utilizar sólo la serie de teclas del 1 a 8, la configuración y la lectura por programa es más sencilla y simple de entender. La conexión involucra 8 pines del conector del módulo de teclado al Arduino, y dos más de ellas para alimentación +5 y GND.

Esta forma de uso tiene la desventaja de que ocupa muchas entradas digitales (que nunca sobran), aunque la ventaja es que no necesariamente se debe usar un Arduino u otro microcontrolador para recibir datos desde el módulo si se lo usa con esta configuración. Podría servir para introducir órdenes de teclado en un circuito puramente digital, sin procesador ni programa.

Diagrama de conexiones con Arduino

Código simple para 8 teclas

Resultado en Monitor Serie




Conexión para leer las 16 teclas

Para leer los teclas del 1 a 16 se debe hacer a través de la interfaz serie I2C o 2-Wire del Arduino, utilizando SCL y SDO, y con dos pines digitales que uno elija y el programa adecuado, que en general es muy simple.

Conexión entre el Arduino y el teclado para el ejemplo de 16 teclas por I2C

Cablear como se muestra a continuación y además hacer un puente en el módulo del teclado para configurarlo para funcionar con 16 teclas, sobre los puntos marcados “TP2”, que se muestran abajo en naranja.

Esto se hace soldando un alambrecito que una estos 2 terminales.

Diagrama de la conexión con Arduino

Código para la lectura de 16 teclas

Resultado en Monitor Serie

Lectura de 16 teclas con posibilidad de pulsar más de una a la vez

Como en cada caso en que se habilitan 16 teclas, la comunicación con el microcontrolador se realiza por medio del protocolo I2C. Cada tecla está asociada a un bit en un entero sin signo de dos bytes.

Estos son algunos ejemplos:

La tecla 1 aparecerá como 0000 0000 0000 0001
La tecla 2 aparecerá como 0000 0000 0000 0010
La tecla 3 aparecerá como 0000 0000 0000 0100
… …
La tecla 9 aparecerá como 0000 0001 0000 0000
La tecla 12 aparecerá como 0000 1000 0000 0000
La tecla 16 aparecerá como 1000 0000 0000 0000

Cuando se tocan dos o más teclas, el entero asociado contendrá dos bits o más en 1. Por ejemplo, si se pulsan la tecla 1 y la 16 al mismo tiempo, el entero asociado será 1000 0000 0000 0001

Conexiones:

Los pines TP0 a TP4 en el teclado se deben conectar (hacer un puente) como en la figura siguiente:

Diagrama de conexión con el Arduino:

Código para 16 teclas – multitecla – interfaz 2-wire:

En la Terminal Serie del IDE de Arduino se verá lo que sigue al pulsar las teclas desde 1 a 16 (Nota: debido a la manera en que la función Serial.println maneja las variables, el Monitor Serie no muestra los ceros a la izquierda del entero de 16 bits):

Para este ejemplo: PDFs de ayuda (en inglés) desde el siguiente enlace:
http://osoyoo.com/driver/TTP229.rar

Se puede descargar el programa INO (con textos en inglés) desde el siguiente enlace:
http://osoyoo.com/wp-content/uploads/2016/07/TTP229_all.rar