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
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()