Conversor Analógico-Digital (A/D)

Un conversor analógico-digital es un dispositivo electrónico capaz de convertir una señal analógica en un valor binario, en otras palabras, éste se encarga de transformar señales analógicas a digitales (0 y 1).

El dispositivo establece una relación entre su entrada (señal analógica) y su salida (digital) dependiendo de su resolución. La resolución determina la precisión con la que se reproduce la señal original.

Esta resolución se pude saber, siempre y cuando conozcamos el valor máximo de la entrada a convertir y la cantidad máxima de la salida en dígitos binarios.

Resolución = +Vref/2^n(donde n son bits)

Por ejemplo, un conversor A/D de 8-bits puede convertir valores que van desde 0V hasta el voltaje de referencia (Vref) y su resolución será de: Resolución = Vref/256. Lo que quiere decir que mapeará los valores de voltaje de entrada, entre 0 y Vref voltios, a valores enteros comprendidos entre 0 y 255 (2^n-1).

La tarjeta Arduino utiliza un conversor A/D de 10-bits, así que: Resolución = Vref/1024 Mapeará los valores de voltaje de entrada, entre 0 y Vref voltios, a valores enteros comprendidos entre 0 y 1023 (2^n-1). Con otras palabras, esto quiere decir que nuestros sensores analógicos están caracterizados con un valor comprendido entre 0 y 1023. (Ver analogRead()).

Si Vref es igual a 5v, la resolución es aproximadamente de 5 milivoltios. Por lo tanto el error en las medidas de voltaje será siempre de sólo 5 milivoltios.

Caso de transmisión o envío de datos (comunicación) por el puerto serie:

Al enviar datos por el puerto serie, tenemos que tener en cuenta que la comunicación se realiza a través de valores con una longitud de 8-bits (Ver serialWrite(c) o serialRead(c)), mientras que como ya se hemos indicado, el conversor A/D de Arduino tiene una resolución de 10-bits.

Por ejemplo, si capturamos los valores de un sensor analógico (e.j. potenciómetro) y los enviamos por el puerto serie al PC, una solución podría ser transformarlos en un rango entre 0 y 9 y en modo de codificación ASCII (carácter).

(dato capturado del sensor analógico * 9 / 1024) + 48;

0 ASCII -->decimal = 48

1 ASCII -->decimal = 49

etc..

En forma de código podría quedar como:

value1 = analogRead(analogPin1); //captura del valor de sensor analógico (0-1023)
serialWrite(treatValue(value1)); //volcado al puerto serie 8-bits
int treatValue(int data) {
return (data * 9 / 1024) + 48;// fórmula de transformación
}

Otra fórmula sería dividiendo por 4 ¿Esto es correcto? (1024/256)los valores capturados de los sensores analógicos, para convertirlos en valor de byte válido (0 - 255).

value = analogRead(analogPin)/4;
serialWrite(value);

Comunicación serie

Para hacer que dos dispositivos se comuniquen necesitamos un método de comunicación y un lenguaje o protocolo común entre ambos dispositivos. La forma más común de establecer dicha comunicación es utilizando la comunicación serie. La comunicación serie consiste en la transmisión y recepción de pulsos digitales, a una misma velocidad.

El transmisor envía pulsos que representan el dato enviado a una velocidad determinada, y el receptor escucha dichos pulsos a esa misma velocidad. Esta técnica es conocida como comunicación serie asíncrona. Un caso práctico es el de un MODEM externo conectado a un PC.

Por ejemplo, si tenemos dos dispositivos conectados y que intercambian datos a una velocidad de 9600 bits por segundo (también llamados baudios), el receptor capturará el voltaje que le está enviando el transmisor, y cada 1/9600 de un segundo, interpretará dicho voltaje como un nuevo bit de datos. Si el voltaje tiene valor HIGH (+5v en la comunicación con Arduino), interpretará el dato como 1, y si tiene valor LOW (0v), interpretará el dato como 0. De esta forma, interpretando una secuencia de bits de datos, el receptor puede obtener el mensaje transmitido.

Los dispositivos electrónicos usan números para representar en bytes caracteres alfanuméricos (letras y números). Para ello se utiliza el código estándar llamado ASCII (enlace), el cual asigna a cada número o letra el valor de un byte. El código ASCII es utilizado en la mayoría de los dispositivos como parte de su protocolo de comunicaciones serie.

Así que si queremos enviar el número 90 desde un dispositivo a otro. Primero, se pasa el número desde su formato decimal a su formato binario. En binario 90 es 01011010 (1 byte).

Y el dispositivo lo transmitiría como secuencia de pulsos según el siguiente gráfico:

Otro punto importante, es determinar el orden de envío de los bits. Normalmente, el transmisor envía en primer lugar, el bit con más peso (o más significativo), y por último el de menos peso (o menos significativo) del formato binario.

Entonces y como conclusión, para que sea posible la comunicación serie, ambos dispositivos deben concordar en los niveles de voltaje (HIGH y LOW), en la velocidad de transmisión, y en la interpretación de los bits transmitidos. Es decir, que deben de tener el mismo protocolo de comunicación serie (conjunto de reglas que controlan la secuencia de mensajes que ocurren durante una comunicación entre dispositivos). Generalmente se usa el protocolo serie llamado RS-232 e interfaces (conectores vs puertos serie) que utilizan dicha norma.

Hasta no hace mucho, la mayoría de los PCs utilizaban el estandar RS-232 para la comunicación serie, pero actualmente los PCs están migrando hacia otras formas de comunicación serie, tales como USB (Bus Serie Universal), y Firewire, que permiten una configuración más flexible y velocidades de transmisión más altas.

Para conectar un dispositivo a un PC (o sistema operativo) necesitamos seleccionar un puerto serie y el cable apropiado para conectar al dispositivo serie.

Gráfico de Puerto serie RS-232 en PC (versión de 9 pines DB-9)

En Arduino y en función del modelo de placa que hayamos adquirido tendremos que elegir un cable RS-232 (estándar, no debe ser de tipo null modem) o USB o bien un adaptador RS-232/USB. (enlace a guía de instalación)

Share