La idea de la tarjeta Arduino, es programarla para que monitorice de forma continua los pines de entrada (sensores de línea negra, distancia, temperatura, orientación, color etc) , y reaccione a sus cambios activando las salidas (Motores, leds, zumbadores, etc) correspondientes, de modo que se realice alguna tarea que sea de utilidad,
Un programa es un conjunto varios elementos:
Instrucciones: Son órdenes escritas que se dan al microcontrolador para que haga algo, después de una orden hay que escribir ";". Las hay de cuatro tipos:
a) Instrucciones "a secas": Simplemente ejecutan una tarea.
Ejemplo: myServo.detach() desconecta el servo myServo y éste se detiene.
- Instrucciones con parámetros (o argumentos): Además de la instrucción se le indica entre paréntesis una serie de parámetros separados por comas.
Ejemplo: digitalWrite(3,HIGH) pone la salida digital 3 a nivel alto (5V).
- Instrucciones que dan un resultado (devuelven un valor): Normalmente el resultado es un número.
Ejemplo: digitalRead(3) da como resultado un número, que en este caso puede ser 0 (LOW) ó 1 (HIGH).
- instrucciones creadas por el programador. Un programador puede crear instrucciones nuevas como combinación de otras instrucciones. Las instrucciones creadas por el programador pueden ser de cualquiera de los tres tipo anteriores.
Ejemplo:
/* Funcion que umbraliza la deteccion de una línea negra.
Recibe como parámetro un número con la lectura del sensor analógico de reflectividad CNY70
Devuelve:
1- Si estamos sobre una línea negra
0- Si no estamos sobre una línea negra.
*/
int esLineaNegra (int infraredValue) {
if (infraredValue < (NEGRO_INFRARED + BLANCO_INFRARED)/2) {
return 1; // Negro -> Limite del tatami
} else {
return 0;
}
}
b) Variables: Son como los post-it, permiten al programa recordar datos recibidos de los sensores en algún momento anterior. El hecho de usar una variable para recordar datos, permite que los programas no sólo reaccionen a lo que los sensores están detectando en la actualidad, si no también tener en cuenta todo lo que ha ocurrido con anterioridad a la hora de tomar una decisión.
Las variables tienen un nombre asociado (es como ponerles etiquetas a los post-it) inventado por el usuario, y que debe describir
de alguna manera el dato que se escribe en ella, en un programa de Arduino se definen las variables que se van a usar al principio del programa y se escribe en ellas un dato inicial.
El dato que se escribe en una variable se puede modificar cuantas veces se quiera.
Ejemplo: Se define una variable de tipo entero (int) para escribir las veces que se pulsa un pulsador conectado a la entrada 3, y otra para escribir el estado del pulsador.
Cuando el pulsador se ha pulsado 3 veces se enciende un LED conectado a la salida 13
int cuentaPulsaciones = 0;
int estadoPulsador = 0;
void setup() {
pinMode(3,INPUT);
pinMode(13,OUTPUT);
// empezamos con el LED apagado
digitalWrite(13,LOW);
}
void loop() {
// Si el pulsador está pulsado estadoPulsador tendrá el valor 1, si no tendrá 0.
estadoPulsador = digitalRead(3);
//Si el pulsador está pulsado aumentamos la cuenta de pulsaciones en 1
if(estadoPulsador == 1) {
cuentaPulsaciones = cuentaPulsaciones + 1;
}
// si ya se ha pulsado 3 veces encender el LED
if(cuentaPulsaciones == 3) {
digitalWrite(13,HIGH);
}
// esperamos 200ms antes de volver a leer la entrada
delay(200);
}
c) Decisiones. Un robot tiene que reaccionar de distintas formas en función de los valores de las entradas conectadas a los sensores. Para ello lo que debe hacer es ejecutar distintos bloques de instrucciones en función de los valores de las entradas y las variables. Los bloques de instrucciones vienen delimitados por llaves { }. Para tomar decisiones se usa la instrucción if seguida de una condición entre paréntesis.
Hay muchos tipos de decisiones que podemos tomar usando la instrucción if, las más importantes son:
- if (simple)
if(condición) {
// Las instrucciones de este bloque se ejecutan sólo si la condición se cumple
}
- if else
if(condición) {
// Las instrucciones de este bloque se ejecutan sólo si la condición se cumple
} else {
// Las instrucciones de este bloque se ejecutan si la condición no se cumple
}
- if else if else. Se pueden usar tantos else if como se quiera, aunque en abajo sólo mostramos dos, para ahorrar espacio.
if(condición 1) {
// Las instrucciones de este bloque se ejecutan sólo si la condición 1 se cumple
} else if(condición 2) {
// Las instrucciones de este bloque se ejecutan sólo si la condición 2 se cumple
} else {
// Las instrucciones de este bloque se ejecutan si ninguna de las condiciones anteriores
// se cumple
}
La condición más sencilla consta de: Una variable, un operador y un número, y tiene sólo dos posibilidades; o se cumple o no se cumple. Los operadores que se pueden usar son:
== igual que (esto no es un error, cuando usamos el símbolo igual para comparar dos cosas se escribe dos veces)
> mayor que
< menor que
!= distinto de
>= mayor o igual que
<= menor o igual que
Ejemplos de condiciones son los siguientes:
estadoPulsador == 1 // La condición será cierta si y solo si el número // escrito en la variable estadoPulsador es 1
estadoPulsador == 0 // La condición será cierta si y solo si el número // escrito en la variable estadoPulsador es 0
estadoPulsador != 1 // Lo mismo pero de otra manera
numeroPulsaciones > 3 // la condición es cierta cuando el número escrito // en la variable numeroPulsaciones
// es 4 o mayor que 4
numeroPulsaciones >= 3 // la condición es cierta cuando el número escrito // en la variable numeroPulsaciones
// es 3, o mayor que 3
Negación de una condición. Se puede negar una condición poniendo delante de la misma el operador, para mayor claridad se recomienda poner entre paréntesis la condición
que se está negando.
! Operador negación u operador No: Torna una condición cierta en falsa y viceversa
Ejemplos de uso del operador negación:
!(estadoPulsador == 1) // La condición se cumplirá si no es cierto que el // valor escrito en la variable estadoPulsador es 1.
// O lo que es lo mismo: Si el valor escrito en la // variable estadoPulsador es 0
!(numeroPulsaciones >= 3) // la condición será cierta si no es cierto que el // valor escrito en la variable numeroPulsaciones
// es mayor o igual que 3.
// O lo que es lo mismo: Si el número escrito en // variable numeroPulsaciones es 2 ó 1.
Condiciones compuestas: Se pueden concatenar varias condiciones usando los operadores: && (Y) y || (O)
Ejemplos de concatenación de operaciones:
(numeroPulsaciones > 3) && (numeroPulsaciones < 6) // el número escrito en la variable numeroPulsaciones es mayor que 3 y menor
// que 6 (es decir 4 ó 5)
(numeroPulsaciones == 4) || (numeroPulsaciones == 5) // el número escrito en la variable numeroPulsaciones es 4 ó 5
!(numeroPulsaciones == 4) && !(numeroPulsaciones == 5) // el número escrito en la variable numeroPulsaciones no es 4 ni 5
Comentarios: Son aclaraciones para entender lo que hace el programa, no se ejecutan. Para escribir un comentario de una sola línea se escribe // al principio del texto,
para escribir un comentario de varias líneas se escibe /* al principio y */ al final. Es conveniente escribir un comentario de varias líneas al principio del programa escribiendo
Que es lo que el programa hace, que entradas y salidas se usan y que tipos de sensores y actuadores se conectan a ellas, así como el nombre del autor del programa.
Ejemplos de comentarios:
// Esto es un comentario de una línea
/*
Este es de
varias líneas
*/
Instrucciones más importantes de Arduino
El lenguaje de programación de Arduino consta de unas cuantas instrucciones. Las más básicas e importantes que alguien que empieza debería conocer son:
pinMode(pin,mode) Define si el pin cuyo número se pasa como primer parámetro será una entrada o una salida, normalmente se hace dentro de setup().
pin es un número del 0 al 13 que se corresponde con la entrada digital que queremos configurar.
mode puede tener dos valores INPUT o OUTPUT
Ejemplo:
/* configuramos el pin 13 como salida digital */
void setup() {
pinMode(13,OUTPUT);
}
digitalRead(pin) Nos devuelve 0 ó 1 dependiendo de si el voltaje del pin pasado como parámetro es 0V ó 5V
pin es un número de 0 a 13 que se corresponde con la entrada digital que queremos leer.
devuelve un número entero que puede ser 0 si la entrada está a 0V ó 1 si está a 5V
Ejemplo:
// Leemos el valor de la entrada 3 y lo escribimos en la variable barreraBajada
barreraBajada = digitalRead(3);
digitalWrite(pin, value) Establece el voltaje de una salida digital a 0 ó 5V
pin es un número del 0 al 13 que se corresponde con la entrada digital cuyo voltaje queremos cambiar.
value hay dos posibles valores:
HIGH establece el voltaje de la salida a 5V
LOW establece el voltaje de la salida a 0V
Ejemplo:
// Apagamos el led conectado a la salida 13
digitalWrite(13,LOW);
analogRead(pin) Nos devuelve u número entre 0 y 1023 que corresponce con el nivel de voltaje presente en una entrada analógica. los valores 0 y 1023 se corresponden
normalmente con 0V y 5V respectivamente.
pin es un número del 0 al 5 que se corresponde a la entrada analógica cuyo voltaje queremos leer
devuelve un número entre 0 y 1023 que se corresponde con el voltaje de la entrada pin. Los valores 0 y 1023 se corresponden con los niveles 0V y 5V respectivamente.
Ejemplo:
// Leemos la temperatura mediante un termistor conectado al pin analógico 1
temperatura = analogRead(1);
delay(milisegundos) el programa se detiene en esta instrucción durante el tiempo especificado en el parámetro.
milisegundos es un número que indica la cantidad de milisegundos durante los que el programa se va a detener en este punto
Ejemplo:
// espereamos 200 milisegundos
delay(200);
Serial.begin(velocidad_de_comunicación en bits/s);se usa dentro del setup() para Inicializar la comunicación serie con el ordenador a través del puerto USB a la velocidad indicada en el argumento, la velocidad más común es 9600. Una vez inicializada la comunicación se puede envíar y recibir información a través del cable USB usando: Serial.print("Texto"), Serial.println("Texto") y Serial.readString();
Ejemplo:
// Variable en la que almacenamos la cadena de texto recibida del ordenador
String datosRecibidos = "";
void setup() {
// Inicializamos la comunicación con el ordenador a 9600 bits/s
Serial.begin(9600);
}
void loop() {
Serial.println("Introduce datos:");// Envía el mensaje "Introduce datos" al ordenador
while (Serial.available() == 0) {} //bloquea el programa mientras no lleguen datos del ordenador
datosRecibidos = Serial.readString();//Lee los datos y los guarda en la variable datosRecibidos
datosRecibidos.trim();// elimina \r \n y espacios en blancoal principio y final de la cadena
if (datosRecibidos == "rojo") { // Contesta al ordenador con un mensaje u otro
Serial.println("Un color primario");
} else {
Serial.println("Cualquier otra cosa");
}
}
if(condición) ejecuta el conjunto de instrucciones entre corchetes si se cumple la condición. Sirve para tomar decisiones (Ver Decisiones más arriba)
Librerías más importantes
Una librería es una ampliación de las instrucciones básicas de Arduino que facilitan la programación de tareas muy concretas como el control de un servo, la medida de la distancia por ultrasonidos, la realización de operaciones trigonométricas con variables etc.
La más importante de todas, es la que se usa para controlar servos conectados a Arduino, la librería Servo.
Para usar una librería hay que incluir al principio del programa una línea como esta con el nombre de la librería que se va a usar
Ejemplo:
// Usamos la librería para el control de servos
#include <Servo.h>
las tres funciones más importantes de la librería de servos son: