Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Apuntes Arduino, Apuntes de Electrónica Digital y Analógica

Asignatura: Electrònica digital, Profesor: , Carrera: Enginyeria Electrònica Industrial i Automàtica, Universidad: UPV

Tipo: Apuntes

2015/2016

Subido el 26/11/2016

elena_alvarez-3
elena_alvarez-3 🇪🇸

5

(2)

1 documento

1 / 30

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Arduino
Nivel Pardillo
Apuntes de
ARDUINO
Nivel Pardillo
Daniel Gallardo García
Profesor de Tecnología del IES Laguna de Tollón
DGG 1 de 30
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e

Vista previa parcial del texto

¡Descarga Apuntes Arduino y más Apuntes en PDF de Electrónica Digital y Analógica solo en Docsity!

Nivel Pardillo

Apuntes de

ARDUINO

Nivel Pardillo

Daniel Gallardo García

Profesor de Tecnología del IES Laguna de Tollón

Nivel Pardillo

1. ¿QUÉ ES ARDUINO?

Arduino es una placa o tarjeta controladora, con una serie de entradas y salidas, y que se programa a través del ordenador mediante un lenguaje de programación. Veamos qué elementos componen una Arduino UNO : Alimentación: Arduino puede estar alimentado por dos vías: conexión USB (que proporciona 5 V). jack de alimentación (que normalmente será una pila de 9 V o fuente de alimentación, que se recomienda que esté entre 7 – 12 V). Los pines de alimentación son para alimentar los circuitos la placa de prototipos o breadboard o protoboard : 3.3 V proporciona una tensión de 3,3 V, y una intensidad máxima de 50 mA. 5 V proporciona una tensión de 5 V, y una intensidad máxima de 300 mA. GND es la toma de tierra, o nivel 0 V de referencia. Vin proporciona la tensión máxima con la que está alimentado Arduino. Valores de entrada y de salida: en función de cómo esté siendo utilizado en pin, tendremos: Salida y entrada digital: los valores de salida pueden ser o 0 V ( LOW ) o 5 V ( HIGH ), y se interpretará una entrada de entre 0 y 2 V como LOW y de entre 3 y 5 V como HIGH. Salida analógica: los valores de salida van desde 0 V a 5 V en un rango de 0 a 255 (precisión de 8 bits) valores intermedios. Entrada analógica: los valores de entrada van desde 0 V a 5 V en un rango de 0 a 1023 (precisión de 10 bits) valores intermedios. La intensidad máxima de todos estos pines es de 40 mA.

Nivel Pardillo Dominio de una variable : si declaro una variable al comienzo del programa, podré emplear dicha variable en cualquier momento (dentro de cualquier función o bloque de programa), pero si declaro una variable dentro de una función, sólo se podrá utilizar en dicha función. Poner nombre a las variables : Por último, una última consideración: a la hora de poner un nombre a una variable es recomendable utilizar alguna palabra que nos ayude a reconocer qué se está almacenando en ella, y en caso de utilizar dos o más palabras se suele emplear la notación de joroba de camello (poner en mayúscula la primera letra de las siguientes palabras). Ejemplos son: ledPin estadoAnterior cuentaPulsaciones miVariable lecturaSensor ledPinAzul parte : Configuración de Arduino void setup() {…} En este bloque habrá que especificar: Qué pines van a ser empleados como entrada y cuáles como salida. pinMode(2,OUTPUT); //utilizaré el pin 2 como salida Digital. pinMode(3,OUTPUT); //utilizaré el pin 3 como salida Digital o Analógica. pinMode(8,INPUT); //utilizaré el pin 10 como entrada Digital. Las entradas analógicas no hacen falta incluirlas en el setup, puesto que esos pines (A0, A1, A2, A3, A4, A5) solo pueden ser entradas analógicas. Si vamos a querer establecer una conexión con el ordenador. Serial .begin(9600); /*hay que especificar los baudios (bits por segundo) a la que va a realizarse dicha comunicación Arduino-PC */ Si vamos a querer utilizar número aleatorios. randomSeed(0); //se inicia la generación de número aleatorios. parte : Comandos que regirán el comportamiento de Arduino void loop () {…} En este bloque se deberá escribir todas aquellas instrucciones, órdenes, primitivas, comandos o funciones necesarias para que Arduino funcione según nuestro deseo. Realmente, este bloque constituye un bucle infinito, ya que Arduino, mientras esté alimentada con energía, funcionará haciendo el programa loop una y otra vez. Iremos viendo cuáles son estas funciones durante el desarrollo de estos apuntes.

Nivel Pardillo

3. SALIDAS DIGITALES digitalWrite(4,HIGH);

Podemos indicar a Arduino que en un pin determinado coloque un “ 0 ” o un “ 1 ” lógico (que serán 0 V o 5 V) mediante los siguientes comandos, respectivamente: digitalWrite(12,LOW); digitalWrite(12,HIGH); Ejemplo 1. Parpadeo de un LED Conectaremos un diodo LED en el pin 3. Siempre que conectemos un LED a una salida de Arduino debemos hacerlo en serie con una resistencia de valor comprendido entre 100 y 1K para evitar que una intensidad demasiado elevada destruya dicho LED: El programa que utilizaremos será el siguiente: Vemos que ha aparecido una nueva instrucción: delay ( milisegundos ); delay(1000); //realiza una pausa en el programa de 1000 ms

Nivel Pardillo Emplea una variable (en este caso i) que se inicia (asignándole un valor inicial, en este ejemplo i=7). Dicha variable va incrementándose cada vez que se repite el for. El incremento puede expresarse así: i=i+5 //el valor de i se incrementa en 5 i+=5 //el valor de i se incrementa en 5 (es otra forma) i=i+1 //el valor de i se incrementa en 1 i+=1 //el valor de i se incrementa en 1 (es otra forma) i++ //el valor de i se incrementa en 1 (sólo para incremento +1) i=i-1 //el valor de i disminuye en 1 i-=1 //el valor de i disminuye en 1 (es otra forma) i-- //el valor de i disminuye en 1 (sólo para incremento -1) i=i3 //el valor de i se multiplica por 3 i=3 //el valor de i se multiplica por 3 (es otra forma) i=i/2 //el valor de i se divide entre 2 i/=2 //el valor de i se divide entre 2 (es otra forma) El bucle for se repetirá siempre y cuando se siga cumpliendo la condición. for(i=7; i<=11; i ++) { } hará un primer ciclo con el valor i=7. Después de hacer todo lo que está entre las llaves, incrementará en 1 el valor de i. ¿Es i (ahora 8) menor o igual que 11? Como la respuesta es sí, volverá a hacer el bloque. Cuando termine el ciclo con valor i=11, la i se incrementará en 1 (valdrá 12). En ese momento ya no cumplirá la condición y el programa se saldrá del bucle for. Otra observación es que, como la variable i solo se va a utilizar dentro del for (y en ninguna otra parte del programa) puedo declararla en ese mismo momento: for(int i=7; i<=11; i++) { }

4. SALIDAS ANALÓGICAS analogWrite(5,128);

Podemos indicar a Arduino que en un pin determinado coloque un valor de tensión comprendido entre 0 V y 5 V, pudiendo seleccionar entre 256 valores intermedios posibles (de 0 a 255 ), empleando la siguiente orden: analogWrite(11,214); /* coloca en el pin 11 un valor de salida de 214, que equivale a unos 4,2 V */ Realmente, la señal analógica de salida no es analógica en sí, sino un PWM. Esto significa que la salida es una señal modulada por pulsos, formada por una serie de pulsos (de valor 5 V) repartidos durante un tiempo determinado de tal forma que el valor promedio de la señal de salida se hace coincidir con el de la señal analógica que se persigue imitar. Es importante tener esto presente para comprender el funcionamiento de Arduino y, por ejemplo, de los transistores conectados a ella.

Nivel Pardillo Ejemplo 3. Parpadeo de un LED cuya intensidad será gradual Se trata ahora de que el LED brille de forma gradual: de menos intensidad a más, y cuando alcance su máximo brillo comience a disminuir, y así sucesivamente. El programa será el siguiente: int brillo=0; //declaro la variable brillo, con valor inicial= int incremento=5; //declaro la variable incremento, con valor= int ledPin=9; void setup () { pinMode(ledPin,OUTPUT); //el pin 9 será la salida } void loop () { analogWrite(ledPin, brillo); //coloca el valor brillo en el pin 9 brillo = brillo + incremento; //brillo aumenta su valor en 5 if(brillo==0 || brillo==255) { //si brillo llega a sus límites... incremento = -incremento; //...pasamos de ir creciendo a pasar... //...a ir decreciendo y al revés } delay(30); /*hay que dar un pequeño tiempo entre valor y valor de brillo para que la variación no sea instantánea */ } Vemos que ha aparecido una nueva estructura , la condicional : if ( condición ) { ... } if(x>=5) { } Entre los paréntesis pondremos una condición, y en caso de cumplirse, se ejecutarán los comandos que estén dentro de las llaves. Si solamente se va a escribir un único comando, pueden omitirse las llaves: if(x!=4) digitalWrite(pinLed,HIGH);

Nivel Pardillo

5. ENTRADAS DIGITALES digitalRead(5);

Debemos indicar a Arduino qué pin vamos a emplear como entrada digital. Dicha señal de entrada podrá tener dos valores: LOW o HIGH. x = digitalRead ( 3 ); //asigna a x el valor lógico que Arduino lee en el pin 3 Cualquier sensor que tenga dos posibles valores distintos puede emplearse como entrada digital. Podemos hacer una entrada digital con un pulsador o interruptor a través de una resistencia de drenaje (pull down), normalmente de 10K. Debemos tener en cuenta que Arduino va a percibir todo el transitorio (sobreoscilación o bouncing) cada vez que el pulsador sea accionado, en el cambio de 0 a 5 V. Eso significa que durante un muy breve periodo de tiempo, el valor en la entrada puede oscilar. El esquema de un pulsador doble es el siguiente: Ejemplo 4. Contador de pulsaciones con codificación binaria en 3 LEDs Este montaje consta de 3 LEDs, que reflejarán el número de veces que ha sido accionado un pulsador, codificando dicho número en binario, es decir, contará desde 0 a 7. El programa que controla este proyecto es el siguiente:

Nivel Pardillo int val; //no hace falta asignarle un valor inicial int x=0; //será el número de pulsaciones void setup () { pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); pinMode(13,INPUT); //configuro el pin 13 como entrada digital } void loop () { val=digitalRead(13); //asigno a val el valor de lectura del pin 13 if(val==HIGH) x=x+1; //detecta una pulsación y la suma a la cuenta if(x==8) x=0; //si llegamos a 8, hacemos que inicie la cuenta if(x==1 || x==3 || x==5 || x==7) digitalWrite(6,HIGH); //condición para encender el tercer bit else {digitalWrite(6,LOW);} if(x==2 || x==3 || x==6 || x==7) digitalWrite(7,HIGH); //condición para encender el segundo bit else {digitalWrite(7,LOW);} if(x==4 || x==5 || x==6 || x==7) digitalWrite(8,HIGH); //condición para encender el primer bit else {digitalWrite(8,LOW);} delay(200); /*espero 200ms para que no cuente más de una vez la misma pulsación */ } Como vemos, se suele utilizar estas entradas con la función if (condicionante). Recordemos que la lectura digital de una entrada sólo puede tomar dos valores: LOW y HIGH. Ejemplo 5. Cambiar el estado de un LED (ON/OFF) con un pulsador Un montaje muy sencillo sería controlar el encendido de LED con un pulsador si el funcionamiento fuera que mientras esté pulsado el botón, esté encendido el LED, y cuando se deje de accionar el LED se apagara. Pero este es otro ejercicio más complicado: sería utilizar el pulsador a modo de interruptor. En este caso el LED pasará a estar encendido o a estar apagado cada vez que accionemos el pulsador. Para determinar esto, crearemos una variable (estado) que deberá cambiar cada vez que apretemos el pulsador, pero… ¿qué ocurre si estoy apretando el botón bastante tiempo? Hasta que no vuelva a apretar no debería cambiar el estado, y la solución no puede ser introducir un delay(1000) porque puede darse el caso de que se apriete dos veces el botón en un intervalo de tiempo muy pequeño y el programa no reconociera las dos pulsaciones. La solución a esto es crear dos variables: val y valAnterior, que permitirán determinar si ha habido o no una acción de cambiar el estado del pulsador o no. El programa puede ser el siguiente: int val=0; //almacenará la lectura del pulsador: ON u OFF int valAnterior=0; //almacenará una lectura justamente anterior int estado=0; //¿qué toca ahora, encender o apagar el LED?

Nivel Pardillo El programa para este circuito puede ser el siguiente: int val; int ledPin=9; void setup (){ pinMode(ledPin,OUTPUT); } void loop (){ val=analogRead(A0); //hago la lectura analógica en el pin A val=val/4; //divido entre 4 dicho valor analogWrite(ledPin,val); //pongo en la salida este último valor delay(100); } Es importante conocer el motivo de por qué se divide entre 4 el valor de la lectura antes de ponerlo en la salida: recordemos que un valor de entrada puede oscilar entre 0 y 1023 (es decir, 10 bits), pero la salida debemos limitarnos a un valor comprendido entre 0 y 255 (es decir, 8 bits). ¿Qué ocurriría si no hago esta escala de valores? Pues que el valor de salida, una vez sobrepasado el valor 255, pasaría al otro extremo del intervalo, es decir, volvería al 0: 256=0, 257=2, 258=3, 259=4, 260=5, …, 510=254, 511=255. De igual modo, una salida por debajo de cero volvería a dar la vuelta al intervalo: -1=255, -2=254, -3=253, …, -256=0. Otra forma de hacer este escalado (o mapeo) de valores, es a través de la función map , que mapea un rango inicial de valores a otro rango final de valores: x = map(val,0,1023,0,255);

Nivel Pardillo Si no quiero utilizar una nueva variable, puedo reasignar la variable val al nuevo valor mapeado: val = map(val,0,1023,0,255); Otro aspecto a tener en cuenta es que nuestra entrada, tal y como está construida (con un divisor de tensión) nunca alcanzaría los valores máximo y mínimo (quizás tenga un rango entre 345 y 831, por ejemplo). Si queremos que la intensidad de brillo de nuestro LED pueda oscilar entre todo su rango posible, se hace necesario la función map (no sería suficiente dividir entre 4): val = map(val,345,831,0,255); Debo tener presente que cuando realice un mapeo, y me salga fuera del rango de entrada, Arduino da la vuelta y aparece por el otro extremo, es decir, si considero el ejemplo: val = map(val,50,70,0,255); un valor de entrada de 45, daría el equivalente a una entrada de 65. También puede ser muy útil, a la hora de evitar salirnos de los rangos habituales de uso, la función constrain ( variable , valorMínimo , valorMáximo ) : x = constrain(val,a,b); asigna a x el valor de val siempre y cuando val esté comprendido entre a y b. En el caso de que val salga de dicho intervalo, tomará los valores extremos de este: si a<val<b, entonces x = val si val<a, entonces x = a si val>b, entonces x = b Ejemplo 7. La luz avanza por 4 LEDs en función de un potenciómetro El potenciómetro es otro sensor de entrada muy usado. Consta de una resistencia variable, que dependerá de la posición de giro en que se encuentre su consola (o mango). Es muy importante conectar el potenciómetro de manera correcta para

Nivel Pardillo void setup (){ pinMode(led1,OUTPUT); pinMode(led2,OUTPUT); pinMode(led3,OUTPUT); pinMode(led4,OUTPUT); pinMode(led5,OUTPUT); } void loop (){ val=analogRead(A0); //repartiré los 1023 valores posibles en 5 tramos if(val>=0 && val<204) { digitalWrite(led1,HIGH); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); digitalWrite(led4,LOW); } if(val>=204 && val<408) { digitalWrite(led1,LOW); digitalWrite(led2,HIGH); digitalWrite(led3,LOW); digitalWrite(led4,LOW); digitalWrite(led4,LOW); } if(val>=408 && val<612) { digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,HIGH); digitalWrite(led4,LOW); digitalWrite(led4,LOW); } if(val>=612 && val<816) { digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,HIGH); digitalWrite(led4,LOW); } if(val>=816 && val<1023) { digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); digitalWrite(led4,HIGH); } } Como vemos, es un simple programa que divide el rango de entrada (que va desde 0 hasta 1023) en 5 posibilidades. En función del valor de lectura del potenciómetro, encenderá el LED correspondiente. Otra estructura que se podría haber utilizado es: switch switch(val) { /*el programa cogerá un camino u otro en función del valor de la variable val / case 3: …; //en caso de que val==3 … break; //provoca la salida del bloque switch (opcional) case 12: …; //también se puede poner como case(val==12): break; … default: …; /en caso de no cumplirse ningún case, ejecutará las funciones que se incluyan en el default */ }

Nivel Pardillo En el caso de que tenga que comparar la variable con un caracter , deberé ponerlo de la siguiente forma: case(val==’A’): //es el caso en el que la variable es igual a la letra A Veamos cómo quedaría el void loop () del proyecto anterior utilizando la estructura switch: void loop (){ val=analogRead(A0); val=map(val,0,1023,0,4); switch(val) { case 0: digitalWrite(led1,HIGH); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); digitalWrite(led4,LOW); break; case 1: digitalWrite(led1,LOW); digitalWrite(led2,HIGH); digitalWrite(led3,LOW); digitalWrite(led4,LOW); digitalWrite(led4,LOW); break; case 2: digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,HIGH); digitalWrite(led4,LOW); digitalWrite(led4,LOW); break; case 3: digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,HIGH); digitalWrite(led4,LOW); break; case 4: digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); digitalWrite(led4,HIGH); break; } }

7.COMUNICACIÓN ARDUINO-PC Serial.begin(9600);

En muchas ocasiones es muy útil poder visualizar a través del ordenador los valores de lectura en los pines de entrada y de salida de Arduino. Asimismo, también puede ser necesario mandar información a Arduino desde el teclado del PC. Veamos cómo poner en contacto ambos aparatos: Antes de nada, debemos configurar en el void setup () que vamos a establecer dicha comunicación, utilizando la orden Serial.begin( ) void setup ( ) { Serial. begin(9600); //se especifica los baudios, normalmente 9600 } //recordemos que 1 baudio = 1 bit/segundo Luego, dentro del void loop () podemos utilizar las siguientes funciones:

Nivel Pardillo

8. MOTORES DE CORRIENTE CONTINUA (DC motor) Un motor de corriente continua es un actuador que consume una intensidad relativamente elevada. La intensidad de corriente máxima que Arduino puede suministrar por un pin de salida es de 40 mA. Así pues, para poder gobernar a un DC motor, así como a cualquier otro actuador de considerable potencia, podemos utilizar:

  • un transistor.
  • un relé.
  • un integrado L293D (consiste en un puente H de diodos, específico para el control de motores de corriente continua, inclusive el cambio de giro). 1. Transistor BD Éste es un transistor npn de mediana potencia, y a diferencia del BC547, puede soportar intensidades mayores. Debemos saber muy bien en qué patilla está situado el Emisor, el Colector y la Base (la palabra EsCoBa nos ayudará a recordarlo). Podemos realizar las siguientes conexiones: Quizás, la más recomendada sea la primera opción (utilizando una resistencia de base).

Nivel Pardillo El diodo se utiliza para evitar las corrientes inducidas por las bobinas del motor, así que, en la medida de lo posible, debemos ponerlo (recordemos que la línea plateada corresponde al cátodo del diodo). Con este montaje podemos controlar , tanto el encendido como el apagado del motor, así como su velocidad (utilizando un PWM como salida), y siempre girando en el mismo sentido. Recordemos que la salida modulada por pulsos es una imitación a una señal analógica formada por una serie de pulsos repartidos durante un tiempo determinado (los pulsos de salida son de 488 Hz). Esto supone que en este montaje del control de un motor a través de un transistor, si realmente se tratara de una salida analógica, o bien se coloca al transistor en corte o bien en saturación (no se podría controlar la velocidad del motor, sólo ponerlo en ON y en OFF); pero lo que ocurre realmente es que el “valor analógico” de la salida se transforma en una serie de pulsos (5V) repartidos durante cada pulso para que resulte un equivalente en su Vmedia, y durante esos picos, el transistor se satura e irá dando “impulsos de corriente” al motor, cuyo efecto final será el de girar a una velocidad controlada.

2. Relé Un relé es un dispositivo electromecánico que permite gobernar el paso o no de corriente en un circuito independiente al circuito que utilizamos para el control. La conexión debe realizarse de la siguiente forma: