






























Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Un documento de apoyo para el uso de arduino y empezar a usarlo
Tipo: Apuntes
1 / 38
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
Este manual aborda todos los conceptos básicos de Arduino y es una excelente guía para todo aquel que quiera iniciarse en este apasionante mundo.
El manual ha sido confeccionado por Raúl Diosdado usando para ello la siguiente información y recursos:
http://www.arduino.cc (Pagina oficial de Arduino)
Fritzing (Elaboración de esquemáticos y montajes) http://fritzing.org
http://www.zonamaker.com (Recursos propios)
Está permitida la impresión, distribución y modificación de este manual siempre que se reconozca a su autor y las fuentes de las que se extrajo su información.
No está permitida la comercialización o venta de este manual.
Un profesor solía decirme, "No inventes la rueda, eso ya se preocupo alguien en inventarla, tu tan solo úsala" Haced que Arduino sea vuestra rueda
Primera edición publicada en Septiembre de 2014 Este manual esta bajo licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
6.1 E/S digitales 6.1.1 Lectura de entradas digitales (digitalRead) 6.1.2 Escritura de salidas digitales (digitalWrite) 6.2 E/S Analógicas 6.2.1 Lectura de entradas analógicas (analogRead) 6.2.2 Escritura de salidas analógicas (analogWrite)
7.1 Inicialización de la comunicación serie (Serial.begin) 7.2 Escritura del puerto serie (Serial.print) 7.3 Lectura del puerto serie (Serial.read)
8.1 Delay (ms) 8.2 DelayMicroseconds (μs) 8.3 Millis () 8.4 Min(x,y) 8.5 Max(x,y)
Programación y conceptos básicos
La estructura de un programa en Arduino puede llegar a ser muy diferente en función de la complejidad de la aplicación que queramos crear, pero como en la mayoría de lenguajes de programación esta estructura está formada por funciones, sentencias, bucles y otros elementos que conforman la estructura de programa.
Una función es un bloque de código con un nombre y un conjunto de estamentos que son ejecutados cuando se llama a dicha función. Las funciones de usuario se crean para realizar tareas repetitivas reduciendo de esa manera el tamaño del programa.
Las funciones están asociadas a un tipo de valor "type", este es el valor que devolverá la función una vez termine su ejecución.
type nombreFunción (parámetros) { Estamentos o instrucciones; }
Si la función no devuelve ningún valor, se le asignará el tipo "void" o función vacía. No es obligatorio pasarles parámetros a la función, se pueden crear funciones independientes que obtengan sus propios parámetros para trabajar.
Ejemplo de función: /* Define la función "multiplicar" a la que se le pasarán los 2 números que se deseen multiplicar devolviendo un valor entero (int). */ int multiplicar (int x, int y) //función multiplicar { int resultado; //declara la variable donde se almacena el resultado resultado = x * y; //ejecuta la operación de multiplicar return resultado; //devuelve el resultado de la multiplicación }
Para hacer uso de la función anterior, tan solo habrá que llamarla desde cualquier parte del programa. Esta llamada a la función se realiza de la siguiente manera:
void loop () { int i =2;
Programación y conceptos básicos
funcion() { Estamentos o instrucciones; }
El punto y coma ";" se utiliza para definir el final de una instrucción y separarla de la siguiente. Si no colocamos punto y coma, el programa va a interpretar mal las instrucciones y se va a producir un error de compilación.
digitalWrite (10, HIGH);
El error más común a la hora de programar suele ser olvidar poner punto y coma al final de la instrucción.
Los bloques de comentarios son áreas de texto que nos ayudan a describir o comentar un programa, estos bloques serán ignorados a la hora de compilar el programa en nuestro Arduino.
/*El bloque de comentario ayuda al programador a describir el programa */
Se pueden introducir todas las líneas de texto que se deseen siempre que se encuentren entre los caracteres /.../. Se recomienda el uso de bloques de comentarios siempre que se pueda, ya que ayudan a la comprensión del programa a personas ajenas al mismo, además, estos comentarios no van a ocupar espacio de programa, ya que son ignorados a la hora de compilar.
La línea de comentarios tienen la misma función que los bloques de comentarios, la única diferencia es que las líneas de comentarios suelen usarse para comentar instrucciones ya que solo afectan a una línea.
int x = 10; //declara la variable 'x' como tipo entero de valor 13
Programación y conceptos básicos
Las variables son elementos donde se almacenan valores numéricos que serán usados por el programa. Como su nombre indica, las variables van a cambiar de valor con la evolución del programa y nos van a permitir crear la lógica del programa en función de estos cambios.
int variable_entrada = 0; //declara una variable y le asigna el valor 0 variable_entrada = analogRead(2); //la variable toma el valor de la entrada analógica 2
Una variable debe ser declarada y opcionalmente asignarle un valor antes de ser usada por el programa, si no hemos declarado la variable o lo hemos hecho con posterioridad a su uso va a dar un error al compilar el programa.
Es recomendable asignarle un valor inicial a las variables para no tener un valor indeterminado que pudiera ocasionar algún error a la hora de la ejecución del programa.
Cuando se asignen nombres a las variables, se deben de usar nombres que identifiquen claramente a dichas variables, para ello se usan nombres como "pulsador", "led", "entrada_1".... esto va a ayudar a hacer un código legible y fácil de entender.
Las variables pueden ser declaradas en diferentes lugares del programa, en función del lugar donde sean declaradas, las variables van a ser de tipo global o local, determinando esto el ámbito de aplicación o la capacidad de ciertas partes del programa para hacer uso de las mismas.
Una variable global es aquella que puede ser vista y utilizada por cualquier función yestamento de un programa. Las variables globales se declaran al comienzo del programa, antes de la función setup().
Una variable local es aquella que se define dentro de una función o como parte de un bucle. Solo será visible y podrá utilizarse dentro de la función o bucle donde es declarada.
La existencia de variables globales y locales, permite el uso de variables con el mismo nombre en partes diferentes del programa, estas variables podrán almacenar valores distintos sin que se produzca ningún conflicto, ya que a las variables locales solo tendrán acceso las funciones donde se declaren dichas variables.
Programación y conceptos básicos
Si queremos definir una constante, podemos hacerlo de manera muy similar a como definíamos las variables, tan solo hay que indicar al programa que se trata de un valor "no modificable", para ello hay que añadir antes del "tipo" la palabra " const ", que va a hacer que la variable sea de solo lectura.
const float pi = 3.1415; //crea una constante de tipo "float" y le asigna el valor 3.
Es posible crear constantes usando #define , esta sentencia va a nombrar las constantes antes de ser compiladas por Arduino. Las constantes creadas de esta manera no van a ocupar memoria de programa, ya que el compilador va a remplazar estas constantes con el valor definido en el momento de compilar.
#define pi 3.1415 // crea una constante usando #define a la que le asigna el valor 3.
Hay que tener cuidado a la hora de usar #define , ya que la sintaxis es diferente, no hay que poner el operador de asignación "=" ni cerrar sentencia con el punto y coma ";".
Usar #define puede ser problemático, ya que si existe en cualquier parte del programa alguna constante o variable con el mismo nombre que tengamos asignado en #define, el programa lo va a sustituir con el valor que tengamos asignado a esta constante, por ello se debe tener cuidado a la hora de asignar constantes con #define y no crear constantes muy genéricas como #define x 10, ya que "x" es muy común usarlo como variable dentro de alguna función o bucle.
Los operadores son los elementos con los que vamos transformar las variables del programa, hacer comparaciones, contar un número determinado de eventos… .Los operadores se pueden considerar como uno de los elementos más importantes junto con las estructuras de control. Dentro de los operadores, podemos encontrarlos de varios tipos.
Los operadores aritméticos son operadores que nos van a permitir realizar operaciones básicas como sumar, restar, dividir, multiplicar...
x = x + 5; //suma x+5 y guarda el valor en x y = y - 8; //resta 8 a el valor "y" almacena el resultado en "y" z = z * 2; //multiplica z*2 y guarda el valor en z k = k / 3; //divide k entre 3 y guarda el valor en k p = 10; // asigna a p el valor 10
Programación y conceptos básicos
Hay que tener en cuenta el tipo de variable que estamos usando a la hora de realizar operaciones, ya que si vamos a efectuar una operación que da como resultado un numero con decimales y hemos definido estas variables como int (entero), el resultado no va a mostrar la parte decimal (10 / 3 va a devolver 3 en lugar de 3.33).
Las asignaciones compuestas combinan una operación aritmética con una variable asignada. Estas asignaciones son usadas comúnmente en bucles.
x ++; //equivale a x = x + 1 (incrementa x en 1) x --; //equivale a x = x - 1 (decrementa x en 1) x += y; //equivale a x = x + y x -= y; //equivale a x = x - y x *= y; //equivale a x = x * y x /= y; //equivale a x = x / y
Los operadores de comparación se usan con frecuencia en estructuras condicionales para comprobar si una condición se cumple o no. Normalmente estos condicionales realizan la comparación entre las variables y constantes del programa.
x == y; //x es igual a y x != y; //x es distinto de y x < y; //x es menor que y x > y; //x es mayor que y x <= y; //x es menor o igual que y x >=y; // x es mayor o igual que y
Son operadores lógicos que se usan para comparar 2 o más expresiones y que no devuelven un valor, sino que dan un estado de “verdadero” (si se cumple la expresión) o “falso” (si no se cumple). Existen 3 operadores lógicos, AND "&&", OR "||" y NOT "!".
if (x<3 && x>0) //Cierto si se cumplen las dos expresiones if (x<7 || x=20) //Cierto si se cumple alguna de las dos expresiones if (!x=3) //Cierto si x es distinto de 3
Programación y conceptos básicos
if (valor < 100) // Si valor es menor que 100 ejecuta la instrucción { ejecuta instrucciones; } else if (valor >=500) // Si valor es mayor o igual que 500 ejecuta la instrucción { ejecuta instrucciones; } else //si no se cumplen las condiciones anteriores, ejecuta esta instrucción { ejecuta instrucciones; }
Los bucles son elementos que hacen que el programa entre en un ciclo de repetición mientras se cumplan las condiciones del bucle.
5.2.1 For El bucle for se usa para repetir un bloque de sentencias un número determinado de veces. Cada vez que se terminan de ejecutar las sentencias encerradas dentro del bucle, se comprobará la condición inicial, repitiéndose el buche mientras se cumpla dicha condición.
for (inicialización; condición; expresión) { ejecuta instrucciones; }
El buche for está formado por 3 partes, la inicialización, la condición del bucle y una expresión (la expresión no es necesaria o puede ponerse dentro de las sentencias del bucle). Ejemplo de bucle for :
for (int x=0; x<10; x++) //declara la variable x y la inicializa a 0, comprueba la //condición (x<10), incrementa x en 1 { digitalWrite (13, HIGH); //envía un 1 al pin 13 delay (500); //espera 500ms digitalWrite (13, LOW); //envía un 0 al pin 13 delay (500); //espera 500ms }
5.2.2 While El bucle while es un bucle que se repetirá constantemente mientras se cumpla la expresión del bucle. Dentro de la expresión del bucle se pueden
Programación y conceptos básicos
usar variables que cambien dentro del propio bucle o que tomen el valor de alguna de las entradas de Arduino que podemos tener asociadas a sensores u otros elementos.
while (sensor < 150) //ejecuta el bucle mientras "sensor" sea menor a 150 { ejecuta instrucciones; }
5.2.3 Do... while El bucle do... while funciona de la misma manera que while , con la única diferencia de que va a ejecutar al menos 1 vez el bucle, ya que la condición del mismo se comprueba al final.
do { sensor = analogRead (1); //asigna a "sensor" el valor de la entrada analógica 1 }while (sensor < 150) //repite el bucle mientras "sensor" sea menor que 150
El lenguaje de programación de Arduino, como muchos lenguajes de programación, ha heredado características de los primeros lenguajes de programación BASIC, estas características incluyen sentencias para el control del flujo como Goto , Return y Break. Estas sentencias no son muy apreciadas a la hora de programar, ya que en muchas ocasiones rompen el flujo de programa y dificultan la comprensión del mismo. Además en lenguajes de programación de alto nivel como el que usa Arduino se pueden usar funciones y otros elementos alternativos para realizar las mismas tareas, aunque conviene conocer la existencia de estas funciones ya que pueden ser de utilidad en algunasocasiones.
5.3.1 Goto Esta sentencia realiza un salto a cualquier parte del programa que este marcada con la etiqueta correspondiente, la posición desde la que realicemos el salto quedará almacenada en la pila del programa para que podamos regresar al lugar desde donde realicemos el salto.
if (x == 110) { goto marca1; //salta a la etiqueta "marca1" }
Programación y conceptos básicos
Antes de empezar a trabajar con Arduino, deben de ser configurados los pines de la placa que vayan a ser usados, asignándolos como entradas o como salidas. En ningún caso un mismo pin podrá hacer de entrada y de salida al mismo tiempo.
La configuración de los pines se hará dentro de la función setup() , estableciendo el modo de trabajo del pin como entrada o como salida.
La instrucción que se utiliza para realizar la configuración de los pines es pinMode , donde habrá que asignarle el pin que queremos configurar y si queremos que actúe como entrada (INPUT) o como salida (OUTPUT).
void setup () { pinMode (10, OUTPUT); //configura el pin 10 como salida }
Los pines de Arduino están configurados por defecto como entradas, por lo que no es necesario indicarles el modo de trabajo si vamos a trabajar con ellos como entradas.
La razón de tener los pines configurados por defecto como entradas, es que las entradas se encuentran en un estado de alta impedancia, lo que va a evitar en muchos casos que dañemos la placa al realizar una mala conexión. Si establecemos un pin como salida y por error entra corriente por dicho pin lo más seguro es que dañemos el microcontrolador de manera irreversible.
Programación y conceptos básicos
Los pines que tengamos configurados como salida (OUTPUT) van a suministrar una corriente máxima de 40mA por separado, sin que la corriente total de las salidas pueda superar los 200mA. Esta corriente es suficiente para hacer brillar un led, pero insuficiente para activar elementos de mayor potencia.
Los pines asignados a E/S digitales, son pines que trabajan con dos estados HIGH (alto) o LOW (BAJO). Según el modelo de Arduino que estemos usando, va a tomar el estado HIGH (alto) como 5v o como 3.3v, el estado LOW (bajo) está asociado a un nivel de voltaje 0.
6.1.1 Lectura de entradas digitales (digitalRead) Al hacer una lectura digital, vamos a leer el valor de un pin almacenando el resultado como HIGH (alto o 1) o como LOW (bajo o 0).
valor = digitalRead (pin); //la variable "valor" toma el estado asociado al pin
Podemos especificar el pin asignándole directamente la numeración del pin digital que queremos leer o con una variable o constante previamente definida.
6.1.2 Escritura de salidas digitales (digitalWrite) Cuando hacemos una escritura digital vamos a mandar al pin definido previamente como salida el valor HIGH o LOW. El valor HIGH se va a traducir (en función del tipo de Arduino) por una señal de 5 o 3.3 voltios.
digitalWrite (pin, HIGH); //Establece el pin en estado alto (5 o 3.3v)
Ejemplo E/S digital
#define led 13 //asigna a "led" el valor 13 #define pulsador 7 //asigna a "pulsador" el valor 7 boolean valor;
void setup () { pinMode (led, OUTPUT); //establece led (pin 13) como salida pinMode (pulsador, INPUT); //establece pulsador (pin 7) como entrada }
Programación y conceptos básicos
El nivel de tensión que tendremos a la salida del pin, va a ser igual al nivel de tensión promedio proporcional al ancho de los pulsos.
Como se observa en la imagen superior, variando en ancho del pulso, podemos obtener una señal promedio equivalente. Para la primera señal, cuyo ancho de pulso es del 10%, nos daría una señal analógica de 0.5v (el 10% de 5V), para la segunda una señal de 2.5v y para la tercera señal obtendríamos una señal equivalente de 4.5v.
Las salidas analógicas trabajan con registros de 8bit's, o lo que es lo mismo, pueden tomar valores comprendidos entre 0 y 255, correspondiendo el 0 a un nivel de 0 voltios y el 255 al máximo voltaje (5 o 3.3 voltios dependiendo de la placa que estemos usando).
analogWrite (pin, valor); //saca por el pin el nivel de tensión equivalente a valor
Cuando trabajemos con entradas y salidas analógicas hay que tener en cuenta que al realizar una lectura analógica el resultado se guarda en una variable de 10 bit's, pero la escritura se hace con una variable de 8 bit's, por lo que si queremos usar el valor leído para escribir en algún pin, primero deberemos de adaptar la variable de 10 a 8 bit's, si no hacemos esto, el valor que escribamos va a estar fuera de rango y no va a mostrar el nivel de tensión correcto.
Programación y conceptos básicos
Arduino cuenta con una serie de pines que tienen la capacidad de comunicarse con otros dispositivos usando la comunicación serie para ello. Con esta comunicación serie se puede realizar también una comunicación con el ordenador a través del USB gracias al chip FDTI que incorpora la placa y que realiza la conversión USB-serie.
La capacidad de comunicarse con otros dispositivos, hace de Arduino una herramienta muy potente, ya que se pueden crear proyectos muy complejos con multitud de dispositivos que se comuniquen e interactúen entre sí, pero cuando se empieza a programar, es mucho más interesante el poder establecer una comunicación entre nuestro ordenador y Arduino, ya que de esta forma podemos intercambiar información con la placa, pudiendo ver cómo evolucionan las variables del sistema y de esta forma poder detectar posibles problemas de programación.
Para poder utilizar el puerto serie hay que inicializarlo estableciendo la velocidad de la conexión. Esta inicialización se hace siempre dentro de la función setup().
Un valor típico para realizar la conexión es 9600 baudios , aunque se pueden asignar otros muchos valores.
void setup () { Serial.begin (9600); //abre el puerto serie estableciendo la velocidad en 9600 } //baudios
Según el modelo de Arduino que estemos usando, puede tener 1 o más puertos para la comunicación serie, estos puertos estarán numerados y deberán de abrirse de manera independiente según los que queramos usar.
En el Arduino MEGA se disponen de 4 puertos para la conexión serie, si se desean abrir los 4 puertos el programa quedará de la siguiente manera:
void setup () { Serial.begin(9600); Serial1.begin(9600); Serial2.begin(9600); Serial3.begin(9600); }