TECNICAS DIGITALES I Trabajo Práctico Nº 6 Integrantes: Fecha de Presentación: Calificación:
Observaciones: 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 or denador. 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, Resistencias, LEDs, Pulsador, Fuente de alimentación.
Parte A: Secuencia de luces Actividades: 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). m onitor). 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 secuencias deberán estar almacenadas 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 Nota: En todos los casos recomendamos utilizar una fuente de alimentación alim entación externa.
Facultad Re gional Para ná – U.T.N. 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 or denador. 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 Re gional Para ná – U.T.N. Técnicas Digitales I
Trabajo Prácti co 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.
RESET
A1 A2 A3 A4 A5
PC0/ADC0 PC1/ADC1 PC2/ADC2 PC3/ADC3
m i c r o c o n t r o l a n d o s . b l o g s p o t . c o m
A N A L O G I N
PC4/ADC4/SDA
AREF PB5/SCK
PB4/MISO ~PB3/MOSI/OC2A ~ PB2/SS/OC1B ~ PB1/OC1A 1 U 2 P 1 P 1 8 2 3 A G E M T A
DPB0/ICP1/CLKO I G PD7/AIN1 I T A ~ PD6/AIN0 L PD5/T1 ~ ( ~ PD4/T0/XCK P W ~ PD3/INT1 M PD2/INT0 ) TX PD1/TXD RX PD0/RXD
A R D U I N O U N O R 3
D U I N O 1
13 12 11 10
9
A N T I -R E B O T E
1 0 k
R 1
V c c
8 7 6 5
1
4 3
2
2
3
1
4
0
5 6 7 8 9
R E S P A C K 8
R P 1
Las secuencias de leds utilizadas, expresadas en binario son: Secuencia1:
Secuencia4:
Secuencia7:
B01010101
B11000000
B10000001
B10101010
B11110000
B11000011
B11111100
B11100111
B11111111
B11111111
B10000000
B11111100
B01111110
B01000000
B11110000
B00111100
B00100000
B11000000
B00011000
B00010000
B00000000
B00111100
Secuencia2:
B00001000 B00000100
B01111110 Secuencia5:
B11111111
B00000010
B00000000
B11100111
B00000001
B00001110
B11000011
B11100000
B10000001
Secuencia3:
B11101110 B11000000
B01110111
B11110000
B00000111
B01111111
B11111100
B00000000
B10111111
B11111111 B00111111
Secuencia9:
B11011111 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.
RESET
A1 A2 A3 A4 A5
PC0/ADC0 PC1/ADC1 PC2/ADC2 PC3/ADC3
m i c r o c o n t r o l a n d o s . b l o g s p o t . c o m
A N A L O G I N
PC4/ADC4/SDA
2 0 0
AREF PB5/SCK PB4/MISO ~PB3/MOSI/OC2A
~ PB2/SS/OC1B ~ PB1/OC1A 1 U 2 P 1 P 1 8 2 3 A G E M T A
PB0/ICP1/CLKO
D I G I T A L ( ~ P W M )
PD7/AIN1 ~ PD6/AIN0 ~
PD5/T1
PD4/T0/XCK ~ PD3/INT1
PD2/INT0 TX PD1/TXD RX PD0/RXD
A R D U I N O U N O R 3
D U I N O 1
12
11 10
R 2 B
B U Z 1
U Z Z E R
N P N
Q 1
9 8
6 5 4 3 2 1 0
A N T I -R E B O T E
1 0 k
R 1
V c c
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.
V c c
#i ncl ude #def i ne TI EMPO 500
PROGRAMA A, hoja 1 bool t i empopr eci onado ( voi d) ; voi d f uncSecuenci a( voi d) ; i nt cont ador = 0; bool bot on; byt e SecAct ual = 0; byt e el ement os[ ] = {2, 8, 8, 8, 7, 8, 13, 0, 0, 0}; byt e Secuenci a1[ ] = { B01010101, B10101010 }; byt e Secuenci a2[ ] = { B10000000, B01000000, B00100000, B00010000, B00001000, B00000100, B00000010, B00000001}; byt e Secuenci a3[ ] ={ B11000000, B11110000, B11111100, B11111111, B00111111, B00001111, B00000011, B00000000}; byt e Secuenci a4[ ] ={ B11000000, B11110000, B11111100, B11111111, B11111100, B11110000, B11000000, B00000000}; byt e Secuenci a5[ ] = { B00000000, B00001110, B11100000, B11101110, B01110111, B00000111, B00000000};
byt e Secuenci a6[ ] = { B10000001, B11000011, B11100111, B11111111, B01111110, B00111100, B00011000, B00000000}; byt e Secuenci a7[ ] = { B10000001, B11000011, B11100111, B11111111, B01111110, B00111100, B00011000, B00111100, B01111110, B11111111, B11100111, B11000011, B10000001}; /* byt e Secuenci a8[ ] = { B11000011, B00111100 }; byt e Secuenci a9[ ] = { B01111111, B10111111, B11011111, B11101111, B11110111, B11111011, B11111101, B11111110}; byt e Secuenci a10[ ] ={ B11111111, B00000000 }; */ byt e * Secuenci a8; byt e * Secuenci a9; byt e * Secuenci a10; byt e * SECUENCI AS[ ] = {Secuenci Secuenci Secuenci Secuenci Secuenci Secuenci
a1, a2, a3, a4, a5, a6,
PROGRAMA A, hoja 2
Secuenci a7, 0, 0, 0, }; unsi gned l ong auxt i em; bool LED; voi d set up( ) { pi nMode( 8, I NPUT) ; pi nMode( 13, OUTPUT) ; di gi t al Wr i t e( 13, HI GH) ; DDRD=B11111111; /* EEPROM. wr i t e( 0, 2) ; EEPROM. wr i t e( 1, Secuenci a8[ 0] ) ; EEPROM. wr i t e( 2, Secuenci a8[ 1] ) ; EEPROM. wr i t e( 3, 8) ; EEPROM. wr i t e( 4, Secuenci a9[ 0] ) ; EEPROM. wr i t e( 5, Secuenci a9[ 1] ) ; EEPROM. wr i t e( 6, Secuenci a9[ 2] ) ; EEPROM. wr i t e( 7, Secuenci a9[ 3] ) ; EEPROM. wr i t e( 8, Secuenci a9[ 4] ) ; EEPROM. wr i t e( 9, Secuenci a9[ 5] ) ; EEPROM. wr i t e( 10, Secuenci a9[ 6] ) ; EEPROM. wr i t e( 11, Secuenci a9[ 7] ) ; EEPROM. wr i t e( 12, 2) ; EEPROM. wr i t e( 13, Secuenci a10[ 0] ) ; EEPROM. wr i t e( 14, Secuenci a10[ 1] ) ; */ PORTD = 0; el ement os[ 7] =EEPROM. r ead( 0) ; Secuenci a8=( byt e*) mal l oc( 1*el ement os[ 7] ) ; Secuenci a8[ 0] =EEPROM. r ead( 1) ; Secuenci a8[ 1] =EEPROM. r ead( 2) ; el ement os[ 8] =EEPROM. r ead( 3) ; Secuenci a9=( byt e*) mal l oc( 1*el ement os[ 8] ) ; Secuenci a9[ 0] =EEPROM. r ead( 4) ; Secuenci a9[ 1] =EEPROM. r ead( 5) ; Secuenci a9[ 2] =EEPROM. r ead( 6) ; Secuenci a9[ 3] =EEPROM. r ead( 7) ; Secuenci a9[ 4] =EEPROM. r ead( 8) ; Secuenci a9[ 5] =EEPROM. r ead( 9) ; Secuenci a9[ 6] =EEPROM. r ead( 10) ; Secuenci a9[ 7] =EEPROM. r ead( 11) ; el ement os[ 9] =EEPROM. r ead( 12) ; Secuenci a10=( byt e* ) mal l oc( 1*el ement os[ 9] ) ; Secuenci a10[ 0] =EEPROM. r ead( 13) ; Secuenci a10[ 1] =EEPROM. r ead( 14) ;
PROGRAMA A, hoja 3
SECUENCI AS[ 7] =Secuenci a8; SECUENCI AS[ 8] =Secuenci a9; SECUENCI AS[ 9] =Secuenci a10; auxt i em=mi l l i s( ) ; } voi d l oop( ) { i f ( ( mi l l i s( ) - auxt i em) >=1000) { swi t ch ( LED) { cas e LOW: LED=HI GH; di gi t al Wr i t e( 13, L ED) ; br eak; case HI GH: LED=LOW; di gi t al Wr i t e( 13, L ED) ; br eak; } auxt i em=mi l l i s( ) ; } bot on=di gi t al Read( 8) ; i f ( bot on) { i f ( ! t i empopr eci onado( ) ) { f uncSecuenci a( ) ; } } } bool t i empopr eci onado ( voi d) { unsi gned l ong t i empo=mi l l i s( ) ; whi l e( bot on=di gi t al Read( 8) ) { i f ( ( mi l l i s ( ) - t i empo) >=1000) { di gi t al Wr i t e( 13, HI GH) ; PORTD = 0; t i empo=0; SecAct ual =0; del ay( 1000) ; r et ur n t r ue; }} r et ur n f al s e; }
PROGRAMA A, hoja 4
voi d f uncSecuenci a ( voi d) {
PROGRAMA A, hoja 5
di gi t al Wr i t e( 13, LOW) ; cont ador = 0; SecAct ual ++; whi l e( ! ( di gi t al Read( 8) ) ) { PORTD = * ( SECUENCI AS[ SecAct ual - 1] +cont ador ) ; cont ador ++; auxt i em=mi l l i s( ) ; whi l e( ( mi l l i s( ) - auxt i em) <=TI EMPO) { i f ( di gi t al Read( 8) ) auxt i em=- TI EMPO; } i f ( cont ador == el ement os[ SecAct ual - 1] ) cont ador =0; } i f ( SecAct ual >=10) SecAct ual =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]]/DIV ISOR); tiempoaux=millis(); while((millis()<=tiempoaux+tiempos[tiemposnot[aux-1]]*1. 30/DIVISOR)&&caso==canc){ } if(aux==cancion[0]) aux=1; else aux++; } }
// Funciones de Interrupciones void botonpresionado(void){ if(!banderadoble){ caso=0; banderadoble=true; } else { if(caso<3) caso++; else caso=1; banderadoble=false;
banderadecontrol=true; }
} void dobleclick(void){ if(banderadecontrol){ banderadoble=true; banderadecontrol=false; } }
PROGRAMA B, hoja 4