Professional Documents
Culture Documents
Una vez completemos la instalación podemos abrir el IDE. Al iniciarse se vera una pantalla
como esta:
Pag 2 – Curso Basico de Arduino
Pag 3 – Curso Basico de Arduino
Configurar el IDE
Solo debemos realizar un par de ajustes para poder comenzar a realizar nuestro primer
sketch. Pero primero debemos conectar la placa Arduino al ordenador por un puerto USB.
Una vez que tengamos seleccionada la placa y el puerto podremos subir un sketch a la
placa.
La función setup() se ejecuta una vez al iniciarse el programa, y se ejecutaran una vez las
instrucciones que se encuentran entre sus llaves.
Y la función loop() de ejecutara de forma continua, de esa forma las instrucciones que se
encuentren entre sus llaves se repetirán indefinidamente.
En el sketch también podremos notar algo de texto en color gris. Estos son comentarios del
programa, y hay dos formas de escribir comentarios:
1. Usando barras dobles nos permite hacer comentarios en una sola linea: //Este es el comentario
2. O usando barra-asterisco, que nos permite hacer comentarios de varias lineas: /*Este es el
comentario*/
Los comentarios son muy útiles para documentar nuestros programas, con el fin de que lo
utilicen otras personas o como recordatorio de lo que hemos realizado.
Como puede observarse en la primera parte se define el LED que se empleará, en este caso el 13. Luego
se configura en modo salida y en el tercer bloque de código el led enciende durante un segundo, luego se
apaga durante dos segundos y repite este ciclo (loop).
Pag 7 – Curso Basico de Arduino
Variables y operadores
¿Qué es una Variable?
Una variable es un elemento de nuestro sketch que guarda un determinado contenido. Ese
contenido (el valor de la variable) se podrá modificar en cualquier momento de la ejecución
del sketch. Lo podemos imaginar como un recipiente: al recipiente le podemos dar un
nombre y podemos elegir su tamaño.
Declaración e inicialización
En Arduino antes de poder utilizar una variable debemos crearla, a esto se llama declarar
una variable, y también podríamos asignarle un valor inicial, y a esto le llamamos inicializar
la variable. A continuación unos ejemplos de cómo podemos hacerlo.
Ejemplo 1
int nombreVariable1, nombreVariable2, nombreVariable3; //Crea 3 variables de tipo int
float nombreVariable = 2.1; //Crea una variable tipo float con el valor inicial de 2.1
Pag 8 – Curso Basico de Arduino
Asignación
Para cambiar el valor de una variable, que esté o no inicializada, usaremos el operador de
igualdad “=” de acuerdo al siguiente ejemplo.
Ejemplo 2
nombreVariable = 22; //Se asigna 22 a la variable nombreVariable
Tipos de Variables
Hay muchos tipos de variables en Arduino. El tipo de cada una lo definiremos de acuerdo a
los datos que vamos a guardar en la variable.
Ejemplo 3
float resultado; //Declara una variable de tipo float
void setup() {
void loop() {}
Ejemplo 4
float resultado; //Declara una variable de tipo float
Pag 11 – Curso Basico de Arduino
void setup() {
void loop() {}
Al ser una de las variables de la división tratadas como float, el resultado es guardado
temporalmente en una variable float para luego asignarla a resultado.
Constantes
Las constantes se pueden entender como variables de solo lectura, cuando intentemos
modificarlas el compilador dará un error. Lo único que hay que hacer para definirla es
preceder la declaración de la variable con la palabra clave “const”. Por ejemplo:
float resultado; //Declara una variable de tipo float
void setup() {
void loop() {}
Al ser una de las variables de la división tratadas como float, el resultado es guardado temporalmente en una variable float para luego asignarla a resultado.
Constantes
Las constantes se pueden entender como variables de solo lectura, cuando intentemos modificarlas el compilador dará un
error. Lo único que hay que hacer para definirla es preceder la declaración de la variable con la palabra clave “const”. Por
ejemplo:
Existen otras constantes definidas en el lenguaje Arduino. Las constantes true y false son unas de ellas, false es la más fácil
de definir y es igual a 0, y true aunque puede interpretarse como 1 correctamente, en un sentido más amplio es definida
como no 0.
Pag 13 – Curso Basico de Arduino
Operadores aritméticos
Los operadores aritméticos empleados en lenguaje Arduino son los siguientes:
= operador de asignación
+ Operador suma
– Operador resta
* Operador multiplicación
/ Operador división
% Operador módulo
Operadores compuestos
Son aquellos que nos permiten abreviar código y los usados en Arduino son los siguientes
Pag 14 – Curso Basico de Arduino
+= x += y; // equivalente a la expresión x = x + y;
-= x -= y; // equivalent to the expresión x = x – y;
*= x *= y; // equivalente a la expresión x = x * y;
/= x /= y; // equivalente a la expresión x = x / y;
%= x %= y; // equivalente a la expresión x = x % y;
< > <= >= Comparaciones menor que, mayor que if (x < 255)
Y nuestra lección del día de hoy no podría quedar completa si no realizamos algunos
ejercicios para practicar nuestros nuevos conocimientos.
Ejercicios
Ejercicio 1: Hola Mundo
Realizar un programa que imprima en el monitor serie el texto “Hola Mundo”.
Condicionales If y Switch
Los bloques condicionales permiten evaluar condiciones en una variable, y ejecutar algunas
instrucciones en caso de cumplirse o no cumplirse la condición, los bloques condicionales
son los if y los switch.
if (condición) {
} else {
El else es opcional, puedes colocarlo o no según lo necesite tu programa. También se puede dar el caso que necesitamos evaluar varias condiciones a la vez,
los bloques if se pueden entonces anidar usando la expresión else if, y usando la siguiente sintaxis:
if (condición) {
} else if (otra_condición) {
//Instrucciones que se ejecutan si la condición del anterior “if” es falsa pero la actual es cierta
} else if (otra_condición) {
//Instrucciones que se ejecutan si la condición del anterior “if” es falsa pero la actual es cierta
} else {
No existe límite para la cantidad de condiciones que podemos evaluar, ni para el tipo de variable que podemos evaluar, pueden ser números enteros o
decimales.
Por otro lado, es bastante probable encontrar en algunos programas expresiones tales como if(mivariable) en vez de if(mivariable!=0), por ejemplo. Es decir,
“ifs” que solo incluyen una variable, pero no la condición para evaluarla. Esta forma de escribir los “ifs” es simplemente un atajo: si en el if solo aparece una
variable o expresión sin ningún tipo de comparación, es equivalente a comprobar si dicha variable o expresión es “true” (es decir, si es diferente de 0).
Ejemplo de uso de if
void setup() {
void loop() {
Serial.println("Alerta de temperatura");
}else {
Bloques “switch”
Una manera válida de hacer comprobaciones de condiciones múltiples, más elegante, cómoda y fácil es utilizar el bloque switch. Su sintaxis es la siguiente:
switch (expresión) {
case valor1:
Pag 21 – Curso Basico de Arduino
break;
case valor2:
break;
//Puede haber los “case” que se deseen, y al final una sección “default” (opcional)//
default:
La única limitación que tiene el switch es que solo se pueden evaluar números enteros, y solo se evalúan las condiciones hasta que una sea cierta.
void setup(){
void loop() {
case 20:
break;
case 50:
break;
default:
Operadores lógicos
Además de los operadores de comparación, en las comparaciones también se pueden utilizar los operadores booleanos (también llamados lógicos), usados
para encadenar dos o más comprobaciones dentro de una condición. Estos son los siguientes:
Pag 23 – Curso Basico de Arduino
|| Comprueba que, al menos, una de dos condiciones sea cierta (Operador OR)
Ejercicios
Realizar un programa que me indique si el valor de una variable es mayor a 10. Para ello vamos a declarar una variable y le daremos un valor cualquiera (por
ejemplo 20), luego compararemos el valor de la variable con 10 para saber si esta es mayor, si es mayor se imprimirá en el monitor serie un mensaje
indicándolo, y si no lo es también nos lo dirá con un mensaje.
Usando el monitor serie evaluar si el numero entero introducido es igual, menor o mayor a 22. Se debe recibir un mensaje de respuesta en el monitor serial
para cada caso.
Usando la función switch, verificar usando el monitor serial si el número introducido es igual a 17, 22 o 25, indicándolo mediante un mensaje.
Pag 24 – Curso Basico de Arduino
Ejercicio 4: Comparaciones
Usando dos variables, una llamada presión y otra temperatura, hacer un programa que evalúe si la presión es menor a 7.5 y la temperatura mayor a 80, en
ese caso mandar una alerta por el monitor serial. Adicionalmente si la presión baja de 3.1 enviar una alarma también por el monitor serial.
Cuando iniciamos con Arduino nos preguntamos ¿Cómo usar las entradas y salidas digitales
en Arduino?
El uso de los puertos de entrada y salida digitales es bastante sencillo. Se usan básicamente
3 funciones.
Pag 25 – Curso Basico de Arduino
Con pinmode() configura un pin digital como entrada o como salida de corriente. Esto es
necesario ya que podemos decidir cómo funcionara cada pin, si como entrada o como
salida. Es por ello que esta función se suele escribir dentro de setup(). No tiene valor de
retorno. Y su sintaxis es muy sencilla:
pinMode(pin,tipo);
Donde
pin: es el número de pin digital (0,1,…13) o podemos usar los analógicos (A0, A1,…A5)
INPUT define el pin como entrada digital, OUTPUT como salida y adicionalmente tenemos la opción de usar un pin digital como entrada con una resistencia
resistencia pull-up de 20 KΩ que todo pin digital incorpora. Para ello, se ha de utilizar la constante predefinida INPUT_PULLUP en vez de INPUT.
La función digitalWrite() envía un valor ALTO (HIGH) o BAJO (LOW) a un pin digital. El pin al que se le envía la señal se especifica como primer parámetro
(escribiendo su número) y el valor concreto de esta señal se especifica como segundo parámetro (escribiendo las constantes predefinidas HIGH o LOW). La
sintaxis es como sigue:
digitalWrite(pin,valor);
Pag 26 – Curso Basico de Arduino
Donde
pin: es el número de pin digital (0,1,…13) o podemos usar los analógicos (A0, A1,…A5)
Si el pin especificado en digitalWrite() está configurado como salida, la constante HIGH equivale colocar en ese pin de salida 5 V (o bien 3,3 V en las placas
que trabajen a ese voltaje) y la constante LOW equivale a una señal de salida de 0 V. Cada pin digital tiene una capacidad de corriente de hasta 40mA.
Y la función digitalRead() devuelve el valor leído de un pin digital. Este valor de retorno es de tipo int y puede tener dos únicos valores un 1 o un 0. La
sintaxis es la siguiente:
digitalRead(pin);
Donde
pin: es el número de pin digital (0,1,…13) o podemos usar los analógicos (A0, A1,…A5)
Si la entrada es de tipo INPUT, el valor HIGH se corresponde con una señal de entrada mayor de 3 V y el valor LOW con una señal menor de 2 V.
Si la entrada es de tipo INPUT_PULLUP, al tener la entrada conectada una resistencia “pull-up”, las lecturas son al revés: el valor HIGH indica que no se recibe
señal de entrada y el valor LOW que sí.
Configuración pull-up/pull-down
Pag 27 – Curso Basico de Arduino
En la configuración pull-Up el voltaje de salida (Vout) es 1 (5V) cuando el pulsador no esta presionado, y 0 (0V) cuando si lo esta. Y en la configuracion Pull-
Down el voltaje de salida es 0 (0V) cuando no esta presionado el pulsador y 1 (5V) cuando si lo esta. Este voltaje de salida es el que leería el pin de entrada
digital.
Si configuramos una entrada como INPUT_PULLUP se activa una resistencia interna del
microcontrolador conectada entre el pin de entrada y 5V, similar a R1.
Configuración Sinking/Sourcing
La configuracion Sinking/Sourcing se refiere a si de la salida digital entra o sale corriente, en
la configuración Sourcing la corriente sale del pin digital, y en la configuracion Sinking la
corriente entra.
Veamos un par de ejemplos muy sencillos de cómo utilizar los pines de entrada y salida digitales.
Pag 28 – Curso Basico de Arduino
Ejemplo 1
void setup(){
void loop(){
Ejemplo 2
void setup(){
}
Pag 29 – Curso Basico de Arduino
void loop() {
if (estadoBoton == HIGH) { //Si se detecta que el botón está pulsado, se enciende el LED
digitalWrite(4,HIGH);
digitalWrite(4,LOW);
Ejercicios
Ejercicio 2: Titilar
Hacer que uno o varios leds titilen una vez pulsado el botón.
Ejercicio 4: Semáforo
Hacer que el conjunto de los tres leds se comporten como un semáforo.
El uso de las entradas y salidas analógicas en Arduino, está basado en tres funciones
analogWrite(), analogRead() y analogReference(). Y podemos ayudarnos con dos funciones
Pag 32 – Curso Basico de Arduino
adicionales que nos facilitan la interpretación de las lecturas analógicas que son las
funciónes map() y constrain().
Señal analógica
Señal digital
Pag 33 – Curso Basico de Arduino
Una señal analógica puede ser representada de forma digital, usando un procedimiento que
se denomina conversión analógico digital, este consiste en tomar medidas de la señal
analógica cada cierto tiempo y representar cada medida con valores digitales. Un ejemplo
sencillo lo podemos ver en la siguiente gráfica.
Conversión analógico-digital
Donde podemos representar los valores que tiene una señal analógica por medio de dos
bits, y de esa forma tendríamos una señal digital, que representa la señal analógica.
A medida que tengamos mas valores (bits) para representar la señal analógica, mas real
sera su representación.
Arduino usa 10 bits para realizar la conversión analógica digital de una señal analógica, y
convierte los valores de la señal de entrada entre 0 y 5 voltios, a valores entre 0-1023.
Pag 34 – Curso Basico de Arduino
La función analogRead()
Devuelve el valor leído del pin de entrada analógico (A0, A1,…A5) que se le ha indicado.
Este valor se obtiene mapeando proporcionalmente la entrada analógica obtenida (que
puede tener cualquier valor entre 0 y un voltaje llamado voltaje de referencia, el cual por
defecto es 5 V) a un valor entero entre 0 y 1023. Por lo que podríamos detectar cambios en
la señal analógica de entrada de hasta (resolución de lectura que es 5V/1024) 0,004883 V.
La sintaxis es la siguiente:
NombreVariable = analogRead(pin);
Donde
pin: es el pin analogico donde conectamos la señal A0, A1, A2, A3, A4, A5
La variable donde vamos a guardar el valor de la lectura debe ser una variable tipo entero (int).
Algo que debemos tener en cuenta en nuestros sketchs es que al microcontrolador le toma cerca de 100 microsegundos (0.0001 s) el leer un entrada
analógica, así que la máxima frecuencia de lectura es de 10,000 lecturas por segundo.
void setup(){
void loop(){
Configura el voltaje de referencia usado por la entrada analógica, que por defecto está configurado a 5 voltios. Las opciones son, DEFAULT (ajusta el voltaje
de referencia a 5V), INTERNAL (ajusta el voltaje de referencia a 1.1V) y EXTERNAL (usa el voltaje aplicado al pin AREF como voltaje de referencia). La sintaxis
será la siguiente:
analogReference(tipo);
Donde
Modificar el voltaje de referencia implica que la resolución de lectura será mayor, pero también que solo podemos leer señales analógicas dentro del rango
de voltaje definido por 0 y el voltaje de referencia. Por ejemplo, para un voltaje de referencia de 1.1V, la resolución de lectura será de 1.1V/1024, es decir,
de 0,001074 V.
Pag 36 – Curso Basico de Arduino
Existen un par de funciones que resultan muy útiles cuando trabajamos con entradas analógicas, y estas son map() y Constrain().
Escala un número de un rango a otro rango. Esto es, el valor fromLow será escalado a toLow, y el valor de fromHigh será escalado a toHigh, y todos los
valores entre estos límites, etc. Esta función no admite decimales, estos serán truncados. La sintaxis es la siguiente:
donde
void setup() {
Serial.begin(9600);
void loop()
Y la función constrain()
Limita un número a estar dentro de un rango. Si el valor a limitar es superior al límite superior b, entonces la función devuelve b, y si es inferior al límite
inferior a, entonces devuelve a. Esta función trabaja con todos los tipos de datos y la sintaxis es:
NombreVariable = Constrain(x,a,b);
donde
Pag 38 – Curso Basico de Arduino
x: es el número a limitar
Coloca en el pin seleccionado una señal equivalente a un voltaje. Esta señal equivalente, es una señal PWM, cuya magnitud podemos variar de acuerdo a un
parámetro de tipo “byte” (con valores entre 0 y 255). No todos los pines digitales pueden generar señales PWM: en la placa Arduino UNO por ejemplo solo
son los pines 3, 5, 6, 9, 10 y 11 (están marcados en la placa con el simbolo ᷉ al lado del número de la entrada digital). Cada vez que se ejecute esta función se
regenerará la señal. Esta función no tiene valor de retorno, y su sintaxis es muy sencilla:
analogWrite(pin,valorPWM);
Donde
pin: es el número de pin con capacidad para PWM 3, 5, 6, 9, 10, y 11 (en Arduino UNO)
¿Y qué es PWM?
Una señal PWM es una señal digital cuadrada que simula ser una señal analógica. El valor simulado de la señal analógica dependerá de la duración que tenga
el pulso digital (es decir, el valor HIGH de la señal PWM). Si el segundo parámetro de esta función vale 0, significa que su pulso no dura nada (es decir, no hay
señal) y por tanto su valor analógico “simulado” será el mínimo (0V). Si vale 255, significa que su pulso dura todo el período de la señal (es decir, es una señal
continua) y por tanto su valor analógico “simulado” será el máximo ofrecido por la placa (5V). Cualquier otro valor entre estos dos extremos (0 y 255) implica
un pulso de una longitud intermedia (por ejemplo, el valor 128 generará una onda cuadrada cuyo pulso es de la misma longitud que la de su estado bajo) y
por tanto, un valor analógico “simulado” intermedio (en el caso anterior, 2,5 V).
void setup(){
void loop(){}
void setup() {}
void loop()
---------------------------------------------------------------------------------------------------------------
Pag 41 – Curso Basico de Arduino
Ejercicios
Para realizar los ejercicios utilizaremos el siguiente circuito
Pag 42 – Curso Basico de Arduino
El led verde estará encendido cuando el valor de entrada se encuentre entre el 5 y el 50%.
El led amarillo se encenderá cuando el valor de entrada se encuentre entre el 51 y el 80%.
El led rojo se encenderá cuando el valor de entrada se encuentre entre el 81 y el 100%.
Y con los ejercicios hemos culminado la lección, espero te allá sido de provecho.
Los bloques repetitivos permiten ejecutar ciertas instrucciones de forma cíclica siempre que la condición que evalúen sea cierta (true) estos bloques o
funciones son los while y los for.
La función while (mientras) es un bloque que implementa un bucle; es decir, repite la ejecución de las instrucciones que están dentro de sus llaves de
apertura y cierre mientras la condición especificada entre sus paréntesis sea cierta (true). Su sintaxis es muy sencilla:
while (condición) {
}
Pag 45 – Curso Basico de Arduino
Si se llega por primera vez a una sentencia while y la condición resulta ser falsa, no se ejecutarán las sentencias interiores ninguna vez. Este detalle es
importante tenerlo en cuenta.
Ejemplo 1
void setup(){
while (x <= 50){ //Mientras x sea menor o igual a 50 ejecuto las instrucciones
void loop(){}
¿Y la función do while?
El bucle do funciona exactamente igual que el bucle while, con la excepción de que la condición es evaluada después de ejecutar las instrucciones escritas
dentro de las llaves. Esto hace que las instrucciones siempre sean ejecutadas como mínimo una vez, aun cuando la condición sea falsa. La sintaxis es de la
siguiente forma:
Pag 46 – Curso Basico de Arduino
do {
} while (condición)
La diferencia entre un bucle while y un bucle for está en que en el primero el número de iteraciones realizadas depende del estado de la condición definida,
pero en un bucle for el número de iteraciones se puede fijar a un valor exacto. Por tanto, usaremos el bucle for para ejecutar un conjunto de instrucciones
(escritas dentro de llaves) un número concreto de veces. La sintaxis general del bucle for es la siguiente:
for (valor_inicial_contador;condicion_final;incremento) {
Tal como se observa, entre paréntesis se deben escribir tres partes diferentes, separadas por puntos y coma. Estas tres partes son opcionales (pueden
omitirse cualquiera de ellas) y son las siguientes:
Valor inicial del contador: en esta parte se asigna el valor inicial de una variable entera que se utilizará como contador en las iteraciones del bucle. Por
ejemplo, si allí escribimos x=0, se fijará la variable x a cero al inicio del bucle.
Condición final del bucle: en esta parte se especifica una condición. Justo antes de cada iteración se comprueba que sea cierta para pasar a ejecutar el grupo
de sentencias internas. Si la condición se evalúa como falsa, se finaliza el bucle, y continúa el programa tras su llave de cierre.
Incremento del contador: en la última de las tres partes es donde se indica el cambio de valor que sufrirá al inicio de cada iteración del bucle la variable
usada como contador. Este cambio se expresa con una asignación. Por ejemplo, la sentencia x=x+1 le sumará 1 a la variable x antes de cada nueva iteración
Pag 47 – Curso Basico de Arduino
del bucle, por lo que en realidad estaríamos haciendo un contador que aumenta de uno en uno a cada repetición. Este cambio se efectúa justo antes de
comprobar la condición de final del bucle.
Ejemplo 2
void setup(){
void loop(){}
La instrucción break debe estar escrita dentro de las llaves que delimitan las sentencias internas de un bucle, y sirve para finalizar este inmediatamente. Es
decir, esta instrucción forzará al programa a seguir su ejecución a continuación de la llave de cierre del bucle.
La instrucción continue también debe estar escrita dentro de las llaves que delimitan las sentencias internas de un bucle y sirve para finalizar la iteración
actual y comenzar inmediatamente con la siguiente. Es decir, esta instrucción forzará al programa a “volver arriba” y comenzar la evaluación de la siguiente
iteración aun cuando todavía queden instrucciones pendientes de ejecutar en la iteración actual.
Pag 48 – Curso Basico de Arduino
Ejemplo 3
void setup(){
void loop(){}
Ejercicios
Imprimir en el monitor serial los números pares del 0 al 50. Ordenados en 5 filas.
Pag 49 – Curso Basico de Arduino
Partiendo del ejercicio anterior usando las funciones “break” o “continue” evitar que se imprima el 20 y el
40.
Probar todas las combinaciones de colores que podemos hacer con un LED RGB (rojo, verde y azul) usando
PWM con valores que vayan desde 150 hasta 255. Debemos tener en cuenta un tiempo de espera de 10ms
entre cada cambio de color.
Arduino cuenta con un conjunto básico de funciones para el manejo de tiempo, estas son: millis(), micros(), delay() y
delayMicroseconds(), a continuación las describimos:
La función millis()
Devuelve el número de milisegundos (ms) desde que la placa Arduino empezó a ejecutar el sketch. Este número se reseteará a
cero aproximadamente después de 50 días (cuando su valor supere el máximo permitido por su tipo de variable, que es “unsigned
long”). No tiene parámetros.
Y la función micros()
Devuelve el número de microsegundos (μs) desde que la placa Arduino empezó a ejecutar el sketch. Este número (de tipo
unsigned long) se reseteará a cero aproximadamente después de 70 minutos. Esta instrucción tiene una resolución de 4 μs (es
decir, que el valor retornado es siempre un múltiplo de cuatro). Recordar que 1000 μs es un milisegundo y por tanto, 1000000 μs es
un segundo. No tiene parámetros.
Pag 52 – Curso Basico de Arduino
void setup(){
void loop(){
void setup(){
Pag 53 – Curso Basico de Arduino
void loop(){
Las funciones delay() y delayMicroseconds() como lo mencionamos anteriormente, ponen en pausa el sketch, lo cual puede
resultar un problema cuando tenemos otras funciones que atender, y este problema se ve acentuado cuando los tiempos de espera
son largos. Para resolver esto es recomendable usar la funcion millis() para controlar esos tiempos. En el siguiente ejemplo
veremos como hacer parpadear un led usando millis(). Y podemos usar una programación similar para atender eventos periódicos.
void setup() {
void loop() {
digitalWrite(13,estadoLed);
Ejercicios
Para realizar algunos ejercicios es necesario que montemos el siguiente circuito:
Pag 55 – Curso Basico de Arduino
Para crear una función propia, primero debemos declararla. Esto se hace en cualquier lugar fuera de setup() y loop(), antes o
después. Una función puede o no retornar valores, y también puede o no recibir parámetros, esto se hace siguiendo la sintaxis
marcada por la plantilla siguiente:
donde
tipodeRetorno: Indica el tipo de valor que la función devolverá al sketch principal una vez
ejecutada.
nombredefuncion: Es el nombre que le damos a la función
tipodeparam: son las declaraciones de los parámetros de la función, que no son más que variables
internas cuya existencia solo perdura mientras el código de esta se esté ejecutando.
Ejemplo 1
void blinkLED() { //Se declara la función, esta no devuelve ningún valor ni recibe parámetros
void setup(){
void loop(){
Ejemplo 2
int primerNumero=2; //Declaro e inicializo una variable global
int multiplicar(int x, int y){ // Se declara la función, retorna un valor y recibe dos
parámetros
Pag 58 – Curso Basico de Arduino
void setup(){
void loop(){}
Ejercicios
Para realizar los ejercicios podemos usar el siguiente circuito:
Pag 59 – Curso Basico de Arduino
Al utilizar matrices debemos tener presente que para consultar o asignar valores, debemos comenzar indexando el primer
elemento por el número cero, que será el primer elemento de la matriz.
int misPines[] = {2, 4, 8, 3, 6}; //declara una matriz de 5 variables tipo int
float misSensores[5] = {2, 4, -8, 3.8, 2.1}; //declara una matriz de 5 variables tipo float
char mensaje [5] = {'h','o','l','a'}; //declara una matriz de 5 elementos tipo char
Las matrices tipo char necesitan un carácter adicional para saber cuál es el fin de la matriz, esto debemos tenerlo en cuenta para el
tamaño de la matriz.
void setup(){
for (contador=0; contador<6; contador++) { //Uso un for para declarar todos los pines
pinMode(pines[contador], OUTPUT); }
}
void loop() {
for (contador =0; contador <6; contador ++) { //Uso un for para encender leds conectados
digitalWrite(pines [contador], HIGH); //a los pines, y uso una matriz para acceder
delay(tiempo); //a ellos secuencialmente
digitalWrite(pines [contador], LOW);
delay(tiempo);
}
for (contador =5; contador >=0; contador --) {
digitalWrite(pines [contador], HIGH);
Pag 62 – Curso Basico de Arduino
delay(tiempo);
digitalWrite(pines [contador], LOW);
delay(tiempo);
}
}
Matrices de cadenas de texto
Es posibles hacer matrices de cadenas de texto, este es un ejemplo de matrices de dos dimensiones, en el ejemplo siguiente el
asterisco después del tipo de dato “char*“ indica que esta es una matriz de punteros. Sin entrar en detalles que son los punteros
podemos ver como se usan.
void setup() {
Serial.begin(9600);
}
void loop() {
for (int i = 0; i < 4; i++) { //imprimo todas las cadenas de la matriz
Serial.println(miscadenas [i]);
delay(500);
}
}
Ejercicios
Ejercicio 1: Consultar una matriz de números
Crear una matriz de 6 variables tipo int, asignarle los valores 10, 20, 30, 40, 50 y 60. Y luego imprimir estos valores en el monitor
serie usando un lazo “for”.
Pag 63 – Curso Basico de Arduino
Ejercicio 5: Adivinador
Crear matriz con seis o mas mensajes diferentes que sirvan para responder una pregunta (por ejemplo: Si, No, Quizás, Nunca,
Siempre, algunas veces, etc). Conectaremos también un pulsador a la entrada digital 2. Cada vez que presionemos el pulsador
aparecerá en el monitor serie uno de los mensajes de forma aleatoria. Y de esta forma habremos creado un adivinador, haremos
una pregunta y al pulsar el botón este nos dará una respuesta. Para generar el numero aleatorio usar la función random().
Estas pantallas nos sirven para mostrar caracteres y números, y en los modelos gráficos podremos mostrar gráficos o dibujos.
Usarlas en nuestros proyectos nos permite por tanto mostrar información. Unas de las más comunes son las de caracteres, las
cuales vienen de diferentes tamaños, denotados por el número de columnas y filas, son populares las de 16×2, las cuales tienen 16
columnas y 2 filas. A continuación veremos cómo conectarlas a Arduino y como mostrar información en ellas.
Como podemos ver requerimos de un mínimo de 6 pines digitales para conectar la pantalla. Y debemos también incorporar una
resistencia de 220 ohms para conectar el led de luz de fondo (background) y un potenciómetro para ajustar el contraste. Una vez
conectado el circuito ya podemos hacer algunas pruebas. Para ello nos serviremos de una librería.
LiquidCrystal()
begin()
clear()
home()
setCursor()
write()
print()
cursor()
noCursor()
blink()
noBlink()
display()
noDisplay()
scrollDisplayLeft()
scrollDisplayRight()
autoscroll()
noAutoscroll()
leftToRight()
rightToLeft()
createChar()
A continuación vamos a explicar las de uso común,
LiquidCrystal()
Descripción
Crea una variable de tipo LiquidCrystal. La pantalla puede ser controlada usando 4 o 8 líneas de datos. Si se omiten los números
de pin para d0 hasta d3, se pueden dejar esos pines desconectados, o conectados a tierra, el pin RW también puede ser
conectado a tierra también en vez de conectarlo al Arduino.
Sintaxis
LiquidCrystal lcd(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal lcd(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal lcd(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
Pag 68 – Curso Basico de Arduino
Parámetros
lcd: una variable de tipo LiquidCrystal (el nombre que le das a tu LCD)
rs: el numero del pin de Arduino que es conectado a el pin RS del LCD
rw: el numero del pin de Arduino que es conectado a el pin RW del LCD (opcional)
enable: el numero del pin de Arduino que es conectado a el pin enable del LCD
d0, d1, d2, d3, d4, d5, d6, d7: los números de pines de Arduino que son conectados a los pines de datos correspondientes del
LCD. d0, d1, d2, y d3 son opcionales; si son omitidos, el LCD será controlado usando solo cuatro líneas de datos (d4, d5, d6, d7).
begin()
Descripción
Inicializa la interface de la pantalla LCD, y especifica las dimensiones de la pantalla (ancho y alto). begin() debe ser llamada antes
que cualquier otra función de la librería.
Sintaxis
lcd.begin(columnas, filas)
Parámetros
lcd: una variable de tipo LiquidCrystal
clear()
Descripción
Limpia la pantalla LCD y coloca el cursor en la esquina superior izquierda.
Sintaxis
lcd.clear()
Parámetros
lcd: una variable de tipo LiquidCrystal
setCursor()
Descripción
Posiciona el cursor de la pantalla LCD; esto es, define la ubicacion donde el texto escrito en la pantalla sera mostrado.
Sintaxis
lcd.setCursor(columna, fila)
Parámetros
lcd: una variable de tipo LiquidCrystal
print()
Descripción
Imprime texto en el LCD.
Pag 70 – Curso Basico de Arduino
Sintaxis
lcd.print(data)
lcd.print(data, BASE)
Parámetros
lcd: una variable de tipo LiquidCrystal
BASE (optional): el formato en el cual imprimir los numeros: BIN para binario (base 2), DEC para decimal (base 10), OCT para octal
(base 8), HEX para hexadecimal (base 16).
La librería LiquidCristal trae números ejemplos los cuales podemos ver en el IDE. Veamos algunos de ellos.
void setup() {
// Indicamos el numero de columnas y filas, he inicializamos la LCD
milcd.begin(16, 2);
// Imprimimos un mensaje en primera fila
milcd.print("Hola mundo!");
}
void loop() {
// colocamos el cursor en la columna 0 y fila 1
// notemos que la fila 1, es la segunda fila, ya que comenzamos a contarlas desde 0
milcd.setCursor(0, 1);
// Imprimimos el numero de segundos desde que se reinicio la placa
Pag 71 – Curso Basico de Arduino
milcd.print(millis() / 1000);
}
Ejemplo 2 – Activar y desactivar el cursor
#include <LiquidCrystal.h> //debemos incluir la libreria
void setup() {
// Indicamos el numero de columnas y filas, he inicializamos la LCD
lcd.begin(16, 2);
// Imprimimos un mensaje en primera fila
lcd.print("hello, world!");
}
void loop() {
// desactiva el cursor
lcd.noCursor();
delay(500);
// activa el cursor
lcd.cursor();
delay(500);
}
Algo que complementa los caracteres alfanuméricos en las pantallas LCDs es la posibilidad de imprimir caracteres especiales.
Para ello usaremos la función createChar() la cual explicaremos a continuación.
createChar()
Descripción
Crea un carácter personalizado para su uso en la pantalla LCD. Se admiten hasta ocho caracteres de 5×8 píxeles (numerados de 0
a 7). El aspecto de cada carácter personalizado se especifica mediante una matriz de ocho bytes, uno para cada fila. Los cinco bits
menos significativos de cada byte determinan los píxeles de esa fila. Para mostrar un carácter personalizado en la pantalla, se usa
la función write() con su número.
Pag 72 – Curso Basico de Arduino
Importante! Cuando se hace referencia al carácter personalizado “0”, si no está en una variable, se debe convertir (cast) como byte,
de lo contrario el compilador arroja un error.
Sintaxis
Lcd.createChar (num, datos)
Parámetros
Lcd: una variable del tipo LiquidCrystal
void setup() {
lcd.createChar(0, feliz); // Creamos el caracter especial 0
Pag 73 – Curso Basico de Arduino
void loop() {}
Ejercicios
Ejercicio 1 – Imprimir dos valores
Imprimir el valor de dos variables en la LCD, una en cada linea, identificandolas como variable 1 y variable 2, la variable 1 es un
contador que cambia de valor cada segundo y la variable 2 es un contador que cambia cada 3 segundos.
Ejercicio 3 – Termometro
Usando un sensor de temperatura, visualizar la temperatura medida en la pantalla LCD.
Pag 74 – Curso Basico de Arduino
¿Que es un servomotor?
Un servomotor (también llamado servo) es un dispositivo similar a un motor de corriente continua que tiene la capacidad de
ubicarse en cualquier posición dentro de su rango de operación, y mantenerse estable en dicha posición.
Libreria Servo.h
Esta librería permite a las placas Arduino controlar RC servos (hobby).
Pag 77 – Curso Basico de Arduino
La librería servo soporta hasta 12 servomotores en la mayoría de las placas Arduino, y hasta 48 en la Arduino Mega. En todas las
placas menos en la Mega, el uso de la librería deshabilita el uso de analogWrite() (PWM) en los pines 9 y 10, tengan o no tengan
un servo conectado a esos pines.
Para mas información acerca de la librería Servo.h podemos visitar la web oficial de Arduino.
Ejemplo – Controlar un servo con un potenciometro
//Controla la posición de un servomotor de acuerdo a la posición de un potenciometro
#include <Servo.h> //Incluye la librería para controlar servos
void setup() {
myservo.attach(9); // "attach" el servomotor en el pin 9 al objeto servo
}
void loop() {
val = analogRead(potpin); // lee el valor del potentiometro (valor entre 0 y 1023)
Pag 78 – Curso Basico de Arduino
val = map(val, 0, 1023, 0, 180); // escalo este para usarlo con el servo (valor entre 0 y 180)
myservo.write(val); // Indico la posición del servo de acuerdo al valor escalado
delay(15); // espero que el servo se mueva
}
Por eso se desarrollaron los sensores de la familia DHT. Nos proporcionan de forma digital la temperatura y la humedad, con diferente
precisión según el modelo.
Muy barato,
Funciona con 3,3 y 5V de alimentación
Rango de temperatura: de 0º a 50º con 5% de precisión (pero solo mide por grados, no fracciones)
Rango de humedad: de 20% al 80% con 5% de precisión
1 Muestra por segundo (No es el más rápido del oeste)
Bajo consumo
Devuelva la medida en ºC
En cuanto al DHT22:
Barato,
Funciona con 3,3 y %V de alimentación
Pag 79 – Curso Basico de Arduino
En cuanto a la forma de conectarlos y programarlos es la misma para ambos modelos y veremos que hay desarrolladas librerías para
Arduino que soportan los dos de una forma sencilla.
MATERIAL REQUERIDO.
La conexión es trivial, pero cabe destacar que se vende en dos encapsulados, uno de tres pines que son GND, Data y Vcc, y otro 4 pines
y uno de ellos, sencillamente sobra y no se conecta. Normalmente viene rotulado en el sensor el nombre de cada pin, y si no ya sabeis, a
buscar el manual en Google
Pag 81 – Curso Basico de Arduino
http://www.prometec.net/wp-content/uploads/2014/10/DHT11.zip
#include <DHT11.h>
Y definimos una instancia del sensor donde declaramos el pin al que esta conectado.
Pag 83 – Curso Basico de Arduino
int pin=2;
DHT11 dht11(pin);
int error ;
El programa completo =
#include <DHT11.h>
int pin=2;
DHT11 dht11(pin);
void setup()
Serial.begin(9600);
}
Pag 84 – Curso Basico de Arduino
void loop()
int err;
Serial.print("Temperatura: ");
Serial.print(temp);
Serial.print(hum);
Serial.println();
else
Serial.println();
Pag 85 – Curso Basico de Arduino
Serial.print(err);
Serial.println();
Para hacer variar os valores, de humedad y temperatura y comprobar que todo funciona correctamente, podeis, sencillamente, enviar
vuestro aliento al sensor, y salvo que estéis en el trópico haréis subir tanto la temperatura como la humedad relativa.
Pag 86 – Curso Basico de Arduino
SENSOR DE DISTANCIA
MATERIAL REQUERIDO.
Hemos visto, en los documentales, que los murciélagos son capaces de volar en completa oscuridad y sin embargo, sortear obstáculos o
atrapar insectos en vuelo. Sabemos que lo hacen, pero rara vez pensamos como.
Tenemos una vaga idea de que se llama ecolocalización y que más o menos tiene que ver con unos sonidos agudos que emiten y que
después recogen con esas enormes orejas que Dios les ha dado, pero rara vez nos planteamos cómo es esto posible.
Delfines y ballenas utilizan un sistema similar para atrapar a sus presas, y hasta hemos visto que, en cualquier película de submarinos,
en el momento álgido el capitán ordena emitir un pulso único de sonar para localizar al enemigo.
El concepto básico, es siempre el mismo, sabiendo a qué velocidad viaja el sonido, si emitimos un pulso sónico corto y escuchamos
cuanto tiempo tarda en regresar el eco podemos calcular la distancia a la que se encuentra el objeto en el que ha rebotado la señal.
El radar funciona de modo similar aunque usando ondas de radio frecuencia muy cortasy con una problemática propia descomunal. Un
pulso de radiofrecuencia se emite desde la antena y se recoge el eco que vuelve a la velocidad de la luz.
Lo que haremos en esta sesión es utilizar un sensor de distancia sencillo HC-SR04 (y muy parecido a los sensores de aparcamiento de
los coches modernos), que nos permite enviar estos pulsos ultrasónicos y escuchar el eco de retorno. Midiendo este tiempo, podemos
calcular la distancia hasta el obstáculo.
Pag 88 – Curso Basico de Arduino
El oído humano no percibe sonidos por encima de 20kHz. Por eso, a las ondas de mayor frecuencia las llamamos ultrasonidos ( mas allá
del sonido). Los sensores de ultrasonidos funcionan sobre los 40 kHz.
No son perfectos, les influye la temperatura ambiente, la humedad y los materiales en los que reflejan, lo que genera una cierta
incertidumbre. Pero a cambio son baratos y efectivos hasta un poco más de 3 metros en condiciones normales si la precisión no es un
problema determinante
DIAGRAMA DE CONEXIÓN
Veamos como conectar uno de esto detectores a nuestros Duinos. Aquí está el esquema eléctrico y de protoboard por cortesía de
Fritzing:
Pag 89 – Curso Basico de Arduino
EL PROGRAMA DE CONTROL
#define trigPin 13
#define echoPin 12
#define led 2
Pag 90 – Curso Basico de Arduino
Hasta ahora habíamos visto que podíamos definir una variable como int, por ejemplo, y también como una constante (const int pin). Aquí
utilizamos otro método, el #define que es una directiva para el compilador.
Esto solo significa que el compilador (en rigor el pre procesador) cambiará todas las ocurrencias de estos #define en nuestro programa
por su valor antes de compilar. Esta es la forma clásica de C de hacer esto y tiene la virtud de que no ocupa memoria definiendo una
variable (y con un Arduino UNO, que va muy corto de memoria, esto puede ser crítico en ocasiones).
void setup()
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
Ya estamos más que habituados a la función delay(milis), pero el reloj interno de Arduino mide en microsegundos y tenemos otra función
parecida delayMicroseconds(µs) que simplemente congela Arduino el número especificado de microsegundos.
Para dar un pulso ultrasónico lo que hacemos es activar el pin Trigger durante unos microsegundos y para ello lo ponemos en HIGH,
antes de escuchar el eco:
Para escuchar el pulso vamos a usar otra función, pulseIn() ( Oh sí, hay muchas, muchísimas). Para leer el manual de pulseIn() buscad
en google Arduino pulseIn y vereis que pronto lo encontrais.
Básicamente lo que hace es escuchar el pin que le pasamos, buscando una señal que pase de LOW a HIGH ( si le pasamos HIGH como
parámetro) y cuenta el tiempo que tarda en volver a bajar desde que sube.
Ahora ya sabemos el tiempo que tarda en volver el eco en µs. Como la velocidad del sonido es de 343 metros / segundo, Necesitamos
1/343 = 0,00291 segundos para recorrer un metro.
Para usar una medida más cómoda podemos pasar esto a microsegundos por centímetro:
Como nuestro eco mide el tiempo que tarda el pulso en ir y venir la distancia recorrida será la mitad:
Pag 92 – Curso Basico de Arduino
#define echoPin 12
#define led 2
void setup()
{ Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
void loop()
else
Para convertir esto en un detector de movimiento hemos creado una variable un poco menor de la medida que el sensor recibe en vacio
(en mi caso unos 200 cm). Si la distancia medida cae por debajo este valor es que algo se ha interpuesto y por tanto encendemos una
alarma, en nuestro caso un humilde LED.
Después de este ejercicio de física y matemáticas, que sin duda causará furor entre los estudiantes aplicados, vamos a hacer el mismo
programa pero usando una librería externa, que alguien se ha molestado en escribir, paras esas pocas personas que no disfrutan de los
problemas de ciencias y que así, podamos ver la diferencia.
Pag 94 – Curso Basico de Arduino
http://www.prometec.net/wp-content/uploads/2014/10/NewPing_v1.5.zip
En la ventana que sale, buscad el fichero NewPing_v1.5.zip que habéis descargado y seleccionadlo.
Ya está. Arduino ha importado la librería y los ejemplos que incluye. Si ahora volvéis a Programa\ImportarLibrería, veréis que al final de
la lista ya está disponible como NewPing, y además el zip incluye varios ejemplos de uso. Vamos a cargar el equivalente del programa
anterior. Haced :
Arduino cargara un programa de ejemplo. Las instrucciones claves son primero inicializar la librería con:
#include <NewPing.h>
#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 11 // Arduino pin tied to echo pin on the ultrasonic sensor.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance
void setup()
void loop()
delay(50);
Pag 96 – Curso Basico de Arduino
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS)
Serial.print("Ping: ");
Serial.print(uS / US_ROUNDTRIP_CM);
Serial.println("cm");
Como veis la librería se encarga de inicializar los pines necesarios, enviar los pulsos, escuchar el eco de retorno y de hacer los cálculos.
No está mal.
MATERIAL REQUERIDO.
Pag 97 – Curso Basico de Arduino
MATERIAL REQUERIDO.
Un diodo LED
Pag 98 – Curso Basico de Arduino
Un potenciometro de 10k
Un motor de corriente continua CC, yo voy a usar una rueda para mostrar el giro
Es difícil moverse por nuestro mundo sin tropezarte con motores eléctricos de todos los tipos y tamaños. Desde los pequeños con los
que arrancas el coche cada mañana a los muy pequeños que mueven tu reproductor de CDs o DVS, al que hace girar el microondas con
el que te calientas el café al levantarte, estamos rodeados de motores eléctricos.
Pag 99 – Curso Basico de Arduino
Podemos comprar desde grandes motores trifásicos, de corriente alterna, de gran potencia para labores industriales hasta pequeños
motores de corriente continua para mover las ruedas de un pequeño coche de control remoto.
En sesiones previas, ya presentamos una introducción a como gobernar servos o pequeños motores de CC, pero ha llegado el
momento de dedicarles un poco más de tiempo y detalle a ver lo que son y cómo usarlos en nuestro proyectos de Arduino.
Y como siempre es preferible empezar por el principio vamos a comenzar con los motores de corriente continua y viendo cómo podemos
controlarlos.
Estoy seguro, de que todos estaréis familiarizados con el hecho de que los imanes tienen un polo positivo y otro negativo y que
mientras que los polos opuestos se atraen, los iguales se repelen.
Hay una relación muy estrecha entre la corriente eléctrica y los campos magnéticos que definen las ecuaciones de Maxwell (Ya estamos
otra vez) y resulta que cuando hacemos circular una corriente por un conductor que está inmerso en un campo magnético, este se ve
sometido a una fuerza mecánica, que llamamos electromotriz y que podemos usar como principio básico de funcionamiento de
un motor eléctrico
Desde un punto de vista práctico, si hacemos circular una corriente por un hilo que está entre los polos de un imán, aparecerá una fuerza
mecánica que se opondrá a los cambios de esta corriente e intentara hacer girar el conductor para compensarlos.
La fuerza que aparezca será proporcional a la intensidad del campo magnético, y a el número de conductores que sean recorridos por
la corriente, (por eso lo que hacemos es arrollar espiras de cobre o devanados alrededor de un núcleo, para que la fuerza aumente).
Todos los motores eléctricos disponen de dos partes básicas:
Pag 100 – Curso Basico de Arduino
El estator o parte inmóvil que por regla general incluye o bien imanes potentes fijos o generan un campo variable mediante corriente
alterna (Lo que nos llevaría a construir un motor de corriente alterna claro)
El rotor, en el que disponemos espiras o arrollamientos de hilos de cobre alrededor de un núcleo, para que la fuerza que se ejerce sobre
el rotor se multiplique proporcionalmente a este número
La idea final es que podemos diseñar motores de corriente continua sencillos para que esta fuerza sea máxima.
Claro que a medida que la fuerza electromotriz hace girar una fracción de vuelta el rotor, al final nos encontraríamos que, llegaríamos a
una posición de equilibrio, lo que no nos conviene en absoluto porque se pararía el giro del motor.
Por eso tenemos que complicar un poco más el asunto y asegurarnos de que disponemos de múltiples grupos de espiras en distintas
posiciones, de forma que cuando un grupo alcance el equilibrio el otro tome el relevo y el motor siga girando.
Pag 101 – Curso Basico de Arduino
Fijaros en los bloques negros marcados como + y – (Que llamamos escobillas) que se mantienen estáticos mientras alimentamos con
corriente eléctrica una pareja de espiras con devanados opuestos. Cuando llegan al punto de equilibrio, desconectan ese juego de
espiras y las escobillas alimentan el siguiente juego de espiras durante una fracción de vuelta… y vuelta a empezar.
De ese modo siempre hay un juego de espiras conductoras fuera de la posición de equilibrio que se ve sometido a la
fuerza electromotriz y obliga al motor a girar buscando un equilibrio (Como en el caso de los imanes) al que nunca le permitimos llegar.
Pag 102 – Curso Basico de Arduino
En esta imagen izquierda podéis apreciar los arrollamientos de hilo conductor, para un pequeño motor de corriente continua. En la
animación de la derecha, podéis apreciar el conjunto girando, y donde Shaft, es el eje de giro. Brushes son las escobillas. Rotor coils son
los devanados de hilo conductor y Magnets son imanes.
En la sesión transistores, vimos que era muy fácil hacer girar un pequeño motor mediante un transistor que regulase la intensidad de
corriente que le entregamos.
En aquella sesión nos centramos casi en exclusiva en el transistor, para presentar este componente, que vamos a utilizar una y otra
vez, y prácticamente usamos el motor como excusa sin entrar en el tema. Pero en esta ocasión queremos poner el foco en el motorcito y
como lo controlamos y por eso vamos a volver a este ejemplo, pero complicándolo un poco más (Que le vamos a hacer), añadiendo
un potenciómetro que nos permita variar la velocidad de giro el motor.
Para ello usaremos un motor de continua, de 5V, con rueda, que podéis encontrar por muy poco dinero y que nos viene de perlas para
apreciar el de giro.
Como cualquier motor, por pequeño que sea consume más de lo que uno de los pines de nuestros Duinos pueden proporcionar,
necesitamos usar un transistor como el 2N2222 para alimentarlo. Y usaremos uno de los pines de Arduino para gobernar este
transistor.
Vamos a repetir el montaje que vimos en la sesión transistores con este motorcito. Os incluyo copia del esquema eléctrico que usamos
allí y del diagrama de pines del transistor.
Pag 103 – Curso Basico de Arduino
Pag 104 – Curso Basico de Arduino
Aquí tenéis el esquema inicial sin potenciómetro para que comprobéis las conexiones del motor y que funciona correctamente, antes de
seguir.
Para comprobar que el motor funciona, podéis cargar este pequeño programa, que simplemente varia la tensión que ponemos en el pin 9
para modificar la velocidad de giro del motor:
Pag 105 – Curso Basico de Arduino
void setup()
{ pinMode(control, OUTPUT) ; }
void loop()
analogWrite (control, n) ;
delay(15) ;
Que como veréis, simplemente pone un valor analógico en el pin 9. Podemos controlar la velocidad del motor variando la intensidad de
tensión que ponemos en la base del transistor, ya que esta regula la resistencia que el transistor presenta entre emisor y colector.
A 0V el transistor entra en corte (Resistencia infinita) y a 5V está en saturación, con lo que presenta resistencia nula.
No supongáis que podemos hacer que el motor gire de forma continua para todos los valores de tensión en la base. Por debajo de un
cierto umbral se parará y solo girará cuando este se supere.
Al hacer crecer el valor de tensión que le damos al motor, la velocidad de giro, irá aumentando progresivamente.
Pag 106 – Curso Basico de Arduino
MATERIAL REQUERIDO.
Arduino UNO
Pag 107 – Curso Basico de Arduino
Una Protoboard
En la sesión anterior dimos un pequeño repaso a la teoría que hay detrás de los motores paso a paso e intentamos sentar las cuatro
ideas importantes que debéis conocer para elegir y usar con éxito, uno de esto motores.
En esta sesión, vamos a usar un pequeño motor paso a paso unipolar, muy común en el mundo Arduino por su pequeño tamaño y bajo
coste, el 28BYJ-48 y el adaptador que suele venir con él, basado en el chip ULN2003A.
Pag 108 – Curso Basico de Arduino
Veremos en primer lugar las características que presenta y después montaremos un pequeño circuito básico, para mover el motor. Como
siempre intentaremos que el ejemplo sea lo más simple posible para que en esta primera ocasión veáis con claridad la forma de
manejarlos.
Y poco más que decir en esta pequeña introducción. Vamos pues, a meternos directamente en harina.
Este pequeño motor es muy habitual en los proyectos con pequeños robots y posicionadores caseros sencillos, porque aunque no es
demasiado potente, ni rápido tiene varias características más que simpáticas, además de ser muy barato (Unos pocos euros).
Y como no podía ser de otra manera, empezaremos por buscar su manual (Va que sí, que vosotros podéis encontrarlo en Internet).
Pag 109 – Curso Basico de Arduino
Reductora de 1 / 64.
Traduciendo esto a cristiano, quiere decir que como es de 4 pasos (Steps), u 8 medios pasos (O half Steps) por vuelta y usa una
reductora de 1 /64, por lo que necesitamos dar 8 * 64 = 512 impulsos para completar un giro completo a medios pasos.
Sé que parece confuso. Hay 4 bobinas, si las excitamos de una en una tenemos 4 pasos x 64=256 pasos por vuelta.
Pero también podemos excitar la bobina mediante medios pasos, como veíamos en las tablas de la sesión previa (que es
el ejemplo que vamos a hacer) y por eso a medios pasos una vuelta son 8 * 64 = 512 impulsos
Además si no recuerdo mal de mis lejanos días de universidad, un par de 0,34 Kg por cm, significa que con una polea de un 1cm de
diámetro colocado en el eje, este pequeño motor levantaría un peso de 350 gramos contra la gravedad, lo que no está mal.
Pag 111 – Curso Basico de Arduino
Este es su diagrama de conexión de bobinas, y además marca los colores del cable en función de su conexión interna. El motor presenta
un conector al extremo en el que podemos pinchar cables de protoboard si hay que moverlo directamente, o bien para conectarlo a su
adaptador.
Fijaros que su consumo es muy bajo, de unos 55 mA, dentro del rango que nuestro USB proporciona a Arduino (Siempre que no
intentemos alimentarlo con un pin) y lo alimentaremos mediante la breakboard típica que le acompaña, que suele usar un integrado del
tipo ULN2003A que es un array de transistores Darlington, que soporta hasta 500 mA y que ya dispone de un conector para el motor y
de unos pines (IN1 – IN4) para conectar a nuestro Arduino.
Sin entrar en muchos detalles, un Darlington suele ser un par de transistores bipolares colocados juntos y que se manejan como uno
único.
La ventaja de este esquema es que aumenta mucho la ganancia del transistor resultante y además permite la conducción de grandes
corrientes y tensiones.
Hemos usado uno de estos transistores para alimentar una tira Ed LEDS aquí.
Pag 112 – Curso Basico de Arduino
Pues usando la breakboard no tiene mucho mérito. Conectad el motor primero a su conector, que tiene una posición para impedir que lo
coloques al revés y después vamos a colocar las 4 fases a nuestro Arduino de modo que podamos excitarlas de forma independiente.
Es importante que entendáis la idea de que vamos a ir excitando cada una de las fases (O varias simultáneamente) en secuencia
levantando a HIGH el pin de Arduino correspondiente.
No merece la pena montar un esquema de protoboard para esto. Para conectar vuestro Arduino usad la siguiente tabla:
ARDUINO 12 11 10 9
Conectad GND y Vcc a los pines correspondientes del adaptador y eso es todo (Gran ventaja cuando usas módulos a medida) vamos
con el programa.
EL PROGRAMA DE CONTROL
Mientras que los motores CC normales, están diseñados para que al alimentarlos giren de forma continua, un motor paso a paso está
diseñado para girar un pasito cada vez que alimentas una de las fases.
Por eso nuestro programa tendrá que gestionar la secuencia en la que excitamos las bobinas para que el motor vaya avanzando de
forma continua.
En un motor de 4 fases como este que vamos a usar hay tres maneras de hacer esta secuencia como veíamos en la sesión anterior.
Excitando dos bobinas cada vez (Suele ser lo que recomienda el fabricante)
Pag 113 – Curso Basico de Arduino
1 ON ON OFF OFF
2 OFF ON ON OFF
3 OFF OFF ON ON
4 ON OFF OFF ON
Excitando solo una bobina cada vez (Se le llama wave drive):
Que produciría un par menor (Porque solo se activa una bobina en lugar de dos) y consumo bajo.
O podríamos dar medios pasos así:
Pag 114 – Curso Basico de Arduino
2 ON ON OFF OFF
4 OFF ON ON OFF
6 OFF OFF ON ON
8 ON OFF OFF ON
El movimiento es más suave y lento que con los métodos anteriores, y el consumo y el par es también intermedio.
Y naturalmente lo habituales, ya os habréis sospechado que vamos a definir unos arrays con estas tablas para secuenciar el movimiento.
Por ejemplo en el caso de usar medios pasos el array sería algo así:
Pag 115 – Curso Basico de Arduino
int Paso [ 8 ][ 4 ] =
{ {1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};
Y seguro que no tendréis problema en definir el array correspondiente a los otros dos tipos de movimiento
Nuestro programa Prog_98_1 recorrerá el array y alimentara las bobinas de acuerdo a los valores que presenta. Empecemos con
algunas definiciones:
#define IN1 12
#define IN2 11
#define IN3 10
#define IN4 9
Pag 116 – Curso Basico de Arduino
int steps_left=4095;
Los defines indican a que pines de nuestro Arduino vamos a conectar cada una de los terminales de las bobinas del motor. Después
algunas variables para control y un array que representa la secuencia. El setup es bastante sencillo
void setup()
{ pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Vamos a definir una función llamada stepper() que avanza un paso cada vez que la invocamos, en realidad medio paso dada la matriz
de excitación y que controle en que punto de la secuencia estamos.
void loop()
{ while(steps_left>0)
{
Pag 117 – Curso Basico de Arduino
delay (1) ;
delay(300);
steps_left = 4095;
Usamos Steps_left para definir el número de pasos que queremos girar, y por eso mientras queden pasos pendientes seguimos en el
while, que lo que hace es avanzar un paso, disminuir el número de pasos pendientes y hacer un delay que controla la velocidad de giro.
Cuando acaba el while, hacemos un delay para poder apreciar el final e invertimos el valor de direction para cambiar la dirección de
giro.Vamos con la funcion Stepper que parece más complicada:
SetDirection();
Lo se, da asco. Es tan fácil que aburre. Usamos la variable Steps para saber en cuál de los 8 estados posibles de la matriz estamos y
escribimos en las bobinas los valores que corresponden a esa situación.
Es SetDirection() quien va a controlar la dirección de giro y el valor de Steps, vamos a ver como:
void SetDirection()
if(Direction)
Steps++;
else
Steps--;
Steps = ( Steps + 8 ) % 8 ;
Es muy fácil ver que si giramos en la dirección digamos positiva, hay que ir incrementando Steps para mantener el giro. Y tampoco es
complicado ver que en el giro contrario hay que irlo decrementando para que lea el array al revés. Pero quizás la última línea merece una
explicación aparte.
A medida que vamos incrementando Steps, queremos que cuando pase de 7 vuelva a 0 y esto se consigue muy fácil haciendo
Pag 119 – Curso Basico de Arduino
Steps = Steps % 8
Es decir tomando el modulo con respecto a 8, pero si lo vamos decrementando, alcanzaremos valores negativos, y el módulo de algo
negativo sigue siendo negativo, lo que no nos vale, porque necesitamos que el siguiente valor a 0 sea 7 y no -1.
Steps = ( Steps + 8 ) % 8 ;
Compruébalo si no me crees.
TECLADOS MATRICIALES
Pag 120 – Curso Basico de Arduino
OBJETIVOS
MATERIAL REQUERIDO.
Un teclado no es más que una colección de botones, a cada uno de los cuales le asignamos un símbolo o una función determinada. Pero
botones al fin y al cabo.
Leer botones es algo que ya no tiene secretos para nosotros, pero si conectáramos cada tecla a un pin digital de nuestro Arduino, pronto
estaríamos en apuros.
El teclado de nuestro ordenador suele ser de alrededor de 106 teclas, así que el método de fuerza bruta va a entrar en apuros
rápidamente. Necesitamos otra solución.
Y como el mundo está lleno de gente ingeniosa se les ocurrió una solución de lo más elegante, una matriz de teclas.
Vamos a ver un ejemplo con un pequeño teclado numérico de 16 teclas tipo los de los teléfonos móviles o los de los cajeros
automáticos.
Pag 122 – Curso Basico de Arduino
Para que nuestro Arduino pueda saber que tecla se pulsa, basta con poner tensión en las filas de forma secuencial y luego leer las
columnas para ver cuál de ellas tiene HIGH.Los teclados matriciales usan una combinación de filas y columnas para conocer el estado
de los botones. Cada tecla es un pulsador conectado a una fila y a una columna. Cuando se pulsa una de las teclas, se cierra una
conexión única entre una fila y una columna.
Por ejemplo, ponemos HIGH en la primera fila (hilo 8 en el diagrama de la derecha) y después leemos sucesivamente los hilos
correspondientes a las columnas (hilos 4, 3, 2,1). Si ninguno está en HIGH es que no se ha pulsado ninguna tecla de la primera fila.
Pag 123 – Curso Basico de Arduino
Pasamos a la segunda fila (hilo 7) y ponemos HIGH, si al leer los hilos 4, 3, 2,1 encontramos que el hilo 1 está en HIGH, es que se ha
pulsado la tecla correspondiente a la “B”.
De este modo, para leer un teclado matricial de 4×4 necesitamos 8 hilos en lugar de 16, aunque nos dará un poco más de guerra a la
hora de programar. Para un teclado de PC 106 teclas bastaría una matriz de 10×11 o sea 21 hilos en vez de 106.
DIAGRAMA DE CONEXIÓN
Lo más práctico es conectar el teclado a Arduino directamente, podemos usar cables de protoboard, o bien con un peine de pines para
que no se suelte nada.
Esta es otra de esas raras ocasiones en que un esquema electrónico tendría poco sentido, así que pasaremos rápidamente a ver el tema
del programa.
Pag 124 – Curso Basico de Arduino
Un apunte rápido: Por comodidad en el diagrama, y porque en los ejemplos que vienen con Arduino utilizan estos mismos números de
pines del 0 al 7, los hemos mantenido. Pero conviene saber que Arduino usa los pines 0 y 1 para comunicarse a través del USB, por lo
que no es buena usarlos para otra cosa cuando vayamos a usar el puerto serie.
EL PROGRAMA DE LECTURA
Como ya dijimos, el programa ha de consistir en ir dando tensión consecutivamente a los pines de las filas 8, 7, 6, 5 y después ir leyendo
los valores de las columnas para detectar que teclas se han pulsado.
No es un programa complicado, pero antes de que el pánico se apodere de los que siguen la sesión con creciente temor (y recuerden
que tienen algo urgente e ineludible que hacer) comentaremos que alguien ha tenido este problema antes que nosotros y amablemente
ha puesto a nuestra disposición una librería llamada KeyPad ideal para leer este tipo de matrices sin complicaciones,.
Lo que no quita para que podáis escribir un programa que lea directamente la matriz y reconozcáis las pulsaciones. Animo, no es difícil y
el ejercicio siempre es bueno.
Lo primero es descargar la librería e instalarla. La tenéis aquí Descargar, o bien en la página de Arduino
http://playground.arduino.cc/Code/Keypad#Download
Id a la sección de “Download, install and import” donde encontrareis keypad.zip. Descargadlo y para instalarla recordad que basta con
hacer:
En la ventana que sale, buscad el fichero Keypad.zip que habéis descargado, seleccionadlo y listo.
Pag 125 – Curso Basico de Arduino
Una vez instalada para usarla basta con que le indiquéis que deseáis usarla. SI hacéis Programa\Importar Librería \ Keypad veréis que
incluye la siguiente línea en vuestro programa:
#include <Keypad.h>
Vamos a ver como usamos esta librería. Lo primero es definir un par de contantes
Y ahora una par de arrays para indicarle a la librería que pines de Arduino corresponden a las filas y cuales a las columnas del keypad:
Recordad que un array es una colección de elementos que pasamos entre llaves y separados por comas. Es más cómodo que andar
definiendo 8 variables.
Recordad lo que vimos en la sesión 9, que cuando definimos una array por enumeración de sus elementos, como en este caso, no
necesitamos pasar entre corchetes el número de elementos (Los cuenta el mismo C++ solito).
Tendremos que definirle, además, que símbolos corresponden a cada posición de las teclas. Una nueva oportunidad para disfrutar de
los arrays, pero esta vez de 2 dimensiones en vez de una.
{'1','2','3','A'},
{'4','5','6','B'},
Pag 126 – Curso Basico de Arduino
{'7','8','9','C'},
{'*','0','#','D'}
};
Definimos el array de 4×4 pasándole las dimensiones entre corchetes. Sus miembros van a ser 4 filas, cada una de las cuales es un
array de 4 elementos, y después enumeramos los cuatro arrays de 4 miembros.
Fijaros en que cada array va entre llaves. Los elementos de un array se separan por comas, pero al final de las llaves exteriores va un
punto y coma porque toda el conjunto es una asignación.
Los arrays siempre parecen complicados hasta que te acostumbras pero no es para tanto y este es un buen ejemplo para que
comprendéis la idea de un array de 2 dimensiones.
Una de las curiosidades de leer una matriz de teclas y después asignar un carácter contenido en un array es que podemos redefinir el
valor de las teclas sin más que cambiar el contenido del array.
Si por lo que sea hubiéramos conectado mal los pines del keypad al Arduino, podríamos redefinir los valores del array para que
coincidan con lo que pone en las teclas. Puede ser más fácil que mover de sitio los cables.
De hecho es esa capacidad de mapear la representación de un carácter a una posición en una tabla, es lo que permite que podamos
reconfigurar el mismo teclado a diferentes lenguas, sin más que cambiar los valores del array (aunque también ayudará mucho luego
cambiar los símbolos rotulados en el teclado).
Por ultimo tendremos que crear una instancia de Keypad que llamaremos Teclado1
Que leído así asusta, pero que en realidad es una tontería. Traduciendo sería: Crea una instancia del tipo Keypad que llamaras Teclado1
y al que asignarás las teclas que tenemos en el array Teclas, y le decimos que hemos conectado las filas del keypad a los números de
pines que te indico en el array Pins_Filas y las columnas al array Pins_Cols.
Pag 127 – Curso Basico de Arduino
MakeKeymap (Teclas) es una función disponible en la librería y que nos permite asignar un array de valores a una matriz. Se hace solo
una vez al principio salvo que por lo que sea nos interese cambiarlo sobre la marcha.
Por ultimo para leer el keypad hacemos una llamada a otra función de la librería:
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
Pag 128 – Curso Basico de Arduino
{'*','0','#','D'}
};
void setup()
{ Serial.begin(9600) ; }
void loop()
if (pulsación != 0)
Porque la condición del if debe evaluarse a TRUE o FALSE y para los ordenadores un 0 es FALSE sin remisión, pero cualquier otro valor
que no sea 0 es TRUE, incluyendo un carácter.
Pag 129 – Curso Basico de Arduino
RESUMEN DE LA SESIÓN
LOS SERVOS
OBJETIVOS
o Que es un servo.
o Comprender la diferencia con un motor normal.
o Introducir el concepto de librería en C++.
o La función map().
Pag 130 – Curso Basico de Arduino
MATERIAL REQUERIDO.
Una Potenciómetro.
QUE ES UN SERVO
.
Normalmente los motores habituales lo que hacen es transformar la energía eléctrica (O química) en un giro continuo que podemos usar
para desarrollar trabajo mecánico.
En la sesión 13 utilizamos un pequeño motor de corriente continua y regulamos la velocidad de giro mediante una
señal PWM de Arduino.
Los servos son también motores de corriente continua, pero en lugar de diseñarse para obtener un giro continuo que podamos
aprovechar (para mover una rueda por ejemplo), se diseñan para que se muevan un angulo fijo en respuesta a una señal de control, y se
mantengan fijos en esa posición.
Imaginad por ejemplo un timón de un avión o barco. No queremos un giro continuo, sino un motor al que le pueda indicar el ángulo que
deseamos en grados y que mantenga esa orientación hasta que le demos una orden en contrario.
Estos servos o servomotores son muy frecuentes en Aero modelismo y en robótica, por la capacidad que presentan para moverse a un
ángulo concreto y mantenerse allí. De hecho se suelen diseñar para que giren un ángulo proporcional a una señal PWM, de forma que
su control es muy preciso. Un servo suele estar formado por:
En la práctica se comporta como un bloque funcional que posiciona su eje en un ángulo preciso en función de la señal de control
Habitualmente los servos tiene un margen de operación, es decir, pueden moverse entre 0º y ángulo dado, que suele ser de 180º, pero
existen modelos comerciales de todas la características imaginables (incluyendo servos de 360º).
Normalmente estos pequeños servos funcionan sobre 5V y el control se realiza mediante una señal de control PWM, en la que el ancho
el pulso indica el ángulo que deseamos adopte el eje.
Un servo tiene un conector de 3 hilos, 5V (rojo), GND (negro o marrón) y el otro Control (amarillo o blanco).
Podríamos escribir un pequeño programa en Arduino que controle estos pulsos y los relacione con el ángulo buscado, pero antes de que
nadie se asuste, los servos (y otras cosas) son tan habituales, que ya ha habido gente que han escrito estos programas y los han puesto
a nuestra disposición.
De este modo podemos manejar un servo sin preocuparnos para nada de cómo realizar el control de las señales, o de la operación
interna, basta con instalar estos programas en una forma especial llamada librería.
Una librería es un conjunto de definiciones y funciones escritas en C++ de Arduino, que podemos utilizar en nuestros programas.
Podemos ver el código de estos programas, aunque normalmente se requiere un nivel medio alto en C++ para comprender su
funcionamiento.
La ventaja de trabajar con una plataforma tan bien establecida como Arduino, es que hay cantidad de gente en el mundo desarrollando
librerías, casi para cualquier cosa que podáis imaginar.
Servo es una librería estándar en Arduino. Eso quiere decir que viene incluida cuando instaláis el IDE, a diferencia de otras librerías que
debemos buscar, descargar de Internet e instalar para poder usarlas.
Para usar una librería estándar, basta con pedirle al IDE que la incluya en nuestro programa. Id al menú Programa \ Importar Librería y
os saldrá un desplegable con todas las librerías que tenéis instaladas en el IDE.
Por ahora solo nos interesa la librería Servo. Pinchad en ella. Arduino incluirá una línea al principio de vuestro programa como esta:
#include <Servo.h>
Normalmente para usar una librería hay que leer la documentación, en la que se detalla la forma de usarla, que funciones tenemos
disponibles, que parámetros pasarlas…etc.
Como es vuestra primera librería, y nosotros ya nos hemos leído el manual, vamos a llevaros de la mano. Veréis que es de lo más fácil.
Vamos a montar un circuito en el que hagamos moverse al servo de forma controlada, e iremos viendo las instrucciones necesarias.
Vamos a conectar el servo primero a GND y 5V y luego el pin de control, a un pin de Arduino que permita PWM (Recordad esto o de lo
contrario os costara ver el problema). Recordad que es el ancho el pulso lo que controla el ángulo.
Vamos también a conectar un potenciómetro a la puerta A0 para jugar con el servo.
Pag 134 – Curso Basico de Arduino
EL PROGRAMA DE CONTROL
Vamos a empezar con una línea que ya conocíamos el include y otra nueva:
#include <Servo.h>
Pag 136 – Curso Basico de Arduino
Servo servo1;
Para poder utilizar la librería debemos crear, lo que se conoce como un objeto tipo Servo que llamamos servo1.
C++ es un lenguaje orientado a objetos, esto significa que podemos definir objetos tipo (como servos) sin más que declarar un nuevo
objeto del tipo que deseamos. En la jerga de la programación se llama crear una instancia, o instanciar un nuevo objeto.
Así, esa segunda línea significa que vamos a crear una nueva instancia de tipo Servo que llamamos servo1.
Aunque ahora os pueda parecer una forma extraña de hacer las cosas, la programación orientada a objetos (OOP por sus siglas en
inglés), es una de las metodologías más potentes de las ciencias de computación actuales y todos los lenguajes de programación que se
precien, han incorporado las ideas de la OOP.
Entrar en la teoría del OOP, desborda con mucho las pretensiones de este humilde tutorial de Arduino, por ahora nos limitaremos a
mostraros como usar los objetos.
Una vez creada la instancia del objeto (y podemos crear tantas como necesitemos, para manejar varios servos a la vez) tenemos que
incluir una línea en la función setup() para informar a C++ que vamos a conectar ese objeto abstracto que todavía es servo1 a un pin
físico del Arduino para controlarlo. En nuestro caso el pin 9:
servo1.attach(9);
Una vez cumplido el trámite para gobernar la posición del servo recurrimos a
servo1.write( angulo);
Vamos a escribir un programa que vaya barriendo un Angulo en grados y moviendo el servo a esa posición.
int angulo = 0 ;
Pag 137 – Curso Basico de Arduino
void setup()
void loop()
servo1.write(angulo);
delay(25);
servo1.write( angulo );
delay(25);
Pag 138 – Curso Basico de Arduino
Veréis como el servo se va moviendo primero hacia adelante y luego retrocede para volver a empezar.
Vamos ahora a hacer que el valor del potenciómetro represente la posición del servo de manera que el servo se mueva siguiendo al
potenciómetro. Para ello hay que entender que el valor que leamos en la puerta A0 está comprendido entre 0 y 1024, y que estos valores
tienen que distribuirse entre 0 y 180º. Así que para calcular el Angulo correspondiente basta con hacer:
Como la experiencia me ha demostrado, que los errores haciendo este tipo proporciones
tienden a infinito, voy a aprovechar para presentaros la función map(), que hace exactamente eso de un modo cómodo, librándonos de
los float ( aunque para aprender no os vendría mal hacer así el programa y luego usar el map()).
Traducido quiere decir: Haz la proporción de los valores que leas en A0, entre 0 y 1024, en un valor comprendido entre 0 y 180 y
asignale ese valor al ángulo. //Prog_16_2
int angulo = 0 ;
void setup()
{
Pag 139 – Curso Basico de Arduino
void loop()
servo1.write(angulo);
delay(250);
DETECTOR DE LLAMA
OBJETIVOS
MATERIAL REQUERIDO.
Un buzzer piezoeléctrico
Un sensor de llama
Pag 141 – Curso Basico de Arduino
SENSORES DE LLAMA
No resulta extraño que los sensores de llamas se encuentren entre los más vendidos. La industria los suministra de todos los tipos,
tamaños y precios, porque la idea de que se te queme la casa o la empresa es algo que ayuda mucho a sacar la cartera y buscar un
detector que sea capaz de avisarte con tiempo de que hay llamas cerca de tus cosas.
En realidad, es muy probable que tengas varios de estos detectores en tu casa. Imagínate, por ejemplo, los calentadores de gas, los
hornos domésticos de gas, o un sencillo calentador de agua y calefacción.
Todos ellos requieren una llama quemando gas. Si por cualquier motivo, la llama se extingue y no lo detectases, el gas seguiría fluyendo
y causando un embalsamiento, listo para causar un disgusto explosivo.
Por eso, todos estos electrodomésticos, y sus equivalentes industriales, incorporan por ley, un detector de llama, que pueda cortar el gas
en cuanto detecte falta de llama.
Lo sensores más sencillos (y baratos), suelen ser del tipo de detectores de ultravioletas, o sensores de infrarrojos.
El mercado ofrece, también, un amplio espectro de sensores del tipo de detectores de humo y de gases nocivos como monóxido de
Carbono (CO) típico de la combustión,Dioxido de Carbono (CO2), detectores de humo, o de gases peligrosos libres, como hidrocarburos
(Propano, Butano y demás).
Si tenemos ocasión en el futuro hablaremos de ellos.
En un entorno normal, la ignición de una llama provoca una ionización potente de gases comunes (En realidad un plasma ionizado,
similar al que ilumina una lámpara halógena), que generan un patrón típico de frecuencia en el rango del ultravioleta. El detector es un
semiconductor sensible a este rango de frecuencias.
Cuando la llama se estabiliza, es relativamente sencillo detectar su espectro infrarrojo, con una fotorresistencia LDR, pero diseñada para
ser específicamente sensible a un rango característico.
Nosotros vamos a usar un sensor muy sencillo y fácil de manejar que es un sensor infrarrojo de llamas. Funcionan detectando una
longitud de onda especifica (de unos 760 nm) que son características de las llamas, aunque son relativamente fáciles de engañar y
pueden dar falsos positivos con ciertas luces.
Pag 142 – Curso Basico de Arduino
Como todo en la vida, es cuestión de precio, y el nuestro es barato, así que nos tendremos que apañar, pero a pesar de todo, confio, en
que el resultado de la sesión, sea satisfactorio.
Este sensor se encuentra muy frecuentemente encapsulado con un soporte y un potenciómetro para ajustar la sensibilidad, por poco
dinero. Incluso se vende en formato múltiple, con varias cabezas apuntando en distintas direcciones
En principio siempre es recomendable usar uno montado (Porque dan menos trabajo y a la hora de la verdad no se suelta un cable),
pero como me sobraba un detector independiente, por la mesa voy a montarlo en circuito de protoboard para ver qué pasa.
Pag 143 – Curso Basico de Arduino
ESQUEMA DE CONEXIÓN
Lo normal para leer este sensor de llamas, seria usar un divisor de tensión como este:
Donde R1 debería tomar valores sobre 500k y como no tenía nada parecido, he usado 4 resistencias de 100k en serie, para tener
lecturas claras en la puerta A0 de Arduino. EL esquema eléctrico es algo así:
Pag 144 – Curso Basico de Arduino
PROGRAMA DE CONTROL
El programa es de lo más simple. Solo tenemos que leer la caída de tensión en el divisor y mandar una señal acústica con el buzzer en
cuanto el valor de la lectura en A0 sobrepase un cierto umbral.
Vamos a recuperar, además, la función Beep () que escribimos en la sesion Buzzers o zumbadores, para dar el tono de alarma cuando
se detecte una llama
Pag 146 – Curso Basico de Arduino
void setup()
pinMode(9, OUTPUT);
void loop()
int v = analogRead(A0) ;
if ( v > 10)
beep(200) ;
analogWrite(9, 20);
delay(pausa); // Espera
Pag 147 – Curso Basico de Arduino
delay(pausa); // Espera
Lo que hace el programa es leer el pin A0 y si su valor sobrepasa un mínimo (para evitar los falsos positivos) llama a la función beep()
para dar la alarma.
Nota: Normalmente hay que calibrar la sensibilidad del sensor. Para ello hay que ver que valores te devuelve en tu caso concreto y afinar
este valor umbral, para que no esté pitando continuamente.
Los sensores en placa, suelen venir con un potenciómetro, que hay que ajustar para calibrar la sensibilidad el detector.
Tambien convendría modificar el programa, para que el tono de la señal se hiciese mas agudo cuanto mas alto sea el valor de lectura en
A0
Monitor serie
El monitor serie es una de las herramientas de desarrollo mas interesantes que nos aporta el entorno arduino, mediante este
monitor podemos ver los valores de nuestras variables, así como mensajes de texto que nos permitirán conocer como esta
funcionando nuestro programa, o simplemente interactuar con el.
El monitor serie consiste en una consola de entrada y salida, esto quiere decir que podremos mostrar datos enviados por nuestra
placa arduino y también podremos enviar datos a nuestra placa. Podremos acceder a el a través del menú Herramientas/Monitor
serie o haciendo click en el icono que parece una lupa ubicado a la derecha en el IDE.
Pag 148 – Curso Basico de Arduino
La comunicación serie se lleva a cabo por los pines TX / RX y usa niveles lógicos TTL (5V o 3.3V dependiendo de la placa). Esta
se utiliza para la comunicación entre la placa Arduino y una computadora u otros dispositivos. Todas las placas Arduino tienen al
menos un puerto serie (también conocido como UART o USART). Por lo tanto, si utilizamos esta función, no se pueden utilizar los
pines 0 y 1 para la entrada o salida digital.
begin()
Establece la velocidad de datos en bits por segundo (baudios) para la transmisión de datos en serie. Para comunicarse con el
ordenador, utilice una de estas velocidades: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o 115200. Sin
embargo, se pueden especificar otras velocidades. Por tanto, su ejecución es imprescindible antes de realizar cualquier transmisión
por dicho canal. Se debe indicar la velocidad del canal como argumento.
Pag 149 – Curso Basico de Arduino
Sintaxis
Serial.begin(velocidad)
Serial.begin(velocidad, configuracion)
Parametro
velocidad: es la velocidad de comunicación del puerto serie en bits por segundo (baudios)
Configuracion: selecciona el numero de datos, paridad y bits de parada. Los valores validos
son: SERIAL_5N1, SERIAL_6N1, SERIAL_7N1, SERIAL_8N1 (por defecto), SERIAL_5N2, SERIAL_6N2, SERIAL_7N2,
SERIAL_8N2, SERIAL_5E1, SERIAL_6E1, SERIAL_7E1, SERIAL_8E1, SERIAL_5E2, SERIAL_6E2, SERIAL_7E2, SERIAL_8E2,
SERIAL_5O1, SERIAL_6O1, SERIAL_7O1, SERIAL_8O1, SERIAL_5O2, SERIAL_6O2, SERIAL_7O2 y SERIAL_8O2.
end()
No tiene ningún argumento ni devuelve nada, y se encarga de cerrar el canal serie. Permitiendo que los pines RX y TX sean
usados para entradas y salidas generales.
Sintaxis
Serial.end()
print()
Envía a través del canal serie un dato (especificado como parámetro) desde la placa arduino hacia el exterior. Ese dato puede ser
de cualquier tipo: carácter, cadena, número entero, número decimal (por defecto de dos decimales), etc. Si el dato se especifica
explícitamente (en vez de a través de una variable), hay que recordar que los caracteres se han de escribir entre comillas simples y
las cadenas entre comillas dobles.
Sintaxis
Serial.print(valor, formato)
Pag 150 – Curso Basico de Arduino
Parametros
formato: Especifica la base numérica (BIN (binario o base 2), OCT (octal o base 8), DEC (decimal o base 10), HEX (hexadecimal o
base 16)) o el número de decimales (para los datos float).
println()
Hace exactamente lo mismo que Serial.print(), pero además, añade automáticamente al final de los datos enviados dos caracteres
extra: el de retorno de carro (código ASCII nº 13)(\r) y el de nueva línea (código ASCII nº 10) (\n). La consecuencia es que al final
de la ejecución de Serial.println() se efectúa un salto de línea.
Sintaxis
Serial.println(valor, formato)
Parametros
formato: Especifica la base numérica (BIN (binario o base 2), OCT (octal o base 8), DEC (decimal o base 10), HEX (hexadecimal o
base 16)) o el número de decimales (para los datos float).
void loop() {}
Pag 151 – Curso Basico de Arduino
void setup() {
Serial.begin(9600); //Inicia la comunicacion serie a 9600 baudios
}
void loop() {
analogValue = analogRead(0); //lee el valor analogico en el pin A0
// Imprime el valor en varios formatos
Serial.println(analogValue); // Imprime el valor en decimal
Serial.println(analogValue, DEC); // Imprime el valor en decimal
Serial.println(analogValue, HEX); // Imprime el valor en hexadecimal
Serial.println(analogValue, OCT); // Imprime el valor en octal
Serial.println(analogValue, BIN); // Imprime el valor en binario
delay(100); //espera 100 millisegundos para la siguiente lectura
}
available()
Devuelve el número de bytes –caracteres– disponibles para ser leídos y que provienen del exterior a través del canal serie. Estos
bytes ya han llegado al microcontrolador y permanecen almacenados temporalmente en una pequeña memoria de 64 bytes que
tiene la placa arduino –llamada “buffer”– hasta que sean procesados mediante la instrucción Serial.read().
Esta función devuelve el numero de bytes para leer. Si no hay bytes para leer, esta instrucción devolverá un 0. No tiene
parámetros.
Sintaxis
Serial.available()
read()
Devuelve el primer byte aún no leído de los que estén almacenados en el buffer de entrada del chip TTL-UART. Al hacerlo, lo
elimina de ese buffer. Para leer el siguiente byte, se ha de volver a ejecutar Serial.read(). Y hacer así hasta que se hayan leído
todos. Cuando no haya más bytes disponibles, Serial.read() devolverá -1. Esta funcion no tiene parámetros.
Pag 152 – Curso Basico de Arduino
Sintaxis
Serial.read()
void setup() {
Serial.begin(9600);// inicia la comunicación serie a 9600 baudios
}
void loop() {
// lee e imprime en el monitor serie cuando se reciben datos
if (Serial.available() > 0) {
byteEntrante = Serial.read(); // lee el byte entrante
Serial.print("He recibido: "); // imprime el byte entrante
Serial.println(byteEntrante, DEC);
}
}
Debemos notar que esta función nos devuelve el equivalente ASCII de los caracteres leidos. Para ver la tabla ASCII click aqui.
parseFloat()
Lee del buffer de entrada (eliminándolos de allí) todos los datos hasta que se encuentre con un número decimal. Su valor de
retorno – de tipo “float”– será entonces ese número decimal encontrado. Cuando detecte el primer carácter posterior no válido,
dejará de leer (y por tanto, no seguirá eliminando datos del buffer). Esta instrucción no tiene parámetros.
Sintaxis
Serial.parseFloat()
parseInt()
Lee del buffer de entrada (eliminándolos de allí) todos los datos hasta que se encuentre con un número entero. Su valor de retorno
–de tipo “long”– será entonces ese número entero encontrado. Cuando detecte el primer carácter posterior no válido, dejará de leer
(y por tanto, no seguirá eliminando datos del buffer). Esta instrucción no tiene parámetros.
Pag 153 – Curso Basico de Arduino
Sintaxis
Serial.parseInt()
void setup(){
Serial.begin(9600); //inicia la comunicación serie a 9600 baudios
}
void loop(){
// lee e imprime en el monitor serie cuando se reciben datos
if(Serial.available()>0){
numero=Serial.parseFloat(); //lee un numero decimal
Serial.println(numero); //imprime el numero leido
}
}
write()
Envía a través del canal serie un dato (especificado como parámetro) desde el microcontrolador hacia el exterior. Pero a diferencia
de Serial.print(), el dato a enviar solo puede ocupar un byte. Por lo tanto, ha de ser básicamente de tipo “char” o “byte”. En realidad,
también es capaz de transmitir cadenas de caracteres porque las trata como una mera secuencia de bytes independientes uno tras
otro. Su valor de retorno es, al igual que en Serial.print(), un dato de tipo “byte” que vale el número de bytes enviados.
Sintaxis
Serial.write(valor)
Serial.write(cadena)
Serial.write(matriz, longitud)
Parametros
void loop() {}
Como podemos ver cuando usamos la función Serial.write el monitor serie nos imprime el equivalente ASCII del numero que
recibe.
Existen muchas mas funciones relacionadas con la comunicación serie, apenas hemos visto algunas de las mas importantes, para
mas información sobre esas funciones visitar el sitio web de arduino.cc.
Serial plotter
El serial plotter es una herramienta disponible en el IDE de arduino que nos permite visualizar de forma gráfica el valor de una
variable. Para hacerlo es tan fácil como enviar el valor a imprimir con la función Serial.println(), y luego ir al menú herramientas y
seleccionar serial plotter. A continuación un ejemplo.
void loop() {
Pag 155 – Curso Basico de Arduino
Ejercicios
Ejercicio 1 – Imprimir los numero del 1 al 10 en binario
Imprimir en el monitor serie los números del 1 al 10 en binario.