Curso de Arduino 1
Curso de Arduino 1
Primera Parte
P á g i n a 1 | 70
¿Qué es Arduino?
Tan pronto como llegó a una comunidad más amplia, la placa Arduino
comenzó a cambiar para adaptarse a las nuevas necesidades y
desafíos, diferenciando su oferta de placas simples de 8 bits a
productos para aplicaciones IoT, dispositivos portátiles, impresión
3D y entornos integrados. Todas las placas Arduino son
completamente de código abierto, lo que permite a los usuarios
construirlas de forma independiente y eventualmente adaptarlas a
sus necesidades particulares. El software también es de código
abierto y está creciendo a través de las contribuciones de los
usuarios de todo el mundo.
P á g i n a 2 | 70
El uso del Arduino
Usando Arduino
• Windows
• Mac OS X
• Linux
• IDE portátil (Windows y Linux)
Escribir sketches
Nota: las versiones del software Arduino (IDE) anteriores a 1.0 con
sketches guardados con la extensión (.pde). Es posible abrirlos con
P á g i n a 5 | 70
la versión 1.0, nos pedirá que guardemos el sketch con la extensión
(.ino) al guardar.
P á g i n a 6 | 70
Para el manejo de las pestañas se encuentran comandos adicionales
dentro de los cinco menús: Archivo, Editar, Boceto, Herramientas,
Ayuda. Los menús son contextuales, lo que significa que solo están
disponibles los elementos relevantes para el trabajo que se está
realizando actualmente.
Archivo
P á g i n a 7 | 70
• Salir: Cierra todas las ventanas IDE. Los mismos bocetos
abiertos cuando se eligió Salir se volverán a abrir
automáticamente la próxima vez que inicie el IDE.
Editar:
P á g i n a 8 | 70
Sketch
P á g i n a 9 | 70
Hay una lista de bibliotecas (librerías) en la referencia.
Algunas librerías están incluidas con el software Arduino.
Otros se pueden descargar desde una variedad de fuentes o
mediante el Administrador de la Biblioteca (librerías). A partir
de la versión 1.0.5 del IDE, podemos importar una biblioteca
desde un archivo zip y usarla en un sketch abierto.
• Instalando una biblioteca, usando el administrador de la
biblioteca
Para instalar una nueva biblioteca en nuestro Arduino IDE,
podemos usar el Administrador de bibliotecas (disponible en
la versión 1.6.2 de IDE). Abramos el IDE y hagamos clic en el
menú "Programa" y luego Incluir biblioteca> Administrar
P á g i n a 10 | 70
Finalmente hagamos clic en instalar y espere a que el IDE
instale la nueva biblioteca. La descarga puede demorar
dependiendo de la velocidad de nuestra conexión. Una vez que
haya terminado, debería aparecer una etiqueta Instalada junto
a la biblioteca de Bridge. Podemos cerrar el administrador de
la biblioteca.
• Agregar archivo (añadir fichero) ... Agrega un archivo fuente al
sketch (se copiará de su ubicación actual). El nuevo archivo
aparece en una nueva pestaña en la ventana de programa. Los
archivos se pueden eliminar del sketch utilizando el menú de
pestañas accesible haciendo clic en el pequeño icono del
triángulo debajo del monitor en serie, uno en el lado derecho
de la barra de herramientas.
Herramientas
P á g i n a 12 | 70
• Arduino / Genuino Micro: Un ATmega32u4 funcionando a 16
MHz con reinicio automático, 12 entradas analógicas, 20 E/S
digitales y 7 PWM.
• Arduino Esplora: Un ATmega32u4 funcionando a 16 MHz con
reinicio automático.
• Arduino Mini con ATmega328P: Un ATmega328P que funciona
a 16 MHz con reinicio automático, 8 entradas analógicas, 14 E/
S digitales y 6 PWM.
• Arduino Ethernet: Equivalente a Arduino UNO con un escudo
Ethernet: un ATmega328P que funciona a 16 MHz con reinicio
automático, 6 entradas analógicas, 14 E / S digitales y 6 PWM.
• Arduino Fio: Un ATmega328P funcionando a 8 MHz con reinicio
automático. Equivalente a Arduino Pro o Pro Mini (3.3V, 8 MHz)
con ATmega328P, 6 entradas analógicas, 14 E / S digitales y 6
PWM.
• Arduino BT con ATmega328P: ATmega328P funcionando a 16
MHz. El cargador de arranque grabado (4 KB) incluye códigos
para inicializar el módulo bluetooth integrado, 6 entradas
analógicas, 14 E / S digitales y 6 PWM.
• LilyPad Arduino USB: Un ATmega32u4 funcionando a 8 MHz
con reinicio automático, 4 entradas analógicas, 9 E/S digitales
y 4 PWM.
• LilyPad Arduino: Un ATmega168 o ATmega132 funcionando a 8
MHz con reinicio automático, 6 entradas analógicas, 14 E / S
digitales y 6 PWM.
• Arduino Pro o Pro Mini (5V, 16 MHz ) con ATmega328P: Un
ATmega328P funcionando a 16 MHz con reinicio automático.
Equivalente a Arduino Duemilanove o Nano con ATmega328P ;
6 entradas analógicas, 14 E / S digitales y 6 PWM.
• Arduino NG o anterior con ATmega168: Un ATmega168
funcionando a 16 MHz sin reinicio automático. La compilación y
carga es equivalente a Arduino Diecimila o Duemilanove con
ATmega168 , pero el cargador de arranque quemado tiene un
tiempo de espera más lento (y parpadea el LED del pin 13 tres
veces al reiniciar); 6 entradas analógicas, 14 E / S digitales y 6
PWM.
• Arduino Robot Control: Un ATmega328P funcionando a 16 MHz
con reinicio automático.
• Motor Arduino Robot: Un ATmega328P funcionando a 16 MHz
con reinicio automático.
P á g i n a 13 | 70
• Arduino Gemma: Un ATtiny85 que funciona a 8 MHz con reinicio
automático, 1 entrada analógica, 3 E / S digitales y 2 PWM.
• Puerto: Este menú contiene todos los dispositivos seriales
(reales o virtuales) en su máquina. Debería actualizarse
automáticamente cada vez que abramos el menú de
herramientas de nivel superior.
• Programador: Para seleccionar un programador de hardware
cuando se programa una placa o chip y no se utiliza la conexión
USB serie incorporada. Normalmente no necesitaremos esto,
pero si está grabando un cargador de arranque en un nuevo
microcontrolador, lo necesitaremos.
• Grabar cargador de arranque: Los elementos de este menú le
permiten grabar un cargador de arranque en el
microcontrolador en una placa Arduino. Esto no es necesario
para el uso normal de una placa Arduino o Genuino, pero es
útil si compra un nuevo microcontrolador ATmega (que
normalmente viene sin un gestor de arranque). Asegúrese de
haber seleccionado la placa correcta del menú Placas antes de
grabar el gestor de arranque en la placa de destino. Este
comando también establece los fusibles correctos.
Ayuda
Cargando
Bibliotecas
Hardware de terceros
Monitor en serie
Preferencias
Ayuda de idioma
P á g i n a 17 | 70
Si deseamos cambiar el idioma manualmente, iniciemos el Software
Arduino (IDE) y abra la ventana de Preferencias. Al lado del Idioma
del editor hay un menú desplegable de los idiomas admitidos
actualmente. Seleccionemos nuestro idioma preferido en el menú y
reinicie el software para usar el idioma seleccionado. Si el idioma de
nuestro sistema operativo no es compatible, el software Arduino
(IDE) estará predeterminado en inglés.
Conectemos nuestra placa Uno con un cable USB AB; a veces este
cable se llama cable de impresora USB
P á g i n a 18 | 70
La conexión USB con la PC es necesaria para programar la placa y
no solo para encenderla. El Uno, automáticamente extrae energía del
USB o de una fuente de alimentación externa. Conectemos la placa
a nuestra computadora con el cable USB. El LED de alimentación
verde (etiquetado PWR) debería encenderse.
Primer sketch
P á g i n a 20 | 70
Seleccionemos el dispositivo serie de la placa desde Herramientas |
Menú de puerto serie. Es probable que sea COM3 o superior ( COM1
y COM2 generalmente están reservados para puertos seriales de
hardware). Para averiguarlo, podemos desconectar nuestra placa y
volver a abrir el menú; la entrada que desaparece debería ser la
placa Arduino. Volvamos a conectar la placa y seleccionemos ese
puerto serie.
Subir programa
P á g i n a 21 | 70
Segunda, void loop(): Ésta debe ir siempre después de void setup().
En ella escribiremos todas las sentencias, bucles y llamadas a
funciones que necesitemos que nuestro Arduino repita
constantemente. Se escribirán en orden de ejecución. Ejemplo de
éstas pueden ser digitalWrite( , ), Serial.print(“ “), if( )…
Existen otras partes del código que no son obligatorias pero que
podemos necesitar, según el código lo requiera, para organizarlo
todo.
P á g i n a 22 | 70
lo que debe hacer en cada momento. Estas herramientas son las
sentencias y funciones.
Otra cosa importante son las librerías. Son una serie de sentencias
y funciones específicas de cada elemento o shield que conectemos
a Arduino, que no están dentro de las propias IDE, y que realizarán
acciones específicas de cada uno facilitándonos mucho la
programación.
Compilación y carga.
P á g i n a 24 | 70
EJEMPLOS
Ejemplo: Semáforo
1 x Arduino UNO R3
1 x Protoboard
3 x resistencias de 220Ω.
/* SEMAFORO */
//** Definiciones **//
int rojo=2; //definimos el valor del pin para el led rojo
int amarillo=4; //definimos el valor del pin para el led amarillo
int verde=7; //definimos el valor del pin para el led verde
void loop() {
digitalWrite(verde,HIGH); //encendemos el led rojo
delay(2000); //esperamos 2 segundos
digitalWrite(verde,LOW); //apagamos el led rojo
delay(500); //esperamos medio segundo
P á g i n a 26 | 70
Con la sentencia int estamos declarando una variable numérica
entera, para poderla usar después en nuestro código.
Pines de salida
P á g i n a 27 | 70
Los pines que podemos configurar para que cambien el nivel de
salida según nuestro programa son los digitales, es decir, los 1 a 13.
Por defecto estos pines están configurados como entradas así que
lo primero que tenemos que hacer para utilizar un pin como salida
es configurarlo como tal. Para ello escribimos esta sentencia dentro
del apartado setup del programa.
pinMode(pin,OUTPUT);
P á g i n a 28 | 70
Ahora tendremos 5 V permanentemente en ese pin a no ser que en
el programa insertemos
digitalWrite(pinsalida,LOW);
IMPORTANTE: hay que tener en cuenta que estos pines tienen una
intensidad limitada a 40 mA , por tanto no será suficiente para
alimentar a algunos relés, motores, bombillas y todo aquello que
necesite mayor corriente.
PWM
Los pines que permiten esta función están señalados con el símbolo
~ . En la placa Uno son los pines 3, 5, 6, 9, 10 y 11.
analogWrite(pinsalida,191);
void setup()
{
pinMode(pinsalida,OUTPUT); // configura "pinsalida" como salida
digitalWrite(pinsalida,HIGH); // pone el "pinsalida" a nivel alto
delay(2000); // espera 2000 milisegundos (2 segundos)
pinMode(pinsalida,LOW); // pon "pinsalida a nivel bajo
delay(1000); // espera 1 segundo
}
P á g i n a 30 | 70
En la función loop hacemos uso del PWM. Escribimos un bucle “for”
que dará a la variable pwm un valor inicial de 0 y lo irá
incrementando en una unidad hasta que alcance el valor máximo de
255. A continuación, ponemos otro bucle “for” que irá decrementando
el valor desde el máximo hasta el mínimo.
void loop()
{
for(pwm=0;pwm<256;pwm++) // desde pwm valiendo 0; hasta que valga 255; incrementa pwm
{
analogWrite(pinsalida,pwm); // pone el "pinsalida" a el valor que almacena la variable "pwm"
delay(1000/velocidad); // espera (1000/velocidad) milisegundos
}
for(pwm=255;pwm>-1;pwm--) // este bucle hace lo mismo pero decrementando pwm
{
analogWrite(pinsalida,pwm);
delay(1000/velocidad);
}
}
void setup()
{
pinMode(pinsalida,OUTPUT); // configura "pinsalida" como salida
digitalWrite(pinsalida,HIGH); // pone el "pinsalida" a nivel alto
delay(2000); // espera 2000 milisegundos (2 segundos)
pinMode(pinsalida,LOW); // pon "pinsalida a nivel bajo
delay(1000); // espera 1 segundo
}
void loop()
{
for(pwm=0;pwm<256;pwm++) // desde pwm valiendo 0; hasta que valga 255; incrementa pwm
{
analogWrite(pinsalida,pwm); // pone el "pinsalida" a el valor que almacena la variable "pwm"
delay(1000/velocidad); // espera (1000/velocidad) milisegundos
}
for(pwm=255;pwm>-1;pwm--) // este bucle hace lo mismo pero decrementando pwm
{
analogWrite(pinsalida,pwm);
delay(1000/velocidad);
}
}
P á g i n a 31 | 70
Descripción de las entradas
Entradas analógicas
lectura = analogRead(pinentrada);
P á g i n a 32 | 70
Entradas digitales
Las entradas digitales son las mismas que las salidas digitales, es
decir, los pines que van del 1 al 13. Se diferencian de las analógicas
porque éstas son capaces de “entender” sólo dos niveles de señal,
LOW o valores cercanos a 0 V y HIGH o valores cercanos a 5 V.
P á g i n a 33 | 70
Vamos a hacer un pequeño proyecto para medir la temperatura
ambiente y visualizarla en nuestro PC. Su montaje no lleva más de
un par de minutos y podemos verlo claramente en el esquema. La
pata +Vs va al pin 5V, la pata Vout al pin que utilicemos para la
lectura, en este caso el 0, y la restante GND al pin GND. Tened en
cuenta que el dibujo del LM35 está hecho con vista desde las patas.
CUIDADO con colocarlo al revés porque si lo hacéis mal el sensor se
calentará rápidamente y aparte de estropearlo se quemará al
tocarlo.
P á g i n a 34 | 70
Lo siguiente es abrir el puerto serial en la función setup. Esto se
hace para poder comunicarnos desde nuestro ordenador con el
controlador y así poder mostrar los datos por pantalla.
void setup()
{
Serial.begin(9600); // abrimos el puerto reial a 9600 bps
}
void loop()
{
temperatura = analogRead(pinentrada); // lectura del pin A0
temperatura = (temperatura / 1023 * 5 / 0.01); // "traduce" el valor leído a grados
Serial.print(temperatura); // escribe el valor de la temperatura por el puerto
serial
Serial.print(" grados centigrados \n"); // escribe las unidades
delay(1000); // espera 1 segundo
}
P á g i n a 35 | 70
Si nos muestras caracteres extraños es que la configuración del
monitor serial está comunicándose con una tasa bps distinta a los
9600 con los que hemos configurado nuestro puerto serial. Para
corregirlo sólo tenemos que seleccionar el valor adecuado de la
pestaña desplegable como se puede ver en la siguiente imagen.
/*****************************/
/* Medicion de Temperatura */
/* con el sensor LM35 */
/*****************************/
void setup()
{
Serial.begin(9600); // abrimos el puerto serial a 9600 bps
}
void loop()
{
temperatura = analogRead(pinentrada); // lectura del pin A0
temperatura = (temperatura / 1023 * 5 / 0.01); // traduce el valor a ºC
Serial.print(temperatura); // escribe el valor por el puerto serial
Serial.print(" grados centigrados \n"); // escribe las unidades de ºC
delay(1000); // espera un segundo
}
Ejemplo Botones
Esquema común
• 1 x Arduino UNO R3
• 1 X Protoboard
• 1 x Botón
P á g i n a 37 | 70
Usaremos el pin 2 para encender el led y el 4 para saber el estado
del botón. Al montarlo debemos tener en cuenta un par de detalles.
Primero, que conectemos correctamente la polaridad del led,
siguiendo las indicaciones que os dimos en el ejemplo del semáforo.
Segundo, que usemos la resistencia de 10kΩ para conectar el botón
a tierra. Esto es muy importante, ya que con eso protegemos a
nuestra placa de crear un cortocircuito a tierra que podría
deteriorarla. La resistencia de 220Ω, como en ejemplos anteriores,
la usaremos para conectar el led a tierra.
Pulsador
pinMode(2, OUTPUT);
pinMode(4, INPUT);
P á g i n a 38 | 70
Finalmente, nuestro código loop lo que hará será, primero leer del
pin 4 en qué estado está el botón mediante la sentencia digitalRead.
Este valor lo almacenaremos en la variable “pulsador” que
declaramos anteriormente.
pulsador = digitalRead(4);
Una vez que sepa cómo se encuentra el botón, mediante una función
“if”, si el pulsador está HIGH (pulsado) encenderá el led y si el
pulsador está en LOW (sin pulsar) lo apagará.
if(pulsador==HIGH) {
digitalWrite(2, HIGH);
}
else{
digitalWrite(2, LOW);
/**************************/
/* Encender LED con Botón */
/* Pulsador */
/**************************/
void loop() {
pulsador = digitalRead(4); //lee el estado del botón
if(pulsador==HIGH) { //si el estado es pulsado
digitalWrite(2, HIGH); //se enciende el led
}
else{ //si el estado es no pulsado
digitalWrite(2, LOW); //se apaga el led
}
}
Interruptor
int estado=0;
if(pulsador==HIGH){
estado=1-estado;
}
if(estado==1) {
digitalWrite(2, HIGH);
}
else{
digitalWrite(2, LOW);
P á g i n a 40 | 70
El código completo quedaría así:
/**************************/
/* Encender LED con Botón */
/* Interruptor 1 */
/**************************/
void setup() {
pinMode(2, OUTPUT); //declaramos el pin 2 como salida
pinMode(4, INPUT); //declaramos el pin 4 como entrada
}
void loop() {
pulsador = digitalRead(4); //lee si el botón está pulsado
int pulsadorAnt=0;
if((pulsador==HIGH)&&(pulsadorAnt==LOW)){
estado=1-estado;
}
P á g i n a 42 | 70
Para evitar este problema, una solución sencilla es meter una
pequeñísima pausa al programa justo después de que Arduino
detecte nuestra pulsación. De esta forma, cuando el código retome
su funcionamiento, los rebotes habrán terminado y no serán
detectados. En nuestro caso introduciremos una pausa de 40
milisegundos, aunque podéis probar a variar este valor a vuestro
gusto para afinar el resultado.
delay(40);
void setup() {
pinMode(2, OUTPUT); //declaramos el pin 2 como salida
pinMode(4, INPUT); //declaramos el pin 4 como entrada
}
void loop() {
pulsador = digitalRead(4); //lee si el botón está pulsado
P á g i n a 43 | 70
Comunicación Serie
P á g i n a 44 | 70
Una vez que lo pulsemos, se abrirá el monitor en el que podremos
recibir información de Arduino y escribirle nosotros, tanto
información que nos solicite como órdenes.
void setup(){
Serial.begin(9600); // Inicia la comunicación serial
pinMode(led, OUTPUT);
}
void loop(){
if (Serial.available()>0){ // Comprueba si el serial está disponible
parpadeos = Serial.read()-48; // leemos el número de parpadeos
if (parpadeos >= 1 && parpadeos <= 9) // Si el valor introducido está entre 1 y 9
{
Serial.print("Se van a dar ");
Serial.print(parpadeos);
Serial.println(" parpadeos");
delay(1500);
for(int i=0;i<parpadeos;i++){ // Realiza los parpadeos
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(200);
}
}
else { // Si introducimos un valor erroneo
Serial.println("El dato introducido es incorrecto");
}
}
}
P á g i n a 46 | 70
Este programa lo que hace es que nuestro Led parpadee el número
de veces que le digamos. Para ello introduciremos valores, entre 1 y
9, por el monitor serial y pulsamos enter.
P á g i n a 47 | 70
Finalmente definiremos un bucle for. En nuestro caso “ for (int
i=0;i<parpadeos;i++) ”, para que iniciando el valor de “ i ” en 0, si “ i ”
es menor que el valor de parpadeos introducido, encenderá y
apagará el Led una vez e incrementará el valor de “ i ” en 1 cada vez
que pase por el bucle. De esta forma conseguimos que el Led
parpadee las veces que le hemos ordenado.
P á g i n a 48 | 70
Para realizar este ejemplo necesitaremos los siguientes elementos:
• 1 x Arduino UNO R3
• 1 X Protoboard
P á g i n a 49 | 70
/**********************************/
/* Control de Led RGB con Serial */
/**********************************/
//** Definiciones **//
const int ledRojo=3; // definimos los pines digitales para el Led RGB
const int ledVerde=5;
const int ledAzul=6;
const int potRojo=0; // definimos los pines analógicos para los
potenciometros
const int potVerde=1;
const int potAzul=2;
int rojo; // definimos variables para los valores de cada
potenciometro
int verde;
int azul;
void setup(){
Serial.begin(9600); // inicia la comunicación serial
pinMode(ledRojo, OUTPUT); // configuramos los pines digitales como salida
pinMode(ledVerde, OUTPUT);
pinMode(ledAzul, OUTPUT);
}
void loop(){
rojo=analogRead(potRojo) / 4; // leemos el valor de cada potenciómetro
verde=analogRead(potVerde) / 4; // y lo almacenamos
azul=analogRead(potAzul) / 4;
analogWrite(ledRojo,rojo);
analogWrite(ledVerde,verde);
analogWrite(ledAzul,azul);
Serial.print("ROJO: ");
Serial.print(rojo); // si fuese ánodo común sería 255-rojo
Serial.print(" / ");
Serial.print("VERDE: ");
Serial.print(verde); // si fuese ánodo común sería 255-verde
Serial.print(" / ");
Serial.print("AZUL: ");
Serial.println(azul); // si fuese ánodo común sería 255-azul
delay(300);
}
P á g i n a 50 | 70
suficientemente buena. El resto del programa, con lo aprendido en
los post anteriores, se entiende perfectamente.
Una vez que tenemos todo listo, podemos ver cómo, mientras
movemos los potenciómetros, el Led RGB va creando distintos
colores y en el monitor serial nos aparecen los valores de intensidad
que se están utilizando para conseguirlos. Con estos valores
podemos dirigirnos a cualquier programa de edición gráfica y utilizar
ese color exacto, o viceversa.
P á g i n a 51 | 70
Sonidos con Arduino
Función tone
tone(pinsalida,frecuencia);
noTone(pinsalida);
Zumbador
P á g i n a 52 | 70
Ya sólo falta crear el código y cargarlo. En la función loop hacemos
la llamada a tone para que suene y noTone para detener el sonido.
Cambiando los valores de la función delay haremos que suene
durante más o menos tiempo.
void setup()
{
}
void loop()
{
tone(pinzumbador,frecuencia); // inicia el zumbido
delay(2000);
noTone(pinzumbador); // lo detiene a los dos segundos
delay(1000);
}
Podemos observar dos cosas:
P á g i n a 53 | 70
Música
P á g i n a 54 | 70
Vamos con el primer ejemplo. Para no almacenar todas las
frecuencias y tener que escribir la función tone en nuestro código
cada vez que queramos una nueva nota, haremos un pequeño truco.
Almacenaremos sólo el valor de la frecuencia inicial, y las sucesivas
notas tendrán la frecuencia de la anterior multiplicada por 1,059. De
este modo escribiremos una sola vez la función para hacerlo sonar
y un bucle for será el encargado de ir incrementando el valor de la
frecuencia.
/***********************/
/* recorrido de octava */
/***********************/
void setup()
{
}
void loop()
{
for(contador=0,frecuencia=220;contador<12;contador++)
{
frecuencia=frecuencia*m; // actualiza la frecuencia
tone(pinaltavoz,frecuencia); // emite el tono
delay(1500); // lo mantiene 1.5 segundos
noTone(pinaltavoz); // para el tono
delay(500); // espera medio segundo
}
}
P á g i n a 55 | 70
Ahora pasamos a lo bueno: reproducir música, pero de la que
recuerda a los videojuegos con música de 8 bits.
nota(frecuencia,duración);
/**************************/
/* popurri para Arduino */
/**************************/
/* declaración de variables */
int spk=13; // altavoz a GND y pin 13
int c[5]={131,262,523,1046,2093}; // frecuencias 4 octavas de Do
int cs[5]={139,277,554,1108,2217}; // Do#
int d[5]={147,294,587,1175,2349}; // Re
int ds[5]={156,311,622,1244,2489}; // Re#
int e[5]={165,330,659,1319,2637}; // Mi
int f[5]={175,349,698,1397,2794}; // Fa
int fs[5]={185,370,740,1480,2960}; // Fa#
int g[5]={196,392,784,1568,3136}; // Sol
int gs[5]={208,415,831,1661,3322}; // Sol#
int a[5]={220,440,880,1760,3520}; // La
int as[5]={233,466,932,1866,3729}; // La#
int b[5]={247,494,988,1976,3951}; // Si
void nota(int a, int b); // declaración de la función auxiliar. Recibe dos números
enteros.
void setup()
{
P á g i n a 56 | 70
/**************************************/
/* HARRY POTTER */
/**************************************/
nota(b[2], 500);
nota(e[3],1000);
nota(g[3], 250);
nota(fs[3],250);
nota(e[3],1000);
nota(b[3],500);
nota(a[3],1250);
nota(fs[3],1000);
nota(b[2], 500);
nota(e[3],1000);
nota(g[3],250);
nota(fs[3],250);
nota(d[3],1000);
nota(e[3],500 );
nota(b[2],1000 );
noTone(spk); delay(1000);
nota(b[2], 500);
nota(e[3],1000);
nota(g[3], 250);
nota(fs[3],250);
nota(e[3],1000);
nota(b[3],500);
nota(d[4],1000);
nota(cs[4],500);
nota(c[4],1000);
nota(a[3],500);
nota(c[4],1000);
nota(b[3],250);
nota(as[3],250);
nota(b[2],1000);
nota(g[3],500);
nota(e[3],1000);
noTone(spk);
delay(2000);
/*******************/
/* STAR WARS */
/*******************/
/**** tema principal ****/
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(g[1],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(a[1],1200);noTone(spk);delay(2000); P á g i n a 57 | 70
/**** marcha del imperio ****/
nota(g[2],500);noTone(spk);delay(100);
nota(g[2],500);noTone(spk);delay(100);
nota(g[2],500);noTone(spk);delay(100);
nota(ds[2],500);noTone(spk);delay(1);
nota(as[2],125);noTone(spk);delay(25);
nota(g[2],500);noTone(spk);delay(100);
nota(ds[2],500);noTone(spk);delay(1);
nota(as[2],125);noTone(spk);delay(25);
nota(g[2],500);
noTone(spk);delay(2000);
/**********************/
/* entre dos aguas */
/**********************/
nota(a[1],400);noTone(spk);delay(400);
nota(e[1],400);noTone(spk);delay(400);
nota(a[1],400);noTone(spk);delay(200);
nota(e[1],200);noTone(spk);delay(200);
nota(a[1],200);noTone(spk);delay(200);
nota(as[1],100);noTone(spk);delay(100);
nota(b[1],400);noTone(spk);delay(400);
nota(fs[1],400);noTone(spk);delay(400);
nota(b[1],400);noTone(spk);delay(200);
nota(fs[1],200);noTone(spk);delay(200);
nota(b[1],200);noTone(spk);delay(200);
nota(as[1],100);noTone(spk);delay(100);
nota(a[1],400);noTone(spk);delay(400);
nota(e[1],400);noTone(spk);delay(400);
nota(a[1],400);noTone(spk);delay(400);
}
void loop()
{
}
P á g i n a 58 | 70
En otro ejemplo, ya realizamos mediciones de temperatura con un
sensor. Lo interesante de este ejemplo no es el medir la temperatura,
si no aprender el funcionamiento del sistema OneWire, para poder
usarlo en cualquier sensor que lo utilice, y la instalación e importado
de librerías de terceros.
P á g i n a 59 | 70
En este ejemplo vamos a usar las librerías propias del sensor en
cuestión, en nuestro caso usaremos las librerías DallasTemperature
y OneWire . Para instalar las librerías propias, o de terceros, una vez
descargadas existen 2 métodos:
P á g i n a 60 | 70
Una vez instaladas las librerías que vayamos a usar, podremos usar
los ejemplos que traen cada una para probar sus accesorios. Es
interesante echarles un ojo antes de ponernos a programar como
locos, porque de estos ejemplos podemos aprovechar partes de
código o ver cómo usa las funciones… y así ahorrarnos mucho
trabajo. Para abrir estos ejemplos solo tendremos que dirigirnos
dentro del IDE a Archivo->Ejemplos y ahí veremos todas las librerías
disponibles y dentro de cada una, sus ejemplos correspondientes.
P á g i n a 61 | 70
Ejemplo: Medición de temperatura con sensor ds18b20
• 1 x Arduino UNO R3
• 1 x Protoboard
• 1 x Resistencia de 4,7kΩ
void setup() {
delay(1000);
Serial.begin(9600);
sensors.begin(); //Se inician los sensores
}
void loop() {
sensors.requestTemperatures(); //Prepara el sensor para la lectura
P á g i n a 63 | 70
Con la línea OneWire ourWire(Pin) , le decimos al sensor a través de
que pin se debe comunicar con Arduino y con DallasTemperature
sensors(&ourWire) llamaremos a la librería de Dallas para que
interprete los datos enviados y recibidos por nuestro bus.
Material necesario
P á g i n a 65 | 70
Montaje
• SS a la fila GND
• VDD a la fila 5 V
• V0 a la pata central del potenciómetro
• RS al pin 12
• RW a la fila GND
• E al pin 11
• D0 a D3 sin conexión
P á g i n a 66 | 70
• D4 al pin 5
• D5 al pin 4
• D6 al pin 3
• D7 al pin 2
• A a la fila 5 V
• K a la fila GND
• Del potenciómetro conectamos una de las patas libres a GND
y otra a 5 V
• Pata VS del sensor a la fila 5 V
• Pata central del sensor al pin A0
• Pata GND del sensor a la fila GND
• Si la pantalla no tiene iluminación prescindiremos de los pines
A y K.
Código
Sólo vamos a tratar en profundidad la parte del código que tiene que
ver con el LCD y no con el sensor ya que está visto anteriormente.
Al final del post está el código completo. En primer lugar, tenemos
P á g i n a 67 | 70
que añadir la librería para LCD en Esketch → Importar librería →
LiquidCrystal o escribiendo
#include <LiquidCrystal.h>
LiquidCrysta lcd(12,11,5,4,3,2);
lcd.begin(6,2);
lcd.setCursor(0, 1);
lcd.print(temp);
P á g i n a 68 | 70
Y con esto escribirá el número que amacena la variable temp . Para
que nuestro proyecto quede más estético escribiremos la cadena de
caracteres “C” en la octava columna de la segunda fila (el símbolo “º”
no se muestra correctamente).
lcd.setCursor(7, 1);
lcd.print(“C”);
lcd.clear();
P á g i n a 69 | 70
/ *
programa que envía mediante el Monitor Serie el valor de distancia
leído por el sensor ultrasónico HC - SR04.
* /
configuración nula ()
{
pinMode (TRIG, OUTPUT); // disparador como salida
pinMode (ECO, INPUT); // echo como entrada
pinMode (LED, SALIDA); // LED como salida
Serial.begin (9600); // inicializacion de comunicacion serial a 9600 bps
bucle vacío ()
{
P á g i n a 70 | 70