Arduino: Índice
Arduino: Índice
Arduino: Índice
Versión 1.0
Índice:
1. Introducción a Arduino 1
2. La placa Arduino UNO 3
3. Programar la placa Arduino 5
4. Salidas digitales 1 7
5. Salidas digitales 2 9
6. Entradas digitales 1 12
7. Entradas digitales 2 16
8. Entradas analógicas 19
9. Salidas analógicas 23
Este texto es la versión offline/imprimible de uno de los capítulos del libro de texto multimedia de la web educativa www.tecno12-18.com.
Todos los derechos reservados. Se permite a los alumnos que han comprado una suscripción a la versión individual del libro que incluya este
capítulo, y a los profesores de estos alumnos, mantener una copia de este archivo PDF y/o imprimirlo, en ambos casos para uso exclusivamente
personal. En todos los demás casos no está permitida la reproducción total o parcial de esta obra, ni su almacenamiento en un sistema
informático, ni la distribución mediante cualquier medio electrónico, mecánico u otros sin el permiso previo y por escrito de los titulares del
copyright.
1. Introducción a Arduino
Introducción
Arduino es una plataforma de control automático basada en hardware y software open source que se ha hecho muy
popular. Se utiliza ampliamente en educación y en la creación de prototipos tecnológicos y artísticos.
Arduino se basa en unos componentes electrónicos llamados microcontroladores, así que empezaremos viendo qué
son los microcontroladores y después pasaremos a ver cuáles son las características y las aplicaciones de Arduino.
En otras miniunidades haremos una introducción a la programación de Arduino.
Introducción
En la miniunidad anterior vimos qué es la plataforma Arduino y para qué se utiliza. Vimos también que la plataforma
Arduino está formada por varias placas electrónicas que tienen un microcontrolador y por programas que permiten
programar estas placas. Ahora vamos a estudiar cómo es la placa más popular, la placa Arduino UNO.
2.1. Microcontrolador
Arduino UNO está compuesto por una placa o tarjeta electrónica (también llamada PCB, de "Printed Circuit Board",
Tarjeta de Circuito Impreso) donde se sueldan diversos componentes electrónicos. El componente más importante
es el microcontrolador, un chip Atmega328P del fabricante Atmel. El microcontrolador tiene una memoria donde se
guarda un programa y un circuito miniaturizado que procesa información (la CPU, "Central Processing Unit").
Podemos decir que es el "cerebro" del sistema.
2.2. Programa
Las placas Arduino sirven para controlar actuadores (como luces o motores). El void setup(){
programa que hay en la memoria del microcontrolador ordena cuándo deben pinMode(13, OUTPUT);
encenderse o apagarse. Aquí puedes ver qué aspecto tiene un programa sencillo. }
Para programar la placa (cambiar el programa) primero se debe escribir el programa void loop(){
en un ordenador, en las próximas miniunidades veremos cómo se hace. digitalWrite(13, HIGH);
delay(1000);
2.3. Puerto USB digitalWrite(13, LOW);
El cable USB sirve para programar la placa y también para alimentarla con delay(1000);
electricidad (a 5 V). Una vez que tenemos el programa que ejecutará la placa Arduino }
UNO, debemos grabarlo en la memoria del microcontrolador. Se hace conectando la
placa al ordenador mediante un cable USB. Este cable tiene una segunda función: alimentar la placa con electricidad
que sale del ordenador.
Introducción
En la miniunidad anterior vimos cómo es la placa Arduino UNO. Ahora vamos a programarla y ponerla en
funcionamiento por primera vez. La haremos funcionar de la manera más sencilla posible: sin conectarla a ningún
circuito externo y grabando en su memoria un programa muy básico que hará que el led L (el indicador luminoso
integrado en la placa que sirve para hacer pruebas) se encienda y se apague cada segundo. Para programar la placa
usaremos el entorno de programación de Arduino (el IDE de Arduino). Finalmente veremos en qué consiste la
programación visual.
1 /*
2 Este programa hace parpadear el led
3 integrado de la placa Arduino.
4 */
5
6 //La función setup se ejecuta una sola vez.
7 void setup(){
8 pinMode(13, OUTPUT);
9 }
10
11 // La función loop se ejecuta continuamente.
12 void loop(){
13 digitalWrite(13, HIGH);
14 delay(1000);
15 digitalWrite(13, LOW);
16 delay(1000);
17 }
4. Salidas digitales 1
Introducción
En la miniunidad anterior practicamos por primera vez con Arduino creando un programa que hace parpadear el led L
(un led integrado en la placa que sirve para hacer pruebas). Ahora, usando el mismo programa, vamos a hacer
parpadear un led situado en un circuito externo. Es un circuito muy sencillo, pero muy importante por sus
aplicaciones prácticas, ya que desde Arduino se controla igual un humilde led que una máquina industrial de miles de
vatios de potencia: enviando 0 o 5 V al pin de la salida digital donde está conectado el actuador. Recuerda que
Arduino UNO tiene 14 salidas digitales.
Cuando el programa que hay en el microcontrolador decide encender un actuador envía una pequeña corriente de 5
V al pin donde está conectado. Cuando decide apagarlo retira la corriente y la tensión en el pin vuelve a ser de 0 V.
Las salidas digitales sólo pueden tener dos valores: 0 (apagado, 0 V, LOW en el código) o 1 (encendido, 5 V, HIGH
en el código). En el circuito que vamos a estudiar el led externo está conectado a la salida digital 13, que es la salida
a la que también está conectado internamente el led L, por lo que podremos usar el programa de la miniunidad
anterior.
5. Salidas digitales 2
Introducción
En la miniunidad anterior montamos un circuito con un led externo y escribimos un programa que lo hacía parpadear.
Ahora crearemos un circuito un poco más completo: 3 ledes que parpadean de forma secuencial, de derecha a
izquierda. La salida digital 2 controlará el led de la derecha, la salida 3 el led del centro y la salida 4, el led de la
izquierda. El retorno de la corriente que atraviesa cada uno de los ledes se produce a través del pin GND ("ground",
masa) que hay a la izquierda del pin 13.
Primero montaremos el circuito en una protoboard y después escribiremos el programa que lo controlará. Haremos
una primera versión del programa repitiendo las instrucciones del programa que hicimos en la miniunidad anterior.
Después lo mejoraremos introduciendo una variable para controlar el tiempo de parpadeo y finalmente haremos una
tercera versión con una estructura de programación llamada "bucle for".
Versión 1 Versión 2
1 void setup(){ 1 int timer = 500;
2 pinMode(2, OUTPUT); 2
3 pinMode(3, OUTPUT); 3 void setup(){
4 pinMode(4, OUTPUT); 4 pinMode(2, OUTPUT);
5 } 5 pinMode(3, OUTPUT);
6 6 pinMode(4, OUTPUT);
7 void loop(){ 7 }
8 digitalWrite(2, HIGH); 8
9 delay(500); 9 void loop(){
10 digitalWrite(2, LOW); 10 digitalWrite(2, HIGH);
11 delay(500); 11 delay(timer);
12 digitalWrite(3, HIGH); 12 digitalWrite(2, LOW);
13 delay(500); 13 delay(timer);
14 digitalWrite(3, LOW); 14 digitalWrite(3, HIGH);
15 delay(500); 15 delay(timer);
16 digitalWrite(4, HIGH); 16 digitalWrite(3, LOW);
17 delay(500); 17 delay(timer);
18 digitalWrite(4, LOW); 18 digitalWrite(4, HIGH);
19 delay(500); 19 delay(timer);
20 } 20 digitalWrite(4, LOW);
21 delay(timer);
22 }
Ahora escribimos el bucle "for" para que vaya cambiando automáticamente el led que parpadea: primero el de la
salida 2, después el de la 3 y finalmente el de la 4. Solo tienes que escribir la línea 10 y la llave que hay en la 15.
Después prueba el programa en la placa Arduino. En la página siguiente veremos cómo funciona.
1. Escribe en la línea 10 el encabezado del bucle "for".
2. El bucle "for" se delimita con una llave de cierre.
3. Prueba en la placa.
Es fácil modificar un bucle "for" cambiando el valor inicial de la variable o cambiando la condición del bucle:
== Igual que. > Mayor que. >= Mayor o igual que.
!= No igual que. < Menor que. <= Menor o igual que.
6. Entradas digitales 1
6.4. El circuito
A continuación, para practicar con las entradas digitales, montaremos un circuito que tiene un pulsador y un led
conectados a una placa Arduino UNO y escribiremos un programa para controlar el led en función de la información
que el microcontrolador capta del exterior a través del pulsador (un sensor digital). Este programa tendrá dos
versiones. La primera versión hará que al presionar el pulsador se encienda el led y al dejar de presionarlo se
apague. En la segunda versión haremos que mientras el pulsador esté presionado el led parpadee.
1. En las dos primeras líneas debes crear dos variables de tipo int (de "integer", número entero). En la primera
variable (ledPin) guardaremos el número del pin donde está conectado el led, en este caso es el pin 2. En la segunda
variable (buttonPin) guardaremos el número del pin donde está conectado el pulsador, en este caso es el pin 12. Al
poner delante de las variables la expresión "const" (de constante) le estamos diciendo al microcontrolador que son
variables cuyo contenido no va a cambiar una vez declaradas, es decir, que deben ser tratadas como constantes.
Esto sirve como sistema de control de errores: si se intenta cambiar el valor de esta constante, se mostrará
automáticamente un error.
2. En la tercera línea declara la variable buttonState, de tipo "integer", y ponle valor 0. En esta variable guardaremos
el estado del botón. Si el botón no está pulsado, la variable tendrá valor 0 (equivalente a LOW); si el botón está
pulsado, la variable tendrá valor 1 (equivalente a HIGH).
Esta variable también se podría definir como tipo "boolean", que es un tipo de dato que solo tiene dos valores
posibles: true (equivalente a HIGH y a 1) o false (equivalente a LOW y a 0). En este caso la línea 3 sería: boolean
buttonState = false;
3. En las líneas 6 y 7, dentro de la función setup(), utilizamos la función pinMode para decirle al microcontrolador que
el pin que hemos guardado dentro de la variable ledPin (el pin número 2, ver la línea 1) debe ser un pin de salida
(OUTPUT) y que el pin que hay dentro de la variable buttonPin (el pin 12, ver la línea 2) debe ser un pin de entrada
(INPUT).
4. Ahora hay que captar información del exterior: debemos saber si el botón está pulsado o no. Esto lo hacemos
utilizando la función digitalRead(), que sirve para leer el estado de una entrada digital. Si el botón está pulsado
llegará corriente de 5 V a la entrada digital 12 (la que está dentro de la variable buttonPin), digitalRead devolverá el
valor HIGH. Si el botón no está pulsado no llegará corriente a la entrada digital 12 y su tensión eléctrica será de 0 V,
digitalRead devolverá el valor LOW.
Tenemos ya la información del exterior: sabemos si el botón está pulsado o no. Ahora toca tomar decisiones con esta
información: encender o apagar el led que hay en la protoboard. Lo haremos usando la estructura condicional if...
else.
5. Escribe las líneas 12 a 17. Se trata de una estructura condicional if... else. Esta estructura tiene una condición que
se pone entre paréntesis. Si se cumple esta condición (if...), se ejecuta la instrucción 1. Si no se cumple la condición
(else), se ejecuta la instrucción 2.
6.5.2. Versión 2: Led que parpadea mientras se pulsa un botón. Diagrama de flujo
Ahora toca escribir la segunda versión del programa. En esta versión la placa Arduino
debe hacer parpadear el led externo mientras el pulsador esté presionado; cuando deje
de estar presionado, debe apagar el led. Aquí puedes ver el diagrama de flujo.
Introducción
En esta miniunidad vamos a utilizar las entradas digitales de Arduino para simular un sistema de seguridad en una
nave industrial que tiene dos puertas de acceso. Cada puerta tiene un sensor que indica al personal de seguridad si
está abierta o no, esta información se muestra en el monitor de un ordenador que hay en la sala de control de
seguridad.
Para implementar este sistema mediante una placa Arduino necesitaremos estudiar tres conceptos nuevos:
1. La estructura de programación if... else if... else.
2. El operador AND.
3. La comunicación de tipo serie entre una placa Arduino y un ordenador.
13. Clica en este icono para abrir el monitor serie, donde podremos ver los mensajes que envía la placa
Arduino. Si usas el IDE de escritorio clica en Herramientas > Monitor serie.
14. Comprueba que la velocidad de la comunicación sea la misma en el IDE que en el programa de la placa.
15. Carga el programa en la placa.
8.5. Prácticas
A continuación haremos dos prácticas para aprender a usar las entradas analógicas. En la primera práctica
utilizaremos el monitor serie del IDE de Arduino para visualizar qué lecturas genera un sensor analógico (usaremos
un potenciómetro). En la segunda práctica aprenderemos a utilizar las lecturas de este sensor para decidir si se debe
encender o apagar un actuador (usaremos un led). La segunda práctica tiene dos versiones. En la primera versión se
utiliza un potenciómetro como sensor analógico, en la segunda
versión se utiliza una LDR.
1. En las tres primeras líneas se crean las variables donde se guardan el número del pin analógico donde está el
potenciómetro (sensorPin) y del pin de la salida digital donde está el led (ledPin). Finalmente se crea la variable
sensorValue, que guardará el valor de la tensión recibida por la entrada analógica.
2. Se declara el pin digital 9 como salida.
3. Se lee el valor del pin analógico A0.
4. Entre las líneas 11 y 16 hay una estructura if... else que enciende o apaga el led en función del valor de la entrada
A0. Para activar o desactivar la salida se usa la función digitalWrite.
5. Carga el programa en la placa y comprueba que funcione correctamente.
Escribe este programa y cárgalo en la placa Arduino. A continuación gira poco a poco el eje del potenciómetro para
modificar el valor de tensión que llega a la entrada analógica A0. Cuando el valor sea mayor o igual que 512, el
programa apagará el led; cuando sea menor, lo encenderá.
9.3. Prácticas
A continuación realizaremos dos prácticas para aprender a usar las salidas analógicas. En la primera práctica
haremos que un led se encienda y se apague paulatinamente. En la segunda controlaremos el brillo de un led a
través de un potenciómetro: girando el eje del potenciómetro haremos que el led luzca más o menos.
1 int ledPin = 9;
2 int tension = 0;
3 int increment = 5;
4
5 void setup(){
6 pinMode(ledPin, OUTPUT);
7 }
8
9 void loop(){
10 analogWrite(ledPin, tension);
11 tension = tension + increment;
12 if (tension <= 0 || tension >= 255) {
13 Increment = -increment;
14 }
15 delay(30);
16 }
1. En la línea 1 se crea la variable "ledPin", que guarda el número del pin donde está conectado el led, el pin 9. En
las líneas 2 y 3 se crean las variables "tension" e "increment". La variable "tension" guarda el valor de la tensión
eléctrica que se enviará al pin 9, recuerda que no se indica en voltios, sino como un número comprendido entre el 0 y
el 255. La variable "increment" almacena cuánto se debe incrementar la variable "tension" cada vez que se ejecuta la
función loop().
2. Se declara el pin digital 9 como salida.
3. Usando la función "analogWrite" se envía el valor de la tensión al pin digital 9.
4. Se incrementa el valor de la tensión en 5 unidades (ver línea 3).
1 int ledPin = 9;
2 int sensorPin = A0;
3 int sensorValue = 0;
4
5 void setup(){
6 pinMode(ledPin, OUTPUT);
7 }
8
9 void loop(){
10 sensorValue = analogRead(sensorPin);
11 float tension = sensorValue * (255.0 / 1023.0);
12 analogWrite(ledPin, tension);
13 }
1. En la línea 1 se crea la variable "ledPin", que guarda el número del pin digital donde está conectado el led, el pin 9.
En la línea 2 se crea la variable "sensorPin", que guarda el número del pin analógico donde está conectado el
potenciómetro, el pin A0. En la línea 3 se crea la variable "sensorValue", donde se guarda el valor de la tensión
eléctrica que se recibe del potenciómetro, recuerda que no se indica en voltios, sino como un número comprendido
entre el 0 y el 1023.
2. Se declara el pin digital 9 como salida.
3. Usando la función "analogRead" se lee el pin analógico A0. El valor de la lectura, un número entre 0 y 1023, se
guarda dentro de la variable "sensorValue".
4. Se crea la variable "tension". Es una variable de tipo "float", que sirve para guardar números con decimales.
Ponemos dentro de "tension" el contenido de la variable "sensorValue" multiplicado por un coeficiente que transforma
proporcionalmente el valor de la lectura del potenciómetro (rango: 0 a 1023) a una salida analógica PWM (rango: 0 a
255). Simplemente se divide la señal recibida del potenciómetro entre 1023 y el resultado se multiplica por 255.
5. Usando la función "analogWrite" se ordena al pin 9 que genere un tren de pulsos PWM. Los pulsos tendrán una
anchura equivalente al valor de la variable "tension". La tensión promedio (en voltios) generada por el tren de pulsos
será proporcional a la señal enviada por el potenciómetro.
6. Carga el programa en la placa y comprueba que funcione correctamente.