Apunte Arduino
Apunte Arduino
Contenido
INTRODUCCIÓN ............................................................................................................................. 2
EL HARDWARE DE LA PLACA ARDUINO ......................................................................................... 2
Alimentación ............................................................................................................................. 3
Entradas y Salidas ...................................................................................................................... 3
Comunicaciones ........................................................................................................................ 4
Microcontrolador ...................................................................................................................... 4
Señales electrónicas .................................................................................................................. 5
Variables digitales ..................................................................................................................... 5
Variables Analógicas.................................................................................................................. 5
PROGRAMACIÓN EN ARDUINO ..................................................................................................... 6
Algoritmo................................................................................................................................... 6
Variables .................................................................................................................................... 6
Tipos de dato en Arduino .......................................................................................................... 7
Array .......................................................................................................................................... 7
Declaración................................................................................................................................ 7
Variable ..................................................................................................................................... 7
Array .......................................................................................................................................... 8
Funciones .................................................................................................................................. 8
Sintaxis ...................................................................................................................................... 9
Llaves ................................................................................................................................... 10
Punto y coma....................................................................................................................... 10
Estructura de un sketch en Arduino, introducción a la programación ................................... 11
EJERCICIOS DE ARDUINO. ........................................................................................................ 12
Led parpadeante ..................................................................................................................... 12
Secuencia de leds. ................................................................................................................... 13
Cruce de semáforos................................................................................................................. 15
SOS con zumbador. ................................................................................................................. 16
Coche Fantástico. .................................................................................................................... 17
Secuencia de leds con pulsador. ............................................................................................. 19
Ruleta de la fortuna. ............................................................................................................... 22
Termostato. ............................................................................................................................. 23
Arduino
Aumentar y disminuir intensidad luminosa de led (fading). ................................................... 25
Luz de led en función de la luz. ............................................................................................... 25
Luz de leds en función de la luz. Versión 2.............................................................................. 26
Luz de leds en función de la luz. Versión 3.............................................................................. 27
Termostato con velocidad de motor variable. ........................................................................ 29
Termostato con velocidad de motor variable (Versión 2). ..................................................... 30
DISPLAY DE 7 SEGMENTOS (1 DÍGITO)............................................................................... 30
Tutorial - Cruce de semáforos LED ................................. ¡Error! Marcador no definido.
LCD Liquid Crystal Display ....................................................................................................... 34
Conexiones de un LCD con Arduino ........................................................................................ 34
Montando el circuito ........................................................................................................... 36
Ejemplo básico LCD con Arduino............................................................................................ 37
Importaciones, declaraciones de constantes y variables .................................................... 37
Función setup().................................................................................................................... 38
Moviendo el texto horizontalmente en un LCD con Arduino ................................................. 40
El algoritmo ......................................................................................................................... 40
Código del texto en movimiento con LCD y Arduino .......................................................... 41
INTRODUCCIÓN
Alimentación
Las placas pueden ser alimentadas por medio de la conexión USB o con una fuente de
Alimentación externa de entre 6 a 20 V, aunque el rango recomendado es de 7 a 12 V.
Entradas y Salidas
Las entradas son señales que brindan información a un centro de procesamiento. Como
por ejemplo un mouse o un teclado son entradas o inputs de un ordenador. Arduino
utiliza como entradas a los sensores.
Temperatura
Luz
Distancia
Presencia, entre otras.
Las salidas son señales que provienen de un centro de procesamiento. Como por
ejemplo un monitor o un parlante son salidas o outputs de un ordenador. Arduino utiliza
como salidas a los actuadores.
Arduino
Los actuadores convierten las señales de corriente o voltaje en señales físicamente útiles
como:
La Luz de un led
Los mensajes en un display
El giro y movimiento de un motor
y los sonidos en un parlante.
Cada uno de los 14 pines digitales (de 0 a 13) pueden utilizarse como entradas o como
salidas usando las funciones pinMode(), digitalWrite() y digitalRead(). Las E/S operan a
5 V. Cada pin puede proporcionar o recibir una intensidad máxima de 40 mA.
Los pines 3, 5, 6, 9, 10, y 11 proporcionan una salida PWM (modulación por anchura de
pulsos) de 8 bits de resolución (valores de 0 a 255) mediante la función analogWrite().
El pin digital 13 lleva conectado un LED integrado en la propia placa. Se encenderá
cuando dicho pin se configura como salida y adopte un valor HIGH.; con valor LOW se
apaga.
La placa tiene 6 entradas analógicas, y cada una de ellas proporciona una resolución
de 10 bits (1024 valores).
Comunicaciones
La placa Arduino Uno proporciona comunicación en modo serie a través de los pines
digitales 0 (RX) y 1(TX). Un chip (CH340) integrado en la placa canaliza esta
comunicación serie a través del puerto USB. El software de Arduino incluye un monitor
de puerto serie que permite enviar y recibir información textual hacia y desde la placa
Arduino. Los leds RX y TX de la placa parpadearán cuando se detecte comunicación
transmitida a través de la conexión USB.
Microcontrolador
Son circuitos electrónicos que sirven para manipular, interpretar y transformar las
señales de voltaje y corriente provenientes de los sensores o entradas, procesar esta
información para tomar las decisiones y generar acciones en los actuadores o salidas.
Arduino puede tomar información del entorno a través de sus entradas, para esto
posee toda una gama de sensores, y puede afectar aquello que le rodea controlando
luces, motores y otros actuadores.
Arduino
El microcontrolador en la tarjeta Arduino es el Atmega328p. Cuando un proyecto ha
sido prototipado, en la implementación se puede solo utilizar el microcontrolador sin
necesidad de utilizar toda la tarjeta Arduino, permitiendo su reutilización.
Señales electrónicas
Variables digitales
Las variables digitales también llamadas variables discretas. Se caracterizan por tener
dos estados diferenciados, es por esto que se suele llamarlas variables binarias. Un
ejemplo son las transmisiones de datos a través de un cable de red.
Variables Analógicas
Son aquellas que pueden tomar un número infinito de valores comprendidos entre dos
límites. La mayoría de los fenómenos de la vida real son señales de este tipo.(el sonido,
la temperatura, la voz) Un ejemplo de una variable analógica es el información enviada
a un altavoz.
PROGRAMACIÓN EN ARDUINO
Arduino
La programación en Arduino, es muy similar a la de muchos otros lenguajes de
programación esencialmente al lenguaje C, del cual hereda muchas funcionalidades.
Algoritmo
Encender el led
Esperar
Apagar el led
Esperar
Para que este conjunto de pasos se ejecutan continuamente, anidamos los pasos en un
bucle o ciclo, un bucle realiza la repetición de un conjunto de instrucciones
infinitamente, hasta cumplir una condición o definiendo previamente un número de
veces.
Variables
byte a = 5;
Consideremos a las variables como los cajones de un armario, cada uno tiene una
etiqueta describiendo el contenido, acompañado de un tipo que indicará el número de
cajones necesarios para almacenar un contenido y dentro se encuentra el valor de la
variable como el contenido del cajón.
Arduino
Array
Declaración
Variable
int Pin;
int Pin = 5;
Arduino
Array
int Pins[];
int Pins[3];
Para agregar elementos en la declaración del array, los colocamos entre llaves
separados por comas.
Para acceder a cada uno de los elementos del array. sólo hay que colocar el índice de
este entre los corchetes, recordar que el primer índice del array es 0.
Pins[índice];
Funciones
Los parámetros son declarados con el tipo de dato al que pertenecen y son separados
con comas.
void setup ()
{
Configuración 1;
Instrucción 1;
}
void loop ()
{
Instrucción 2;
Instrucción 3;
}
Sintaxis
Las llaves sirven para definir el inicio y el final de un bloque de instrucciones. Se utilizan
para los bloques de programación setup(), loop(), funciones de usuario, etc.
type function()
{
instrucciones;
}
Punto y coma
El punto y coma “;” se utiliza para separar instrucciones y así poder ser interpretadas y
compiladas. Muchas veces olvidamos de colocarlos y esto nos dará error al momento
de compilar el programa.
int x = 13;
Las salidas son señales que provienen de un centro de procesamiento. Como por
ejemplo un monitor o un parlante son salidas o outputs de un ordenador. Arduino
utiliza como salidas a los actuadores.
La Luz de un led
Los mensajes en un display
El giro y movimiento de un motor
y los sonidos en un parlante.
3Una línea de comentario empieza con // y terminan con la siguiente línea de código,
las línea de comentarios son ignoradas por el programa y no ocupan espacio en la
memoria.
// Esto es un comentario
Con esto hemos finalizado el presente artículo, los espero en el siguiente para
aprender más de Arduino.
Arduino
Estructura de un sketch en Arduino, introducción a la programación
Arduino
EJERCICIOS DE ARDUINO.
Led parpadeante
Se trata de conectar un led al pin13, haciendo que luzca durante 500 ms y que se apague
durante 100 ms, este
proceso se repetirá cíclicamente.
Objetivos:
Reconocer partes de la placa.
Aprender a conexionar leds a la placa.
Familiarizarse con el entorno de programación.
Reconocer las partes de un programa de arduino.
Conocer órdenes como: pinMode, digitalWrite y delay.
Solución 1:
digitalWrite(7,LOW);
delay(tiempo);
digitalWrite(8,HIGH);
delay(tiempo);
digitalWrite(8,LOW);
delay(tiempo);
}
Arduino
Solución 2:
int tiempo=200;
int n;
void setup() { //comienza la configuracion
for (n=5;n<9;n++) {
pinMode (n, OUTPUT);
}
}
void secuencia() {
for (n=5;n<9;n++) {
digitalWrite (n, HIGH);
delay (tiempo);
digitalWrite (n, LOW);
delay (tiempo);
}
}
void loop() {
secuencia();
}
Solución 3:
Objetivos:
Familiarizarse con el entorno de programación.
Aprender a declarar variables tipo lista de valores.
Solución:
int leds[]={3,4,5,6,7,8);
int tiempo1=3000;
int tiempo2=500;
int n;
void setup() {
for (n=0;n<6;n++) {
pinMode (leds[n],OUTPUT);
}
}
void loop () {
digitalWrite (leds[0],HIGH);
digitalWrite (leds[5],HIGH);
delay (tiempo1);
digitalWrite (leds[5],LOW);
digitalWrite (leds[4],HIGH);
delay (tiempo2);
difitalWrite[leds[0],LOW);
digitalWrite (leds[2],HIGH);
digitalWrite (leds[4],LOW);
digitalWrite (leds[3],HIGH);
delay (tiempo1);
digitalWrite (leds[2],LOW);
digitalWrite(leds[1],HIGH);
delay (tiempo2);
}
Arduino
SOS con zumbador.
Se trata de un zumbador que en código morse (pitidos largos/cortos) especifica una
palabra, en nuestro caso SOS. Para el que no lo sepa, la S son tres señales acústicas de
corta duración y la O tres señales acústica de
larga duración.
El zumbador debe estar conectado al pin 13, los pitidos cortos tendrán una duración
de 100 ms y los largos
300 ms. Entre letra y letra debe pasar un tiempo de 300 ms y entre SOSs debe haber
un tiempo de 1000 ms.
Nota: Debes usar variables para guardar los tiempos que vas a usar.
Objetivos:
• Reconocer partes de la placa.
• Aprender a conexionar un zumbador a la placa.
• Familiarizarse con el entorno de programación.
• Reconocer las partes de un programa de arduino.
• Aprender a como declarar variables.
• Conocer órdenes de control de programa como: for.
Solución1:
Solución 2:
int tcorto=100;
int tlargo=300;
int pausa=300;
int espera=1000;
int n=0;
void setup(){ //comienza la configuracion
pinMode(13,OUTPUT);
}
void s(){ //comienza el bucle para la letra S
for(n=0;n<3;n++) {
digitalWrite (13,HIGH);
delay (tcorto);
digitalWrite (13,LOW);
delay (tcorto);
}
}
void o(){ //comienza el bucle para la letra O
for(n=0;n<3;n++) {
digitalWrite (13,HIGH);
delay (tlargo);
digitalWrite (13,LOW);
delay (tlargo);
}
}
void loop(){ //se ejecuta el bucle principal en el orden
siguiente
s();
delay(pausa);
o();
delay(pausa);
s();
delay(espera);
}
Coche Fantástico.
Se trata de encender y apagar 7 leds secuencialmente. Los leds deben estar
conectados a los pines 5,6,7,8,9,10 y 11.
Arduino
Se deben encender y apagar los leds desde el pin 5 al 11, con un tiempo de encendido
y apagado de 50 ms, más tarde se deben encender y apagar los leds desde el pin 11 al
5, con un tiempo de encendido y apagado de 50 ms. La secuencia se debe repetir
indefinidamente. El efecto del programa es el de las luces delanteras de nuestro
querido "Coche fantástico".
Objetivos:
• Familiarizarse con el entorno de programación.
• Repasar declaración de variables tipo lista de valores.
• Repasar órdenes de control de programa como: for.
Solución1:
int leds[]={5,6,7,8,9,10,11};
int n=0;
int tiempo=50;
void setup() { //comienza la configuración
for (n=0;n<7;n++) {
pinMode(leds[n],OUTPUT);
}
}
void loop() {
for (n=0;n<7;n++) {
digitalWrite (leds[n],HIGH);
delay(tiempo);
digitalWrite (leds[n],LOW);
delay(tiempo);
}
for (n=6;n>=0;n--) {
digitalWrite (leds[n],HIGH);
delay(tiempo);
digitalWrite (leds[n],LOW);
delay(tiempo);
}
}
int n=0;
int tiempo=50;
void setup() { //comienza la configuración
for (n=5;n<12;n++) {
pinMode(n,OUTPUT);
}
}
void loop() {
for (n=5;n<12;n++) {
digitalWrite (n,HIGH);
delay(tiempo);
digitalWrite (n,LOW);
delay(tiempo);
Arduino
}
for (n=11;n>=5;n--) {
digitalWrite (n,HIGH);
delay(tiempo);
digitalWrite (n,LOW);
delay(tiempo);
}
}
• Aprender a declarar una función y llamarla cuando sea• Conocer órdenes como:
digitalRead.
Solución:
Solución 1:
int cadenaleds[]={5,6,7,8};
int pulsador=4;
Arduino
int tiempo=200;
int n=0;
void setup() {
for(n=0;n<4;n++) {
pinMode (cadenaleds[n],OUTPUT);
}
pinMode (pulsador,INPUT);
}
void flash() {
for (n=0;n<4;n++) {
digitalWrite (cadenaleds[n],HIGH);
delay (tiempo);
digitalWrite (cadenaleds[n],LOW);
delay (tiempo);
}
}
void loop() {
if (digitalRead(pulsador)==HIGH) {
flash ();
}
}
Solución 2:
int leds[]={5,6,7,8};
int tiempo=200;
int pulsador=4;
int n=0;
int valorpulsador=0;
void setup(){
for(n=0;n<4;n++){
pinMode(leds[n],OUTPUT);
}
pinMode(pulsador,INPUT);
[Link](9600);
}
void monitoriza(){
[Link]("El valor del pulsador es ...");
[Link](valorpulsador);
delay(1000);
}
void secuencia(){
for(n=0;n<4;n++){
digitalWrite(leds[n],HIGH);
delay(tiempo);
Arduino
digitalWrite(leds[n],LOW);
delay(tiempo);
}
}
void loop(){
valorpulsador=digitalRead(pulsador);
monitoriza();
if (valorpulsador==1){
secuencia();
}
}
Ruleta de la fortuna.
Se trata de cinco leds que se van encendiendo y apagando formando una secuencia, el
jugador debe dar al pulsador cuando el led intermedio se enciende, si acierta funciona
un zumbador y la velocidad de la secuencia aumenta.
Los leds deben estar conectados de los pines 5 a 9 (inclusives), el zumbador al pin 10,
el pulsador al pin 11.
El tiempo inicial entre encendido y encendido de leds debe ser 200 ms, si se acierta se
decrementa el tiempo en 20 ms, si el tiempo entre encendidos llegase a 10 ms, se
devuelve el tiempo a 200 ms.
Objetivos:
• Repaso de conexión de entrada digital a arduino (pulsador).
• Repaso de variables tipo lista de valores.
• Repaso de declarar una función y llamarla cuando sea necesario.
• Repaso de órdenes como: digitalRead.
• Repaso de órdenes de control de programa como: For, If.
Solución:
int leds[]={5,6,7,8,9};
int n=0;
int tiempo=200;
int zumbador=10;
int pulsador=11;
void setup (){
Arduino
for(n=0;n<5;n++) {
pinMode(leds[n],OUTPUT);
}
pinMode(zumbador,OUTPUT);
pinMode(pulsador,INPUT);
}
void compruebaacierto(){
if(digitalRead(pulsador)==HIGH && n==2) {
digitalWrite(zumbador,HIGH);
delay (1000);
digitalWrite(zumbador,LOW);
tiempo=tiempo-20;
if(tiempo<10){
tiempo=200;}
}}
void loop () {
for(n=0;n<5;n++) {
digitalWrite(leds[n],HIGH);
delay(tiempo);
compruebaacierto();
digitalWrite(leds[n],LOW);
delay(tiempo);
}
Termostato.
Se trata de un dispositivo que haga funcionar un motor y un led cuando la temperatura
supera cierto umbral.
Para ello conectaremos una ntc a la entrada analógica 0, un led al pin 5 y un motor de
corriente continua al pin 10. Cuando la temperatura llegue a cierto umbral de voltaje
(entre 0 y 1024) que nosotros decidamos, se conectarán a la vez el diodo led y el motor
que puede tener unas aspas de ventilador en su eje para enfriar la ntc. Además se
deberá visionar el valor de voltaje en la entrada analógica (valor entre 0 y 1024) en una
consola en el PC.
Objetivos:
• Conexión de entrada analógica a arduino (ntc).
• Órdenes como: analogRead.
• Visualizar datos en consola de puerto serie, con órdenes como: [Link],
[Link].
• Repaso de órdenes de control de programa como: If else.
Solución:
Arduino
int led=5;
int ntc=0;
int motor=10;
int medida=0;
int nivel=700; //variable que guarda el límite de
temperatura al que se activa el ventilador
void setup(){
pinMode(led,OUTPUT);
pinMode(motor,OUTPUT);
[Link](9600);
}
void monitoriza(){ //procedimiento que envía al puerto
serie, para ser leído en el monitor,
[Link]("La medida es ...");
[Link](medida);
[Link]();
delay(1000); //para evitar saturar el puerto serie
}
void loop(){
medida=analogRead(ntc);
monitoriza();
if(medida>nivel){ //si la señal del sensor supera el nivel
marcado:
digitalWrite(led,HIGH); //se enciende un aviso luminoso
digitalWrite(motor,HIGH); //arranca el motor
}
else{ // si la señal está por debajo del nivel marcado
digitalWrite(led,LOW);
digitalWrite(motor,LOW); // el motor se para
Arduino
Objetivos:
• Conexionado de salidas analógicas (power with module pwm).
• Conocer órdenes como analogWrite.
Solución:
int luminosidad = 0; // variable para asignar la
luminosidad al led
int led = 11; // pin del led
void setup()
{
// en el setup no hay que configurar nada
}
void loop()
{
for (luminosidad = 0 ; luminosidad <= 255;
luminosidad=luminosidad+3) // fade in (from min to max)
{
analogWrite(led, luminosidad); // ilumina el led con
el valor asignado a luminosidad (entre 0 y 255)
delay(30); // espera 30 ms para que se vea el efecto
«Ejercicios de Arduino resueltos», Grupo Sabika 16
}
for (luminosidad = 255; luminosidad >=0;
luminosidad=luminosidad-3) // fade out (from max to min)
{
analogWrite(led, luminosidad);
delay(30);
}
}
Se trata de un dispositivo que haga lucir un led más o menos en función de la luz
externa. Para ello conectaremos una ldr a la entrada analógica 0 y un led al pin 9.
Cuando la luz se encuentre entre 0 y 512 el led debe colocarse en el nivel de potencia
máxima (255), si la luz se encuentra entre valores 512 y 1024 el debe lucir al nivel de
potencia 64. Además se deberá visionar el valor de voltaje en la entrada analógica
(valor entre 0 y 1024) en una consola en el PC.
Arduino
Objetivos:
• Repaso conexión de entrada analógica a arduino (ldr).
• Conexionado de salidas analógicas.
• Órdenes como: analogWrite.
• Repaso de visualizar datos en consola de puerto serie, con órdenes como:
[Link], [Link].
• Repaso de órdenes de control de programa como: If else.
int led=9;
int ldr=0;
int luz=0;
void setup(){
pinMode(9,OUTPUT)[Link](9600);
}
void monitoriza(){
[Link]("El valor de luz es ...");
[Link](luz);
delay(1000);
}
void loop(){
luz=analogRead(ldr);
monitoriza();
if(luz<512 && luz>=0){
analogWrite(led,255);
}
if(luz>=512 && luz<=1024) {
analogWrite(led,64);
}
}
Objetivos:
• Repaso conexión de entrada analógica a arduino (ldr).
• Repaso conexionado de salidas analógicas.
• Repaso órdenes como: analogWrite.
• Repaso de visualizar datos en consola de puerto serie, con órdenes como:
[Link], [Link].
• Repaso de órdenes de control de programa como: If else.
Arduino
Solución:
int leds[]={9,10,11};
int tiempo=300;
int ldr=0;
int n=0;
int luz=0;
void setup(){
for(n=0;n=2;n++) {
pinMode(leds[n],OUTPUT);
}
[Link](9600);
}
void monitoriza() {
[Link]("El valor de la luz es ...");
[Link](luz);
delay(1000);
}
void loop(){
luz=analogRead(ldr);
monitoriza();
if (luz<=1023 && luz>=768) {
for (n=0;n=2;n++) {
analogWrite(leds[n],64);
delay(tiempo);
}
}
if (luz<=767 && luz>=512) {
for (n=0;n=2;n++) {
analogWrite(leds[n],127);
delay(tiempo);
}
}
if (luz<=511 && luz>=256) {
for (n=0;n=2;n++) {
analogWrite(leds[n],191);
delay(tiempo);
}
}
if (luz<=255 && luz>=0) {
for (n=0;n=2;n++) {
analogWrite(leds[n],255);
delay(tiempo);
}
}
}
Objetivos:
• Repaso conexión de entrada analógica a arduino (ldr).
• Repaso conexionado de salidas analógicas.
• Repaso órdenes como: analogWrite.
• Repaso de visualizar datos en consola de puerto serie, con órdenes
como:[Link], [Link].
int ldr=0;
int leds[]={9,10,11};
int n=0;
int medida=0;
int luzled=0;
void setup(){
for (n=0;n<3;n++) {
pinMode(leds[n],OUTPUT);
}
[Link](9600);
}
void monitoriza(){
[Link]("La medida de luz es ...");
[Link](medida);
[Link]("La luz a dar en los leds es ...");
[Link](luzled);
delay(1000);
}
void loop(){
medida=analogRead(ldr);
luzled=255-(medida/4);
monitoriza();
for (n=0;n<3;n++){
analogWrite(leds[n],luzled);
Arduino
delay(200);
}
}
Objetivos:
• Repaso conexión de entrada analógica a arduino (ntc).
• Repaso conexionado de salidas analógicas.
• Repaso órdenes como: analogWrite.
• Repaso de visualizar datos en consola de puerto serie, con órdenes como:
[Link], [Link].
• Repaso de órdenes de control de programa como: If else.
Solución:
int motor=9;
int led=13;
int ntc=0;
int temperatura=0;
void setup(){
pinMode(led,OUTPUT);
pinMode(motor,OUTPUT);
[Link](9600);
}
void monitoriza(){
[Link]("El valor de temperatura es
..."[Link](temperatura);
delay(1000);
}
void loop(){
temperatura=analogRead(ntc);
monitoriza();
if(temperatura>530){
digitalWrite(led,HIGH);
analogWrite(motor,200);
}
else {
digitalWrite(led,LOW);
digitalWrite(motor,LOW);
}
Arduino
}
Objetivos:
• Repaso conexión de entrada analógica a arduino (ntc).
• Repaso conexionado de salidas analógicas.
• Repaso órdenes como: analogWrite.
• Repaso de visualizar datos en consola de puerto serie, con órdenes como:
[Link], [Link].
• Repaso de órdenes de control de programa como: If else.
Solución:
Introducción teórica
Un display de segmentos (o visualizador) es un componente electrónico que se utiliza
para representar números. Como su propio nombre indica y, como se puede observar
en la imagen siguiente, el display está compuesto por 7 segmentos, los cuales se
encenderán y/o apagarán en función del número a representar. De forma interna, se
asemeja a siete LEDs conectados estratégicamente formando el número 8, aunque
externamente dicha semejanza no se observa, de ahí su simplicidad.
Arduino
Para nuestro caso, disponemos de uno de tipo cátodo común, el LMS5161AS (luz roja,
tamaño de dígito 0.56'').
Conexiones
En lo que se refiere a las conexiones, tenemos que tener en cuenta cada segmento a
qué pin lo vamos a conectar, para poder efectuar una llamada a los pines correcta. En
nuestro caso, hemos hecho las siguientes conexiones (puede variar la designación
según convenga):
Arduino
Ejemplo
void setup()
{
pinMode(6, OUTPUT); // Asignación de las salidas digitales
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}
Hay una amplia gama de pantallas LCDs que podemos utilizar con Arduino. Aparte de
las funcionalidades extra que nos puedan dar cada una de ellas, las podemos
diferenciar por el número de filas y columnas, su tamaño.
Por ejemplo, una pantalla LCD de 16×1 tendrá una fila de 16 caracteres es decir, solo
podremos mostrar 16 caracteres simultáneamente, al igual que un LCD de 20×4 tendrá
4 filas de 20 caracteres cada una.
En este caso vamos a trabajar con un LCD típico, de 16×2. Esto significa que vamos a
poder mostrar 16 caracteres en la primera fila y los mismos en la segunda fila
1 GND (Tierra)
2 5 Voltios
En la siguiente imagen te muestro la correspondencia con los pines físicos del LCD.
Arduino
Montando el circuito
Una vez conocemos los conectores, ya podemos montar el circuito básico. El material
que vamos a utilizar es el siguiente
Una vez incluida, debemos indicar los pines que vamos a utilizar para enviar los datos.
Esto lo hacemos a través del constructor LyquidCrystal(…). Esta función permite
diferente número de parámetros que dependerá de la configuración que estemos
Arduino
utilizando. En la llamada más básica, la que vamos a utilizar, debemos pasar como
parámetros el RS, la sincronización, y los 4 pines para enviar datos. La función quedaría
de la siguiente manera LyquidCrystal(RW, Enable, d4, d5, d6, d7). Si sustituimos estos
datos con los pines de Arduino tenemos lo siguiente.
La palabra lcd es el nombre que le vamos a dar a esta variable (clase). Este nombre
puede ser modificado siguiendo las reglas del lenguaje y no utilizando palabras
reservadas.
Función setup()
Con esto ya podemos pasar a la función setup(). Esta función nos sirve para hacer una
configuración inicial en nuestros programas. Lo primero que hacemos es configurar el
monitor serie y luego inicializamos la interfaz del LCD con Arduino y especificamos las
dimensiones (16 columnas y 2 filas).
void setup() {
[Link](9600);
columnas y 2 filas
[Link](COLS, ROWS);
Función loop()
Ahora ya podemos empezar a escribir en la pantalla del LCD. Para ello vamos a
utilizar tres métodos:
Para escribir el segundo texto, tenemos que mover el cursor a la nueva posición.
Queremos que se sitúe justo debajo así que movemos a la siguiente fila (fila 1 que
corresponde con la segunda fila) y la columna será la 0 (primera columna). Después
escribimos el texto. Por último ponemos un delay() (esperar un tiempo) más que
nada para que no esté constantemente mandando datos. Esto último no sería
necesario.
// Situamos el cursor en la columna 0 fila 1
[Link](0,1);
El algoritmo
Antes de empezar a programar, es conveniente plantear el algoritmo. Esto nos
ahorrará tiempo a la hora de codificar con el lenguaje nativo de Arduino.
Desarrollaremos la idea en sucesivos pasos bien estructurados y ordenados. En este
punto, no hay que profundizar en cuántas variables o constantes necesito. Lo único
que debemos plasmar son la secuencia de pasos.
Es un algoritmo un poco complejo que se divide en 4 bloques. Los dos primeros nos
Arduino
servirán para desplazar el texto hacia la derecha y los dos siguientes para
desplazarlo hacia la izquierda.
interfaz
// Textos
void setup() {
[Link](9600);
columnas y 2 filas
[Link](COLS, ROWS);
En la siguiente parte vamos a mostrar cómo entra el texto por la parte derecha. En
esta parte no vamos a trabajar con el LCD ya que siempre se encontrará en la misma
posición, columna 0 fila 0. El truco está en ir cogiendo trozos de texto, de más pequeño
a más grande, y mostrarlos en el LCD. Esto nos dará la sensación de que se está
moviendo hacia la derecha aunque en realidad lo que hacemos es mostrar cada vez un
texto diferente.
Arduino
for(int i=tam_texto; i>0 ; i--)
{
String texto = texto_fila.substring(i-1);
// Limpiamos pantalla
[Link]();
//Situamos el cursor
[Link](0, 0);
// Escribimos el texto
[Link](texto);
// Esperamos
delay(VELOCIDAD);
}
Ahora si que toca desplazar el texto. Para ello hacemos un simple bucle que recorra
todas las columnas del LCD. Además tenemos que forzar para que la última
visualización sea en la columna 17 y así simularemos que el texto ha desaparecido por
la derecha.
delay(VELOCIDAD); // Esperamos
Una vez que ha desaparecido por la derecha, lo vamos a mover de derecha a izquierda.
Si te fijas en el código, es exactamente igual que en los pasos anteriores. Lo único que
cambia es como se recorren los bucles, ahora en sentido contrario. Lo primero es
desplazar el texto a través de la función setCursor() e indicando en que posición
mostrar el texto.
Arduino
Desplazamos el texto hacia la izquierda en la segunda fila
for(int i=16;i>=1;i--)
delay(VELOCIDAD); // Esperamos
}
Arduino
Código completo
// Incluímos la libreria externa para poder utilizarla
#include <LiquidCrystal.h>
void setup() {
[Link](9600); // Configuración monitor serie
EL BUS I2C
Por eso, en los primeros 80, uno de los grandes fabricantes de electrónica (Phillips),
propuso una norma de comunicación digital, entre los diferentes componentes de una
sistema electrónico.
Esa norma se llamó Inter Integrated Circuits bus, o IIC, y pronto se convirtió en un
estándar de facto en la industria. Las especificaciones han ido mejorando con los años,
pero la idea básica sigue siendo la misma:
Protocolo de dos hilos de control, uno para transmitir los datos, SDA y otro, el reloj
asíncrono que indica cuando leer los datos SCL. Mas GND y 5V (cuando se requiera).
Cada dispositivo conectado al bus I2C y cada uno tiene su dirección exclusiva, de 7 bits,
(Asi que, en teoría, podemos conectar 27 = 128, dispositivos).
Uno de estos componentes, debe actuar como master, es decir controla el reloj.
No se requiere una velocidad de reloj estricta, ya que es el master quien controla el
Clock.
Es multi master, el master puede cambiar, pero solo uno puede estar activo a la vez, y
proporciona un protocolo de arbitraje y detección de colisiones. (Si no has entendido
esto, no te preocupes, todavía es pronto).
Puedes encontrar que a este bus se le llama I2C, IIC o I2C, y también, como TWI (Two
Wire Interface, o interface de 2 hilos), pero siempre es lo mismo.
Arduino
La idea es que todos los componentes se conecten en paralelo a las dos líneas del Bus,
SDA y SCL. En cada momento solo puede haber un master, en este caso, nuestro Duino
y los demás se configuran como esclavos.
Y la buena noticia es que nuestro Arduino lo soporta de fábrica con una librería
estándar, que utiliza dos de los pines analógicos para las funciones SDA (Datos) y SCL
(Clock).
En el Arduino UNO, los pines I2C están en los pines analógicos A4 (SDA) y A5 (SCL).
En el Arduino Mega y DUE, son el 20 (SDA) y en el 21(SCL).
En esta sesión vamos a conectar un display LCD de 16×2 con interface I2C, y así podréis
comprobar porque en la última sesión os recomendé usarlo, en lugar del que se
conecta directamente con 16 pines.
SCANNER DE I2C
Cada componente que conectamos al bus I2C tiene una dirección única, y cada
mensaje y orden que transmitimos al bus, lleva anexa esta dirección, indicando cuál de
los muchos posibles, es el receptor del mensaje.
Pero, claro, esto implica que sabemos la dirección del componente. Lo normal es
comprobar la información técnica del fabricante del componente, y ahí suele decirnos
cuál es la dirección por defecto.
Pero como ya sabemos, que en la vida las cosas rara vez son como en los cuentos,
algún alma caritativa (y con mucho mundo a sus espaldas), hizo un programita para
Arduino, que nos informa, de lo que hay en nuestro bus y con qué dirección. I2C
scanner
Naturalmente, este programa, no tiene ni idea de quien responde y lo que hace, pero
bastante es que nos informe de que hay alguien en la dirección xx.
Si no sabemos en qué dirección está un componente dado, basta con colocarlo solo en
el bus, y ver qué dirección nos reporta el I2C scanner. EL resultado para el LCD que
tengo es 0x27 Hexadecimal.
Arduino
Así que ya podemos pasar a hablar de como programar el uso del display.
DIAGRAMA DE CONEXIÓN
La conexión es, nuevamente, trivial:
Simplemente Arduino A4 a SDA (Datos) y A5 a SCL (Clock), más GND y alimentación. Vamos con el programa.
Arduino
PROGRAMA DE CONTROL
Lo primero, es que descarguéis una nueva librería para maneja el display con I2C, Se
llama LiquidCrystal_I2C y es un añadido para la librería estándar que viene con tu
Duino (tranquilo no duele y debería ser automático).
Ahora vamos a incluir la librería I2c que en Arduino se llama Wire, y como es estándar
la incluyes con:
\\Programa\ImportarLibreria\Wire
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
Vamos ahora a definir una variable con la dirección de nuestro display. En nuestro caso
la 0x27.
LiquidCrystal_I2C
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
void setup()
[Link](3,POSITIVE);
[Link](HIGH);
[Link]("[Link]");
[Link]("Malpartida lib");
void loop()
{}