Arduino

introducción a Arduino

En la imagen anterior se puede ver una imagen de Arduino.

Se pueden diferenciar las distintas conexiones que tiene entre las que hay 13 patitas de conexión de entrada o salida digital (opción configurable por el usuario al inicio del programa) que permiten conectar LED, pulsadores y otros dispositivos, que solo pueden tener dos estados (on-off, pulsado-no pulsado, verdadero-falso, etc). Son señales que manejan voltajes de 0V (off) ó 5V (on).

También hay 6 entradas analógicas, conexiones de voltajes de 5V, 3,3V, GND, un conector de alimentación externa y un puerto USB para conectarlo al ordenador.

comandos de Arduino

En la tabla de más abajo se pueden ver los comandos utilizados en los programas de Arduino, así como los tipos de variables que se pueden utilizar y las sentencias de control.

Imprime esta hoja para tenerla como hoja de referencia cuando estés programando con Arduino.

entorno de programación

Arduino IDE

Entorno de programación oficial de Arduino. Con este software se programa la placa real de Arduino

Tinkercad - Online

Entorno de programación on-line. Es un simulador que permite trabajar con Arduino sin necesidad de tener la placa físicamente. Permite añadir multitud de componentes electrónicos a la simulación y hacer pruebas simuladas antes de programar el Arduino real.

Es una herramienta gratuita que nos ofrecen desde la página de Autodesk.

estructura básica de un programa de Arduino

El código de programación básico se divide en dos grandes bloques, inicialización y ejecución.

La parte de inicialización es void setup(), en donde se definen como se van a utilizar las entradas y salidas de Arduino. Se ejecuta una sola vez al inicio del programa.

La parte de ejecución es void loop(), es donde estará definido el programa que se quiere ejecutar de marera repetida. Se ejecuta en modo bucle, es decir, cuando termina de ejecutarse la última línea se vuelve otra vez a ejecutar el programa desde el principio del void loop().

salida digital con Arudino

En el siguiente programa se puede ver como encender y apagar un LED conectado a la salida digital 3 de Arduino.

Para utilizar un pin digital de Arduino, lo primero que hay que hacer es indicar si el pin va a trabajar como salida o entrada a Arduino.

Un pin digital en modo salida sirve para conectar LED, motores, relés, altavoces, etc.

Un pin digital en modo entrada sirve para conectar un pulsador, final de carrera o sensores en general.

La función para configurar el modo de un pin es "pinMode( pin, modo);". En pin se indica el número de patilla y en modo hay que indicar OUTPUT se va a actuar en modo salida o INPUT si va a actuar en modo entrada.

En el siguiente programa se puede ver un ejemplo de uso del pin 3 como salida para controlar el encendido y apagado de un diodo LED. En este caso hay que poner pinMode( pin, OUTPUT);

void setup() {

pinMode(3 , OUTPUT);

}

void loop() {

digitalWrite(3 , HIGH); // Encendemos la salida

delay(1000); // Esperamos de 1000 mS encendido

digitalWrite(3, LOW); // Apagamos la salida

delay(1000); // Esperamos de 1000mS apagado

Para encender el diodo LED hay que poner el pin de Arduino a nivel alto (HIGH - 5 Voltios) y para apagarlo a nivel bajo (LOW - 0 Voltios). La instrucción de Arduino para hacer es digitalWrite(pin, nivel);, en donde pin es el número de patilla en donde está conectado el elemento a controlar y nivel puede ser HIGH o LOW.

La orden delay(1000); introduce un retardo de 1000mS para que de tiempo a ver el encendido o apagado del LED. Si no se pone, el encendido y apagado de la salida es tan rápido, que nuestro ojo no podría apreciar el cambio de estado de la salida.

Entrada digital con arduino

En este caso la configuración de la patilla digital de Arduino hay que hacerla en modo INPUT. Es similar al punto anterior pero el pin actúa en modo entrada en lugar de en modo salida. Hay que poner pinMode( pin, INPUT);

Además de configurar el pin en modo entrada hay que montar el pulsador de entrada como se ve en las siguientes figuras.

Es importante recalcar que hay una resistencia conectada al pin de Arduino para establecer el nivel predeterminado de voltaje a la entrada, que puede ser de nivel alto (HIGH - Pull Up) o bajo (LOW - Pull Down) según se desee. Cuando se pulsa el pulsador ese nivel predeterminado se cambiará al nivel contrario, indicador de que Arduino debe hacer un cambio en su programación.

NOTA: Esto mismo se puede hacer sin la resistencia externa, ya que Arduino tiene internamente la resistencia de Pull-Up y de Pull-Down y se pueden configurar sin problemas. En este caso veo más didáctico hacerlo con la resistencia externa y posteriormente, cuando se entienda el concepto, utilizar las resistencias internas de Arduino.

La lectura del pin de Arduino se realiza con la función digitalRead(pin); que devuelve como resultado una respuesta con el valor HIGH o LOW indicando el estado de la entrada actual.

Aquí se pueden ver las dos maneras de conectar un pulsador a la patilla digital de Arduino. En este caso la patilla digital actuará como una entrada.

En las siguientes imágenes se pueden ver dos ejemplos de código de programación para la lectura del pulsador y el encendido de un LED cuando se activa el pulsador.

Observar que el estado del pulsador se guarda en la variable pulsador y luego se evalúa con la sentencia if().

La sentencia if es una sentencia de control que evalúa una condición. Si se cumple la condición se ejecuta el código que hay entre las llaves de más abajo. Si no se cumple la condición no se ejecuta el código que está entre las llaves de más abajo y se pasa a ejecutar el código posterior a estas o bien la sentencia else si existe. Se explicará más adelante.

El segundo código se utilizan nombres para identificar las patillas en lugar de utilizar números y que así el programa sea más entendible para el programador y para el que lea el código del programa.

Esto se puede hacer de dos maneras. La primera manera sería utilizando la directiva de preprocesador #define, que establece un valor numérico constante a lo largo del programa y la segunda utilizando variables que además nos permite guardar el número dentro y poderlo cambiar a lo largo del programa.

Modo1: #define LED 2 Establece el nombre LED, que se sustituirá en el programa por el número 2 cuando se compile el programa.

Modo2: int LED=2; Define la variable de tipo entero con el nombre LED y se le asigna un valor predeterminado de 2. Este valor puede cambiar a lo largo del programa y tomar valores de entre -32768 y 32767 o entre 0 y 65535 si es de tipo unsigned int.

En este vídeo puedes estudiar varias sentencias de control de Arduino, ver como funciona cada una y las diferencias entre ellas.

Las sentencias son:

if - Sentencia de ejecución condicional SI

if-else - Sentencia de ejecución condicional SI y SINO

while - Bucle de control.

switch - Sentencia de ejecución de múltiples opciones

Salida pwm con arduino

El modo de trabajo PWM se utiliza con las salidas digitales de Arduino para controlar servomotores o simular una salida analógica modificando el ciclo de trabajo de una señal digital.

Estas salidas se pueden utilizar para hacer encendidos de LED de manera progresiva o controlar la velocidad de giro de un motor.

"Es importante recordar que en una salida PWM el valor de tensión realmente es Vcc (5V). Por ejemplo, si estamos alimentando un dispositivo que necesita 3V, y usamos una salida PWM de 5V, en realidad estaremos suministrando 5V durante un 60% del tiempo y 0V durante el resto de tiempo. Con esto lo quemaremos, ya que le aplicamos 5V con la salida PWM. "

Se utilizará la función "analogWrite(pin, valor);" En donde valor puede tomar los valores entre 0 y 255.

Dependiendo de que valor se le dé al pin se obtendrá a la salida un porcentaje de voltaje medio que se puede calcular mediante una sencilla regla de tres.

En la imagen se ponen tres ejemplos, con valores 100, 128 y 40, respectivamente.

Eso hará que el LED conectado a la salida digital se encienda con una iluminación que corresponderá al porcentaje calculado.

LED RGB:

Este diodo LED tiene en su interior tres LED que se pueden encender de manera independiente con los colores rojo, verde y azul (Red, Green, Blue).

Se los LED se encienden de manera simultánea se obtendrán mezclas de colores, de tal manera que se puede representar cualquier color deseado si se elige la combinación correcta.

Para controlar este LED se necesitan utilizar 3 salidas PWM de Arduino

NOTA: Las resistencias de polarización utilizadas para los tres diodos deben ser del mismo valor. Así se conseguirán colores fieles a la tabla de colores que se muestra más abajo.

Como con Arduino se puede dar un nivel de intensidad a cada color dentro de 256 posibles niveles y tenemos 3 colores, la gama de colores que se puede conseguir es de:

255 x 255 x255 = 16.581.375 Colores. Es lo que se conoce como color verdadero de una imagen.

En una pantalla de PC o TV, que está compuesta por varios miles de Pixel o LED RGB para formar una imagen

En la tabla de más abajo se pueden ver varios ejemplos de colores conseguidos dependiendo de la combinación de colores elegida.

Tabla de colores RGB:

En esta tabla se puede observar los valores numéricos con los que hay que encender cada LED RGB para obtener el color deseado.

Esto se puede hacer con un programa en Arduino cuando se conecta un LED RBG a tres salidas PWM en las que se de como salida los códigos de color deseado en el programa en cuestión.

sonidos con buzzer y arduino

Hay dos tipos de altavoces que se pueden utilizar con Arduino.

Para activar un buzzer activo solo es necesario poner 5V en su entrada y ya generará un tono de sonido

Para activar un buzzer pasivo hay que generar un tono de sonido con Arduino, activando y desactivando la salida digital a una velocidad suficientemente alta como para que sea audible. Hay una función de Arduino ya preparada para esta función y que se presenta más abajo.

Buzzer Activo (Solo con alimentarlo suena)

Buzzer Pasivo

(Necesita un tono de sonido para funcionar)

Se utilizarán las siguientes funciones para hacer sonar el buzzer a una frecuencia determinada. usar las salidas PWM.

tone(pin, frecuencia); //activa un tono de frecuencia determinada en un pin dado

noTone(pin); //detiene el tono en el pin

tone(pin, frequencia, duracion); //activa un tono de frecuencia y duración determinados en un pin dado

Ver los siguientes ejemplos de uso del buzzer

altavoz conectado en el Pin9 para generar una función de 440Hz durante un segundo, pararlo durante 500ms, y finalmente un tono de 523Hz durante 300ms, para repetir el programa tras una pausa de 500ms.

Este programa emplea un array con frecuencias que recorremos secuencialmente para realizar un barrido que aproxima las distintas notas musicales.

manejar relés con arduino

Puesto que una salida digital de Arduino no puede manejar intensidades superiores a los 20mA, no se podrá activar directamente un relé a la salida de Arduino sin la ayuda de un circuito amplificador de corriente.

En el caso que se indica más abajo, este amplificador de corriente se construye con un transistor bipolar NPN. Puede utilizarse cualquier modelo, BD139, BC547, etc.

NOTA: Se recomienda utilizar siempre una resistencia de al menos 300 ohmios, como medida de protección, en cualquier salida de Arduino. Así se evitarán posibles daños al circuito de salida en caso de cometer una equivocación en la conexión del cableado.

En este esquema se puede ver el esquema que hay que montar para controlar un relé con Arduino.

El transistor actúa como amplificador de intensidad de la salida de Arduino, en modo interruptor.

Los contactos de salida del relé pueden atacar directamente a cargas de 230V.

Módulo Arduino con relé

En esta imagen se puede apreciar un módulo de relé ya preconstruido y diseñado para Arduino.

En este caso la circuitería auxiliar necesaria para la activación del relé y la señalización correspondiente ya está montada directamente en placa.

Se puede observar que también trae contactos con tornillos para conectar los cables de la carga.

Puente H L293D

Es un chip específico para control de motores de corriente continua.

Driver de corriente ULN2003

Driver de corriente TTL para dispositivos de hasta 30V y 500mA de intensidad por cada rama.

Módulo de alimentación para Arduino

Este módulo de alimentación es necesario para alimentar motores y cargas pesadas con Arduino. Es capaz de entregar una intensidad máxima de 700mA en cada uno de los voltajes de salida.

El voltaje de salida se puede configurar a 3.3V o 5V en cada una de las líneas.

La placa base de Arduino está limitada una intensidad máxima de unos 400mA, poniendo en peligro la placa de desarrollo.

PANTALLA LCD

Aspecto de un LCD funcionando



Conexionado de LCD

Manejo del LCD con Arduino:

  1. Incluir librería necesaria para la puesta en marcha de la pantalla LCD

#include <LiquidCrystal.h>

  1. Definir las constantes que manejaremos con la pantalla LCD en donde pondremos las características de la pantalla

#define COLS 16 // Columnas del LCD

#define ROWS 2 // Filas del LCD

#define VELOCIDAD 300 // Velocidad a la que se mueve el texto

  1. Indicar a Arduino como hemos conectado el LCD a la placa de Arduino, en donde se indicarán los pines utilizados en la conexión. La función espera definir los siguientes pines LyquidCrystal(RS, Enable, d4, d5, d6, d7). Ejemplo:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

  1. Indicar a Arduino la resolución en filas y columnas que utiliza el LCD

lcd.begin(COLS, ROWS);

  1. Indicar la posición en donde se quiere escribir en el LCD y escribir el texto y/u otras operaciones.

lcd.setCursor(0,0); //Poner el cursor en la posición 0, 0

lcd.print("Hola Mundo!!!!!!"); //Imprimir una frase

lcd.clear(); //Borrar el LCD

lcd.noDisplay(); //Apagar la pantalla

lcd.display(); //Encender la pantalla

NOTA: Para ver las funciones de <LiquidCrystal.h> pincha aquí.

Monitor serie con Arduino

El monitor serie de Arduino nos permite ver los valores que van tomando las variables del programa al tiempo que se está ejecutando dicho programa.

Hay que inicializar el puerto serie en la parte de setup

void setup(){

Serial.begin(9600); //iniciamos el puerto serie

}

Para imprimir textos o valores se utiliza la función Serial.print() en la función principal

Serial.print("Contador: ");

Serial.println(cont);


Sensor de temperatura con Arduino

Conectando este dispositivo a una entrada analógica de Arduino se podrán obtener los valores de temperatura y humedad del lugar en donde está ubicado el sensor.

Servo motor con Arduino

Un servo motor es un motor que contiene un motor de corriente continua controlado con una placa electrónica interna, junto con unos engranajes desmultiplicadores que ralentizan el movimiento y aumentan la fuerza del motor a su salida.

Con un potenciómetro interno se consigue medir la posición actual de salida del conjunto y gracias a la placa electrónica se puede controlar el ángulo de giro de salida del motor al ángulo deseado

Dependiendo del ancho del pulso que se de a través de la salida PWM de Arduino el motor variará el ángulo de giro.

En la imagen de al lado se puede ver como se conecta el servomotor a Arduino. El código de programación correspondiente se puede ver en la imagen de más abajo.

SG90 de Elegoo necesita los siguientes parámetros para girar en su máximo rango:

myservo.attach(9,345,2600);

Para que gire 180 grados, poner:

myservo.attach(9,345,2350);

//Libreria necesaria para mover el servo motor#include <Servo.h>//Crear una variable de tipo Servo para el motorServo motor;
//Variable para controlar la posición del motorint posicion = 0;
void setup() { Serial.begin(9600); // Indicar en que pin PWM está conectado el motor motor.attach(9); }
void loop() { motor.write(0); // Levar al motor a la posición 0 grados delay(1000); motor.write(90); // Levar al motor a la posición 90 grados delay(1000); motor.write(180); // Levar al motor a la posición 180 grados delay(1000);
//Mover el motor desde 0 grados hasta 180 grados for (posicion=0; posicion<=180; posicion++) { motor.write(posicion); delay(50); //Mover un grado cada 50 milisegundos }
//Mover el motor desde 180 grados hasta 0 grados for (posicion=180; posicion>=0; posicion--) { motor.write(posicion); delay(50); //Mover un grado cada 50 milisegundos }

}

#include <Servo.h>
Servo myservo; int Potenciometro = A0; long Posicion;
void setup() { Serial.begin(9600); myservo.attach(9);}
void loop() { Posicion = analogRead(Potenciometro); Posicion = map(Posicion, 0, 1023, 0, 180); Serial.println(Posicion); myservo.write(Posicion); delay(400); }

Entradas analogicas con arduino

Se utiliza la función de lectura:

Valor = analogRead(Pin_Analógico);

Nos devuelve un valor entre 1 y 1023, que corresponde a los escalones digitalizados de una señal de 5V por defecto

Con la función analogReference() se puede cambiar al voltaje de referencia segun:

  • DEFAULT: Valor por defecto, 5V o 3.3V, según modelos.

  • INTERNAL: Corresponde a 1.1V (en Atmega 168 y 328)

  • EXTERNAL: Voltaje aplicado de forma externa en el pin Vref (siempre entre 0 y Vcc

  • INTERNAL1V1 y INTERNAL2V56, correspondientes a 1.1V y 2.56V (sólo en Mega)

Potenciómetro con Arduino

En este caso se va a introducir un voltaje por una patilla analógica de Arduino para medir el valor de salida producido por un potenciómetro o resistencia variable conectada entre Vcc y GND.

El resultado de la medida se puede ver mediante el monitor serie o incluso en la pantalla LCD.

Para leer una entrada analógica hay que utiliza la función analogRead(); y guardar el resultado en una variable del programa.

Posicion = analogRead(Potenciometro);

Voltímetro con Arduino

Utilizando una entrada analógica de Arduino y el display LCD se puede hacer de una manera muy sencilla un voltímetro con Arduino.

El esquema se puede ver en la imagen de al lado, solo falta mapear los voltajes de entrada de la manera correcta

Aquí se puede ver el proyecto completo.

pulsadores con Arduino

Bucle de espera hasta que alguien pulse

if digitalRead(Pulsador==LOW)

; //Sentencia vacía que no hace nada

Arduino quedará bloqueado en el bucle mientras que el pulsador no está pulsado.

Lectura de varios pulsadores y su evaluación

do //Lectura de todos los pulsadores. Quedamos a la espera de que alguien pulse algún botón{Pulsador1 = digitalRead(Entrada1);Pulsador2 = digitalRead(Entrada2);Pulsador3 = digitalRead(Entrada3); . . .while( Pulsador1==LOW && Pulsador2==LOW && Pulsador3==LOW && ....)
// Evaluación del pulsador activado y acción que de quiere realizarif (Pulsador1==HIGH){Acción 1;}if (Pulsador2==HIGH){Acción 2;}if (Pulsador3==HIGH){Acción 3;} . . .

receptor infrarrojo Arduino

Tabla de códigos para mando a distancia (21) de Elegoo

//LookupTable because else-if is too slow

IRemote_Signal elegoo_remote[21]{

{"ff906f","e5cfbd7f",'u'},

{"ffe01f","f076c13b",'d'},

{"ffa25d","e318261b",'s'},

{"ff629d","511dbb",'+'},

{"ffe21d","ee886d7f",'F'},

{"ff22dd","52a3d41f",'b'},

{"ff02fd","d7e84b1b",'p'},

{"ffc23d","20fe4dbb",'f'},

{"ffa857","a3c8eddb",'-'},

{"ff9867","97483bfb",'e'},

{"ffb04f","f0c41643",'r'},

{"ff6897","c101e57b",'0'},

{"ff30cf","9716be3f",'1'},

{"ff18e7","3d9ae3f7",'2'},

{"ff7a85","6182021b",'3'},

{"ff10ef","8c22657b",'4'},

{"ff38c7","488f3cbb",'5'},

{"ff5aa5","449e79f",'6'},

{"ff42bd","32c6fdf7",'7'},

{"ff4ab5","1bc0157b",'8'},

{"ff52ad","3ec3fc1b",'9'}

};

Modulo Bluetooth HC-05

Enlace1

Enlace2