91
UNIVERSIDAD EAFIT LABORATORIO DE CONTROL DIGITAL HUGO ALBERTO MURILLO ISMAEL DAVID ANAYA MEDELLIN 2012 GUIA ARDUINO

Guia Arduino 2012

Embed Size (px)

Citation preview

Page 1: Guia Arduino 2012

UNIVERSIDAD EAFIT

LABORATORIO DE CONTROL DIGITAL

HUGO ALBERTO MURILLO

ISMAEL DAVID ANAYA

MEDELLIN

2012

GUIA

ARDUINO

Page 2: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

1

TABLA DE CONTENIDO

1. MANEJO DEL SOFTWARE............................................................................................................. 4

2. ENTORNO DE DESARROLLO PARA ARDUINO .............................................................................. 8

3. INSTRUCCIONES BÁSICAS .......................................................................................................... 16

4. SIMULACIÓN EN PROTEUS ........................................................................................................ 19

5. INSTRUCCIONES DE ROTACIÓN ................................................................................................. 26

6. MOTORES PASO A PASO............................................................................................................ 28

6.1 Motores unipolares ............................................................................................................. 28

6.2 Motores bipolares ............................................................................................................... 29

7. MANEJO DE DISPLAY 7 SEGMENTOS Y ANTIRREBOTE .............................................................. 34

8. TRABAJOS CON PULSADORES (ANTIRREBOTE) ......................................................................... 36

9. MULTIPLEXAJE DE DISPLAY ....................................................................................................... 39

10. INTERRUPCIONES ..................................................................................................................... 44

11. TIMER ........................................................................................................................................ 47

12. MANEJO DEL TECLADO TELEFONICO ........................................................................................ 51

13. MANEJO DEL LCD (DISPLAY DE CRISTAL LÍQUIDO)................................................................... 56

14. ALMACENAMIENTO EN LA MEMORIA EEPROM INTERNA ........................................................ 70

15. CONVERSOR ANÁLOGO/DIGITAL A/D ....................................................................................... 75

16. COMUNICACIÓN SERIAL............................................................................................................ 78

16.1 Comunicación Sincrónica:................................................................................................. 78

16.2 Comunicación Asincrónica:............................................................................................... 78

17. INTERRUPCIÓN SERIAL .............................................................................................................. 83

18. CONTROL PWM ......................................................................................................................... 86

Page 3: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

2

INTRODUCCIÓN AL ARDUINO

Arduino es una plataforma de electrónica abierta para la creación de prototipos basada ensoftware y hardware flexibles y fáciles de usar. Se creó para artistas, diseñadores,aficionados y cualquier otro público interesado en la creación de entornos u objetosinteractivos.Es un circuito integrado que contiene toda la estructura de un microprocesador, es decir,unidad de proceso (CPU), memoria RAM, memoria ROM y circuitos de entrada/salida.

Arduino puede tomar información del entorno a través de sus pines de entrada de todauna gama de sensores y puede afectar aquello que le rodea controlando luces, motores yotros actuadores. El microcontrolador en la placa Arduino se programa mediante ellenguaje de programación Arduino y el entorno de desarrollo Arduino. Los proyectoshechos con esta plataforma pueden ejecutarse sin necesidad conectar a un ordenador, sibien tienen la posibilidad de hacerlo y comunicar con diferentes tipos de software (p.ej.Flash, Processing, MaxMSP).

En esta guía se usara el Arduino Mega 2560.

El Arduino Mega 2560 es una placa electrónica basada en el Atmega2560. Cuenta con 54pines de entradas / salidas digitales (de los cuales 15 se pueden utilizar como salidasPWM) , 4 UARTs (puertos de hardware de serie), además 16 entradas analógicas, unoscilador con cristal de 16 MHz, una conexión USB, un conector de alimentación, unacabecera de ICSP (sirve para programar el BootLoader del Microcontrolador ATmega ycargar los programas directamente en el microcontrolador sin necesidades deProgramadores externos) y un botón de reinicio. Contiene todo lo necesario para elfuncionamiento del microcontrolador, sólo tiene que conectarlo a un ordenador con uncable USB o de poder con un adaptador AC-DC o la batería para empezar.

Una vez el proyecto esté funcionando, el Arduino puede trabajar independiente sinnecesidad de un PC.

Page 4: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

3

Ficha técnica tarjeta de desarrollo mega:

Microcontrolador ATmega2560

Voltaje de funcionamiento 5V

Voltaje de entrada (recomendado) 7-12V

Voltaje de entrada (los limites) 6-20V

Pines de I/O digital 54 (de los cuales 15 proporcionan una salida PWM)

Pines de entrada análoga 16

Corriente DC I/O Pin 40 mA

corriente DC para 3.3V Pin 50 mA

Memoria flash 256 KB de los cuales 8 KB utilizadas por gestor de arranque

SRAM 8 KB

EEPROM 4 KB

Velocidad del cristal 16 MHz

Page 5: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

4

1. MANEJO DEL SOFTWARE

Lo primero que se debe hacer, si no se dispone del software, es descargarlo de la páginaweb del fabricante: http://www.arduino.cc/

Imagen tomada de la página www.arduino.ccDespués de ingresar en la página web, se selecciona la opción Download y en esta opciónseleccionar la versión de Arduino a utilizar y el sistema operativo.

Page 6: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

5

Imagen tomada de la página arduino.cc

Al seleccionar la opción, automáticamente sale una ventana preguntando si desea abrir oguardar el archivo comprimido de la descarga, se debe seleccionar la opción guardar y seespera que finalice la descarga.

Una vez descargado el archivo ubicar la carpeta donde fue guardado al descargar paraproceder a descomprimirlo.

Laboratorio de Control Digital - Universidad EAFIT

5

Imagen tomada de la página arduino.cc

Al seleccionar la opción, automáticamente sale una ventana preguntando si desea abrir oguardar el archivo comprimido de la descarga, se debe seleccionar la opción guardar y seespera que finalice la descarga.

Una vez descargado el archivo ubicar la carpeta donde fue guardado al descargar paraproceder a descomprimirlo.

Laboratorio de Control Digital - Universidad EAFIT

5

Imagen tomada de la página arduino.cc

Al seleccionar la opción, automáticamente sale una ventana preguntando si desea abrir oguardar el archivo comprimido de la descarga, se debe seleccionar la opción guardar y seespera que finalice la descarga.

Una vez descargado el archivo ubicar la carpeta donde fue guardado al descargar paraproceder a descomprimirlo.

Page 7: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

6

Se hace doble clic en el archivo comprimido y se procede a descomprimir haciendo clic enla opción extraer en.

Luego se selecciona la ubicación donde se va a guardar la carpeta, que en este caso seráen el escritorio.

Laboratorio de Control Digital - Universidad EAFIT

6

Se hace doble clic en el archivo comprimido y se procede a descomprimir haciendo clic enla opción extraer en.

Luego se selecciona la ubicación donde se va a guardar la carpeta, que en este caso seráen el escritorio.

Laboratorio de Control Digital - Universidad EAFIT

6

Se hace doble clic en el archivo comprimido y se procede a descomprimir haciendo clic enla opción extraer en.

Luego se selecciona la ubicación donde se va a guardar la carpeta, que en este caso seráen el escritorio.

Page 8: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

7

Ahora que se ha descomprimido la carpeta y ha sido ubicada en el destino deseado, seprocede a abrir el software de Arduino.

Al abrir el software de Arduino se obtiene la siguiente pantalla, en donde se comenzará atrabajar.

Laboratorio de Control Digital - Universidad EAFIT

7

Ahora que se ha descomprimido la carpeta y ha sido ubicada en el destino deseado, seprocede a abrir el software de Arduino.

Al abrir el software de Arduino se obtiene la siguiente pantalla, en donde se comenzará atrabajar.

Laboratorio de Control Digital - Universidad EAFIT

7

Ahora que se ha descomprimido la carpeta y ha sido ubicada en el destino deseado, seprocede a abrir el software de Arduino.

Al abrir el software de Arduino se obtiene la siguiente pantalla, en donde se comenzará atrabajar.

Page 9: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

8

2. ENTORNO DE DESARROLLO PARA ARDUINO

El entorno de Desarrollo Arduino está constituido por un editor de texto para escribir elcódigo, un área de mensajes, una barra de herramientas con botones para las funcionescomunes y una serie de menús, que permite la configuración de la conexión con elhardware de Arduino para cargar los programas y comunicarse con ellos.Arduino utiliza, lo que denomina "sketch" (programa), para editar los programas. Estosprogramas son escritos en el editor de texto. Existe la posibilidad de cortar/pegar ybuscar/remplazar texto. En el área de mensajes se muestra información mientras secargan los programas y también muestra los errores. La consola muestra el texto de salidapara el entorno de Arduino incluyendo los mensajes de error completos y otrasinformaciones. La barra de herramientas permite verificar el proceso de carga, creación,apertura y guardado de programas, y el monitor de comunicación serial:

Verify (verificar) compila el programa, verificando que este no presente errores.

Upload (cargar) compila el código del "sketch" (programa) y lo carga en el Arduino.

New (nuevo) crea un nuevo "sketch" (programa).

Open (abrir) abre un "sketch" (programa) ya existente.

Save (guardar) guarda el "sketch" (programa).

Serial monitor (monitor serial) abre el monitor de comunicación serial.

Ya teniendo claro las funciones de cada icono del entorno Arduino, el paso siguiente es laselección de la placa Arduino con la cual se va a trabajar, en esta guía se trabaja con laplaca Arduino Mega 2560, los pasos para seleccionar la placa con la cual se trabajará sepresentan a continuación:

Primero debe ubicarse en la barra de herramientas, situada en la parte superior delentorno Arduino, luego:• Seleccione la opción herramientas• Seleccione la opción tarjeta• Seleccione la tarjeta con la cual se va a trabajar que en este caso es la Arduino Mega

2560.

Laboratorio de Control Digital - Universidad EAFIT

8

2. ENTORNO DE DESARROLLO PARA ARDUINO

El entorno de Desarrollo Arduino está constituido por un editor de texto para escribir elcódigo, un área de mensajes, una barra de herramientas con botones para las funcionescomunes y una serie de menús, que permite la configuración de la conexión con elhardware de Arduino para cargar los programas y comunicarse con ellos.Arduino utiliza, lo que denomina "sketch" (programa), para editar los programas. Estosprogramas son escritos en el editor de texto. Existe la posibilidad de cortar/pegar ybuscar/remplazar texto. En el área de mensajes se muestra información mientras secargan los programas y también muestra los errores. La consola muestra el texto de salidapara el entorno de Arduino incluyendo los mensajes de error completos y otrasinformaciones. La barra de herramientas permite verificar el proceso de carga, creación,apertura y guardado de programas, y el monitor de comunicación serial:

Verify (verificar) compila el programa, verificando que este no presente errores.

Upload (cargar) compila el código del "sketch" (programa) y lo carga en el Arduino.

New (nuevo) crea un nuevo "sketch" (programa).

Open (abrir) abre un "sketch" (programa) ya existente.

Save (guardar) guarda el "sketch" (programa).

Serial monitor (monitor serial) abre el monitor de comunicación serial.

Ya teniendo claro las funciones de cada icono del entorno Arduino, el paso siguiente es laselección de la placa Arduino con la cual se va a trabajar, en esta guía se trabaja con laplaca Arduino Mega 2560, los pasos para seleccionar la placa con la cual se trabajará sepresentan a continuación:

Primero debe ubicarse en la barra de herramientas, situada en la parte superior delentorno Arduino, luego:• Seleccione la opción herramientas• Seleccione la opción tarjeta• Seleccione la tarjeta con la cual se va a trabajar que en este caso es la Arduino Mega

2560.

Laboratorio de Control Digital - Universidad EAFIT

8

2. ENTORNO DE DESARROLLO PARA ARDUINO

El entorno de Desarrollo Arduino está constituido por un editor de texto para escribir elcódigo, un área de mensajes, una barra de herramientas con botones para las funcionescomunes y una serie de menús, que permite la configuración de la conexión con elhardware de Arduino para cargar los programas y comunicarse con ellos.Arduino utiliza, lo que denomina "sketch" (programa), para editar los programas. Estosprogramas son escritos en el editor de texto. Existe la posibilidad de cortar/pegar ybuscar/remplazar texto. En el área de mensajes se muestra información mientras secargan los programas y también muestra los errores. La consola muestra el texto de salidapara el entorno de Arduino incluyendo los mensajes de error completos y otrasinformaciones. La barra de herramientas permite verificar el proceso de carga, creación,apertura y guardado de programas, y el monitor de comunicación serial:

Verify (verificar) compila el programa, verificando que este no presente errores.

Upload (cargar) compila el código del "sketch" (programa) y lo carga en el Arduino.

New (nuevo) crea un nuevo "sketch" (programa).

Open (abrir) abre un "sketch" (programa) ya existente.

Save (guardar) guarda el "sketch" (programa).

Serial monitor (monitor serial) abre el monitor de comunicación serial.

Ya teniendo claro las funciones de cada icono del entorno Arduino, el paso siguiente es laselección de la placa Arduino con la cual se va a trabajar, en esta guía se trabaja con laplaca Arduino Mega 2560, los pasos para seleccionar la placa con la cual se trabajará sepresentan a continuación:

Primero debe ubicarse en la barra de herramientas, situada en la parte superior delentorno Arduino, luego:• Seleccione la opción herramientas• Seleccione la opción tarjeta• Seleccione la tarjeta con la cual se va a trabajar que en este caso es la Arduino Mega

2560.

Page 10: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

9

Imagen física Arduino Mega 2560

Laboratorio de Control Digital - Universidad EAFIT

9

Imagen física Arduino Mega 2560

Laboratorio de Control Digital - Universidad EAFIT

9

Imagen física Arduino Mega 2560

Page 11: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

10

Imagen y conexión en proteus del Atmega 2560

Page 12: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

11Descripción de pines

Imagen tomada de la página www.arduino.cc

Laboratorio de Control Digital - Universidad EAFIT

11Descripción de pines

Imagen tomada de la página www.arduino.cc

Laboratorio de Control Digital - Universidad EAFIT

11Descripción de pines

Imagen tomada de la página www.arduino.cc

Page 13: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

12

TABLA DE PINES Arduino Mega 2560

NUMERO DE PIN NOMBRE DE PIN NOMBRE ASIGNADO AL PIN1 PG5 ( OC0B ) Pin Digital 4 (PWM)2 PE0 ( RXD0/PCINT8 ) Pin Digital 0 (PWM) (RX0)3 PE1 ( TXD0 ) Pin Digital 1 (PWM) (TX0)4 PE2 ( XCK0/AIN0 ) I/O5 PE3 ( OC3A/AIN1 ) Pin Digital 5 (PWM)6 PE4 ( OC3B/INT4 ) Pin Digital 2 (PWM)7 PE5 ( OC3C/INT5 ) Pin Digital 3 (PWM)8 PE6 ( T3/INT6 ) I/O9 PE7 ( CLKO/ICP3/INT7 ) I/O

10 VCC VCC11 GND GND12 PH0 ( RXD2 ) Pin Digital 17 (PWM)13 PH1 ( TXD2 ) Pin Digital 16 (PWM)14 PH2 ( XCK2 ) (TX3)15 PH3 ( OC4A ) Pin Digital 6 (PWM)(RX3 )16 PH4 ( OC4B ) Pin Digital 7 (PWM)(TX2)17 PH5 ( OC4C ) Pin Digital 8 (PWM)(RX2 )18 PH6 ( OC2B ) Pin Digital 9 (PWM)(TX1)19 PB0 ( SS/PCINT0 ) Pin Digital 53 (PWM)(RX1)20 PB1 ( SCK/PCINT1 ) Pin Digital 52 (PWM)(SDA)21 PB2 ( MOSI/PCINT2 ) Pin Digital 51 (PWM)(SCL)22 PB3 ( MISO/PCINT3 ) Pin Digital 5023 PB4 ( OC2A/PCINT4 ) Pin Digital 10 (PWM)24 PB5 ( OC1A/PCINT5 ) Pin Digital 11 (PWM)25 PB6 ( OC1B/PCINT6 ) Pin Digital 12 (PWM)26 PB7 ( OC0A/OC1C/PCINT7 ) Pin Digital 13 (PWM)27 PH7 ( T4 ) I/O28 PG3 ( TOSC2 ) I/O29 PG4 ( TOSC1 ) I/O30 RESET RESET31 VCC VCC32 GND GND33 XTAL2 XTAL234 XTAL1 XTAL135 PL0 ( ICP4 ) Pin Digital 4936 PL1 ( ICP5 ) Pin Digital 4837 PL2 ( T5 ) Pin Digital 4738 PL3 ( OC5A ) Pin Digital 46 (PWM)39 PL4 ( OC5B ) Pin Digital 45 (PWM)40 PL5 ( OC5C ) Pin Digital 44 (PWM)

Page 14: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

13

41 PL6 Pin Digital 4342 PL7 Pin Digital 4243 PD0 ( SCL/INT0 ) Pin Digital 21 (SCL)44 PD1 ( SDA/INT1 ) Pin Digital 20 (SDA)45 PD2 ( RXDI/INT2 ) Pin Digital 1946 PD3 ( TXD1/INT3 ) Pin Digital 1847 PD4 ( ICP1 ) I/O48 PD5 ( XCK1 ) I/O49 PD6 ( T1 ) I/O50 PD7 ( T0 ) Pin Digital 3851 PG0 ( WR ) Pin Digital 4152 PG1 ( RD ) Pin Digital 4053 PC0 ( A8 ) Pin Digital 3754 PC1 ( A9 ) Pin Digital 3655 PC2 ( A10 ) Pin Digital 3556 PC3 ( A11 ) Pin Digital 3457 PC4 ( A12 ) Pin Digital 3358 PC5 ( A13 ) Pin Digital 3259 PC6 ( A14 ) Pin Digital 3160 PC7 ( A15 ) Pin Digital 3061 VCC VCC62 GND GND63 PJ0 ( RXD3/PCINT9 ) Pin Digital 1564 PJ1 ( TXD3/PCINT10 ) Pin Digital 1465 PJ2 ( XCK3/PCINT11 ) I/O66 PJ3 ( PCINT12 ) I/O67 PJ4 ( PCINT13 ) I/O68 PJ5 ( PCINT14 ) I/O69 PJ6 ( PCINT 15 ) I/O70 PG2 ( ALE ) Pin Digital 3971 PA7 ( AD7 ) Pin Digital 2972 PA6 ( AD6 ) Pin Digital 2873 PA5 ( AD5 ) Pin Digital 2774 PA4 ( AD4 ) Pin Digital 2675 PA3 ( AD3 ) Pin Digital 2576 PA2 ( AD2 ) Pin Digital 2477 PA1 ( AD1 ) Pin Digital 2378 PA0 ( AD0 ) Pin Digital 2279 PJ7 I/O80 VCC VCC81 GND GND82 PK7 ( ADC15/PCINT23 ) Pin Análogo 15

Page 15: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

14

83 PK6 ( ADC14/PCINT22 ) Pin Análogo 1484 PK5 ( ADC13/PCINT21 ) Pin Análogo 1385 PK4 ( ADC12/PCINT20 ) Pin Análogo 1286 PK3 ( ADC11/PCINT19 ) Pin Análogo 1187 PK2 ( ADC10/PCINT18 ) Pin Análogo 1088 PK1 ( ADC9/PCINT17 ) Pin Análogo 989 PK0 ( ADC8/PCINT16 ) Pin Análogo 890 PF7 ( ADC7/PCINT15 ) Pin Análogo 791 PF6 ( ADC6/PCINT14 ) Pin Análogo 692 PF5 ( ADC5/TMS ) Pin Análogo 593 PF4 ( ADC4/TMK ) Pin Análogo 494 PF3 ( ADC3 ) Pin Análogo 395 PF2 ( ADC2 ) Pin Análogo 296 PF1 ( ADC1 ) Pin Análogo 197 PF0 ( ADC0 ) Pin Análogo 098 AREF Analog Reference99 GND GND

100 AVCC VCCInformación descargada de la página Arduino.cc

• Configuración de puertos: Cada uno de los pines del Arduino mega se pueden configurarcomo entrada o salida. Las entradas corresponden a sensores, suiches o pulsadores, esdecir son los ojos del microcontrolador Arduino; el Arduino adquiere lo que ocurre através de las entradas.Las salidas corresponden a los elementos que el Arduino va a controlar, un bombillo, unled, un motor, una electro válvula, entre otros, es decir las salidas corresponden alelemento final de control.

Configuración del puerto A: Se necesita configurar el puerto a de la siguiente manera:

Para configurar un puerto en Arduino, se utiliza la instrucción DDR seguida de la letra delpuerto que es la que permite definir el puerto como entradas o salidas, hay que tener muyen cuenta que cuando en Arduino se configura un puerto, los 1 son para los bits de salidasy los 0 para los bits de entradas. Los puertos siempre se configurar en el void setup() delencabezado del programa.

En el programa se digita la siguiente línea para configurar los cuatro pines mássignificativos de PUERTO A como entradas y los menos significativos como salidas:

Page 16: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

15

void setup(){DDRA=B00001111; //define PORTA como entrada y salida}

// Configurar todo el PUERTO C como salida.void setup(){DDRC=B11111111; //define PORTC como salida}

// Configurar todo el PUERTO B como entradas.void setup(){DDRB=B00000000; //define PORTB como entrada}

Otra forma de configurar todo el puerto como entrada es la siguiente:

void setup(){DDRB=255; //define PORTB como entrada}

Page 17: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

16

3. INSTRUCCIONES BÁSICAS

• ¿Cómo preguntar si una entrada esta activada?

if(bitRead(PINC,sw)==HIGH) // si el sw es igual a 1

{

Sentencia;}

La sentencia corresponde a la decisión que se va a tomar en caso de que la entrada esteactivada.

¿Cómo preguntar si una entrada esta desactivada?

if(bitRead(PINC,sw)==LOW) // si el sw es igual a 0

{

Sentencia;

}

La sentencia corresponde a la decisión que se va a tomar en caso de que la entrada estedesactivada.

• ¿Cómo activar una salida?

bitSet(PORTA, led); // encienda el led

• ¿Cómo desactivar una salida?

bitClear(PORTA, led); //apague el led

NOTA: Al definir o preguntar por un bit como entrada, siempre se debe hacer con laopción PIN seguido por la letra del puerto y para la salidas con la opción PORT seguidopor la letra del puerto.

¿Cómo llevar un valor a un puerto?

(Tener en cuenta que cada puerto tiene máximo 8 bits)

Page 18: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

17

PORTA = 15; o PORTA = 0X0F; o PORTA = 0B00001111;

(Decimal) (Hexadecimal) (Binario)

Las tres instrucciones equivalen exactamente a lo mismo, llevar el valor 15 al puerto A,con diferente formato.Ejemplo 3.0 instrucciones básicas:

Figura 3.0 Conexión ejemplo

Encender un led conectado a PORTA,0 si el SW conectado a PINA,1 está activado

#define sw PINA,1 //define PINA,1 para el sw

#define led PORTA,0 //define PORTA,0 para el led

void setup()

{

DDRA=B11111101; //define PORTA,1 como entrada y los//demás pines como salida

}

void loop() //haga por siempre

{

if(bitRead(PINA,sw)==HIGH) // si el sw es igual a 1

{

Page 19: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

18

bitSet(PORTA, led); // encienda el led

}

else //de lo contrario

{

bitClear(PORTA, led); //apague el led

}

Page 20: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

19

4. SIMULACIÓN EN PROTEUS

Para simular en proteus, lo primero que hay que hacer es ubicar el archivo .HEX quegenera el sketch de Arduino y esto se hace de la siguiente manera:

• Seleccionar la opción archivo en la barra de herramientas situada en la parte superior deentorno Arduino.

• Seleccionar la opción preferencias.

• En la ventana de preferencias activar la opción mostrar resultados detallados durante lacompilación y listo.

Laboratorio de Control Digital - Universidad EAFIT

19

4. SIMULACIÓN EN PROTEUS

Para simular en proteus, lo primero que hay que hacer es ubicar el archivo .HEX quegenera el sketch de Arduino y esto se hace de la siguiente manera:

• Seleccionar la opción archivo en la barra de herramientas situada en la parte superior deentorno Arduino.

• Seleccionar la opción preferencias.

• En la ventana de preferencias activar la opción mostrar resultados detallados durante lacompilación y listo.

Laboratorio de Control Digital - Universidad EAFIT

19

4. SIMULACIÓN EN PROTEUS

Para simular en proteus, lo primero que hay que hacer es ubicar el archivo .HEX quegenera el sketch de Arduino y esto se hace de la siguiente manera:

• Seleccionar la opción archivo en la barra de herramientas situada en la parte superior deentorno Arduino.

• Seleccionar la opción preferencias.

• En la ventana de preferencias activar la opción mostrar resultados detallados durante lacompilación y listo.

Page 21: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

20

Después de haber hecho estos pasos se procede a compilar el sketch y en la barrasituada en la parte inferior del entorno Arduino se muestra la ubicación del archivo.HEX.

Otra forma para ver la ubicación del archivo .HEX es dejando el botón shift presionadodurante el proceso de compilación del sketch.

Los siguientes son los parámetros con los que debe estar configurado el Arduino enproteus para realizar la simulación correctamente, esta ventana se despliega al dar dobleclick sobre el microcontrolador arduino.

NOTA: Arduino solo se puede simular en una versión d e proteus 7.7 o superior.

Laboratorio de Control Digital - Universidad EAFIT

20

Después de haber hecho estos pasos se procede a compilar el sketch y en la barrasituada en la parte inferior del entorno Arduino se muestra la ubicación del archivo.HEX.

Otra forma para ver la ubicación del archivo .HEX es dejando el botón shift presionadodurante el proceso de compilación del sketch.

Los siguientes son los parámetros con los que debe estar configurado el Arduino enproteus para realizar la simulación correctamente, esta ventana se despliega al dar dobleclick sobre el microcontrolador arduino.

NOTA: Arduino solo se puede simular en una versión d e proteus 7.7 o superior.

Laboratorio de Control Digital - Universidad EAFIT

20

Después de haber hecho estos pasos se procede a compilar el sketch y en la barrasituada en la parte inferior del entorno Arduino se muestra la ubicación del archivo.HEX.

Otra forma para ver la ubicación del archivo .HEX es dejando el botón shift presionadodurante el proceso de compilación del sketch.

Los siguientes son los parámetros con los que debe estar configurado el Arduino enproteus para realizar la simulación correctamente, esta ventana se despliega al dar dobleclick sobre el microcontrolador arduino.

NOTA: Arduino solo se puede simular en una versión d e proteus 7.7 o superior.

Page 22: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

21

Ejemplo 3.1 instrucciones básicas

Laboratorio de Control Digital - Universidad EAFIT

21

Ejemplo 3.1 instrucciones básicas

Laboratorio de Control Digital - Universidad EAFIT

21

Ejemplo 3.1 instrucciones básicas

Page 23: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

22

Encender y apagar un led conectado a PORTA,0 cada segundo .

Ejemplo 3.2 instrucciones básicas

Figura3.2 conexión ejemplo

#define led PORTA,0 //define PORTE,0 como salida para el led

void setup(){DDRA=B11111111; //define PORTE todo como salida}void loop() //haga por siempre{

bitSet(PORTA, led); //enciende el leddelay(1000); //espera 1 segundobitClear(PORTA, led); //apaga el leddelay(1000); //espera 1 segundo

}

Page 24: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

23

Encender los 8 leds conectados al puerto A si los suiches conectados a PINC,0 y PINC,1están activados y apagarlos si están desactivados.

#define sw1 PINC,0 //define PINC,0 para el sw1#define sw2 PINC,1 //define PINC,1 para el sw2void setup()

{DDRA=B11111100; //define PORTA,0 y PORTA,1 como entradas Y los

demás pines como salidasDDRC=B11111111; //define PORTC todo como entradas

}void loop(){if(bitRead(PINC,sw1)==HIGH&&bitRead(PINC,sw2)==HIGH) //si sw1 y sw2 están

activados{PORTA=B11111111; //active lo 8 leds}

if(bitRead(PINC,sw1)==LOW&&bitRead(PINC,sw2)==LOW) //si sw1 y sw2 estándesactivados

{PORTA=0; //apague los 8 leds}

}

Page 25: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

24

Ejemplo 3.3 instrucciones básicas

Figura 2.3 conexión ejemplo

Hacer un programa en ARDUINO que controle un secador de manos de tal manera quecuando se oprima el pulsador encienda el motor y la resistencia durante 10 segundos.

#define pulsador PINA,2 //define el PINA,2 para el pulsador#define motor PORTA,0 //define el PORTA,0 para el motor#define resistencia PORTA,1 //define el PORTA,1 para la resistencia

void setup(){DDRA=B11111011; //define PORTA,2 como entrada y los

demás pines como salida}void loop() //haga por siempre{if(bitRead(PINA,pulsador)==HIGH) // si el pulsador es igual a 1{

bitSet(PORTA,motor); //encienda el motorbitSet(PORTA,resistencia); //encienda la resistenciadelay(10000); //espere 10 segundosbitClear(PORTA,motor); //apague el motorbitClear(PORTA,resistencia); //apague la resistencia

}}

Page 26: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

25

Ejemplo 3.4 instrucciones básicas

Hacer un programa en ARDUINO que indique si se quedaron encendidas las luces delcarro después de apagarlo mediante una alarma que prende y apaga cada 0,5segundos y solo es posible desactivarlo si se apagan las luces.

Figura 3.4 conexión ejemplo

#define alarma PORTA,0 //define PORTA,0 para el alarma#define encendido PINA,1 //define PINA,1 para el encendido#define luces PINA,2 //define PINA,2 para la luces

void setup(){DDRA=B00000001; //define PORTA,0 como salida y los demás pines

como entrada}void loop() //haga por siempre{if(bitRead(PINA,encendido)==LOW&&bitRead(PINA,luces)==HIGH) //si el carro está apagado

y las luces encendidas{

bitSet (PORTA,alarma); //encienda la alarmadelay(500);bitClear(PORTA,alarma);delay(500);

}if(bitRead(PINA,luces)==LOW&& bitRead(PINA,encendido)==LOW) //si el carro está

// apagado y las luces también{bitClear(PORTA,alarma); //apague la alarma

}}

Page 27: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

26

5. INSTRUCCIONES DE ROTACIÓN

En Arduino existen dos instrucciones de rotación una hacia la izquierda y otra hacia laderecha.>> 1: Rotación a la derecha, la cantidad de rotaciones es especificada por él número.<< 1: Rotación a la izquierda, la cantidad de rotaciones es especificada por el número.Al rotar el registro el bit es ocupado con un cero.Ejemplo 5.0 Ejemplos de rotaciónPORTA = PORTA<<1; //Rota el puerto A a la izquierda una vezPORTA = PORTA>>1; //Rota el puerto A a la derecha una vez

Ejemplo 5.1 instrucciones de rotación

Figura 5.1 conexión ejemplo

Encender uno a uno los bits del puerto A, cada medio segundo, comenzando porPORTA,0 En ningún momento se pueden encender dos leds al mismo tiempo.void setup()

{DDRA=B11111111; //define todo PORTA como salida}void loop() //haga por siempre{PORTA=B00000001; //enciende PORTA,0delay(500); //espera medio segundo

while(bitRead(PORTA,7)==LOW) //mientras PORTA,7 este apagado{PORTA=PORTA<<1; //encienda uno a uno los leda hasta llegar a

//PORTA,7delay(500); //espera medio segundo

}}

Page 28: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

27

Ejemplo 5.2 instrucciones de rotación

Figura 5.2 conexión ejemplo

Encender uno a uno los bits del puerto A (0.5seg) desde RA0 hasta RA7 y luegoapagarlos en sentido contrario desde RA7 hasta RA0

void setup (){DDRA=B11111111;}void loop(){

PORTA=B00000001;delay(500);

while(bitRead(PORTA,7)==LOW){PORTA=PORTA<<1;delay(500);}delay(500);

while(bitRead(PORTA,0)==LOW){PORTA=PORTA>>1;delay(500);

}

Page 29: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

28

6. MOTORES PASO A PASO

Los motores paso a paso son un tipo especial de motoresque permiten el movimiento de su eje en ángulos muyprecisos y por pasos, tanto a la izquierda como a la derecha.Aplicando a ellos una secuencia de pulsos.

Cada paso tiene un ángulo muy preciso, determinado por laconstrucción del motor lo que permite realizar movimientosexactos.Son utilizados para generar movimientos precisos, porejemplo en robots, en equipos con movimientos X-Y,entre otros.

Existen dos tipos de motores paso a paso:

Motores Unipolares: este tipo de motor tiene dos bobinas en cada uno de los estatores ycada par de bobinas tienen un punto común, es decir, tiene 5 ó 6 terminales.

Figura 6.1 Motores unipolares

6 terminales

5 terminales

Page 30: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

29

Motores Bipolares: este tipo de motor tiene dos bobinas y no poseen puntos comunes, esdecir tiene cuatro terminales.

Figura 6.2 Motores bipolares

Para controlar este tipo de motor paso a paso bipolar es necesaria usar 8 transistores ocircuitos integrados especiales.

Control del motor paso a paso unipolar

Para controlar el motor paso a paso se debe conocer su secuencia y sus terminales, de talmanera que el circuito o el programa en Arduino generen la secuencia lógica de cuatrobits que energiza una bobina del motor en el orden correcto.

Figura 6.4 Controlador motor paso a paso

Para que el motor gire a la derecha se aplica la secuencia de pulsos en un sentido y paragirar a la izquierda simplemente se invierte la secuencia. Ejemplo:

Tabla 6.4.1 Control del motor paso a paso

Page 31: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

30

Las señales que habilita cada transistor pueden venir desde un circuito integrado o desdeel Arduino, el transistor lleva el negativo a la bobina del motor, en el momento en que eshabilitado. La velocidad del motor depende de la frecuencia con que se envíen los pulsos acada transistor.

Ejemplo 6.1 Motores paso a paso

Figura 6.5 conexión ejemplo

Page 32: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

31

Controlar un motor paso a paso conectado a los cuatro bits menos significativos delPORTA, de tal manera que si el suiche conectado a PINC, 0 está en uno gire a la derecha ysi el suiche está en cero, el motor gira a la izquierda.

int cont;#define Sw PINC,0 //define PINC,0 como entrada para Swbyte const horario[4] = { 0b1100,

0b0110,0b0011,0b1001};

byte const antih[4] = {0b1001,0b0011,

0b0110,0b1100};

void setup(){DDRA=B11111111; //define PORTA como salida

DDRC=B00000000; //define PORTC como entrada}void loop(){if(bitRead(PINC,Sw)==HIGH) // Pregunta si SW esta encendido{

cont=0; // Se pone cont en cerowhile(cont<4 && bitRead(PINC,Sw)==HIGH) // Mientras que cont sea menor a{ //4 y sw=1(encendido)

PORTA=(horario[cont]); // Envíe al PORTA la información// de la tabla de horario

delay(100); // Retardo de 100 milisegundoscont++; // Incremente la variable cont

}}else // de lo contrario{

cont=0; // la variable cont=0while(cont<4 && bitRead(PINC,Sw)==LOW) // Mientras que cont sea{ // menor a 4 y sw=0(apagado)

PORTA=(antih[cont]); // Envíe al PORTA la información// de la tabla de antih

delay(100); // Retardo de 100 milisegundoscont++; // Incremente la variable cont

}}}

Page 33: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

32

Ejemplo 6.2 Motores paso a paso

Figura 6.6 conexión ejemplo

Controlar un motor paso a paso conectado a los cuatro bits menos significativos del

PORTA, de tal manera que si el suiche conectado a PINC,0 está en uno gire a la

derecha y si el suiche conectado a PINC,1 está en uno, el motor gire a la izquierda

int cont;#define Sw1 PINC,0 //define PINC,0 como entrada para Sw1#define Sw2 PINC,1 //define PINC,1 como entrada para Sw2byte const horario[4] = {0b1100,

0b0110,0b0011,0b1001};

byte const antih[4] = {0b1001,0b0011,

0b0110,0b1100};

void setup(){DDRA=B11111111; //define PORTA como salidaDDRC=B00000000; //define PORTC como entrada

Page 34: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

33

}void loop(){if(bitRead(PINC,Sw1)==HIGH) // Pregunta si SW1 esta encendido{

cont=0; // Se pone cont en cerowhile(cont<4) // Mientras que cont sea menor a 4{

PORTA=(horario[cont]); // Envíe al PORTA la información de la tabla de//horario

delay(100); // Retardo de 100 milisegundoscont++; // Incremente la variable cont

}}PORTA=0;if(bitRead(PINC,Sw2)==HIGH) // Pregunta si SW2 esta encendido{

cont=0; // Se pone cont en cerowhile(cont<4) // Mientras que cont sea menor a 4{

PORTA=(antih[cont]); // Envíe al PORTA la información de la tabla de antihdelay(100); // Retardo de 100 milisegundos

cont++; // Incremente la variable cont}

}PORTH=0;}

Page 35: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

34

7. MANEJO DE DISPLAY 7 SEGMENTOS Y ANTIRREBOTE

Conexión de Display 7 segmentos Cuando se quiere mostrar datos en el display, existendos opciones para hacerlo, una utilizar un decodificador BCD a 7 segmentos después delArduino, y otra es generar con el mismo. Arduino el código 7 segmentos equivalente acada número de 0 a 9.

En este caso se hará el decodificador BCD a 7 segmentos con el mismo arduino. Antes deexplicar cómo mostrar datos en un display con el microcontrolador, se recuerda que haceun decodificador BCD a 7 segmentos

Figura 7.1 Conexión del decodificador con el display

El decodificador BCD a 7 segmentos me convierte el código BCD a código 7 segmentos,encendiendo los segmentos correspondientes al número, por ejemplo el número cero(0000 en BCD) debe encender los segmentos a, b, c, d, e y f, el número cuatro (0100 enBCD) debe encender los segmentos b, c, f y g.

Así se podría seguir indicando que segmentos se encienden con cada número, Sinembargo se explicará la forma como el Arduino lo hace.

Se pretende que el mismo Arduino maneje directamente el display sin utilizardecodificadores. La siguiente es la conexión del Arduino con el display de cátodo común.

Para lograr este objetivo se necesita entender el manejo de estructuras en Arduino, quefuncionan como una tabla donde el programa puede consultar el contenido de cadaposición. Lógicamente en cada posición se encuentra el código 7 segmentos de cadanúmero de 0 a 9.

Page 36: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

35

Tabla 7.1 Tabla para los códigos 7 segmentos

Para manejar una estructura en Arduino, lo único que se debe hacer es añadir laestructura al encabezado.

byte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};El número 10 indica la cantidad de posiciones de la estructura, los códigos 7 segmentosestán en hexadecimal.

PH7 PH6 PH5 PH4 PH3 PH2 PH1 PH0g f e d c b a

0 0 0 1 1 1 1 1 1 3F1 0 0 0 0 0 1 1 0 062 0 1 0 1 1 0 1 1 5B3 0 1 0 0 1 1 1 1 4F4 0 1 1 0 0 1 1 0 665 0 1 1 0 1 1 0 1 6D6 0 1 1 1 1 1 0 0 7D7 0 0 0 0 0 1 1 1 078 0 1 1 1 1 1 1 1 7F9 0 1 1 0 0 1 1 1 67

NUMERO

CODIGO 7 SEGMENTOS Numero enhexadecimal

Page 37: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

36

8. TRABAJOS CON PULSADORES (ANTIRREBOTE)Cuando se trabaja con pulsadores o suiches, en el momento en que estos cambian de

estado se genera una señal como la que se muestra en la figura:

Es decir, el suiche o pulsador genera unos y ceros hasta quefinalmente se estabiliza debido a que es un dispositivoelectromecánico, el Arduino con su velocidad de trabajo se dacuenta de esto.

Para evitar errores en la detección de pulsadores y suiches se utilizan retardos de 150 a200ms aproximadamente, en el momento en que se detecta que un pulsador o suichecambió de estado, este tiempo es suficiente mientras se estabiliza y luego, se preguntanuevamente por el estado del suiche.

Ejemplo 8.1 Display 7 segmentos

Hacer un contador de 0 a 9 cada segundo, mostrando el valor del contador en un display7 segmentos. Al llegar a 9, el contador comienza de nuevo.

int cont;

byte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

void setup(){DDRA=B11111111; //define PORTA como salida}

1

0

Figura 8.1 conexión ejemplo

Page 38: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

37

void loop() //haga por siempre{cont=0; //inicializa cont en cero

while(cont<10) //mientras cont sea menor de diez{PORTA=(display[cont]); //muestre el valor en el displaydelay(1000); //retardo de 1 segcont++; //incrementa contador

}}

Ejemplo 8.2 Display 7 segmentos

Figura 8.2 conexión ejemplo

Page 39: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

38

//Realizar un temporizador programable con 2 pulsadores, con un suiche incrementa//y con el otro da Start para empezar a decrementar.

int contador;#define led PORTC,0#define sw1 PINC,4#define sw2 PINC,5byte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

void setup(){DDRA=B11111111;DDRC=B00001111;contador=0;}void loop(){

PORTA=(display[contador]);bitClear(PORTC,led);

if(bitRead(PINC,sw1)==HIGH){delay(200); //antirrebotecontador++;PORTA=(display[contador]);

if(contador==10){

contador=0;}

}if(bitRead(PINC,sw2)==HIGH){delay(200); //antirrebotebitSet(PORTC,led);

while(contador>0){

PORTA=(display[contador]);delay(1000);contador--;

}bitSet(PORTC,led);

}}

Page 40: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

39

9. MULTIPLEXAJE DE DISPLAY

En muchas ocasiones se requiere mostrar números en el display de más de un dígito, esdecir, 2, 3, o 4 dígitos.Si se pretende controlar cada display, se necesitan siete (7) líneas del Arduino por cadauno, esto ocuparía todas las líneas disponibles en cada puerto del Arduino, sin embargoexiste una técnica llamada multiplexaje que consiste en conectar a las mismas 7 líneas los2,3 o 4 display e ir encendiendo uno a uno los display, a través de un transistor, tanrápidamente que parece encenderse todos al mismo tiempo.Cualquier elemento que se encienda y apague con una frecuencia mayor a 25Hz esimperceptible para el ojo humano, éste lo verá encendido en todo momento.El circuito para manejar 2 display multiplexados puede ser el siguiente:

Figura 9.1 circuito para manejar dos displays multiplexados

Nota: Los segmentos de cada display van unidos entre sí, es decir a con a, b con b,hasta el g con g, por cada display adicional se necesita un transistor y sólo una líneamás del Arduino. En este diagrama se asume que las unidades están en el display de laderecha y las decenas en el display de la izquierda.

Page 41: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

40

Ejemplo 9.1 multiplexaje de display

Hacer un contador de 0 a 99 que incremente cada segundo.

int cont; // Declarar la variable cont como un entero, es decirde 8 bits

long contret; // Declarar la variable contret como long, es decir de16 bits

#define tdec PORTC,0 // Definición de variables#define tuni PORTC,1 // Definición de variablesbyte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

void mostrar() // Rutina mostrar{int uni,dec; // Declarar las variables uni,dec como un entero, es

decir de 8bitsdec=cont/10;uni=cont%10;bitClear(PORTC,tdec); // Apaga el display de decenas

Figura 7.1 conexión ejemplo

Page 42: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

41

bitSet(PORTC,tuni); // Enciende el display de unidadesPORTA=(display[uni]); // Muestra lo que hay en unidadesdelay(1); //retardo de 1 milisegundobitClear(PORTC,tuni); // Apaga el display de unidadesbitSet(PORTC,tdec); // Enciende el display de decenasPORTA=(display[dec]); // Muestra lo que hay en decenasdelay(1); //retardo de 1 milisegundo

}void ret1seg() // Rutina RET1SEG{contret=500; // Cargue con 500 la variable contretwhile(contret>0) // Mientras que la variable contret sea mayor que

cero{mostrar(); // Llamar la rutina mostrarcontret--; // Decremente la variable contret

}}

void setup(){DDRA=B11111111; //define PORTA como salidaDDRC=B00001111; //define PORTC| como entrada y salidascont=0; //la variable cont se inicializa en cero}void loop() //haga por siempre{

cont=0;while(cont<100) //mientras que contador sea menor de 100{

ret1seg(); //lama la rutina ret1segcont++; //incrementa la variable cont

}}

Nota: Cuando se encienden y se apagan dos o más bit simultáneamente utilizando lasinstrucciones bitSet y bitClear siempre se debe colocar primero la instrucción bitClear yaque si no se hace de esta forma el sketch no funcionara de la forma deseada.En el ejemplo anterior se utilizan funciones, son pequeños subprogramas que se puedenllamar desde el programa principal. Se debe digitar antes del programa principal que esquien las llama.Si la función no retorna ningún valor se pone la directiva void antes del nombre de lafunción indicando que no retorna ningún valor.

Page 43: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

42

Ejemplo 9.2 multiplexaje de display

Mostrar un valor fijo en el display partiendo de un numero decimal./

int cont; // Declarar la variable cont como un entero, es decir de 8 bits

#define tdec PORTC,0 // Definición de variables

#define tuni PORTC,1 // Definición de variables

byte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

int uni,dec; // Declarar las variables uni,dec como un entero, es decir de8bits

void setup()

{

Figura 7.2 conexión ejemplo

Page 44: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

43

DDRA=B11111111; //define PORTA como salida

DDRC=B00001111; //define PORTC como entrada y salidas

cont=0; //la variable cont se inicializa en cero

}

void loop() //haga por siempre

{

cont=12;

dec=cont/10;

uni=cont%10;

bitClear(PORTC,tdec); // Apaga el display de decenas

bitSet(PORTC,tuni); // Enciende el display de unidades

PORTA=(display[uni]); // Muestra lo que hay en unidades

delay(1); //retardo de 1 milisegundo

bitClear(PORTC,tuni); // Apaga el display de unidades

bitSet(PORTC,tdec); // Enciende el display de decenas

PORTA=(display[dec]) // Muestra lo que hay en decenas

delay(1); //retardo de 1 milisegundo

}

Page 45: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

44

10.INTERRUPCIONES

Si Las llamadas funciones desde el programa principal hacen que el programa ejecute unsubprograma y luego regrese al programa principal, sin embargo el programador estádefiniendo en qué momento debe saltar a ejecutar la función mediante las instrucciones,por esta razón se considera síncronas.Las interrupciones son desviaciones de flujo de control del programa originadasasincrónicamente por diversos sucesos que no dependen del programador, es decir,ocurren en cualquier momento.Las interrupciones ocurren por sucesos externos como la generación de un flanco o nivelen una patica del microcontrolador Arduino o eventos internos tales como eldesbordamiento de un contador, terminación del conversor análogo a digital, entre otras.El comportamiento del microcontrolador ante la interrupción es similar al procedimientoque se sigue al llamar una función desde el programa principal. En ambos casos se detienela ejecución del programa en curso, se guarda la dirección a donde debe retornar cuandotermine de ejecutar la interrupción, atiende o ejecuta el programa correspondiente a lainterrupción y luego continua ejecutando el programa principal, desde donde lo dejocuando fue interrumpido.Existen 4 diferentes causas “LOW,CHANGE,RISING,FALLING” que producen unainterrupción externa, por lo tanto el primer paso de la rutina de interrupción seráidentificar la causa de la interrupción.En esta guía solo se tratan las interrupciones por cambio de estado en el puerto.

attachInterrupt ()

Especifica una función a llamar cuando se produce una interrupción externa. La placaArduino Mega tiene seis pines que se pueden utilizar como interrupciones externas:

NOMBRE DE LA INTERRUPCIÓN PIN DIGITAL PIN FÍSICO

0 2 61 3 72 21 433 20 444 19 455 18 46

Sintaxis

attachInterrupt (interrupción, la función, el modo)

Page 46: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

45

Parámetros

Interrupción: el número de la interrupción (int)Función: nombre de la función a llamar cuando se produce una interrupción, esta funciónno permite ni ingreso ni retorno de parámetro. Esta función se denomina una rutina deservicio de interrupción.El modo es para definir la forma como se activara la interrupción por flanco o porestado. Cuatro constantes están predefinidas como valores válidos:LOW: Genera la interrupción cada vez que el pin pasa a bajo.CHANGE: Genera la interrupción cada vez que hay altos o bajos en el pin.RISING: Genera la interrupción cada vez que el pin pasa a alto.FALLING: Genera la interrupción cada vez que hay un cambio de estado en el puerto dealto a bajo.

Ejemplo 10.1 Interrupciones

Figura 10.1 conexión ejemplo

Page 47: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

46

Hacer un programa que incremente un contador cada vez que se genere una interrupción

byte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};int cont;

void setup(){DDRA=B11111111;attachInterrupt(2,inerrupucion, FALLING); //habilita y llama la interrupción porcambio de estado en el puertocont=0;

}void loop(){PORTA=display[cont]; // Muestra lo que hay en la variable cont en eldisplay

}void inerrupucion() //interrupción{delay(200); //retardo de 200 milisegundoscont++; //incrementa la variable contif(cont==10) //si la variable cont es igual a diezcont=0; //ponga en cero la variable cont e 0

}

Page 48: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

47

11.TIMER

El Arduino mega 2560 tiene 6 temporizadores; el timer0 (8bits), el timer1 (16bits), eltimer2 (8bits) y los timer 3,4, y 5 son de 16bits, de los cuales el timer 1 es el más utilizado.La precisión del timer depende de la velocidad del reloj y la frecuencia. La Velocidad delreloj de Timer1 se define mediante el establecimiento del pre-escaler o divisor. Este pre-escaler se puede establecer en 1, 8, 64, 256 o 1024.Para 16MHz:

PRE-ESCALER TIEMPO DE CONTEO MÁXIMO PERÍODO1 0,0625 uS 8.192 ms8 0,5 uS 65.536 ms

64 4 nos 524,288 mS256 16 nos 2097.152 ms

1024 64uS 8388.608mS

En general:

Máximo = Periodo (pre-escala) * (1/Frecuencia) * (2 ^ 17)

Tiempo de conteo = (pre-escala) * (1/Frecuencia)

Siempre que se va a trabajar con timers se debe agregar la librería de este que ya vienecon todos los parámetros definidos ahorrando tiempo al programar ya que evita elproceso de estar haciendo los cálculos manualmente con esta librería, lo único que hayque hacer es definirle el tiempo de trabajo con el que se desea trabajar el timer estetiempo se le debe dar en microsegundos (uS).

Para descargar la librería del timer1 se encuentra en el siguiente enlace el cual lo lleva a ladescarga.

http://code.google.com/p/arduino-timerone/downloads/list Para instalarlo,simplemente descomprimir y poner los archivos en Arduino/hardware/libraries/Timer1 /

Para agregar una librería al sketch lo único que hay que hacer es ubicarse en la barra deherramientas y seleccionara la opción sketch, importar librería y agregar la libreríadeseada.

Page 49: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

48

Ejemplo 11.1 Timer

Figura 11.1 conexión ejemplo

Page 50: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

49

Realizar un temporizador de 0 a 60 segundos.

#include <TimerOne.h> //incluye la librería del rimer1byte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};int cont, uni,dec,seg;#define U PORTC,1#define D PORTC,0

void mostrar() //muestra en el display los segundos{

uni=seg%10;dec=seg/10;bitClear(PORTC,D);bitSet(PORTC,U);PORTA=display[uni];delay(1);bitClear(PORTC,U);bitSet(PORTC,D);PORTA=display[dec];delay(1);

}void reloj() //rutina de interrupción por timer{seg++;

}

void setup(){

DDRA=B11111111;DDRC=B00000011;dec=0;seg=0;Timer1.initialize(1000000); //define el tiempo de trabajo del timer1 a 1segTimer1.attachInterrupt( reloj ); //habilita y llama la interrupción por timer1

}

void loop(){

if(seg==60)seg=0;

elsemostrar();

}

Page 51: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

50

Ejemplo 10.2 Timer

Figura 11.2 conexión ejemplo

Hacer un contador de 0 a 9, de tal manera que incremente cada segundo porinterrupción a través del timer, al llegar a 9 comienza de nuevo.

#include <TimerOne.h> //agrega librería de timer1byte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};byte cont,seg;

void clock() //rutina que incrementa seg{

seg++;if (seg==10)

seg=0;}

void setup(){

DDRA=B11111111;seg=0;Timer1.initialize(1000000); //define el tiempo de trabajo del timer1 a 1segTimer1.attachInterrupt( clock ); //Habilita y llama la interrupción por timer 1

}void loop(){

PORTA=display[seg]; //muestra seg en el display}

Page 52: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

51

12.MANEJO DEL TECLADO TELEFONICO

Para manejar el teclado telefónico en arduino lo primero que hay que hacer esdescargarse la librería siguiendo el siguiente enlace, haciéndole clic sobre el manteniendola tecla ctrl presionada keypad.zip.Para instalarlo, simplemente descomprimir y poner los archivos enArduino/hardware/libraries/keypad/ una vez ya descargada la librería e instalada seagrega de la misma forma como se vio con la del timer.La conexión entre teclado y arduino es la siguiente:Figura 12.1 Conexión del arduino con el teclado y el display

Los pasos que se deben seguir para manejar un teclado telefónico son:

1. incluir en el encabezado de sketch la librería para manejar el teclado telefónico#include <Keypad.h>.

2. definir el numero de filas y columnas que tiene el teclado con el cual se va atrabajar que en este caso es un teclado de 4x3 ( 4 filas y 3 columnas)const byte filas = 4;const byte columnas = 3;

Page 53: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

52

3. inicializar el tecladochar teclas[filas][columnas] ={

{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}

};4. definir los pines digitales de la filas y las columnas con los cuales se va a manejar elteclado

byte pinesfilas[filas] = {34,33,32,31};byte pinescolumnas[columnas] = {37,36,35};

5. hacer la rutina de lectura de las filas y columnas del tecladoKeypad teclado = Keypad( makeKeymap(teclas), pines filas, pines columnas,filas, columnas );

NOTA: El teclado telefónico solo se puede manejar utilizando pines digitales. Gracias a lalibrería se puede conectar en cualquiera del los pines digitales del Arduino.

Ejemplo 12.1 teclado telefónico

Figura 12.1 conexión ejemplo

Mostrar en un display 7 segmentos el valor digitado en el teclado.#include <Keypad.h> //agrega la librería del tecladobyte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};const byte filas = 4; //define las 4 filas del teclado

Page 54: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

53

const byte columnas = 3; //define las 3 columnas del tecladochar teclas[filas][columnas] = //inicializa filas y columnas{{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};byte pinesfilas[filas] = {33,34,35,36}; //defines los pines digitales de las

cuatro filasbyte pinescolumnas[columnas] = {30,31,32}; //defines los pines digitales de las trescolumnasKeypad teclado = Keypad( makeKeymap(teclas), pinesfilas, pinescolumnas, filas,columnas); //lectura del tecladovoid setup(){DDRA=B11111111; //define PORTA como salida

}void loop() //haga por siempre

{char k = teclado.getKey(); //la variable k es igual a tecladoif(k) //si se pulso una tecla

{PORTA=display[k-48]; //muestra tecla en el display}

}NOTA: si se desea trabajar con un teclado de 4x4 el procedimiento para configúralo essencillo ya que solo hay que modificarle las columnas que en este caso serian 4 en vez de3 cómo se explicó en la configuración del teclado 4x3.const byte filas = 4; //define las 4 filas del tecladoconst byte columnas = 4; //define las 4 columnas del tecladoAl definir las columnas y filas también se agrega la nueva columnachar teclas[filas][columnas] = //inicializa filas y columnas{{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}}Y configurar los pines digitales para el manejo del tecladobyte pinesfilas[filas] = {34,35,36,37}; //defines los pines digitales de las

cuatro filasbyte pinescolumnas[columnas] = {30,31,32,33}; //defines los pines digitales de las tres

//columnas

Page 55: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

54

Ejemplo 12.2 teclado telefónico

Figura 12.2 conexión ejemplo

/*Mostrar el numero digitado por el teclado en el display y cuando se oprima la tecla #, eldisplay comienza a decrementar cada segundo hasta llegar a cero.*/

#include <Keypad.h> //agrega la librería del tecladobyte display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};const byte filas = 4; //define las 4 filas del tecladoconst byte columnas = 3; //define las 3 columnas del tecladochar teclas[filas][columnas] = //inicializa filas y columnas{{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};byte pinesfilas[filas] = {33,34,35,36}; //defines los pines digitales de las //cuatro filas

Page 56: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

55

byte pinescolumnas[columnas] = {30,31,32}; //defines los pines digitales de las trescolumnas

Keypad teclado = Keypad( makeKeymap(teclas), pinesfilas, pinescolumnas,filas,columnas);//lectura del teclado

int cont;int k1;void setup(){DDRA=B11111111;DDRC=B00000000;cont=0;PORTA=display[cont]; //muestre cero en el display

}

void loop() //haga por siempre{

char k=teclado.getKey(); //la variable k es igual a tecladowhile(k=='\0') //si no se oprime ninguna tecla sigue

//llamando al teclado{k = teclado.getKey();

}k1=k-48;if (k){PORTA=display[k-48];}while(k!='#') //mientras k sea diferente de # sigue

//llamando teclado{k = teclado.getKey();}

cont=k1; //cont es igual a k1while(cont>0) //mientas cont sea mayor de 0{cont--; //decremente contPORTA=display[cont]; //muestre lo que hay en la variable con

//en el displaydelay(1000); //retardo de 1 segundo

}}

Page 57: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

56

13.MANEJO DEL LCD (DISPLAY DE CRISTAL LÍQUIDO)Al igual que el teclado telefónico para el LCD también hay que agregar la libreríacorrespondiente con la ventaja de que ya esta no hay que descargarla porque ya vieneincluida en el entorno Arduino por defecto.El procedimiento para trabajar con el LCD es parecido al procedimiento del tecladotelefónico.

La conexión entre el LCD y el Arduino es la siguiente:

Figura 13.1 conexión entre el LCD y el Arduino

Instrucciones para el manejo del display de cristal líquido con Arduino:

#include <LiquidCrystal.h> : Esta línea permite agregar en el proyecto la librería, quefacilita en control del display de cristal liquido.LiquidCrystal lcd(RS, E, D4, D5, D6, D7); : Definir los pines en los que se conecta los pinesdel display de cristal liquido.lcd.begin(16, 2); : Definir el numero de columnas y filas del display de cristal liquido.lcd.setCursor(0, 1); : Define la posición inicial en la que se muestra el mensaje columna,fila.lcd.print("Cadena de caracteres"); Muestra la cadena de caracteres que se pone dentrode las comillas.lcd.print(Variable); Imprimir el valor que contiene una variable tipo entero.

lcd.print(Variable,DEC);Imprimir el valor que contiene una variable tipo decimal.

lcd.clear(); Limpiar pantalla

lcd.write(48); Imprimir el carácter Ascii del valor en este caso imprime el 0.

lcd.noCursor();No aparecer el cursor en pantalla.

lcd.cursor();: Aparecer cursor en pantalla.

lcd.display(); y lcd.noDisplay(); : Mostrar mensaje en la pantalla de cristal liquido y nomostrar el mensaje respectivamente.lcd.home(); ; ir a la posición columna 0 a fila 0.

Page 58: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

57

lcd.leftToRight(); : Escribir los caracteres de derecha a izquierda en la pantalla de cristalliquido.lcd.rightToLeft(); : Escribir los caracteres de izquierda a derecha en la pantalla de cristalliquido.

EL LCD Y LA CONFIGURACIÓN DE LA PANTALLA

Las filas y las columnas en el LCD están distribuidas como se muestra en la figura:El primer número equivale a la columna y el segundo número a la fila.

NOTA: Al igual que el teclado el LCD solo se puede controlar únicamente con pinesdigitales, para los ejemplos con LCD en esta guía se debe iniciar el pin digital 27 comosalida digital y enviarle un cero “0” de la siguiente formapinMode(27,OUTPUT);digitalWrite(27,0);Si no se hace este procedimiento el LCD no mostrara ningún mensaje deseado, este pinsiempre debe ir conectado al pin RW del LCD.

Ejemplo 13.1 LCD

Figura 13.1 conexión ejemplo* LCD RS al pin digital 28* LCD Enable al pin digital 29* LCD D4 al pin digital pin 25* LCD D5 al pin digital pin 24* LCD D6 al pin digital pin 23* LCD D7 al pin digital pin 22

(1,1)

(16,0)

Page 59: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

58

* LCD R/W al pin digital 27* VDD a +5V* VSS a tierra* VEE a potenciómetro

Mostrar un mensaje fijo en el LCD que en la primera fila “GUIA EN ” ,en la segunda“ARDUINO”. En la tercera "UNIVERSIDAD" y en la cuarta "EAFIT".

#include <LiquidCrystal.h> //Agrega la librería del LCD

LiquidCrystal lcd(28, 29,25, 24, 23, 22); //Inicializa la librería y define los pinesdigitales para el LCDvoid setup(){

pinMode(27,OUTPUT);digitalWrite(27,0);lcd.begin(20,4); //Define el LCD a utilizar que en este caso es

de 20 filas y 4 columnas}void loop(){

lcd.setCursor(7, 0); //Ubica el cursor en la fila 7 de la columna 0lcd.print("GUIA EN"); //Muestra el mensaje "GUIA EN"lcd.setCursor(7, 1); //Ubica el cursor en la fila 7 de la columna 1lcd.print("ARDUINO"); //Muestra el mensaje "ARDUINO"lcd.setCursor(5, 2); //Ubica el cursor en la fila 5 de la columna 2lcd.print("UNIVERSIDAD"); //Muestra el mensaje "UNIVERSIDAD"lcd.setCursor(8, 3); //Ubica el cursor en la fila 7 de la columna 3lcd.print("EAFIT"); //Muestra el mensaje "EAFIT"

}

Page 60: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

59

Ejemplo 13.2 LCD

Figura 13.2 conexión ejemplo

* LCD RS al pin digital 28* LCD Enable al pin digital 29* LCD D4 al pin digital pin 25* LCD D5 al pin digital pin 24* LCD D6 al pin digital pin 23* LCD D7 al pin digital pin 22* LCD R/W al pin digital 27* VDD a +5V* VSS a tierra* VEE a potenciómetro

// Mostrar un mensaje diferente de acuerdo al pulsador que se oprima

#include <LiquidCrystal.h> //Agrega la librería del LCD

LiquidCrystal lcd(28, 29,25, 24, 23, 22); //Inicializa la librería y define los pines digitalespara el LCD#define pulsador1 PINC,0 //Define el PINC,0 para el pulsador1#define pulsador2 PINC,1 //Define el PINC,1 para el pulsador2#define pulsador3 PINC,2 //Define el PINC,2 para el pulsador3#define pulsador4 PINC,3 //Define el PINC,3 para el pulsador4

Page 61: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

60

void setup(){

pinMode(27,OUTPUT);digitalWrite(27,0);

lcd.begin(20,4); //Define el LCD a utilizar que en este caso esde 20 filas y 4 columnas

DDRJ=B00000000; //Define todo el PUERTOJ como entrada}

void loop(){if(bitRead(PINC,pulsador1)==HIGH) // Si pulsador 1 está activado{delay(200); // Esperar 0.2 seglcd.clear(); // Borrar el contenido del LCDlcd.setCursor(0,0); // En la fila 0, columna 0lcd.print("SELECCIONE MENU: "); // Mostrar el “SELECCIONE MENU”

}if(bitRead(PINC,pulsador2)==HIGH) // Si pulsador 2 está activado{delay(200); // Esperar 0.2 seglcd.clear(); // Borrar el contenido del LCDlcd.setCursor(0,1); // En la fila 0, columna 1lcd.print(" MENU 1:"); // Mostrar el “MENU 1:”

}if(bitRead(PINC,pulsador3)==HIGH) // Si pulsador 3 está activado{delay(200); // Esperar 0.2 seglcd.clear(); // Borrar el contenido del LCDlcd.setCursor(0,2); // En la fila 0, columna 2lcd.print(" MENU 2:"); // Mostrar el “MENU 2:”

}if(bitRead(PINC,pulsador4)==HIGH) // Si pulsador 4 está activado{delay(200); // Esperar 0.2 seglcd.clear(); // Borrar el contenido del LCDlcd.setCursor(0,3); // En la fila 0, columna 2lcd.print(" MENU 3:"); // Mostrar el “MENU 3:”

}}

Page 62: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

61

NOTA: para manejar un LCD de 16x2 lo único que se debe hacer es darle el número defilas y columnas del LCD a utilizar en la instrucción lcd.begin (16,2);El driver de la librería sirve para cualquier tamaño de LCD de este tipo, al igual que elteclado el LCD se puede utilizar con cualquiera de los pines digitales del Arduino.

Ejemplo 13.3 LCD

Figura 13.3 conexión ejemplo

Mostrar el mensaje “BIENVENIDOS” en la primera línea del LCD,que se vaya desplazando y luego el mensaje fijo “SELECCIONE MENU” en la segunda línea.

#include <LiquidCrystal.h> //Agrega la librería del LCDLiquidCrystal lcd(28,29, 25, 24, 23, 22); //Inicializa la librería y Define los pines digitales para el LCDbyte J;void setup(){

lcd.begin(16,2); //Define el LCD a utilizar que en este caso es de 16//filas y 2 columnas

J=9;while(J>0) //Mientras J se mayor de 0{

lcd.clear(); //Borrar el contenido del LCDlcd.setCursor(J,0); //Ubicar el cursor en la fila 0lcd.print("BIENVENIDOS"); //Mostrar el mensaje "BIENVENIDOS"delay(150); //Esperar 150 milisegundosJ--;

}}void loop() //Haga por siempre{

lcd.setCursor(J,1); //En la fila 1lcd.print("SELECCIONE MENU:"); //Mostrar "SELECCIONE MENU:"

}

Page 63: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

62

Ejemplo 13.4 LCD

Figura 13.4 conexión ejemplo

//Mostrar un contador en LCD de0 a 100 de tal modo que cuando llegue a 100//se inicie de nuevo en 0

#include <LiquidCrystal.h> //Agrega la librería del LCDLiquidCrystal lcd(28, 29, 25, 24, 23, 22); //Inicializa la librería y Define los pines

digitales para el LCDint cont;void setup(){

pinMode(27,OUTPUT);digitalWrite(27,0);lcd.begin(16,2); //Define el LCD a utilizar que en este caso es

de 16 filas y 2 columnascont=0;

}void loop() //Haga por siempre{

lcd.clear(); //limpia la pantalla del LCDlcd.setCursor(0,0); //En la fila 0 columna 0lcd.print("CONTANDO:"); //Mostrar "contando:"

while(cont<=100) //mientas el contador sea menor de 100{lcd.setCursor(0,1); //ubica el cursor en la posición 0 de la

columna 1lcd.print(cont); //Mostrar el valor de contdelay(1000); //retardo de 1 segcont++; //incrementa contador

}cont=0; //cuando llega a 100 reinicia el contador

}

Page 64: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

63

Figura 13.5 Conexión del teclado y el LCD al mismo tiempo

NOTA: no se pueden conectar el LCD y el teclado en los mismos pines.

Page 65: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

64

Ejemplo 13.6 LCD y teclado

Figura 13.6 Conexión ejemploMostrar en el LCD los números digitados por el teclado telefónico, hasta completar 16números.

#include <Keypad.h> //agrega la librería del teclado#include <LiquidCrystal.h> //Agrega la librería del LCDLiquidCrystal lcd(28,29,25,24,23,22); //Inicializa la librería y Define los pines

digitales para el LCDconst byte filas = 4; //define las 4 filas del tecladoconst byte columnas = 3; //define las 3 columnas del tecladochar teclas[filas][columnas] = //inicializa filas y columnas{{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};

Page 66: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

65

byte pinesfilas[filas] = {33,34,35,36}; //defines los pines digitales de las//cuatro filas

byte pinescolumnas[columnas] = {30,31,32}; //defines los pines digitales de las trescolumnasKeypad teclado = Keypad( makeKeymap(teclas), pinesfilas,pinescolumnas,filas,columnas );

//lectura del tecladoint dir;void setup(){

lcd.begin(16,2); //Define el LCD a utilizar que en este//caso es de 16 filas y 2 columnas

}void loop() //Haga por siempre{

dir=0;lcd.clear();

while(dir<17){

char k=teclado.getKey(); // Llamar la función del teclado y//almacenar el// valor digitado en una variable tipo//carácter. Si// no se oprime ninguna tecla el

//teclado// retornara el carácter nulo.

while(k=='\0') // si no se oprime ninguna tecla sigue// llamando al teclado.

{k=teclado.getKey();

}if( (k!='*')&&(k!='#')){lcd.print(k);dir++;

}}

}

Page 67: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

66

Ejemplo 13.7 LCD y teclado

Figura 13.7 Conexión ejemploDigitar una clave en el teclado telefónico, en el LCD mostrar si es correcta o invalida. En elmomento de estar digitando la clave en el LCD se muestran asteriscos en vez de losnúmeros.

#include <Keypad.h> //Agrega la libreria del LCD#include <LiquidCrystal.h> //Agrega la libreria del LCDLiquidCrystal lcd(28, 29, 25, 24, 23,22); //Inicializa la libreria y Define los pinesdigitales para el LCDconst byte filas = 4; //define las 4 filas del tecladoconst byte columnas = 3; //define las 3 columnas del tecladochar teclas[filas][columnas] = //inicializa filas y columnas{{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};

Page 68: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

67

byte pinesfilas[filas] = {33,34,35,36}; //defines los pines digitales de lascuatro filabyte pinescolumnas[columnas] = {30,31,32}; //defines los pines digitales de las tres

//columnasKeypad teclado = Keypad( makeKeymap(teclas), pinesfilas,pinescolumnas, filas,columnas);

//lectura del tecladoint mil,cen,dec,uni,val;#define led1 PORTD,0#define led2 PORTD,1

void teclados(){char k=teclado.getKey(); // Llamar la función del teclado y

//almacenar// el valor digitado en una variable tipo// caracter. Si no se oprime ninguna//tecla el// teclado retornara el carácter nulo.*/

while(k=='\0') // si no se oprime ninguna tecla sigue// llamando al teclado.

{k=teclado.getKey();}

if(k!='\0'){

val=k-48;}}

void setup(){

lcd.begin(16,2); //Define el LCD a utilizar que en este//caso es de 16 filas y 2 columnas

DDRD=B11111111;}void loop() //Haga por siempre{lcd.setCursor(0,0);lcd.print(" BIENVENIDOS ");lcd.setCursor(1,1);lcd.print(" DIGITE CLAVE ");delay(1000);

teclados();

Page 69: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

68

lcd.clear();lcd.setCursor(6,0);

char k=teclado.getKey()

if((k!='*')&&(k!='#')){lcd.print("*");uni=val;

}teclados();

if((k!='#')&&(k!='*')){lcd.print("*");dec=val;

}teclados();if((k!='#')&&(k!='*'))

{lcd.print("*");cen=val;

}teclados();if((k!='#')&&(k!='*'))

{lcd.print("*");mil=val;

}teclados();while((k!='#'))

{k=teclado.getKey();

}if((uni==1)&&(dec==2)&&(cen==3)&&(mil==4)) // Aquí se compara si

// los números digitados// están correctos.

{lcd.clear(); // Se borra LCDlcd.setCursor(1,1); // Se ubica en la posición 1,1lcd.print("CLAVE CORRECTA");bitSet(PORTD,led1);delay(2000);bitClear(PORTD,led1);

}

Page 70: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

69

else{

lcd.clear();lcd.setCursor(1,2);lcd.print("CLAVE INVALIDA");bitSet(PORTD,led2);delay(4000);bitClear(PORTD,led2);

}}

Page 71: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

70

14. ALMACENAMIENTO EN LA MEMORIA EEPROM INTERNA

El microcontrolador de la placa Arduino tiene memoria eeprom interna de 256 bytes,almacenar información en esta memoria tiene la gran ventaja de que los datosalmacenados en ésta no se borran a menos que se sobrescriba sobre ellos, es decir lainformación almacenada allí, no se borra así se des energice el Arduino. Aunque estamemoria es limitada es de gran utilidad.La instrucción para almacenar información en la memoria eeprom interna es la siguiente:EEPROM.write (dirección, valor);La dirección puede ser de 0 a 255, valor es un byteLa instrucción para leer información en la memoria eeprom interna es la siguiente:EEPROM.read (dirección);Dirección puede ser de 0 a 255.Para trabajar con la memoria eeprom en Arduino también se debe incluir en elencabezado del programa la librería de la memoria que ya viene definida por defecto enlas librerías del entorno Arduino.Ejemplo 14.1 memoria eeprom interna

Figura 14.1 Conexión ejemplo

Page 72: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

71

//Realizar un programa en arduino que permita cambiar de clave cada vez que se desee//guardandola en la memoria EEPROM.#include <LiquidCrystal.h> //Agrega la libreria del LCD#include <EEPROM.h> //Agrega la libreria la memoria EEPROM#include <Keypad.h> //Agrega la libreria del TECLADOLiquidCrystal lcd(28, 29, 25, 24, 23, 22); //Inicializa la libreria y Define los pines digitalespara el LCDconst byte filas = 4; //define las 4 filas del tecladoconst byte columnas = 3; //define las 3 columnas del tecladochar teclas[filas][columnas] = //inicializa filas y columnas{{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};byte pinesfilas[filas] = {33,34,35,36}; //defines los pines digitales de las cuatro filabyte pinescolumnas[columnas] = {30,31,32}; //defines los pines digitales de las tres

//columnasKeypad teclado = Keypad( makeKeymap(teclas), pinesfilas, pinescolumnas,filas,columnas);//lectura del teclado

int mil,cen,dec,uni,val,uni1,cen1,dec1,mil1,k1;

#define led1 PORTD,2#define led2 PORTD,3void teclados(){char k=teclado.getKey(); // Llamar la función del teclado y almacenar

k1=k; // el valor digitado en una variable de tipo caracterwhile(k=='\0') // si no se oprime ninguna tecla sigue llamando al teclado.{k=teclado.getKey();

}val=k-48;

}

void clave() //rutina para la clave{ //esta rutina mustra unchar k=teclado.getKey(); //asterisco en el lcdteclados(); //cuando se ingresa un numero

if((k!='*')&&(k!='#')){

lcd.print("*");

Page 73: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

72

uni=val;}teclados();

if((k!='#')&&(k!='*')){lcd.print("*");dec=val;

}teclados();

if((k!='#')&&(k!='*')){lcd.print("*");cen=val;

}teclados();

if((k!='#')&&(k!='*')){lcd.print("*");mil=val;

}}void setup(){

pinMode(27,OUTPUT);digitalWrite(27,0);lcd.begin(16,2); //Define el LCD a utilizar que en este caso es de 16 filas y 2 columnasDDRD=B11111111;lcd.home();lcd.print(" BIENVENIDOS ");delay(1000);lcd.clear();

if(EEPROM.read(0)==255&&EEPROM.read(1)==255&&EEPROM.read(2)==255&&EEPROM.read(3)==255){EEPROM.write(0,0); //esta rutina se ejecuta solamemte cuandoEEPROM.write(1,0); //se programa por primera vez la memoriaEEPROM.write(2,0); //del arduino y colocandola toda en cerosEEPROM.write(3,0); //Por ende primera clave son los "0000"

}}

void loop() //Haga por siempre{

lcd.setCursor(0,0);lcd.print("1 PARA INGRESAR");lcd.setCursor(0,1);

Page 74: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

73

lcd.print("2 CAMBIAR CLAVE");char k=teclado.getKey();

//rutina para ingresarif((k=='1')){

lcd.clear();lcd.setCursor(2,0);lcd.print("DIGITE CLAVE");lcd.setCursor(5,1);

clave();while((k!='#')){k=teclado.getKey();

}uni1=EEPROM.read(0); //lee el valor de la eeprom pos 0 y lo lleva a la variable un11dec1=EEPROM.read(1); //lee el valor de la eeprom pos 1 y lo lleva a la variable dec1cen1=EEPROM.read(2); //lee el valor de la eeprom pos 2 y lo lleva a la variable cen1mil1=EEPROM.read(3); //lee el valor de la eeprom pos 3 y lo lleva a la variable mil1

if((uni1==uni)&&(dec1==dec)&&(cen1==cen)&&(mil1==mil) //si la clave digitada es igual a// la guardada en la eeprom

{lcd.clear(); //Se borra LCDlcd.setCursor(1,1); //Se ubica en la posición 1,1lcd.print("CLAVE CORRECTA"); //muestra el mensaje clave correctabitSet(PORTD,led1); //enciende un led indicando que la clave es correctadelay(2000); //espera 2 segbitClear(PORTD,led1); //apaga el led

}else //pero si la clave no coincide con la guardada en la eeeprom{lcd.clear(); //Se borra LCDlcd.setCursor(1,2); //Se ubica en la posición 1,2lcd.print("CLAVE INVALIDA"); //muestra el mensaje clave invalidabitSet(PORTD,led2); //enciende un led indicando que la clave es invalidadelay(2000); //espera 2 segbitClear(PORTD,led2); //apaga el led

}}//rutina para cambiar claveif((k=='2')){lcd.clear(); //Se borra LCDlcd.setCursor(0,0); //Se ubica en la posición 0,0

Page 75: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

74

lcd.print(" CLAVE ACTUAL"); //muestra el mensaje pidiendo la clave actuallcd.setCursor(5,1);clave(); //llama la rutina clave

while((k!='#')) //espera hasa que se oprima la tecla numero{k=teclado.getKey();

}uni1=EEPROM.read(0); //lee los valores en la eepromdec1=EEPROM.read(1);cen1=EEPROM.read(2);mil1=EEPROM.read(3);

if((uni1==uni)&&(dec1==dec)&&(cen1==cen)&&(mil1==mil) //si la clave digitada es igual//a la guardada en la eprom

{lcd.clear(); //pide digitar la nueva clavelcd.setCursor(0,0);lcd.print(" NUEVA CLAVE ");lcd.setCursor(5,1);clave();EEPROM.write(0,uni); //y la guarda en la eepromEEPROM.write(1,dec);EEPROM.write(2,cen);EEPROM.write(3,mil);

while((k1!='#')) //espera hasta que se oprima la tecla numero{k1=teclado.getKey();

}lcd.clear(); //muestra el mensaje indicandolcd.setCursor(0,0); //que la clave fue cambiadalcd.print(" CLAVE CAMBIADA");delay(1500);lcd.clear();

}else //pero si la clave no coincide con la guardada en la eeeprom{lcd.clear(); //muestra el mensaje clave invalidalcd.setCursor(1,2); //y retorna al inicio inicio del programalcd.print("CLAVE INVALIDA");delay(2000);lcd.clear();

}}

}

Page 76: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

75

15.CONVERSOR ANÁLOGO/DIGITAL A/D

El Arduino mega 2560 posee 16 canales de entrada, conversores análogos/digitales de 10bits.Una señal análoga es una señal continua, por ejemplo una señal entre 0 y 5V es una señalanáloga y puede tomar valores (1V, 2V, 2.5 V, etc.).Una señal digital solo puede tomar dos valores 0V ó 5V, abierto o cerrado, activado odesactivado.Un sensor de nivel que genera una señal análoga que indica el nivel que tiene el tanque entodo momento y la señal será proporcional al nivel del tanque.Un conversor A/D convierte la señal análoga en un número digital (binario), él número esproporcional a la señal análoga.En el caso del Atmega 2560 el conversor A/D tiene 10 bits y la señal análoga de entradapuede estar entre 0V y 5V, sin embargo el conversor A/D tiene unos niveles de referenciaque indican entre que valores será la señal análoga.analogReference (tipo) pin 98 , Configura el voltaje de referencia utilizado para la entradaanalógica (es decir, el valor utilizado como la parte superior del voltaje de entrada). Lasopciones son: DEFAULT: la referencia por defecto analógico de 5 voltios (5V de la placaArduino) o 3,3 voltios (3,3 V en la placa Arduino) INTERIOR: un built-in de referencia, iguala 1,1 voltios y 2.56 voltios INTERNAL1V1: una referencia integrada 1.1V INTERNAL2V56:un built-in de referencia 2.56V EXTERNO: la tensión aplicada a la patilla AREF (entre 0 y 5Vsolamente) se utiliza como referencia.Con 10 bits el mayor número binario que se puede tener es 1024, por lo tanto laresolución del conversor A/D está dada por la fórmula:

1024GNDVresolución REF

Así, por ejemplo, si VREF = +5V y VREF- es 0V, la resolución es 5V/1024 = 4.8mV, cuando laseñal análoga sea 0V le corresponde un número digital = 0000000000 y para 5V será1111111111.Si VREF+ = +5V y VREF- se puede determinar en todo momento a que número digitalaproximado corresponde cualquier señal análoga de entrada, con la fórmula:

VV

mVV EntradaEntrada

0048.08.4

NOTA: Para la simulación en proteus del conversor A/D el pin número 100(AVCC) delArduino debe estar conectado a VCC ya que de no tener este pin conectado no simularael conversor.

Page 77: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

76

Ejemplo 15.1 conversor análogo-digital

Figura 15 .1 Conexión ejemplo

Mostrar en el LCD el valor numérico correspondiente a la señal análoga que entra porRK0(entrada análoga 8).

#include <LiquidCrystal.h> //Agrega la librería del LCDLiquidCrystal lcd(28,29,25,24,23,22); //Inicializa la librería y Define los pines

//digitales para el LCDlong valor; // definir la variable valor como una variable

//tipo long sean 16 bitsvoid setup(){

lcd.begin(16,2); //Define el LCD a utilizar que en este caso esde 16 filas y 2 columnas}void loop()

{valor=analogRead(0) ; // selecciona la entrada análoga 8delay(200); // llama un retardo de 200 milisegundolcd.clear(); // borra lo que hay en display

Page 78: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

77

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

lcd.print("CONVERSOR A/D"); // muestra mensaje CONVERSOR A/Dlcd.setCursor(0,1); // ubica el cursor en la posición 0 de la

// columna 1lcd.print("VOLTAJE = "); // muestra el mensaje VOLTAJE=lcd.print(valor); // muestra el valor numérico de la conversión

}

Page 79: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

78

16.COMUNICACIÓN SERIALExisten dos formas comunes de transferir información binaria entre dos equipos, lacomunicación paralela y la comunicación serial.En la comunicación en forma paralela los datos se transfieren en forma simultánea yexisten algunas líneas adicionales de control que permite la comunicación entre los dosequipos.

Una de las desventajas de la comunicación paralela es la cantidad de líneas que necesita,esto aumenta los costos y más cuando la distancia entre los equipos es grande.La comunicación serial sólo utiliza tres líneas, una para recibir los datos Rx, otra paratrasmitir los datos Tx y la línea común GND.Cada dato se transmite bit a bit, un bit a la vez, por lo tanto se hace mucho más lenta,pero tiene la ventaja de necesitar menos líneas y las distancias a las cuales se puedetransferir la información son mayores, además con el uso de los módem se puedetrasmitir a cualquier parte del mundo.

Existen dos formas de comunicación serial: Sincrónica Asincrónica

16.1 Comunicación Sincrónica:En esta comunicación además de una línea sobre la que se transfieren los datos, senecesita otra que contenga pulsos de reloj que indiquen que el dato es válido; la duracióndel bit está determinada por la duración del pulso de sincronismo.

16.2 Comunicación Asincrónica:En esta comunicación los pulsos de reloj no son necesarios y se utilizan otros mecanismospara realizar la transferencia de datos. La duración de cada bit está determinada por la

Page 80: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

79

velocidad con la cual se realiza la trasferencia de datos, por ejemplo si se transmite a 1200bits por segundo (baudios), la duración de cada bit es de 833 microsegundos.Las velocidades de transmisión más comunes son 300, 600,1200, 2400, 9600, 14400 y28800 baudios.

En este curso solo se estudia la comunicación asincrónica.

En la figura se muestra la forma como se trasmite un dato cuando se realiza algunatransferencia, la línea del transistor permanece en alto. Para empezar a transmitir datosesta línea se pone en bajo durante un bit, lo cual se conoce como bit de Start, y luegocomienza a transmitir los bits correspondientes al dato, empezando por el bit menossignificativo (LSB) y terminando con el más significativo (MSB). Al finalizar se agrega el bitde paridad, si está activada esta opción, y por último los bits de stop, que pueden ser 1 o2, en los cuales la línea regresa a nivel alto.En el ejemplo de la figura, después del bit de start se trasmite el dato 01101001 y al finalhay un bit de stop.Esto significa que la configuración de la transmisión serial es: 1 bit start, 8 bits dato, noparidad y 1 bit de stop.El receptor no está sincronizado con el transistor y no sabe cuándo va a recibir datos. Latransición de alto a bajo de la línea del transmisor, activa el receptor y este generan unconteo de tiempo de tal manera que realiza una lectura de la línea medio bit después delevento; si la lectura realizada es un estado alto, asume que la transición ocurrida fueocasionada por ruido en la línea; si por el contrario la lectura es un estado bajo, consideracomo válida la transición y empieza a realizar lecturas secuenciales a intervalos de un bithasta conformar el dato transmitido. Lógicamente tanto el transmisor como el receptordeberán tener los mismos parámetros de configuración (velocidad, número bits del dato,paridad y bits de parada).La comunicación serial se utiliza para la comunicación entre la placa Arduino y unordenador u otros dispositivos. Todas las placas Arduino tienen al menos un puerto serie(también conocido como un UART o USART): Serial. Se comunica a los pines digitales 0(RX) y 1 (TX), así como con el ordenador a través de USB. Por lo tanto, si utiliza estasfunciones, no se pueden usar los pines 0 y 1 para la entrada o salida digital.Se puede utilizar el entorno de Arduino monitor incorporado de serie para comunicarsecon la placa Arduino. Haga clic en el botón de serie del monitor en la barra de

Page 81: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

80

herramientas y seleccione la misma velocidad de transmisión utilizada en la llamada acomenzar begin().

El Arduino Mega tiene tres puertos serie adicionales: Serial1 en los pines 19 (RX) y 18 (TX),Serial2 en los pines 17 (RX) y 16 (TX), Serial3 en los pines 15 (RX) y 14 (TX) estos no estánconectados al USB - adaptador serial del Mega. Para usar estos pines para comunicarsecon el PC, la forma mas fácil es atraves de un adaptador adicional de USB a serie, quepermite la conexión directa. Para comunicarse con un dispositivo externo TTL serial,conecte el pin TX a RX pin del dispositivo, el RX al pin TX del dispositivo, y la tierra delMega a tierra del dispositivo. (No conectar estos pines directamente a un puerto serieRS232, que operan a + / - 12V, ya que esto daña la placa del Arduino, para esto necesitaun MAX232 como se muestra en la figura 16.1).Las velocidades de transmisión serial del Arduino mega que se pueden utilizar son lossiguientes 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o 115200baudios.

Figura 16.1 Conexión con el puerto serial

Ejemplo 16.2 comunicación serial

Page 82: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

81

Figura 16.2 Conexión ejemplo

Mostrar en el LCD el carácter digitado en el computador.

#include <LiquidCrystal.h> //Agrega la librería del LCDLiquidCrystal lcd(28,29,25,24,23,22); //Inicializa la librería y Define los pinesdigitales para el LCDvoid setup(){

lcd.begin(16,2); //Define el LCD a utilizar que en este caso es//de 16 filas y 2 columnas

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

lcd.print("DIGITE EL TEXTO");lcd.setCursor(0,1);

Page 83: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

82

Serial.begin(9600); //Define la velocidad de la comunicación a//9600 baudios

}

void loop(){if (Serial.available()) //Pregunta si digita una tecla en{lcd.write(Serial.read()); //Muestra la tecla pulsada en el LCD

}}

Page 84: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

83

17.INTERRUPCIÓN SERIAL

El entorno Arduino implementa la comunicación serie a través de la librería integradaSerial. Esta se encarga de manejar las interrupciones de las USART/UART de Arduino,configurar el hardware y gestionar el flujo de datos.Particularmente, maneja las interrupciones de dato recibido y de dato transmitido,añadiendo o recogiendo los datos de sendos bufferes circulares, de forma que un sketchde Arduino pueda mandar datos a la UART sin preocuparse de si la unidad tiene trabajo enese momento o no.Para realizar una interrupción por puerto serial lo único que se debe hacer es agregar alprograma la rutina void serialEvent() antes del void setup o después del void loop, estarutina es la que se encarga de sensar o preguntar si llego algún dato en el puerto serial,en esta rutina se agrega el programa que se quiere que ejecute el Arduino cuando segenere la interrupción.El Arduino mega tiene 4 interrupciones una para cada puerto serial ya que este posee 4puertos seriales estas són:

Para atención de la rutina de interrupción en el puerto serial conectado a TX0 Y RX0 usar:void serialEvent(){Sentencia;}

Para atención de la rutina de interrupción en el puerto serial conectado a TX1 Y RX1 usar:void serialEvent1(){Sentencia;}

Para atención de la rutina de interrupción en el puerto serial conectado a TX2 Y RX2 usar:void serialEvent2(){Sentencia;}

Para atención de la rutina de interrupción en el puerto serial conectado a TX3 Y RX3 usar:void serialEvent3(){Sentencia;}

Page 85: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

84

Ejemplo 17.1 interrupción serialse han recibido datos

Figura 17.1 Conexión ejemplo//Hacer un programa en Arduino de tal manera que cuando se pulse el numero 1//encienda un led y cuando se pulse el número 0 se apague el led esto lo hace//mientras está ejecutando otra labor en este caso un contador.

// Y mostrar un mensaje en el LCD "led on" cuando el led este encendido y "led off"//cuando el led este apagado.

#include <LiquidCrystal.h> //Agrega la librería del LCDLiquidCrystal lcd(28,29,25,24,23,22); //Inicializa la librería y Define los pines

//Digitales para el LCDint cont,valor;#define led PORTC,0void setup(){lcd.begin(16,2); //Define el LCD a utilizar que en este caso es

//de 16//filas y 2 columnas

Page 86: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

85

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

Serial.begin(9600); //Define la velocidad de la comunicación a//9600//baudios

cont=0;DDRC=B11111111; //Define PUERTO C como salida

}void loop()

{lcd.setCursor(1,1); //rutina del contadorlcd.print(cont);delay(1000);cont++;

}void serialEvent() //Revisa que al menos se haya recibido un

carácter en el//puerto serie

{valor=Serial.read();if(valor=='1') //si la tecla pulsada es el número 1{bitSet(PORTC,led); //encienda el ledlcd.home(); //ubica el cursor el la primera posicion del lcdlcd.clear(); //limpia la pantalla del lcdlcd.print("led on"); //muestre el mensaje indicando que el led esta

// Encendido}

if(valor=='0') //si la tecla pulsada es el número 0{bitClear(PORTC,led); //apague el ledlcd.home(); //ubica el cursor en la primera posición del lcdlcd.clear(); //limpia la pantalla del lcdlcd.print("led off"); //muestre el mensaje indicando que el led está

//apagado}

}

Page 87: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

86

18.CONTROL PWM

La modulación por ancho de pulso (PWM) puede ser utilizada en el Arduino de diferentesmaneras, en esta guía se explica una forma sencilla de cómo hacer un control PWM, Si noestá familiarizado con la Modulación de Ancho de Pulso aquí hay una breve explicación,una señal PWM es una onda digital cuadrada, donde la frecuencia es constante, pero lafracción de tiempo en que la señal está encendida (el ciclo de trabajo) puede variar entreel 0 y el 100%.

Imagen 18.1 onda seña PWM

Imágenes tomadas de la página Arduino.ccPWM tiene diferentes usos:

Cambiar intensidad luminica de un LED. Disponer de una salida analógica; si la salida digital está filtrada, esto proveerá de

un voltaje entre el 0% y el 100%. Generar señales de audio. Proveer de un control de velocidad variable para motores. Generar una señal modulada, por ejemplo para utilizar un LED infrarrojo para

control remoto.

Laboratorio de Control Digital - Universidad EAFIT

86

18.CONTROL PWM

La modulación por ancho de pulso (PWM) puede ser utilizada en el Arduino de diferentesmaneras, en esta guía se explica una forma sencilla de cómo hacer un control PWM, Si noestá familiarizado con la Modulación de Ancho de Pulso aquí hay una breve explicación,una señal PWM es una onda digital cuadrada, donde la frecuencia es constante, pero lafracción de tiempo en que la señal está encendida (el ciclo de trabajo) puede variar entreel 0 y el 100%.

Imagen 18.1 onda seña PWM

Imágenes tomadas de la página Arduino.ccPWM tiene diferentes usos:

Cambiar intensidad luminica de un LED. Disponer de una salida analógica; si la salida digital está filtrada, esto proveerá de

un voltaje entre el 0% y el 100%. Generar señales de audio. Proveer de un control de velocidad variable para motores. Generar una señal modulada, por ejemplo para utilizar un LED infrarrojo para

control remoto.

Laboratorio de Control Digital - Universidad EAFIT

86

18.CONTROL PWM

La modulación por ancho de pulso (PWM) puede ser utilizada en el Arduino de diferentesmaneras, en esta guía se explica una forma sencilla de cómo hacer un control PWM, Si noestá familiarizado con la Modulación de Ancho de Pulso aquí hay una breve explicación,una señal PWM es una onda digital cuadrada, donde la frecuencia es constante, pero lafracción de tiempo en que la señal está encendida (el ciclo de trabajo) puede variar entreel 0 y el 100%.

Imagen 18.1 onda seña PWM

Imágenes tomadas de la página Arduino.ccPWM tiene diferentes usos:

Cambiar intensidad luminica de un LED. Disponer de una salida analógica; si la salida digital está filtrada, esto proveerá de

un voltaje entre el 0% y el 100%. Generar señales de audio. Proveer de un control de velocidad variable para motores. Generar una señal modulada, por ejemplo para utilizar un LED infrarrojo para

control remoto.

Page 88: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

87

El lenguaje de programación de Arduino hace que el PWM sea fácil de usar; simplementellama la instrucción analogWrite (pin, dutyCycle), donde dutyCycle es un valor entre 0 y255, donde la sentencia pin es uno de los 15 pines PWM del Arduino mega(0,1,2,3,4,5,6,7,8,9,10,11,12,13 y 16). La función analogWrite ofrece un interfaz simple alhardware PWM, pero no ofrece ningún control sobre la frecuencia. (Nótese que a pesardel nombre de la función, la señal de salida es digital, a menudo haciendo referencia a unaonda cuadrada).

Cuando se va a proveer un control variable para motores por medio de una entradaanáloga se debe utilizar la instrucción map, esta instrucción se encarga de tomar el valoranálogo que está definido por defecto del fabricante a 10 bits (1023) y escalarlo de formaproporcional a 8 bits (255) “o a cualquier otro valor deseado” esto es con el fin de que nose desborde el timer que solamente es de 255 y para un mejor funcionamiento del PWM.pwm=map (pwm, 0,1023,0,255);

NOTA: Al igual que el conversor A/D para simular el PWM en proteus debe colocar el pin100(AVCC) a VCC.Ejemplo 18.1 control PWM

Figura 18.1 Conexión ejemplo

Page 89: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

88

Hacer un programa en Arduino de tal manera que se varíe la velocidad de un motor

long pwm;void setup(){}void loop (){pwm=analogRead (A3); // la variable pwm es igual al valor analogopwm=map (pwm,0,1023,0,255); // convierte la variable pwm que es de 10 bits a 8

// bits para mejor funcionamiento del pwmanalogWrite(13,pwm); // asigna el pin 13 para la salida pwm}

Ejemplo 18.2 control PWM

Figura 18.2 Conexión ejemplo

Page 90: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

89

/*Controlar la velocidad de un motor por medio del teclado y mostrar valor del PWM enel LCD.*/#include <Keypad.h> //agrega la librería del teclado#include <LiquidCrystal.h> //Agrega la librería del LCDLiquidCrystal lcd(28, 29, 25, 24, 23, 22); //Inicializa la librería y Define los pinesdigitales para el LCDconst byte filas = 4; //define las 4 filas del tecladoconst byte columnas = 3; //define las 3 columnas del tecladochar teclas[filas][columnas] = //inicializa filas y columnas{{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};

byte pinesfilas[filas] = {33,34,35,36,}; //defines los pines digitales de lascuatro filabyte pinescolumnas[columnas] = {30,31,32}; //defines los pines digitales de las trescolumnasKeypad teclado = Keypad( makeKeymap(teclas), pinesfilas, pinescolumnas, filas,columnas); //lectura del tecladoint uni,dec,val,pwm,vel;void teclados(){char k=teclado.getKey();while(k=='\0')

{k=teclado.getKey();

}if(k!='\0')

{val=k-48;}

}void setup()

{pinMode(27,OUTPUT);digitalWrite(27,0);lcd.begin(16,2);lcd.print("Digite Velocidad ");lcd.setCursor(0,1);lcd.print("Porcentaje");lcd.setCursor(14,1);

Page 91: Guia Arduino 2012

Laboratorio de Control Digital - Universidad EAFIT

90

lcd.print("%");}

void loop(){

teclados();lcd.setCursor(11,1);char k=teclado.getKey();

if((k!='*')&&(k!='#')){lcd.setCursor(11,1);lcd.print(val);uni=val;}teclados();

if((k!='#')&&(k!='*')){lcd.setCursor(12,1);lcd.print(val);dec=val;}delay(200);pwm=(uni*10)+(dec*1);

while((k!='#')){k=teclado.getKey();}vel=(pwm* 255)/99; //fórmula para velocidadanalogWrite(10,vel);

}