Mostrando entradas con la etiqueta ATmega328. Mostrar todas las entradas
Mostrando entradas con la etiqueta ATmega328. Mostrar todas las entradas

domingo, 20 de septiembre de 2015

¿Cuál es la precisión de medida del Arduino?



Para contestar a esta pregunta deberíamos formular primero si lo que queremos saber es cuál es el menor cambio en una señal a medir capaz de producir una salida perceptible en el Arduino. A esto se le conoce comúnmente por el nombre de resolución.

Y esto nos lleva a la segunda pregunta, ¿de qué precisión estamos hablando, de la precisión de las entradas analógicas o de la precisión de las entradas digitales?

Si nuestra duda viene generada por la resolución de las mediciones que nuestro Arduino hace a través de las entradas analógicas, conviene primero hacer un pequeño repaso a los detalles concretos de la placa que estemos usando, puesto que está en la naturaleza de la placa que tengamos en la mano, la respuesta a nuestra pregunta.

Vamos a repasar juntos los detalles de la placa Arduino UNO y con el mismo método podremos resolver la pregunta para el resto de las placas disponibles.

La placa Arduino UNO lleva montado un microcontrolador del tipo ATmega328



Pues bien, si le echamos un vistazo a la hoja de datos del ATMEL de este micro, veremos que lo primero que nos indica, si le echamos un vistazo a la sección de periféricos (Peripheral Features en inglés), esto es de las estructuras que usa para conectarse con el mundo exterior, es que si nuestro encapsulado es del tipo PDIP (Dual-In-Line), el conversor que usa para transformar las señales analógicas en digitales es de 6 canales y de 10 bits.



Por lo que al menos físicamente parece que encaja con la imagen de la tarjeta que tenemos en la mano, y con el número de pines analógicos identificados en la placa : A0, A1, A2, A3, A4 y A5.



Pero y ¿qué significa "10-bit ADC"? ¿estará ahí la respuesta a nuestra pregunta sobre la precisión de medida de nuestro Arduino?

Para contestar a esta pregunta tenemos que volver a la presentación que hicimos sobre los tres pasos de la conversión analógica digital que estuvimos viendo en entradas anteriores:

1.- Muestreo (ver entrada)
2.- Cuantización de la señal (ver entrada)
3.- Codificación binaria de la señal (ver entrada)

Primero muestramos la señal, luego ajustamos las medidas a unos valores concretos y finalmente transformamos estas medidas en números binarios para que sean procesables por nuestro Arduino.



Pues bien, es desde aquí desde donde podemos contestar a nuestra pregunta sobre la precisión de nuestra medida.

Imaginemos que estamos intentando medir una señal eléctrica pero solo tenemos un multímetro de juguete que tiene tres LEDs que se iluminan cuando la tensión es mayor o igual a 1,  3 y 5voltios respectivamente.






Si traducimos este sistema de LEDs al lenguaje binario,  cuando no se encienden, entenderíamos que es 0 voltios, y se traduce por un 00, cuando se encienda 1 LED entenderíamos que es mayor o igual a 1 voltios y lo traduciríamos por 01 en binario, cuando se encienden 2 LEDs, entenderíamos que es mayor o igual a 3 voltios y lo traduciríamos en binario por 10,  y por último cuando se encendieran los tres,  entenderíamos que es mayor o igual a 5 voltios, y  lo traduciríamos por un 11 al lenguaje binario. 

Con este sencillo multímetro de LEDs binarios, estaríamos traduciendo nuestra señal con un conversor analógico digital de 2 bits.


Pero una cosa es lo que mido y otra cosa bien distinta es lo es. Teniendo en cuenta que mi sistema de LEDs no admite "decimales" o bien se enciende o bien está apagado, estamos perdiendo parte de la realidad, y con los datos obtenidos, la señal original podría ser cualquier cosa comprendida en estos puntos. Un par de ejemplos los podríamos ver a continuación:





Con los mismos resultados, no seríamos ni tan siquiera capaz de asegurar la periodicidad de la onda, no ya la forma, que como podríamos ver podría ser cuadrada, triangular, periódica o totalmente irregular, etc...  

En definitiva con un conversor ADC de 2 bits, solo podríamos medir bien señales que de antemano supieramos la forma concreta, y nos sería imposible identificar si la señal es periódica o no.

Pues bien, imaginemos que ahora vamos a la tienda donde compramos nuestro medidor de juguete y les compramos otro que tenga al menos 7 LEDs, de modo que podamos medir mejor las medidas intermedias.

Pues bien, si ahora volvemos a medir nuestra señal, lo que tendremos sería algo así como esto

Con este nuevo juguete, hemos podido convertir nuestra señal analógica a una digital con el equivalente a un conversor analógico digital de 3 bits. Cuando está todos los LEDs apagados sería el equivalente binario de un 000, cuando se enciende uno sería el 001, cuando se enciende dos sería el 010, ... así hasta cuando se enciende el séptimo tendríamos un 111.  No está mal.


Y al a vista de la gráfica, empezamos a pensar que la señal podría ser periódica,  pero si miramos más detenidamente, vemos que en esos resultados caben muchas opciones, por ejemplo una función senoidal, o una triangular.




Entonces, ¿por qué no usar un multímetro que tenga "miles" de LEDs?, ¿qué pasaría entonces? Pues sucedería que los valores intermedios estarían tan pegados que podríamos reproducir la señal con muchísima fiabilidad.  A mayor número de bits, mayor cantidad de niveles intermedios de medid




En la siguiente figura podemos ver la diferencia entre usar un conversor ADC de 3 bits y uno de 16 bits. O lo que sería equivalente, un multímetro con capacidad para medir 65,536 valores intermedios.
Pues bien, vamos a regresar al principio y vamos a ver qué tipo de conversor ADC teníamos integrado en nuestro Arduino.

Nuestro conversor era de 6 canales, esto es que puede manejar simultáneamente 6 pines analógicos y de 10 bits, esto es que es capaz de manejar 2 elevado a 10 valores intermedios de tensión. ¿Y esto cuántos pasos son?, pues 1024 diferentes de tensión. Así que si ya hemos visto como de preciso es un conversor de 2 bits y uno de 3, ¿cuánto lo será uno de 10 bits?

La respuesta es una simple cuenta. Si dividimos los 1024 escalones (correspondientes a los 10 bits de resolución del conversor) entre los 5 voltios máximo que admite la entrada analógica, significa que convertirá tensiones entre 0 y 5 voltios a un número entero entre 0 y 1023. Esto proporciona una resolución en la lectura de: 5 voltios / 1024 unidades, es decir, 0.0049 voltios (4.9 mV) por unidad.

De modo que volviendo al comienzo, podemos decir que gracias al conversor ADC de 10 bits,  el menor cambio en tensión que es capaz de producir una salida perceptible en el Arduino, sería 4,9mV.


Y ahora qué sabemos cuál es la resolución del Arduino UNO, ¿cuál es la resolución del resto de las versiones de placas de Arduino disponibles?

Echémosle un vistazo a la descripción de cada una de ella:




Podemos ver que sólo en la versión Arduino Due, se ha incorporado un conversor ADC de 12 bits, y dado que funciona con tensiones máximas de 3.3 voltios en lugar de 5 voltios del resto de las versiones de Arduino, si hacemos los cálculos 3.3/ 4096, nos dará que si usamos la versión Due, podremos trabajar con resoluciones de tensión de 0,8mV.  



En próximas entradas veremos un truco para mejorar la resolución del Arduino UNO sin necesidad de adquirir una Arduino DUE, cuando las señales analógicas trabajen con tensiones inferiores a los 5 voltios, y cómo comprobar experimentalmente el resultado de estas mejoras.

Y ya sabéis, si tenéis alguna sugerencia o duda, no tenéis más que mandarnos un correo a

e intentaremos responder a vuestra pregunta lo antes que podamos. 



domingo, 21 de diciembre de 2014

Arduino Nano




En esta ocasión vamos a presentaros una de las muchas versiones de reducido tamaño que se han diseñado para dar solución a aquellos proyectos que exigen reducir el tamaño de toda la electrónica asociada, el Arduino Nano.

Así que comencemos con una de sus virtudes, sus dimensiones: 43,18mm x 15,24mm


Desde la versión 3, incorpora el micro ATmega328 igual que su hermano mayor el Arduino UNO R3, por lo que tendremos sus mismas prestaciones.

El espaciado de los pines es el estándar de 2,54mm para que podamos insertarlo directamente en la protoboard.


Como se puede observar en la foto, tiene un LED azul en la base para indicar el encendido.

Así mismo para transmisión (TX) y recepción (RX)  usa LEDs de color verde y rojo respectivamente.

Además podemos apreciar en la imagen, que también le han cambiado el USB grandote clásico a la version mini B, y no la versión microUSB porque esta versión fue diseñada en el 2008-2009.


Al igual que Arduino UNO R3, tiene RESET automático al cargar programas, no necesitando apretar físicamente el botón antes de grabarle uno nuevo, y al igual que Arduino UNO R3 tiene el bootloader integrado que nos permite programarlo con el entorno de desarrollo de Arduino y sin necesidad de un programador externo. Aunque si eso es lo que se desea, incorpora un conector ICSP que nos permitirá programarlo con un programador externo.

La placa monta la regulación de tensión a 5V así como el chip de comunicación en la segunda cara, permitiéndole un mayor nivel de integración de la electrónica que monta Arduino UNO R3.


El chip FTDI FT232RL solo se activará si la placa está alimentada a través del puerto mini USB. Como consecuencia de ello, cuando el Arduino Nano está alimentado con una fuente externa, y no a través del puerto mini USB, la salida de 3.3V (que es suministrada por el chip FTDI) no estará disponible.


sábado, 20 de diciembre de 2014

Funduino UNO




Esta placa tiene unas cuantas ventajas y algún pequeño inconveniente.

Veamos qué podemos decir de ella.

Tamaño: 68x53mm, el mismo que la Arduino UNO
Frecuencia de reloj: 16 MHz, el mismo que la Arduino UNO
Microprocesador: ATmega328P, el mismo que la Arduino UNO
Voltaje de funcionamiento: 3.3V / 5V,  Arduino UNO solo da 5V.
Voltaje de entrada: 7-12V (aunque al igual que Arduino UNO,  podría llegar a 6-20V)
Interfaz de E/S digitales: 14 (4PWM, de difícil identificación)

Las ventajas inmediatas que le vemos a esta placa son las siguientes:

1.- El precio es de solo 13,99$
2.- Permite conectar sensores o actuadores directamente a los pines sin necesidad de empalmes ni protoboard gracias a los conectores de 3 pines que incorporan en cada I/O.
3.-  Mientras que Arduino UNO no puede suministrar más de 100mA de corriente máxima, Funduino es capaz de suministrar hasta un máximo de 500mA, y llegando a ser capaz de suministrar hasta 5V 2A, cuando está conectado a una fuente externa. Posiblemente gracias al uso del regulador MP2307.
4.- Permite gracias a un interruptor, que las tensiones de funcionamiento sean 5V o 3,3V, permitiendo así trabajar con módulos de bajo voltaje, algo que con Arduino UNO tenemos que hacerlo con algo más de electrónica.
5.- El famoso botón de reinicio que se ha ido moviendo de una versión a otra, está aquí colocado en una posición a la que se puede acceder incluso cuando le coloquemos una tarjeta de expansión (Shield)
6.- Aunque Arduino UNO funciona con tensiones de entrada de 7-12 (con un máximo de 20V), Funduino puede a llegar a soportar tensiones de hasta 23V. Posiblemente gracias al uso del regulador MP2307.


Las desventajas inmediatas que le vemos a esta placa son las siguientes:

1.- Que no se encuentra documentación en internet sobre ella, al menos con facilidad.
2.- Que dado que mantiene el mismo tamaño de placa que Arduino UNO, las regletas de pines auxiliares impiden la identificación cómoda de los pines, haciendo el acceso intuitivo a algunos de ellos, por ejemplo los PWM, imposible.
3.- Que aparentemente la versión que estamos usando usa el chip de ATmega8U2 para la comunicación USB/Serie, que es la que montaba Arduino UNO hasta la revisión R2, sin embargo actualmente montan la ATmega32U2, por lo que me imagino que algún problemilla de comunicación podría llegar a dar. Aunque lo hemos probado contra la versión del IDE 1.0.6, y no hemos encontrado nada anómalo.
4.- Que posiblemente por ser una versión un poco más antigua, aunque renuncia a implementar el conector USB de impresoras, no salta al microUSB, sino que lo sustituye por un microUSB esto hace pensar que es posible que en la siguiente versión incluya estas dos evoluciones.

Así que, llegados a este punto, lo mejor será ir probándola y reportaros los problemas que vayamos localizando.

Si encontráis más temas que consideréis que marcan la diferencia, así como documentación sobre la misma,  agradeceríamos que nos lo mandaseis, seguro que más de uno os lo va a agradecer.




Tabla comparativa de Arduinos


Aunque a lo largo de las próximas entradas iremos presentando algunas de las placas con las que vamos a trabajar en nuestros proyectos, a continuación se recoge las versiones más ortodoxas y las diferencias más relevantes entre ellas.

Característica de Arduino
UNO
Mega 2560
Leonardo
DUE
Tipo de microcontrolador
Atmega 328
Atmega 2560
Atmega 32U4
AT91SAM3X8E
Velocidad de reloj
16 MHz
16 MHz
16 MHz
84 MHz
Pines digitales de E/S
14
54
20
54
Entradas analógicas
6
16
12
12
Salidas analógicas
0
0
0
2 (DAC)
Memoria de programa (Flash)
32 Kb
256 Kb
32 Kb
512 Kb
Memoria de datos (SRAM)
2 Kb
8 Kb
2.5 Kb
96 Kb
Memoria auxiliar (EEPROM)
1 Kb
4 Kb
1 Kb
0 Kb

A partir de aquí, tendremos versiones compatibles de mayor o menor tamaño, con regulación de tensión o sin ella, con tensiones de trabajo de 5V y/o de 3,3V, etc.

La  placa Arduino con microcontroladores de 8 bits Atmel es actualmente la más popular. Entre otras, incluye las placas UNO, MEGA 2560 y Leonardo, aunque tendremos ocasión de presentar alguna otra versión que se sale de esta regla.

Arduino Leonardo se diferencia de sus predecesoras en que utiliza un chip ATmega32U4 que contiene el controlador USB, eliminando la necesidad de ningún otro procesador secundario.

Las salidas analógicas presentes en la Arduino DUE, de 32 bits, proporcionan una resolución (4096 niveles) que podrían emplearse para crear una salida de audio.