domingo, 29 de junio de 2014

Simuladores Arduino

En algún foro leí una vez una solicitud de un visitante acerca de información de simuladores de Arduino. Uno de los miembros del foro le respondió que para que un simulador, con lo económico que resulta adquirir un Arduino. Ciertamente el argumento es válido, sin embargo, en ocasiones es útil tener a disposición un programa que permita emular/simular el funcionamiento del Arduino.

Existen varios emuladores/simuladores en el mercado , tanto gratuitos como de pago. Una lista reducida sería:

En general las versiones de pago son muy completas, especialmente Proteus, en comparación con las versiones gratis, las cuales disponen de un número limitado de componentes.

En el caso de Emulare tiene la opción de emular comunicación serial, con lo que podemos simular en el emulador scripts que hagan uso del puerto serial , como por ejemplo el shell bitlash:



SimulIDE tiene una interfase gráfica muy amigable:


viernes, 20 de junio de 2014

Alimentación de Arduino

Las tarjetas Arduino pueden ser alimentadas de varias formas:
  1. Mediante una fuente externa al conector cilíndrico. Las tensiones recomendadas son : mínimo 7 Voltios y máximo 12 voltios. En mi opinión la tensión ideal es 9 Voltios.
  2. Mediante el conector USB. En este caso se suministra directamente al circuito 5 Voltios sin pasar por la etapa de regulación de tensión.
  3. Mediante los pines VIN y GND : Es similar a la primera opción. No es recomendable.
  4. Mediante los pines VCC y GND : Es similar a la segunda opción. Tampoco es recomendable
En principio las tarjetas permiten estar alimentadas al mismo tiempo por el conector cilíndrico y por el conector USB, dando preferencia a este último, sin embargo no es recomendable.

Cuando armamos un Arduino en un protoboard usualmente incorporamos un regulador de tensión de 5 Voltios para poder alimentar el circuito con una tensíón de entrada de entre 7 y 12 voltios (similar a la opción 1 mencionada anteriormente):


Aunque la etapa de regulación es sencilla (el regulador y tal vez dos  condensadores), podemos alimentar directamente el circuito mediante tres o cuatro baterias AA/AAA. Esto es debido a que las especificaciones del micro atmega 386p establecen que puede operar a 16Mhz con una alimentación de 3.6 Voltios como mínimo.

En la imagen se muestra un circuito alimentado con tres baterias de NiCd recargables. La tensión suministrada es de aproximadamente 3.8 Voltios, siendo suficiente inclusive para alimentar un display de 7 segmentos.



A continuación los valores mínimos asociados a la frecuencia de operación:
  • 4.5 Voltios para 20Mhz
  • 3.6 Voltios para 16Mhz
  • 2.7 Voltios para 10Mhz
  • 1.8 Voltios para 8Mhz
No hay que olvidar que el valor máximo en cualquier caso no debe superar 5.5 Voltios.

lunes, 16 de junio de 2014

Comunicación serial con Arduino

En ocasiones requerimos visualizar información enviada por el Arduino a través de su puerto serial.
Hoy en día muy pocos computadores tienen puertos seriales, la tecnología vigente es el puerto USB, que también utiliza comunicación serial pero bajo otros parámetros técnicos.
Es por ello que se requiere una interfase entre el puerto serial del microcontrolador y el puerto USB del computador. 
Tarjetas como la UNO, Leonardo, MEGA, etc , incorporan esta interfase. Por otro lado tarjetas como la PRO o mini no la incorporan, por lo que se requiere la utilización de interfases externas (ver la entrada Convertidores serial/USB ).

Esto en cuanto al hardware. Para poder visualizar la información que entra por el puerto USB del computador, debemos ejecutar un programa específico para dicho propósito. El IDE de Arduino incorpora el Monitor/Serial , el cual dispone de una línea para enviar comandos al Arduino y una ventana para mostrar la información enviada por éste.




El Monitor/Serial en general es suficiente para la mayoría de los usuarios y usos . Sin embargo, existen varias alternativas con ventajas/desventajas en relación con el primero.

Se puede consultar el artículo Serial Terminal Basics (inglés) de Sparkfun donde se explica en detalle este tema y se analizan las diferentes alternativas disponibles.

Es importante tener en cuenta que debe parametrizarse el programa que estemos utilizando para que la conexión con el Arduino funcione adecuadamente. Los parámetros mas importantes son:

  • Puerto COM a utilizar
  • Velocidad de conexión (baud)
  • Protocolo de conexión : Software
  • Formato de la data : 8 bits, sin paridad y 1 bit de stop

sábado, 14 de junio de 2014

Cargar programa compilado (hex) mediante AX Loader y XLoader

Un script en Arduino es un programa fuente en lenguaje de programación similar a C.
El script se crea en el IDE , se compila (se genera un archivo con extensión .hex) y se carga en el Arduino (al presionar el botón Cargar del IDE se compila y se carga en el micro).
En ocasiones no disponemos del programa fuente, sólo del programa ya compilado.
Si deseamos cargarlo en el Arduino no podemos hacerlo mediante el IDE, necesitamos utilizar otro tipo de aplicación diseñada para este propósito.

En realidad el programa que requerimos viene incorporado en el IDE y se llama avrdude.
Este programa no es gráfico, es un programa tipo linea de comando y su ejecución requiere suministrar una serie de parámetros algo complicados.
Para solventar este inconveniente se han desarrollado interfases gráficas que interactúan con el avrdude y su ejecución resulta muy sencilla.

Dos  de estos GUI (interfase gráfica) que destacan por su sencillez  son AX Loader y XLoader .

AX Loader:





Como se puede ver en la pantalla,  requerimos suministrar el modelo de la tarjeta,  el puerto y el nombre del archivo compilado (extensión .hex) .

Xloader:


En este caso requerimos suministrar el nombre del archivo compilado (extensión .hex) el modelo de la tarjeta , el puerto y la velocidad de comunicación. Este último parámetro lo asigna por defecto el programa al seleccionar la tarjeta.

Es importante tomar en cuenta que es necesario que el Arduino tenga pregrabado el bootloader, ya que estamos haciendo una conexión a través del puerto serial.
Si tenemos un Arduino "virgen" debemos grabar el bootloader mediante un programador, que puede ser otro Arduino actuando como programador ISP.

Actualización 24/02/2020 :

También están disponibles los programas AVRDDudess  y  AVRDDude GUI  que son interfases gráficas (GUI) para el programa de comandos avrdude.

viernes, 13 de junio de 2014

Shells para Arduino

Una shell es algo parecido a un mini sistema operativo en modo caracter, en lugar del ambiente gráfico al que estamos acostumbrados en el ordenador.
Es decir , si conectamos un Arduino a un computador ejecutando un programa terminal/serial, podemos enviarle comandos que el Arduino ejecutará directamente.

Aunque no creo que sean de utilidad práctica, hay disponibles varios desarrollos, algunos de los cuales realmente son impresionantes (bitlash por ejemplo).

En la imagen podemos ver una sesión de bitlash.  Se puede observar que hay tres procesos ejecutándose en multitarea !!! :



Listado parcial de shells:


jueves, 12 de junio de 2014

Convertidores serial/USB

Las tarjetas del tipo Arduino UNO, Leonardo, Due,Fio,  etc  se conectan directamente al puerto USB del computador mediante una interfase incorporada en la tarjeta.

Por otro lado tarjetas como Arduino PRO, Mini, etc requieren una interfase externa para poder establecer dicha comunicación. Lo  mismo ocurre si armamos una Aduino en protoboard.

En estos casos una posibilidad es utilizar interfases de conversión entre la comunicación serial del microcontrolador y la interfase USB del computador.

En el mercado existen una gran variedad de dichas interfases, basadas en diferentes integrados diseñados especialmente para este propósito (CP2102, FT232, PI-2303, etc).

Una primera característica que diferencia  estas interfases es el número de pines de comunicación que incorporan. 

Usualmente las mas económicas tiene cuatro pines , la función de los mismos sería:
  • +VCC : Usualmente +5 Voltios, pero también puede ser +3.3 Voltios 
  • +GND : Tierra
  • TxD : Transmisión de data
  • RxD : Recepción de data
La conexión de estos pines con el Arduino es:
  • +VCC con conexión de alimentación VCC del Arduino
  • +GND con conexión de Tierra del Arduino
  • TxD con el puerto Dx del Arduino
  • RxD con el puerto Tx del Arduino
Si estamos trabajando con una tarjeta que ya tiene alimentación, solo requerimos conectar el pin +GND para establecer la referencia común de tierra.
En ocasiones hay que invertir las conexiones TxD y RxD (problema de nomenclatura de los fabricantes).
Una característica incómoda de estas tarjetas es que tenemos que inicializar el Arduino (reset) para que la carga del script sea exitosa.  Cuando veamos que el mensaje en el IDE cambia de Compilar .. a Cargando , presionamos el boton de Reset durante unos 3-5 segundos. Lo mas importante es no esperar demasiado para presionar el Reset.

En el caso de interfases con seis pines tendríamos, además de los mencionados anteriormente, los siguientes:
  • RTS
  • CTS
En este caso la conexión con tarjetas  Arduino (PRO,Mini,etc) está especificada en el portal arduino.cc .


Si estamos trabajando con un Arduino que hemos armado en protoboard debemos conectar el pin RTS mediante un condensador de 100nF al pin Reset del microcontrolador.
Con estas interfases la carga de scripts es automática, no necesitamos presionar el botón de Reset en el Arduino.

Es importante tener en cuenta que hay interfases de 6 pines donde el pin RTS no permite hacer el reset automático del Arduino, en  este caso debemos utilizar el procedimiento para interfases con cuatro pines.

No hay que olvidar que deben instalarse los drivers correspondientes en el Computador para que éste reconozca la interfase. Usualmente en linux es automático. En el caso de windows es probable tener que hacer la instalación manualmente a partir de los archivos suministrados por el fabricante del integrado.

miércoles, 11 de junio de 2014

Números muy grandes en Arduino

Arduino es una plataforma orientada a conectar dispositivos analógicos o digitales  a los puertos de entrada/salida ,  es decir es un "microcontrolador". Sin embargo no deja de ser un microprocesador. Y es por ello que podemos utilizarlo para casi cualquier tipo de aplicación  capaz de ser ejecutada por un micro.

Y lo cierto es que hay gente muy creativa desarrollando aplicaciones no convencionales para esta plataforma.

Una de estas aplicaciones no convencionales es la librera  BigNumber , una adaptación hecha por Nick Gammon de la libreria GNU bc (linux). Esta librería permite hacer operaciones con números muy grandes, del tipo que estudian los matemáticos en Teoría de Números. 

Al ejecutar alguno de los ejemplos que incluye la librería no deja de sorprender la capacidad del Arduino para ejecutar estos cálculos tan complejos, no olvidemos que es un micro de 8 bits corriendo a 16Mhz, en comparación con los micros de 64 bits corriendo a varios Gigahertz que utilizamos en nuestros computadores.

En la imagen un ejemplo de cálculo de factoriales :



El script calcula los factoriales de los números enteros 1 al 200 . El cálculo no demora mas de 12 segundos !!!

La librería BigNumberMath complementa la anterior con varias funciones nuevas y corrección de otras ya existentes. Debe utilizarse la versión del enlace: version_sin_errores

Un experimento interesante de overclock en el Arduino es cambiar el cristal de 16MHz por otro de 24Mhz:

  • Se modifica el script para establecer una velocidad de comunicación serial de 38400 bauds  ( Serial.begin (38400); ) . 
  • Se carga el script en el Arduino. 
  • Se desconecta la alimentación, cambiamos el cristal. 
  • Conectamos el Arduino de nuevo y utilizamos el monitor serial a una velocidad de conexión de 57600 baud. 
  • Inicializamos el Arduino 
En el caso del script anterior el tiempo de ejecución baja a menos de 9 segundos.

lunes, 9 de junio de 2014

BASIC corriendo en Arduino

Aunque no creo que pueda ser de uso práctico, varios autores han hecho esfuerzos muy encomiables para lograr que interpretadores BASIC corran en forma nativa en la plataforma Arduino.
Me refiero a que mediante un programa de conexión serial en el PC al que está conectado el Arduino (similar al Monitor Serial del IDE de Arduino), podemos crear, guardar en el eeprom interno y ejecutar programas BASIC.



Parece ser que el punto de partida es el  TinyBasic de Mike Field , basado en el   TinyBasic original para el venerable CPU 68000 de Motorola (que días aquéllos !!!).

Una de las versiones es TinyBasic_plus de Scott Lawrence, que incluye nuevos comandos.

Es recomendable formatear la eeprom (EFORMAT) antes de guardar un programa por primera vez (ESAVE). Cuando se guarda un programa en eeprom, este se ejecuta al inicializar el Arduino.

En la imagen un Arduino armado en protoboard conectado a PC mediante interfase serial/USB y ejecutando TinyBasic_plus:


Otros desarrollos:
  • Nanode/TinyBasic
  • Arduino BASIC shield
  • Single chip AVR BASIC Computer
  • BASIC Pocket PC
  • Bitlash : No es BASIC, pero merece la pena hecharle un vistazo. (Antes de trabajar con un puerto debe definirse su modo de trabajo : pinmode(13,1)  define el puerto 13 como salida).
  • AttoBasic : Interesante desarrollo a partir de NASCOM Tiny Basic . Es un interpretador que utiliza variables tipo byte. A pesar de las limitaciones que esto impone sus requerimientos de hardware son mínimos y corre hasta en el ATtiny2313.

domingo, 8 de junio de 2014

Termómetro digital minimalista con ATtiny 45

En la imagen se muestra el circuito de un termómetro digital minimalista realizado con un ATtiny 45:


Componentes:

  • ATtiny 45 utilizando reloj interno de 8Mhz
  • Sensor de temperatura TMP35
  • Tres leds : Rojo, amarillo y verde
  • Tres resistencias de 240 Ohm
El programa que se ejecuta lee la tensión del sensor y la convierte a grados centígrados.
Para mostar el valor de la temperatura se utilizan los tres leds:
  • El primero (de color rojo) parpadea una vez  indicando que se va a mostrar el valor leído.
  • El segundo (de color amarillo) muestra las decenas y parpadea tantas veces como decenas de grados tenga el valor leído.
  • El tercero (de color verde) muestra las unidades y parpadea tantas veces como unidades tenga el valor leído.
Supongamos que la  temperatura tiene una valor de 25°C , entonces el led rojo parpadea una vez, a continuación el red amarillo parpadea dos veces y por último el led verde parpadea cinco veces.

Para programar el ATtiny se utilizó un Arduino UNO en modo programador ISP y se hicieron las conexiones correspondientes con el ATtiny.



sábado, 7 de junio de 2014

Termómetro digital con Arduino pro mini

En la imagen podemos apreciar un termómetro digital utilizando un Arduino pro mini.


Componentes:
  • Arduino pro mini
  • Mini protoboard de 170 puntos
  • Display rojo AC de 7 segmentos
  • Resistencia de 470 Ohms
  • Sensor de temperatura TMP35
  • Batería recargable de 9 Voltios
El programa que se ejecuta lee el valor en voltios del sensor, lo convierte en grados centígrados y muestra los dígitos uno a la vez en el display de 7 segmentos.
Para simplificar el circuito se utilizó una resistencia de 470 Ohms entre el ánodo y tierra.

viernes, 6 de junio de 2014

Control de acceso RFID

En la imágen se muestra un circuito que permite gestionar el control de acceso mediante tarjetas RFID de 125Khz :

Componentes:

  • Arduino Leonardo
  • Lector RFID ID-12
  • DS1307 Real Time Clock
  • Memoria serial  24AA256
  • Rele reed
  • Buzzer
  • Led bicolor
  • Led azul de lectura
  • Led amarillo de acceso
El programa que se ejecuta incluye un menú en la pantalla serial con las siguientes funciones:
  • Registro de Tarjetas
  • Eliminación de Tarjetas
  • Listar Tarjetas registradas
  • Listar histórico de  accesos
  • Eliminar histórico de accesos
  • Configuración de Fecha y Hora 


Cada vez que una tarjeta se presenta al lector se registra el intento de acceso. Si la tarjeta está registrada el led bicolor emite el color verde , el buzzer genera un tono de aprobación y el relé reed se activa encendiendo el led de acceso. Si la tarjeta no está registrada el led bicolor emite el color rojo y el buzzer genera un tono de rechazo. 

Circuitos Arduino en protoboard

A continuación imágenes de dos circuitos Arduino armados en protoboard.
Ambos circuitos incluyen un microcontrolador ATMega 328 con bootloader Arduino y para la carga de los programas se utiliza una interfase serial/usb basada en el integrado CP2102.

El primer circuito corresponde a un circuito que incorpora una fuente dual para protoboard y un lcd de 16x2 . El programa que se ejecuta es un medidor de condensadores (capacímetro):


El segundo corresponde a un circuito que incorpora la etapa de alimentación, un oscilador 556 en modo astable (se utiliza una fotocelda para variar la frecuencia), un sensor de temperatura TMP36 y  un display de 4 dígitos. El programa que se ejecuta lee la temperatura del sensor y mide la frecuencia del oscilador:



En este último circuito sólo quedan disponibles los puertos de comunicación serial y los puertos analógicos.
Lo cierto  es que hoy en día no se justifica el uso de display de 7 segmentos ya que disponemos de los lcd, pero estos dispositivos son llamativos debido a su luminosidad.

Arduino en protoboard

Este es mi aporte al gran número de referencias existentes en la web de como armar un arduino en un protoboard.
El valor agregado consiste en utilizar un miniprotoboard de tal forma que podemos armar en el futuro distintos módulos con diferentes funcionalidades e interconectarlos entre si (algo parecido a los shields/escudos de arduino).

Materiales:
  • Protoboard mini 270 puntos
  • ATMega 328 con bootloader Arduino
  • Interruptor
  • Cristal 16Mhz
  • 2 condensadores de cerámica de 22pf
  • Resistencia de 10Kohm
  • Led 
  • Resistencia 220 Ohms
  • Regulador de tensión de 5 Voltios 7805
  • Condensador electrolítico 100uF 16 Voltios
  • Conector de alimentación hembra
  • Cables de conexión
A continuación la imágen del circuito armado. Podemos ver a la derecha una etapa adicional para controlar dos motores DC .

La siguiente imágen muestra otra configuración sin la etapa de regulación de tensión y con un conector para la interfase serial/usb