Pines de entrada/salida digital


Una de las funciones más interesantes de Arduino y en general de todos los autómatas programables es su capacidad de interacción con el mundo físico. Podemos, por ejemplo, realizar mediciones de tensión, obtener lecturas de gran variedad de sensores, encender dispositivos o controlar motores y actuadores. Esta interacción se lleva a cabo en gran parte mediante el uso de las entradas y salidas tanto digitales como analógicas.


En esta oportunidad aprenderemos a usar estas funciones, que resultan una parte fundamental en la mayor parte de proyectos. Empezaremos las entradas digitales por ser las más sencillas, aunque en su momento veremos que el resto de funciones no resultan mucho más complicadas.


Aunque estamos empleando Arduino como plataforma es importante remarcar que la mayoría de conceptos son aplicables a cualquier autómata general.


Hemos visto como escribir un simple programa, capaz de encendr y apagar un LED. En ese programa, que volvemos a ver en la imagen siguiente, hemos utilizado un par de instrucciones que "operan" sobre el estado de un pin de salida de Arduino.



void setup() {
    // Ponemos el pin D2 como salida
    pinMode(2, OUTPUT);
}

void loop() {
    digitalWrite(2, HIGH);   // Encendemos el LED 
    delay(1000);             // Esperamos un segundo
    digitalWrite(2, LOW);    // Apagamos el LED
    delay(1000);             // Esperamos un segundo
}

Pero ¿qué es un pin? ¿Que significa que es "de entrada" o "de salida"? ¿Y por que los llamamos "digitales"? Vamos a responder estas cuestiones, que son fundamentales para que podramos avanzar hacia proyectos más complejos.


Sabemos que existen varios modelos de placas Arduno. Cada una de ella tiene alguna particularidad que la distingue de las demás. Pero, con pequeñas diferencias, el funcionamiento de sus pines de entrada y salida son iguales en todas ellas. Nosotros veremos en detalle las particularidades del modelo Arduino Nano, que es el que utilizaremos en nuestros proyectos.


La imagen siguiente muestra el pinout de un Arduino Nano. Se utiliza el término pinout como una forma corta de decir descripción de la posición y funcion de cada uno de los pines. Resumiendo, la imagen nos muestra la función que cumple cada una de las conexiones disponibles en la placa.



Pinout del Arduino Nano


Por ahora, solo adelantaremos que los pines digitales son los que aparecen en la imagen pintados en color verde y los dos de abajo a la derecha, que están en color gris.


¿Qué es un pin?


Desde el punto de vista físico, los pines de la placa Arduino Nano son esos pequeños terminales de bronce, que aparecen en la imágen siguiente indicados con color rojo:



Pines del Arduino Nano


Esos terminales nos permiten realizar la conexión de la placa con otros componentes, y constituye la característica más importante de la plataforma Arduino: la capacidad de interactuar con el múndo físico. En efecto, mediante estos pines Arduino puede "sensar" o "actuar" sobre el mundo real, ya sea obteniedo datos proporcionados por un sensor (la temperatura ambiente, por ejemplo) o modificando el estado de algún dispositivo (haciendo girar un motor, entre otros).


Desde un punto de vista más técnico, los pines que estamos analizando reciben el nombre de GPIO. GPIO significa "entradas y salidas de propósito general" (en inglés General Purpose Input Output), y a pesar de que puede parecer algo complejo, lo cierto es que solo significa que son los terminales en los que nos permiten controlar y reaccionar a otros circuitos eléctricos desde las placas Arduino.


Cada modelo de Arduino dispone de un número diferente de I/O digitales. Por ejemplo, Arduino UNO dispone de 16 I/O digitales y Arduino MEGA de 54.


Ya tenemos un punto de partida. Vamos a considerar a estos pines como "puertas de comunicación", capaces de interactuar con otros circuitos. Ahora veamos como hacemos para controlar un pin.


¿Qué significa "de entrada y/o salida" digital?


En todas las placas Arduino la mayor parte de los pines son multifunción o multipropósito. Es decir, dependiendo de como los configuremos en nuestro programa realizarán una función u otra.


En el caso de los pines que estamos analizado, puede utilizarse (entre otras) de dos maneras: como entrada o como salida (E/S). Si los configuramos como entradas, seran capaces de leer datos desde el exterior. Y si los configuramos como salidas, podran modificar el estado de algun dispositivo conectado a ellos.


Pero estos pines solo son capaces de manejar valores digitales. Sabemos que una señal digital tiene la característica de representar solamente valores discretos. Por ejemplo, el interruptor de la luz sólo puede tomar dos valores o estados: abierto o cerrado, o lo mismo una lámpara: encendida o apagada.


Una señal digital es una variación de voltaje entre -Vcc a +Vcc sin pasar por los valores intermedios. Por lo tanto, una señal digital dispone solo de dos estados. Al valor inferior de tensión -Vcc le asociamos un valor lógico LOW o ‘0’, mientras que al valor superior +Vcc le asociamos HIGH o ‘1’ lógico.



Señal digital


El proceso de lectura digital es un proceso de discretización de una señal analógica, el valor de la tensión, en un valor digital que representamos mediante dos estados, LOW y HIGH.


En realidad una entrada digital realiza una comparación de la medición con un valor de tensión umbral. Si el valor medido es superior a la tensión umbral se devuelve HIGH, y si es inferior LOW. El valor de la tensión umbral varía de un autómata a otro, e incluso no tiene porque permanecer constante a lo largo del tiempo.


En general es razonable suponer que la tensión umbral es cercana al punto medio entre -Vcc y +Vcc. No obstante debemos evitar medir tensiones cerca de la tensión umbral porque pueden provocar mediciones incorrectas.


Resumiendo, estos pines pueden operar de dos maneras: como entrada o como salida. E independientemente de como esté operando, al ser "digitales", solo pueden reconocer dos valores: encendido o apagado.


Programando los pines de E/S digital


Para utilizar uno de estos pines en un programa, necesitamos primero definir si va a ser de entrada o de salida. Para ello, utilizamos una de las instrucciones siguientes:


1) pinMode(x,OUTPUT); , donde x es el número del pin que queremos utilizar. Esta instrucción le indica a Arduino que ese pin será utilizado como salida (OUTPUT). Podremos conectar a él un LED o cualquier otro componente externo, y su estado será controlado por Arduino.


1) pinMode(x,INPUT); , donde x es el número del pin que queremos utilizar, le indica a Arduino que ese pin será utilizado como entrada (INPUT). Podremos conectar a él un pulsador, sensor o cualquier otro componente externo, y su estado será leido por Arduino.


Los valores posibles para x son números enteros desde el 0 hasta el 13. Es decir, tenemos en total 14 pines de E/S digital. Para saber cuál es cada uno, podemos consultar la imagen anterior, donde se ve el pinout de la placa.


En la placa Arduino aparecen estos pines marcados con la leyenda "D0" a "D13":



Arduino Nano


Habitualmente se decide cuál va a ser el modo de trabajo de cada pin en la sección setup();, aunque hay ocasiones en las que podemos modificar el modo de funcionamiento de un pin determinado dentro de la sección loop();.


El siguiente trozo de código muestra como poner el pin D4 como entrada, y el pin D8 como salida:



void setup() {
    pinMode(4, INPUT);
    pinMode(8, OUTPUT);
}

IMPORTANTE: Para hacer referencia al pin "Dx" en nuestro programa, solamente ponemos "x". Por ello es que usamos pinMode(4, INPUT); en lugar de pinMode(D4, INPUT);. Es importante recordar esto.


Una vez que hemos definido en nuestro programa si un pin determinado va a funcionar como entrada o como salida, podemos utilizarlo. Para ello, utilizamos las siguientes instrucciones:


1) digitalWrite(x,HIGH); , donde x es el número del pin que queremos utilizar. Esta instrucción le indica a Arduino que ese pin tendrá un estado alto (HIGH). Eso significa que ese pin se pondrá a 5V, y el dispositivo que esté conectado a él recibirá esa tensión.


2) digitalWrite(x,LOW); , donde x es el número del pin que queremos utilizar. Esta instrucción le indica a Arduino que ese pin tendrá un estado bajo (LOW). Eso significa que ese pin se pondrá a 0V (o GND), y el dispositivo que esté conectado a él recibirá esa tensión.


3) digitalRead(x); , donde x es el número del pin que queremos utilizar. Esta instrucción devuelve un valor alto (HIGH) o bajo (LOW), dependiendo si el dispositivo que hemos conectado en ese pin tiene una tensión mayor a 3V o menor a 2V (respectivamente). Esta es la instrucción, si se quiere, mas "compleja" de éste grupo, y la veremos con más detalle cuando aprenadamos a conectar un pulsador a nuestra placa Arduino.


Ahora que hemos aprendido el significado y funcionamiento de cada una de las instrucciones relacionadas con el uso de los pines de E/S digitales, podemos volver a mirar el código que enciende y apaga un LED, y comprender exactamente que está haciendo cada una de las instrucciones utilizadas:



void setup() {
    // Ponemos el pin D2 como salida
    pinMode(2, OUTPUT);
}

void loop() {
    digitalWrite(2, HIGH);   // Encendemos el LED 
    delay(1000);             // Esperamos un segundo
    digitalWrite(2, LOW);    // Apagamos el LED
    delay(1000);             // Esperamos un segundo
}

Entradas digitales


Supongamos que queremos emplear Arduino para conectarlo con un sensor, o cualquier otro dispositivo, que dispone de una salida de tensión ininterrumpida entre 0V a 5V. De momento no consideramos la posibilidad de que la entrada digital quede totalmente desconectada, algo que trataremos en el capítulo llamado Lectura de un pulsador con Arduino.


Podemos realizar la lectura del valor de tensión en el sensor con un esquema como el siguiente:



Conexión eléctrica de un sensor a un pin I/O digital.


La lectura dará un valor HIGH si el valor de tensión medido es superior a una tensión umbral, y LOW si el valor de tensión es inferior. El código para realizar la lectura es realmente sencillo. Simplemente tendremos que configurar un I/O digital como entrada con pinMode(); y realizar la lectura con digitalRead();.


Con esto finaliza la parte básica de este capítulo. ¡Nos vemos en el siguiente!


Contenido avanzado


Dejamos para el final la explicación un poco más profunda acerca del funcionamiento de estos pines. Su lectura y comprensión no es indispensable para entender los capitulos siguientes y realizar los proyectos que allí abordaremos. Pero si tienes curiosidad o necesitas conocer mejor el funcionamiento de los pines de entrada y salida de Arduino, sigue leyendo.


En la imagen siguiente se muestra el estado por defecto de un pin de E/S digital en una placa Arduino. Se ha simplificado con interruptores la compleja electrónica que hay en su interior. Por defecto, los pines de E/S digitales están configurados como entradas en un estado de alta impedancia (equivalente a una resistencia de 100 Mohms en serie con pin). Es decir, el interruptor SW3 está en ON (cerrado) y no hace falta utilizar la instrucción pinMode();, aunque es recomendable para que nuestro código sea más claro.



Circuito interno de un pin de E/S.


Veamos ahora que ocurre cuando utlizamos la instrucción pinMode(); con distintas opciones. En cada caso, x es el número de pin que estamos configurando:


1) pinMode(x, INPUT); : Pone el interruptor SW3 en ON y el resto en OFF. Si ese pin no está conectado a ningún componente externo, los valores leídos al consultar ese pin serán aleatorios. El pin está en un estado de alta impedancia (resistencia de 100 Mohms).


2) pinMode(x,INPUT_PULLUP); : Pone los interruptores SW3 y SW4 en ON, y el resto en OFF. Si ese pin no está conectado a ningún componente externo, los valores leídos al consultar ese pin serán HIGH. La Resistencia R1 tiene un valor que depende de la placa Arduino que estemos usando, pero siempre está entre entre 20kOhm y 150kOhm.


3) pinMode(x,OUTPUT); y digitalWrite(x,HIGH);: Pone el interruptor SW2 en ON, SW1 a +5V, y el resto en OFF. Es un estado de baja impedancia, no hay resistencia interna conectada y es necesario poner un resistor del valor adecuado a la salida el pin para no superar los 40mA (source, o salida) máximos admitidos por el pin.


4) pinMode(x,OUTPUT); y digitalWrite(x,LOW);: Pone el interruptor SW2 en ON, SW1 a GND, y el resto en OFF. Es un estado de baja impedancia, no hay resistencia interna conectada y es necesario poner un resistor del valor adecuado a la salida el pin para no superar los 40mA (sink, o entrada) máximos admitidos por el pin.