Secuencias de LEDs y Melodias con Arduino

TECNICAS DIGITALES I Trabajo Práctico Nº 6 Integrantes: Fecha de Presentación: Calificación: Observaciones: Visado: Res

Views 105 Downloads 55 File size 157KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

TECNICAS DIGITALES I Trabajo Práctico Nº 6 Integrantes: Fecha de Presentación: Calificación:

Observaciones: Visado: Res. Práctica: Ing. Gustavo Maggiolo / Ing. Rubén Britos

Objetivos: Que el alumno integre el conocimiento teórico con la práctica utilizando un esquema ordenador. Que el alumno logre capacidad manual para el uso de dispositivos electrónicos. Requisitos: Repasar sus conocimientos de Informática I y II, Dispositivos Electrónicos. Haber asistido a la clase teórica del tema Esquema Ordenador. Elementos a Utilizar: Arduino UNO o Nano, Resistencias, LEDs, Pulsador, Fuente de alimentación.

Parte A: Secuencia de luces Actividades: Se desea que el alumno sea capaz de desarrollar e implementar un sistema completo en el entorno Arduino. Debiendo ser realizado con todos los puntos citados debajo. Se deberá entregar un informe, donde describa el funcionamiento general de cada uno de los puntos enumerados en el práctico; y los esquemas del circuito. 1. El circuito deberá contar con 8 LEDs, conectados a IOL en el Arduino y dispuestos de la forma que desee, para la resolución de la actividad. Un pulsador en la entrada 8 de IOH. 2. El funcionamiento general del circuito es: a. Al inicio no debe estar encendido ninguno de los 8 LEDs (Puede usar el LED L de la placa Arduino como status y/o monitor). b. Al presionar el pulsador repetidamente deberá reproduciendo una secuencia determinada, sobre un total de DIEZ (10) a su elección. c. Tres (3) de estas secuencias deberán estar almacenadas en la memoria EEPROM del microcontrolador, indefectiblemente. d. Si el pulsador se presiona por un segundo o más deberá volver a la condición inicial (punto a).

Nota: En todos los casos recomendamos utilizar una fuente de alimentación externa.

Facultad Regional Paraná – U.T.N. Técnicas Digitales I

TECNICAS DIGITALES I Trabajo Práctico Nº 6 Integrantes: Fecha de Presentación: Calificación:

Observaciones: Visado: Res. Práctica: Ing. Gustavo Maggiolo / Ing. Rubén Britos

Objetivos: Que el alumno integre el conocimiento teórico con la práctica utilizando un esquema ordenador. Que el alumno logre capacidad manual para el uso de dispositivos electrónicos. Requisitos: Repasar sus conocimientos de Informática I y II, Dispositivos Electrónicos. Haber asistido a la clase teórica del tema Esquema Ordenador. Elementos a Utilizar: Arduino UNO o Nano, Resistencias, Buzzer, Pulsador, Fuente de alimentación.

Parte B: Generación de melodías Actividades: Se desea que el alumno sea capaz de desarrollar e implementar un sistema completo en el entorno Arduino. Debiendo ser realizado con todos los puntos citados debajo. Se deberá entregar un informe, donde describa el funcionamiento general de cada uno de los puntos enumerados en el práctico; y los esquemas del circuito. 1. El circuito deberá contar con un Buzzer y un pulsador, conectados al esquema Arduino, en pines adecuados para tal fin. 2. El circuito del Buzzer deberá tener su etapa de driver, preferentemente utilizando la alimentación de entrada Vin. 3. El circuito del pulsador deberá tener una etapa de anti rebote. 4. El funcionamiento general del circuito es: a. Al inicio no deberá generarse ninguna melodía (Puede usar el LED L de la placa Arduino como status y/o monitor). b. Al presionar el pulsador repetidamente deberá ir reproduciendo cada una de las melodías que se detallan a continuación: i. El “Feliz cumpleaños”. ii. La canción “La cucaracha” iii. Un tema a elección del grupo. c. Si el pulsador se presiona dos veces seguidas (similar a un doble clic del mouse) se debe volver al inicio (punto a).

Nota: En todos los casos recomendamos utilizar una fuente de alimentación externa.

Facultad Regional Paraná – U.T.N. Técnicas Digitales I

Trabajo Práctico N°6   

Parte A:  La implementación del circuito utilizado, consiste simplemente en la conexión de 8  leds, cada uno con su ánodo conectado a un pin de la placa Arduino, junto con un array  de resistencias para limitar la corriente que circule por estos. Además se incorporó un  pulsador junto con una etapa anti rebote utilizando un Timer 555. Para controlar los  leds se utilizaron los pines del 0 al 7, caracterizados por formar parte de registro de  puertos D del micro. Para el pulsador se valió del pin 8.   

ARDUINO UNO R3

DUINO1

2 3 4 5 6 7 8 9

RP1

1

RESPACK-8

1121 ATMEGA328P-PU

Vcc

7 6 5 4 3 2 1 0

R1

PD7/AIN1 ~ PD6/AIN0 ~ PD5/T1 PD4/T0/XCK ~ PD3/INT1 PD2/INT0 TX PD1/TXD RX PD0/RXD

13 12 11 10 9 8

10k

PC4/ADC4/SDA PC5/ADC5/SCL

DIGITAL (~PWM)

A4 A5

PC0/ADC0 PC1/ADC1 PC2/ADC2 PC3/ADC3

ANALOG IN

A0 A1 A2 A3

PB5/SCK PB4/MISO ~PB3/MOSI/OC2A ~ PB2/SS/OC1B ~ PB1/OC1A PB0/ICP1/CLKO

ANTI-REBOTE

microcontrolandos.blogspot.com

RESET

AREF

           

Las secuencias de leds utilizadas, expresadas en binario son:  Secuencia1:   Secuencia4:  Secuencia7:             B01010101             B11000000  B10000001            B10101010                        B11110000               B11000011                                                 B11111100               B11100111  Secuencia2:                        B11111111               B11111111                                                                  B10000000                        B11111100  B01111110                         B01000000                        B11110000               B00111100                         B00100000                        B11000000               B00011000                         B00010000               B00111100                        B00000000                         B00001000                   B01111110                         B00000100  Secuencia5:                 B11111111                         B00000010           B00000000               B11100111                         B00000001                        B00001110               B11000011                            B11100000               B10000001    Secuencia3:                        B11101110    Secuencia9:            B11000000                        B01110111                        B11110000                        B00000111  B01111111                        B11111100  B10111111                                              B00000000                        B11111111  B11011111                            B00111111   Secuencia6:               B11101111                        B00001111           B10000001               B11110111                        B00000011                        B11000011               B11111011                        B00000000                        B11100111               B11111101                          B11111111               B11111110             B01111110             B00111100     Secuencia10:                           B00011000    B11111111                          B00000000               B00000000             Del programa se deben destacar las funciones encargadas de realizar la rutina  solicitada y algunos fragmentos de códigos implementados para distintas actividades.  En la función SETUP, se debió incluir líneas de código que leyeran de la EEPROM las  secuencias previamente guardadas  (8, 9 y 10). La función LOOP realiza un pulling  sobre el pin del pulsador y además controla que el led L de la placa cambie de estado  cada 1 segundo. Al realizar una pulsación, se realiza un condicionamiento sobre el  retorno de la función tiempo presionado, que devolverá FALSE  si se deja de presionar  el pulsador antes de 1 segundo o TRUE si se da la condición contraria.  Si la función  anterior retorna FALSE se llama a la función funcSecuencia, que ejecutará las  secuencias de leds hasta presionar nuevamente el pulsador y retornar a LOOP.

Parte B:  Para la implementación de la rutina pedida, se valió de un buzzer, conectado a un  seguidor de tensión con un transistor bipolar, el cual “sigue” la tensión del pin 10 de la  placa Arduino, el cual se utilizó como salida de la función tone. El sistema de pulsación,   es el mismo utilizado en la parte A, pero esta ves se conectó en el pin 2,  para poder  utilizar interrupciones en vez de pulling.   

1121 ATMEGA328P-PU

R1

10k

Vcc

DUINO1

ARDUINO UNO R3

   Del programa implementado, se puede destacar la forma en la que se dispuso la información,  en la cual se utilizó solo el vector NOTAS para mantener las frecuencias de tonos y para las  melodías se guardó la posición del vector NOTAS a la que se debía acceder, de manera similar  se realizó con la duración. Entre lo más interesante del programa es la utilización de 2  interrupciones, una vinculada al pulsador y otra que se ejecuta cada 500 ms. Esta interrupción  por tiempo es de vital importancia para la ejecución del “doble click” para volver al micro al  estado inicial. Como en la parte A, en dicho estado el led L cambiará de estado cada 1 segundo. 

Vcc

Q1

NPN

BUZ1

BUZZER

7 6 5 4 3 2 1 0

R2

PD7/AIN1 ~PD6/AIN0 ~ PD5/T1 PD4/T0/XCK ~ PD3/INT1 PD2/INT0 TX PD1/TXD RX PD0/RXD

13 12 11 10 9 8

ANTI-REBOTE

PC4/ADC4/SDA PC5/ADC5/SCL

DIGITAL (~PWM)

A4 A5

PC0/ADC0 PC1/ADC1 PC2/ADC2 PC3/ADC3

ANALOG IN

A0 A1 A2 A3

PB5/SCK PB4/MISO ~PB3/MOSI/OC2A ~ PB2/SS/OC1B ~ PB1/OC1A PB0/ICP1/CLKO

200

microcontrolandos.blogspot.com

RESET

AREF

#include #define TIEMPO 500 PROGRAMA A, hoja 1 bool tiempoprecionado (void); void funcSecuencia(void); int contador = 0; bool boton; byte SecActual = 0; byte elementos[]= {2, 8, 8, 8, 7, 8, 13, 0, 0, 0}; byte Secuencia1[]= { B01010101, B10101010 }; byte Secuencia2[]= { B10000000, B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001}; byte Secuencia3[]={ B11000000, B11110000, B11111100, B11111111, B00111111, B00001111, B00000011, B00000000}; byte Secuencia4[]={ B11000000, B11110000, B11111100, B11111111, B11111100, B11110000, B11000000, B00000000}; byte Secuencia5[]= { B00000000, B00001110, B11100000, B11101110, B01110111, B00000111, B00000000};

byte Secuencia6[]= { B10000001, B11000011, B11100111, B11111111, B01111110, B00111100, B00011000, B00000000}; byte Secuencia7[]= { B10000001, B11000011, B11100111, B11111111, B01111110, B00111100, B00011000, B00111100, B01111110, B11111111, B11100111, B11000011, B10000001}; /* byte Secuencia8[]= { B11000011, B00111100 }; byte Secuencia9[]= { B01111111, B10111111, B11011111, B11101111, B11110111, B11111011, B11111101, B11111110}; byte Secuencia10[]={ B11111111, B00000000 }; */ byte * Secuencia8; byte * Secuencia9; byte * Secuencia10; byte * SECUENCIAS[] = {Secuencia1, Secuencia2, Secuencia3, Secuencia4, Secuencia5, Secuencia6,

PROGRAMA A, hoja 2

Secuencia7, 0, 0, 0, };

unsigned long auxtiem; bool LED;

void setup() { pinMode(8, INPUT); pinMode(13, OUTPUT); digitalWrite(13,HIGH); DDRD=B11111111; /* EEPROM.write(0,2); EEPROM.write(1,Secuencia8[0]); EEPROM.write(2,Secuencia8[1]); EEPROM.write(3,8); EEPROM.write(4,Secuencia9[0]); EEPROM.write(5,Secuencia9[1]); EEPROM.write(6,Secuencia9[2]); EEPROM.write(7,Secuencia9[3]); EEPROM.write(8,Secuencia9[4]); EEPROM.write(9,Secuencia9[5]); EEPROM.write(10,Secuencia9[6]); EEPROM.write(11,Secuencia9[7]); EEPROM.write(12,2); EEPROM.write(13,Secuencia10[0]); EEPROM.write(14,Secuencia10[1]); */ PORTD = 0; elementos[7]=EEPROM.read(0); Secuencia8=(byte*)malloc(1*elementos[7]); Secuencia8[0]=EEPROM.read(1); Secuencia8[1]=EEPROM.read(2); elementos[8]=EEPROM.read(3); Secuencia9=(byte*)malloc(1*elementos[8]); Secuencia9[0]=EEPROM.read(4); Secuencia9[1]=EEPROM.read(5); Secuencia9[2]=EEPROM.read(6); Secuencia9[3]=EEPROM.read(7); Secuencia9[4]=EEPROM.read(8); Secuencia9[5]=EEPROM.read(9); Secuencia9[6]=EEPROM.read(10); Secuencia9[7]=EEPROM.read(11); elementos[9]=EEPROM.read(12); Secuencia10=(byte*)malloc(1*elementos[9]); Secuencia10[0]=EEPROM.read(13); Secuencia10[1]=EEPROM.read(14);

PROGRAMA A, hoja 3

SECUENCIAS[7]=Secuencia8; SECUENCIAS[8]=Secuencia9; SECUENCIAS[9]=Secuencia10; auxtiem=millis(); } void loop() { if ((millis()-auxtiem)>=1000){ switch (LED){ case LOW: LED=HIGH; digitalWrite(13,LED); break; case HIGH: LED=LOW; digitalWrite(13,LED); break; } auxtiem=millis(); } boton=digitalRead(8); if(boton){ if(!tiempoprecionado()){ funcSecuencia(); } } } bool tiempoprecionado (void){ unsigned long tiempo=millis(); while(boton=digitalRead(8)){ if((millis()-tiempo)>=1000) { digitalWrite(13,HIGH); PORTD = 0; tiempo=0; SecActual=0; delay(1000); return true; }} return false; }

PROGRAMA A, hoja 4

void funcSecuencia (void) {

PROGRAMA A, hoja 5

digitalWrite(13,LOW); contador= 0; SecActual++; while(!(digitalRead(8))){ PORTD = *(SECUENCIAS[SecActual-1]+contador); contador++; auxtiem=millis(); while((millis()-auxtiem)=10) SecActual=0; }

#include #define DIVISOR 2 #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define

NOTE_AS3 NOTE_C4 NOTE_CS4 NOTE_D4 NOTE_DS4 NOTE_E4 NOTE_F4 NOTE_FS4 NOTE_G4 NOTE_GS4 NOTE_A4 NOTE_AS4 NOTE_B4 NOTE_C5 NOTE_CS5 NOTE_D5 NOTE_DS5 NOTE_E5 NOTE_F5 NOTE_FS5 NOTE_G5 NOTE_GS5 SILENCIO

PROGRAMA B, hoja 1

233 262 277 294 311 330 349 370 392 415 440 466 494 523 554 587 622 659 698 740 784 831 0

void reproducir(byte * cancion, byte * tiemposnot, byte canc); void botonpresionado(void);

// DO 0 RE 1 MI 2 FA 3 SOL 4 LA 5 LA# 6 SI 7 DO´8 RE´ 9 MI´10 FA´11 SOL´12 13 DO# 14 int notas[]={NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_AS3, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, SILENCIO, NOTE_CS4}; int tiempos[]={2000, 1000, 500, 4000, 3000, 250, 1500, 8000, 2500}; /* 0 1 2 3 4 5 6 7 8 */ byte cucaracha[]={34, 0, 0, 0, 3, 5, 0, 0, 0, 3, 5, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0, 2, 4, 0, 0, 0, 2, 4, 8, 9, 8, 6, 5, 4, 3}; byte TiemCucaracha[]={2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1}; byte cumple[]={25, 4, 4, 5, 4, 8, 7, 4, 4, 5, 4, 9, 8, 8, 10, 11, 10, 8, 7, 5, 12, 12, 10, 8, 9, 8}; byte TiemCumple[]={2, 2, 1, 1, 1, 0, 2, 2, 1, 1, 1, 0, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0}; byte TiemBMF[]={ 5, 5, 5, 5, 0, 1, 1, 4, 5, 5, 5, 5, 0, 1, 1, 4, 5, 5, 5, 5, 0, 1, 2, 2, 4,

5, 5, 5, 5, 6, 1, 2, 7, 2, 2, 2, 8, 6, 2, 2, 2, 8, 6, 2, 2, 2, 2, 2, 1, 2, 3, 3, 5, 5, 5, 5,

5, 5, 5, 5,

6, 2, 5, 5,

6, 2, 5, 5,

2, 2, 2, 2,

5, 5, 2, 2,

byte BueMalFeo[]= 5, 9, 5, 9, 5, 3, 5, 9, 5, 9, 9, 3, 5, 9, 5, 9, 5, 4,

5, 5, 5, 5,

6, 2, 5, 5,

6, 2, 2, 2,

2, 2, 2, 2, 2, 2, 7, 7};

{97, 5, 9, 5, 9, 5, 3, 4, 1, 4, 8, 2, 1, 0, 1, 1,

1, 5, 3, 8, 13, 1, 5, 3, 8, 13, 1, 5, 3, 8, 5, 10, 8, 11, 12, 11, 10, 9, 12, 11, 10, 9, 12, 11, 10, 9, 11, 7, 5, 4, 7, 5,

9, 11, 10, 9, 12, 9, 9, 11, 10, 9, 12, 9, 10, 8, 9, 8, 7, 8, 5, 3, 4, 3, 2, 3, 1, 0, 14};

byte caso; bool LED; bool banderadoble; bool banderadecontrol; unsigned long auxtime;

void setup() { pinMode(3,INPUT); pinMode(13, OUTPUT); digitalWrite(13,HIGH); pinMode(10, OUTPUT); attachInterrupt(1,botonpresionado,RISING); banderadoble=true; banderadecontrol=false; LED=HIGH; caso=0; Timer1.initialize(500000); Timer1.attachInterrupt(dobleclick); }

PROGRAMA B, hoja 2

void loop() { if((millis()-auxtime)>=1000){ LED=!LED; digitalWrite(13,LED); auxtime=millis(); } switch (caso){ case 1: Serial.println("cuca"); reproducir(cucaracha, TiemCucaracha, caso); break; case 2: Serial.println("CUMPLE"); reproducir(cumple, TiemCumple, caso); break; case 3: Serial.println("BFM"); reproducir(BueMalFeo, TiemBMF, caso); break; default:

PROGRAMA B, hoja 3

break; } }

void reproducir(byte * cancion, byte * tiemposnot, byte canc){ byte aux=1; unsigned long tiempoaux; while(caso==canc){ tone(10, notas[cancion[aux]],tiempos[tiemposnot[aux-1]]/DIVISOR); tiempoaux=millis(); while((millis()