Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Arduino
Curso Arduino
NTRODUCCIÓN
C ENTRO DE I NVESTIGACIÓN DE T ECNOLOG
ECNOLOGÍAS
ÍAS DE LA
I NFORMACIÓN (CIDETI)
E NERO 2018
I NTRODUCCIÓN
Introducción
Introducción
Las tarjetas Arduino son capaz de leer entradas de
señales analógicas y digitales desde diferentes sensores
y convertirlo en una salida tal que activa un actuador,
encienda o apague un led, se conecte a la nube o
cualquier otra acción.
M ICROCONTROLADOR AT91SAM3X8E
D ESCRIPCIÓN DE LA TARJETA A RDUINO
Introducción
5. Reset externo.
6. Fuente de voltaje de salida de 3.3 V.
7. Fuente de voltaje de salida de 5 V.
8. Pines de tierra (GND).
9. Este pin puede ser usado para alimentar la tarjeta Arduino
desde uns fuente externa.
10. La tarjeta Arduino incluye 6 entradas analógicas de A0 hasta
A5, Estos pines pueden leer la señal desde un sensor
analógico y convertir estas señales a digitales las cuales
pueden ser leídas por el microprocesador.
D ESCRIPCIÓN DE LA TARJETA A RDUINO
Introducción
(a) Ejemplo 1 (b) Ejemplo 2
C ARGANDO PROGRAMA A LA TARJETA
A RDUINO
Introducción
Una vez seleccionado el programa seleccionamos la
tarjeta y el puerto en al que esta conectado.
Introducción
Introducción
array.
array.
Este tipo de datos en realidad no existe como tal. Lo que
existen son arrays de variables de tipo “boolean”, arrays
de variables de tipo “int”, arrays de variables de tipo
“float”, etc. En definitiva: arrays de variables de cualquier
tipo de los mencionados hasta ahora.
Un array (también llamado “vector”)
“vector”) es una colección de
variables de un tipo concreto que tienen todas el mismo y
único nombre, pero que pueden distinguirse entre sí por
un número a modo de índice.
Los arrays sirven para ganar claridad y simplicidad en el
código, además de facilitar la programación.
E JEMPLO 2 : CAMBIO DE VARIABLES
Introducción
/*Cam
Cambio
bio de var
variab
iable
le “Ca
“Casti
sting”
ng”*/
floatvariablefloat=3.4;
floatvariablefloat=3.4;
byte variablebyte=126;
void setup(){
setup(){
Serial.begin(9600);
Serial.begin(9600);
Serial.println(
Serial.println(byte
byte(variablefloat));
(variablefloat));
Serial.println(
Serial.println(int
int(variablefloat));
(variablefloat));
Serial.println(
Serial.println(word
word(variablefloat));
(variablefloat));
Serial.println(
Serial.println(long
long(variablefloat));
(variablefloat));
Serial.println(
Serial.println(char
char(variablefloat));
(variablefloat));
Serial.println(
Serial.println(float
float(variablefloat));
(variablefloat));
}
void loop(){
loop(){
//No
//No se ej
ejec
ecut
uta
a na
nada
da aq
aquí
uí
}
E JEMPLO 3 : USO DE VARIABLES
Introducción //Prob
//Pr oble
lema
ma de
dell us
uso
o de di
dist
stin
inta
tas
s va
vari
riab
able
les
s
float resultado;
int numerador=5;
int denominador=2;
void setup() {
Serial.begin(9600);
Serial.begin (9600);
resultado=numerador/denominador;
Serial.println(resultado);
Serial.println (resultado);
}
void loop() {
}
E JEMPLO 3: USO DE VARIABLES
Introducción //Problema del uso de distintas variables
float resultado;
int numerador=5;
int denominador=2;
void setup() {
Serial.begin(9600);
resultado=numerador/denominador;
Serial.println(resultado);
}
void loop() {
}
Las variables numerador como denominador son
enteros, y por tanto, el resultado siempre será entero, a
pesar de que lo guardemos en una variable de tipo
“float”.
E JEMPLO 4 USO DE VARIABLES
Introducción //Problema del uso de distintas variables
int numero=100;
long resultado;
void setup() {
Serial.begin(9600);
resultado=numero*1000;
Serial.println(resultado);
}
void loop() {
}
E JEMPLO 4 USO DE VARIABLES
Introducción //Problema del uso de distintas variables
int numero=100;
long resultado;
void setup() {
Serial.begin(9600);
resultado=numero*1000;
Serial.println(resultado);
}
void loop() {
}
Para evitar esto, lo más fácil sería forzar a que alguno de los
elementos presentes en el cálculo sea del mismo tipo que el de la
variable “resultado”, debido a que el numero 1000 es de tipo “int”.
E JEMPLO 4 USO DE VARIABLES
Introducción //Problema del uso de distintas variables
int numero=100;
long resultado;
void setup() {
Serial.begin(9600);
resultado=numero*1000;
Serial.println(resultado);
}
void loop() {
}
Para evitar esto, lo más fácil sería forzar a que alguno de los
elementos presentes en el cálculo sea del mismo tipo que el de la
variable “resultado”, debido a que el numero 1000 es de tipo “int”.
Dentro del código Arduino si tras su valor literal añadimos la letra
“U”, su tipo por defecto será “word”, si añadimos “L”, su tipo será
“long” y si se añadimos “UL”, su tipo será “unsigned long”. Es decir,
una línea como resultado=numero*1000L; hubiera conseguido
el mismo efecto que la solución anterior.
C OMUNICACIÓN SERIE CON A RDUINO
Introducción
Serial.print()
Envía a través del canal serie un dato (especificado como
parámetro) desde el microcontrolador 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.
Introducción
Serial.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 no 13) y el de nueva línea (código ASCII no
10). La consecuencia es que al final de la ejecución de
Serial.println() se efectúa un salto de línea. Tiene los
mismos parámetros y los mismos valores de retorno que
Serial.print()
Introducción Serial.write()
Envía a través del canal serie un dato (especificado como
parámetro) desde el microcontrolador hacia el exterior. El
dato a enviar solo puede ocupar un byte. Por lo tanto, ha
de ser básicamente de tipo “char” o “byte”.
char cadena[]=”hola”;
byte bytesDevueltos;
void setup(){
Serial.begin(9600);
bytesDevueltos=Serial.write(cadena);
Serial.println(bytesDevueltos);
}
void loop() {
}
Introducción
byte byteRecibido = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available( ) > 0 ) {
byteRecibido = Serial.read();
Serial.write(”Byte recibido: ”);
Serial.write(byteRecibido);
}
}
Serial.find()
Introducción
boolean encontrado;
void setup() {
Serial.begin(9600);
}
void loop() {
encontrado=Serial.find(”Hola”);
if (encontrado == true) {
Serial.println(”Encontrado ”);
}
}
Introducción
Serial.readBytes()
Lee del buffer de entrada (eliminándolos de allí) la
cantidad de bytes especificada como segundo parámetro
(o bien, si no llegan suficientes bytes, hasta que se haya
superado el tiempo especificado por
Serial.setTimeout() ) . En cualquier caso, los bytes
leídos se almacenan en un array –de tipo “char[]”–
especificado como primer parámetro. Esta instrucción
devuelve el número de bytes leídos del buffer (por lo que
un valor 0 significa que no se encontraron datos válidos)
Introducción
Serial.setTimeout()
Tiene un parámetro (de tipo “long”) que sirve para
establecer el número de milisegundos máximo que las
instrucciones Serial.readBytesUntil() y
Serial.readBytes() esperarán a la llegada de datos
al buffer de entrada serie. Si alguna de estas dos
instrucciones no recibe ningún dato y se supera ese
tiempo, el sketch continuará su ejecución en la línea
siguiente. El tiempo de espera por defecto es de 1000
milisegundos. Esta instrucción se suele escribir en “void
setup ()”. No tiene valor de retorno.
E JEMPLO 9: LECTURA DE DATOS
Introducción
char a[10];
const int timeout=1000;
void setup() {
Serial.begin(9600);
Serial.setTimeout(timeout);
}
void loop() {
Serial.println(”Escribe un carácter”);
int b = Serial.readBytes(a, 10);
Serial.print(”bytes leídos:\t”);
Serial.println(b);
delay(1000);
}
Introducción
Serial.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 “long”– 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.
Serial.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.
E JEMPLO 10 L ECTURA DE DATOS
float numero;
Introducción
void setup() {
Serial.begin(9600);
}
void loop(){
/* Vacía el buffer hasta reconocer algún
número decimal o vaciarlo del todo */
numero=Serial.parseFloat();
/*Imprime el número decimal detectado, y si no
se ha encontrado ninguno, imprime 0.00 */
Serial.println(numero);
/*Lee un byte más y lo imprime. Si se hubiera
detectado un número decimal, ese byte sería el
carácter que está justo después de él. Si el
buffer está vacío porque Serial.parseFloat()
no encontró ningún número decimal, entonces
devuelve -1 */
Serial.println(Serial.read());
}
Introducción
micros():
Devuelve el número de microsegundos ( µs) desde que la placa
Arduino empezó a ejecutar el sketch actual. 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).
INSTRUCCIONES DE GESTIÓN DEL
TIEMPO
Introducción Estas instrucciones no pertenecen a ningún objeto, así
que se escriben directamente:
delay():
Pausa el sketch durante la cantidad de milisegundos
especificados como parámetro ?de tipo ?unsigned long??. No
tiene valor de retorno.
delayMicroseconds():
Pausa el sketch durante la cantidad de microsegundos
especificados como parámetro –de tipo “unsigned long”– .
Actualmente el máximo valor que se puede utilizar con
precisión es de 16383. Para esperas mayores que esta, se
recomienda usar la instrucción delay(). El mínimo valor que se
puede utilizar con precisión es de 3 µ s. No tiene valor de
retorno.
Ejemplo 11
Introducción
INSTRUCCIONES MATEMÁTICAS, TRIGONOMÉTRICAS Y
DE PSEUDOALEATORIEDAD
El lenguaje Arduino dispone de una serie de instrucciones
Introducción
matemáticas y de pseudoaleatoriedad que nos pueden venir
bien en nuestros proyectos. Son estas:
abs(). Devuelve el valor absoluto de un número pasado por
parámetro (el cual puede ser tanto entero como decimal).
min(). Devuelve el mínimo de dos números pasados por
parámetros.
max(). Devuelve el máximo de dos números pasados por
parámetros.
constrain() . Recalcula el valor pasado como primer
parámetro (llamémosle “x”) dependiendo de si está dentro o
fuera del rango delimitado por los valores pasados como
segundo y tercer parámetro (llamémoslos “a” y “b”
respectivamente, donde “a” siempre ha de ser menor que
“b”). Los tres parámetros pueden ser tanto enteros como
decimales.
map(). Modifica un valor –especificado como primer parámetro– el cual
Introducción inicialmente está dentro de un rango (delimitado con su mínimo –segundo
parámetro– y su máximo –tercer parámetro–) para que esté dentro de otro
rango (con otro mínimo –cuarto parámetro– y otro máximo –quinto
parámetro–) de forma que la transformación del valor sea lo más
proporcional posible.
El valor mínimo del rango inicial (0) se mapea al valor mínimo del rango final
(200), el valor 25 (una cuarta parte del rango inicial) se mapea al valor 250
(una cuarta parte del rango final) y que un valor fuera del rango inicial (500)
Introducción
Introducción
Un número pseudoaleatorio no es estrictamente un número
aleatorio según la definición matemática rigurosa, pero para
nuestros propósitos el nivel de aleatoriedad que alcanzan las
siguientes funciones será más que suficiente:
randomSeed() . Inicializa el generador de números
pseudoaleatorios. Se suele ejecutar en la sección “setup()”
para poder utilizar a partir de entoncesnúmeros
pseudoaleatorios en nuestro sketch. Esta instrucción tiene un
parámetro de tipo “int” o “long” llamado “semilla” que indica el
valor a partir del cual empezará la secuencia de números.
Semillas iguales generan secuencias iguales, así que
interesará en múltiples ejecuciones de randomSeed()
utilizar valores diferentes de semilla para aumentar la
aleatoriedad. También nos puede interesar a veces lo
contrario: fijar la semilla para que la secuencia de números
aleatorios se repita exactamente. No tiene ningún valor de
retorno.
Introducción
void setup() {
Serial.begin(9600);
randomSeed(100);
}
void loop(){
Serial.println(random(1,30));
delay(1000);
}
OPERADORES ARITMÉTICOS
Introducción
Algunos de los operadores aritméticos, funcionan tanto
para números enteros como decimales y son los
siguientes:
Operadores aritméticos
+ Operador suma
− Operador resta
∗ Operador multiplicación
/ Operador división
% Operador módulo
Introducción
Lo primero que debemos saber es que para escribir
correctamente en nuestro sketch estas condiciones
necesitaremos utilizar alguno de los llamados
operadores, que son los siguientes:
Operadores de comparación
== Comparación de igualdad
! = Comparación de diferencia
> Comparación de mayor que
>= Comparación de mayor o igual que
< Comparación de menor que
<= Comparación de menor o igual que
Operadores lógicos
& AND
|| OR
! NOT
if y if/else
Introducción if (condición) {
//Instrucciones -una o más- que se
ejecutan si la condición es cierta
} else if (otra condición) {
/*Instrucciones -una o más- que se
ejecutan si la condición del anterior “if”
es falsa pero la actual es cierta */
} else if (otra condición) {
/*Instrucciones -una o más- que se
ejecutan si la condición del anterior ?if?
es falsa pero la actual es cierta */
} else {
//Instrucción(es) que se ejecutan si todas
las condiciones anteriores eran falsas
}
E JEMPLO 16
Introducción
E JEMPLO CON “ STRING ‘”
Introducción
Ejemplo 17:
switch
Introducción
Ejemplo 18:
while y do
Introducción while
Ejemplo 19:
do (condición) {
//Instrucciones que se repetirán mientras
la condición sea cierta -“true”,1-
} while ( condición)
for
Introducción
Operadores compuestos
x++ Incremento
x– Decremento
x+=3 x=x+3
x-=3 x=x-3
x*=3 x=x*3
x/=3 x=x/3
Ejemplo 20:
E NTRADAS Y S ALIDAS
Introducción
(e) pull-down (f) pull-up
E JEMPLO 21
Introducción
Introducción
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.
Si el segundo parámetro de esta función vale 0, el pulso no dura nada
(no hay señal) y por tanto su valor analógico “simulado” será 0V.
Si vale 255 (resolución de 8 bits), el pulso dura todo el período de la
señal (señal continua) y su valor analógico “simulado” será el máximo
de la placa (5 V).
Ejemplo 31
Introducción
Introducción