Arduino UNO.

Si en la anterior práctica construimos un circuito equivalente multivibrador, en esta práctica aprenderemos como el ATmega de Arduino procesa las señales eléctricas a su entrada analógica.

Medición de entradas analógicas.

Ya hemos indicado que los puertos analógicos se suelen utilizar para comprobar el nivel de tensión que ofrece un dispositivo o sensor o la tensión que se le ofrece al mismo para cierto proceso; así que, por un lado compara la tensión que llega del sensor (cuando está configurado como entrada), a la vez que controla su comportamiento; y por otro lado, proporciona el comportamiento correcto a la tensión correcta, según verás en otras prácticas.

Para esta práctica vamos a conectar un único potenciómetro al arduino como puedes ver en la imagen.

primera práctica

Observa que al variar el potenciómetro, el monitor serial nos proporciona datos de la entrada, ya que la variación de la tensión del potenciómetro se aplica a la entrada analógica 0. Y como ya hemos mencionado anteriormente en el curso teórico, cada puerto analógico tiene una resolución de 1024 bytes, de ahí que el mayor valor obtenido sea 1023 y el menor sea 0.

En cuanto al código, ya debería de dejar de tener secretos para tí. Las dos primeras variables del tipo int, son para declarar el puerto analógico a usar pot y la otra val, para almacenar el valor que irá tomando el puerto en cada movimiento del potenciómetro.

En el setup() incluyo la conexión Serial.begin(9600) para que me hago un rastreo de 9600 baudios.

En el loop() asigno el valor de la variable val al puerto 0 (pot). A continuación utilizo una Serial.println(val), para que me indique los valores que coge el potenciómetro en cada desplazamiento.

Y para terminar una función delay con 200ms permitirá que el estado del monitor serie cambie continuamente de estado con el cambio de posisicón del potenciómetro.

Medición de tension.

Para medir la tensión simplemente utilizamos un voltímetro poniendo el positivo al pin0 y el negativo a GND. Cuando giremos el potenciómetro nos aparecerá en el voltímetro la tensión que cae en el pin0.

tensión en el pin0 al variar el potenciómetro

Convertidor analógico - digital.

Ya sabes que la tensión analógica de entrada se convierte en un valor binario de entre 0 y 1023 o dicho de otro modo, tiene una resolución de 10 bits.

El microcontrolador de Arduino UNO contiene internamente un conversor analógico a digital de 6 canales. El conversor tiene una resolución de 10 bits, devolviendo enteros entre 0 y 1023. Los pines analógicos de Arduino también tienen todas las funcionalidades de los pines digitales. Por lo tanto, si necesitamos más pines digitales podemos usar los pines analógicos.

El datasheet de ATmega advierte de hacer lecturas rápidas entre pines analógicos (analogRead). Esto puede causar ruido eléctrico e introducir jitter en el sistema analógico. Se aconseja que después de manipular pines analógicos (en modo digital), añadir un pequeño retraso antes de usar analogRead () para leer otros pines analógicos.

Un microcontrolador solo entiende señales digitales (1 y 0), por lo tanto para poder leer señales analógicas necesitamos los convertidores Analógico a Digital (ADC). Esta conversión consiste en la transcripción de señales analógicas en señal digital, con el propósito de facilitar su procesamiento (codificación, compresión, etcétera) y hacer la señal resultante (digital) más inmune al ruido y otras interferencias a las que son más sensibles las señales analógicas. El ATMega328p, al igual que toda la gama ATMega de Atmel y otros microcontroladores, tienen un ADC integrado y no necesita ningún hardware adicional, esto nos permite simplemente conectar un sensor analógico. El ADC interno del microcontrolador tiene una resolución de 10 bits, esto significa que la tensión analógica de entrada se convierte en un valor numérico entre 0 y 1023. Aunque el ATmega328P tiene 6 pines que son capaces de ser utilizados como pines de entrada analógicos (Port C), sólo hay un ADC en el microcontrolador, pero entre el ADC y los pines hay un multiplexor analógico, esto permite que podamos elegir qué pin está conectado al ADC, es decir, aunque podemos utilizar todos los pines, sólo se puede leer el valor de uno de ellos a la vez, para casi todas las aplicaciones esto es más que suficiente, pero en algunos casos limitados que necesitan lecturas ADC de alta velocidad se podría necesitar el uso de ADC externos. En el caso de la ATmega328P los pines que se pueden utilizar una entrada analógica son todos los del puerto C.

También se puede cambiar la tensión máxima (siempre por debajo de Vcc) que utiliza el ADC como referecia, es la llamada tensión de referencia y es la tensión contra la que todas las entradas analógicas hacen las conversiones. Esta tensión de referencia se toma del pin AREF. Reducir el voltaje máximo del ADC tiene sentido para mejorar la resolución del ADC. Con 5V la resolución es de 5/1023 = 4,88 mV para cada valor, pero para un sensor que no pasa de 3.3V la resolución es de 3.3/1023 = 3.22mV.

El ADC interno también se puede utilizar en un modo de 8 bits, donde sólo se utilizan los 8 bits más significativos de la resolución de 10 bits completa, esto podría ser útil cuando se trabaja en ambientes ruidosos y sólo necesita 8 bits de resolución, el uso de este modo es un plus debido a que no es necesario dedicar más tiempo de CPU calculando los 10 bits completos. El ADC también puede configurarse para que lleve a cabo una conversión y detenerse o puede ser configurado para funcionar en un modo de funcionamiento libre, la primera opción es la mejor opción cuando queremos leer diferentes pines, y el segundo es mejor cuando sólo tenemos que leer un pin y esto puede ahorrar algo de tiempo entre las conversiones.

También tenemos que tener cuidado de la frecuencia máxima de trabajo del ADC, este valor se especifica en la ficha técnica y es de 200 kHz, este es el valor del reloj interno de la circuitería del ADC y se genera dividiendo el reloj principal ATmega, que en el caso del UNO es 16 MHz, este divisor del reloj se realiza mediante pre-escaladores y sólo hay un rango limitado de valores, por lo que la frecuencia máxima que podemos utilizar y estar dentro de la frecuencia máxima de trabajo es 125 kHz. El siguiente pre-escalador supone usar el ADC a 250 kHz, en este caso no se puede garantizar la resolución de 10 bits, pero si una resolución de 8 bits. De todas formas en caso de necesitar un ADC más rápido se podría usar uno externo.

El ADC puede trabajar en dos modos: single conversion mode y free running mode. En modo single conversion el ADC hace una sola conversión y para, pero en modo free running el ADC está continuamente convirtiendo, es decir, hace una conversión y luego comienza con la siguiente.

El ADC en microcontroladores AVR utiliza una técnica conocida como aproximación sucesiva mediante la comparación de la tensión de entrada con la mitad de la tensión de referencia generada internamente. La comparación continúa dividiendo de nuevo la tensión y actualizando cada bit del registro ADC a 1 si el voltaje es HIGH en la comparación o 0 en el otro caso. Este proceso se realiza 10 veces (por cada bit de resolución del ADC) y genera como resultado la salida binaria.

Conmutación.

En esta práctica vamos a crear un circuito conmutado con dos pulsadores para que cuando presionemos uno, se encienda un led y al pulsar el otro se apague. También haremos que los botones sean correlativos, es decir que si se pulsa uno u otro, el otro pulsador actúe en consecuencia (apagándo o encendiendo el Led).

circuito conmutado

Conectándo dos pulsadores, a los pines 2 y 3, se desea controlar el encendido del led conectado al pin13. El funcionamiento es similar a una conmutada en una vivienda en donde al pulsar cualquiera de los interruptores se enciende o apaga el Led. Así pues con los dos pulsadores se puede controlar el encendido o apagado del Led.

El montaje del circuito es muy sencillo.

circuito en conmutación

Utilizaremos como puedes ver los siguientes componentes:

● 1 Led rojo
● 3 resistencias de 10KΩ
● 2 pulsadores.

En cuanto a los pulsadores hay que decir que los pulsadores suelen ser NA (normalmente abierto) y las pistas se unen en un extremo con el otro, pero en los lados están abierto.

pulsador en arduino

Fijate que los pines del pulsador están conectado por la cara inferior entre la parte superior y la parte inferior indicando mediante un código que cualquiera de ellos es un mismo terminal. En el otro lado ocurre lo mismo con los terminales superior e inferior, pero teniendo en cuenta que cuando se presione el pulsador se cortocircuitarán los pines laterales del pulsador.

Como puedes ver del pin02 y el pin03 digital de arduino, se sacan dos conectores que conectarán a las partes inferiores de los pulsadores. Por la parte superior se conectarán los pines de los pulsadores en paralelo y, por un lado irán a negativo GND, y por el otro lado se conectará el Led (el cátodo a la resistencia de 10KΩ y al pin13); las otras dos resistencias de 10KΩ son resistencias de protección del los puertos de la placa Arduino.

circuito ensamblado

Codigo del circuito conmutado:

Empezamos por declarar las variables globales que usaremos en nuestro Sketch:

declaración de variables

Después escribimos el setup. En el tenemos que declarar los pines del Led y de los pulsadores como salida y entradas respectivamente, ya que el Led es una salida del pin13 y los pulsadores se tienen que declarar como entradas porque harán control del sistema.

declaración del setup

Para terminar, el loop crearemos la programación para realizar la función de que cuando se pulsa un pulsador, se encienda el led y, si está encendido, se apague. Para realizar la estructura, voy a realizar una estructura con condicionales IF de la forma que si el pulsador1 o pulsador2 no están pulsado (y el led está apagado), entonces se encienda.

declaración del loop

Además se ha incluido dos condiciones que se han unido mediante || que es el operador OR y su significado implica que para devolver un TRUE se debe de cumplir una condición u otra.

Para terminar he incluido un bucle WHILE que hará que el código se desarrolle como queremos, porque sin él, el código no pararía de ejecutarse.

La variable encendido sirve para indicar si el led está encendido o apagado, de tal forma que el primer if detecta si se ha pulsado alguno de los dos pulsadores y el segundo se utiliza para cambiar el valor de la variable encendido; es decir, si vale 0, entonces se activa la salida poniendo la variable a 1. Si no,apaga la salida poniendo la variable a 0.

Bien hasta ahora hemos visto la programación de Arduino y los puertos analógicos. En el siguiente capítulo veremos los puertos digitales PWM~ que nos posibilitarán otras acciones. Ahora visita el enlace del video o pasa al siguiente capítulo.

Podrás bajarte el sketch desde el enlace de descargas de dicha página, abajo en el pie de página.