PRIMEROS PASOS CON ARDUINO
Publicado por Alberto Peiró
Mi primer programa
Aquí ya nos metemos realmente en harina. Vamos a rehacer el programa Blink desde cero explicando detalladamente cada línea. El programa Blink, como hemos visto antes, hace que el LED naranja (asociado al estado del pin 13) de la placa se encienda y apague periódicacamente.
Nuevo Sketch
Abrimos la IDE de Arduino. Lo más normal es que nos aparezca una hoja en blanco en la que podemos empezar a teclear directamente, o si no, en caso de que estemos en la página de otro programa, "creamos un nuevo archivo". Veremos también que la IDE automáticamente le da un nombre al archivo de la forma sketch_fecha. Se puede cambiar exactamente igual que hacemos en otros programas como el Word. Abrimos el menú Archivo y le damos a guardar_como y allí introducimos el nuevo nombre. Por ejemplo mi_programa_Blink.
La estructura
¡Esta parte es importante! Un sketch se compone de varios bloques. Un bloque global que contiene las instrucciones para cargar otras bibliotecas, la definición de variables globales, funciones, y además los otros dos bloques. Dentro de este bloque hay dos funciones: setup y loop que conforman los otros dos bloques. La bloque setup se ejecuta una sola vez y se utiliza para establecer el modo de los pines e inicializar algunas variables. Mientras, el bloque loop se ejecuta repetidamente hasta el infinito y es el que, generalmente, aloja el programa principal.
El aspecto que tendría es el siguiente:
// ===== Sketch Arduino ====
// ... Carga de bibliotecas ...
// ... Definiciones de variables globales ...
// ... Definiciones de funciones ...
void setup() {
// Se ejecuta una sola vez.
//.... instrucciones ....
}
void loop {
// Se ejecuta infinitas veces.
//.... instrucciones ....
}
Para los que conozcan C, verán que no hay una función main. Pero realmente sí que existe. La IDE de Arduino la añade en el proceso de construcción.
el siguiente fichero:
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}
Para más detalle, si estamos en alguna distribución Linux, ver en el directorio de instalación:
\usr\share\arduino\hardware\arduino\cores\arduino\main.cpp
Instrucción a instrucción
Ahora sí. Vamos ya a escribir nuestro programa.
Comentarios
Empezamos con un comentario, una línea que es explicativa y que no contiene código a ejecutar. Se indica al inicio con "//" y se extiende toda la línea.
// ==== Mi programa Blink ====
//
Otra forma alternativa es encerrar el comentario entre /* mi comentario */. En este caso el comentario puede abarcar varias líneas
Contenido global
Vamos es a definir una variable con el nombre led_pin que usaremos para hacer referencia al pin asociado con el LED. Lo único que estamos haciendo es un paso previo para ganar claridad en el programa principal. Ya que es más intuitivo ver nombres como led_pin en una instrucción que números como 13.
const int led_pin = 13;
Con más detalle cada elemento de la línea signifiva (exactamente igual que C) lo siguiente:
- const: el valor no va a ser modificado en el programa.
- int: va a contener un valor entero entre -32768 y 32767.
- led_pin: es el nombre de la variable.
- 13: el valor que va a contener:
- ; y el punto y coma que indica que acaba la instrucción. Muy fácil de olvidar cuando estás acostumbrado a Python.
Bloque Setup
Pasamos al siguiente bloque. En este caso utilizaremos el bloque setup para introducir la definición que el comportamiento del pin 13 (ligado al LED) como un pin de salida. Definido como salida puede tomar dos valores: alto (1 ó True lógicos) que pondrá en salida 5V y encenderá el LED, o bajo (0 ó False lógico) que pondrá el pin a 0V y apagará el LED.
void setup() {
pinMode(led_pin, OUTPUT);
}
void setup () {contenido;} define una función que será llamada una sola vez al correr el programa en el Arduino.
- void: la función no devolverá ningún valor al terminar la ejecución.
- setup: es el nombre de la función.
- (): no le pasamos ningún parámetro.
- {contenido;}: son las instrucciones que se ejecutarán cuando se llama a la función.
pinMode(led_pin, OUTPUT); configuramos el pin 13 (led_pin) como salida.
- pinMode: es una instrucción de la biblioteca de Arduino en la que fijamos el modo de trabajo del pin número 13.
el primer valor es el número del pin a configurar.
el segundo valor es la configuración. Puede ser como INPUT o OUTPUT.
Bloque Loop
La parte que se va a repetir infinitamente, encender y apagar el led, la introducimos en la función loop.
void loop() {
digitalWrite(led_pin, HIGH);
delay(1000);
digitalWrite(led_pin, LOW);
delay(1000);
}
Igual que antes, loop es una función a la que no pasamos ningún parámetro y que no devuelve ningún valor. Solo ejecuta infinitamente las instrucciones contenidas entre las llaves.
Explicamos las instrucciones que contiene.
digitalWrite(led_pin, HIGH). Pone el pin 13 (LED) a HIGH (alto) que es equivalente a encenderlo.
- digitalWrite(pin, estado): es otra función de la biblioteca de Arduino que pone el pin indicado al estado HIGH o LOW.
delay(1000). Espera un segundo.
- delay(n): con esta instrucción el progama se detiene en este punto el tiempo indicado por n en milisegundos. En esta caso n=1000 milisegundo que es lo mismo que un segundo.
digitalWrite(led_pin, LOW); apaga el led.
delay(1000); volvemos a esperar un segundo.
Volvemos al principio del bloque y seguimos ejecutando instrucciones.
HIGH y LOW son constantes predefinidas que equivalen a los estados posibles de los pines. HIGH equivale a 1 (realmente es a cualquier valor que no sea 0) o TRUE. Mientras LOW equivale a 0 o a FALSE.
Paso final
Solo nos queda cargar el programa en el Arduino.
Verificamos que no hay ningún problema en la sintaxis del código. En mi caso lo más normal es que me haya dejado algún ";". Si aparece algún problema lo corregimos.
Y una vez que no dé ningún error, cargamos el programa en el Arduino y, si todo va bien, veremos como se apaga y se enciende el led.
Experimentación.
Lo más importante para aprender es experimentar. Os recomiendo probar lo siguiente:
- Modificar el tiempo del delay. Probar con 500ms, 2000ms.
- Cambiar HIGH por 1 o por TRUE.
- Cambiar LOW por 0 o por FALSE.
- Crear una variable tiempo global.
(Ayuda: debajo de la definición de pin_led escribirconst int tiempo=1000;
e introducir la variable dentro del delaydelay(tiempo);)
- Eliminar la variable pin_led e introducir manualmente el valor 13.