PLAY BOYS: MASKOTA TEKNOLOGIKOA Ikastetxea: ESKOLAZ KANPO Udalerria: BILBAO Maila: DBH1 Tutorea: NATXO MARTIN Partaideak: OSCAR MARTIN LOPEZ LANDER ALBIZURI MONCALVILLO JOSU HIDALGO VILLANUEVA OIER URZAY UNANUE Amaierako txostena- Proiektu teknologikoaren txostena Proiektu teknologikoaren izenburua: Maskota teknologikoa: Skinnerren kutxa elektronikoa hamster bat trebatzeko Proiektu teknologikoaren laburpena : Skinnerrek egin zituen experimentu bezalakoak egingo ditugu, Hamster batekin. Hamster bati “erreflexu baldintzatua” eragiten nahi digu, Skinerren Kaxa elektronikoa eginez. Horreterako Arduino proiektu bat garatu dugu. Hiru aldi edo fase daude: 1. lehenengoan hamsterrak beti jo dezake palanka, 2. bigarrenean bakarrik batzuetan pizten da argia eta argia piztuta badago jo dezake palanka, 3. hirugarrenean brainwaverekin egin dugu, hark zure meditazio eta kontzentrazio hondak neurtzen ditu, eta kontzentratuta bazaude ledak pizten joaten dira kontzentrazioaren arabera eta azkenean guztiak piztuta daudenean hamsterrak palanka jo ahal du eta funtzionatzen da. Arazoa: Zer ikertu duzue, edo zeri bilatu nahi izan diozue konponbidea? Skinnerren kutxa egin dugu, Arduino eta elementu bakunak erabilitzen. Behar diren programak asmatu ditugu, animalia baten gogaratzeko ahalmena ikasteko. Nola egin dugu: • Arduino ikasi eta gero Skinnerren kutxa egin dugu. • Subjektu: hamsterra, egia esateko bi hamster (Rocky eta Rocky 2.0, lehenengoa hil zelako) • Hamsterrek palanka bat jo duenenan janari gozo-gozoa erortzen zaio eta berak jaten du. Lehenengo aldietan ez zen ezertaz konturatu, baina momentu batean nahi gabe konturatu zen opari bat edukiko zuela (denbora asko behar zen) eta portaera errepikatzen zuen. • Brainwave mobile bat erabili nahi ditugu ledak pizteko. 2 Helburuak: Zer eta nola neurtu duzue? Helburuak • Arduino eta processing ikasi: behar diren programak egin behar genuen, beste programa batzuk ikasiz. • Hamserrarako Skinnerren kutxa bat egitea. • Hamsterri “erreflexu baldintzatua” eragitea. Helburuak neurtzeko modua: • Programek ongi funtzionatzen badute. • Kutxak bere funtzioak ongi betetzen baditu. Erreflexu baldintzatua neurtzeko bi modu desberdinak erabili ditugu: • 1. fasean: Hamsterrek palanka jotzen duenean oparia lortzen duela antzeman behar du experimentuan → 3 neurriak erabili ditugu: zenbat aldi jotzen du palanka, hasteko denbora (1. aldia palanka jotzeko), gainerako denbora. • 2. eta 3. fasean: bigarren fasean ikusi behar dugu ia diferentziatzen badu noiz jo behar duela palanka: Argi gorria piztu daudenean bakarrik. Piztu baino lehen “Rocky” musika entzuten da.-→ neurria bakarra erabili dugu: zenbat aldi jotzen du palanka ezertarako (oparia ez lortzeko ledak piztuta ez zeudetalako) 3 Erabilitako materialak: • • • • • • Hormak: Kartoia eta plastikozko kartulina. Hormak apaintzeko: papera zilarrezko kolorekoa, moketa arraro eta verde bat, gomaspuma mota bat, Oskarren marrazkiak, etabar. Sorua: metalesko sare bi sorua egiteko eta apal zahar bat ipini ditugu. Eraikitzeko: gustia itsasteko silikona erabili dugu Elektronika eta Mekanika:Arduinoko plaka bat,kable asko, protoboard bat, led berde eta gorriak, 7 segmentu display-a eta txipa, pulsadore bat, pringles kutxak, tapoiak, etabar. Skinner bezalako experimentuak neurtzeko: bideokamara bat, txantiloiak datuak idazteko, excel orriak datuak aztertzeko Aurrekontua: 200 euroak: • Kaxa egiteko materialak: 20 euro • Elektronika egiteko materialak: ◦ Arduino kita: 39 euro ◦ Brainwave mobile: 136 euro • Hamsterra: 5 euro (Kaiolarik ez) 4 Metodologia: Jarraitu duzuen prozesuaren faseak edo egitura FASEAK 1. Skinnerrek eta Pavlovek egin zituzten ikerketak aztertu. 2. Arduino ikasi: Behar ditugun elementuak erabili eta processing programatu. Horrez gain, beste programak Ikasi ditugu: Sketch Up, Frizzing,.. 3. Gure Skinnerren Kutxa diseinatu. 4. Zirkuitoa diseinatu eta hardware-elementuak prestatu. 5. Skinner Kutxa egin. 6. Processing programak asmatu. 7. Experimentuak egin. 8. Ondorioak azaldu. Planoak. Diseinua eraiki badaiteke, haren argazkia (Sketch Up) 5 6 7 ZIRKUITO ELEKTRONIKOA (Fritzing) Asken horrietan proccessing programak daude (3 fasekoak). 8 Emaitza: Espero zenutena izan da? Berriro egitekotan, nola hobetuko zenukete? SKINNERREN KUTXA EGITEA: Skinerrek egin zuen bezalako kutxa egiteko gai izan gara. ELEKTRONIKA ETA PROGRAMAK: Arduino erabiliz eta processing programatzen 2 lehenengo faseak eginda daude. Hirugarrenaren frogak egin ditugu eta saiatzen ari gara bukatzea. ERREFLEXU BALDINTZATUA ERAGITEA: Hamster batek (Rocky) lehenengo fasea betetzea lortu zuen eta bigarrena ia lortuta zegoen hil baino lehen. Bere iloba, Rocky 2.0, lehenengo fasean dago momento honetan. Lehengeno fasean: Bigarren fasean: GRAFIKOAK... Baina arazo batzuk izan dira: • Hamsterra (Rocky) hil zen Aste Santuan (2. fasea ia bete zuen) • Hobetu nahi genuke janaria emateko prozesua, batzuetan buxatzen delako. • Batzuetan bateriak ia agortutak egon ziren eta boltimetro batekin konturatu ginen. • 3. faseko programa hobetu ahal dugu. Oso zaila da bluetooth moduloa konfiguratzea eta brainwave mobile irakurtzea. • Kaxa hobetu ahal dugu:Material hobeak erabili ahal dugu. 9 Ondorioak eta erreferentziak. Proiektuen emaitzetatik abiatuta, beste zer proiektu teknologiko egin daiteke? Zer geratu zaizue argitzeko edo hobetzeko? Kaxa hobea eta zirkuito konplexuagoa egin ahal dugu: • Hobetu nahi genuke janaria emateko prozesua, batzuetan buxatzen delako. • Material hobeak erabili ahal dugu. • Beste portaerak estimulatu ahal ditugu. Kaiola domotikoa egin ahal dugu: mugikorra baten bidez kontrolatzeko eta barruan gertatzen dena ikusteko. Brainwave uhinak erabili ahal dugu, Arduino proiektu baten bidez, bideo-joku bat erabiltzeko. 10 Eskerrak Bere ideak, eta laguntza eman dizkigutenez eskertu nahi ditugu: • BTEK zentroa-ri • Jon Garcia Barruetabeñari, Deustuko Unibertsitatearen Doktorea. • Gure lagunei Miguel, Araceli eta haien aitari, Andres. Askenean, Mario, Anita eta izeko Maiteri, etxetik kanpo egoten zirelako, eta horrela proiektuan aurreratu ahal genuen. Doako Programak: • Arduino 1.6.7. (processing programa egiteko eta plaka igotzeko) • Fritzing 0.8.3. (zirkuitoa diseinatzeko) • Sketch Up 2016 (3D planoak egiteko) • LibreOffice- Writer 5.1.0.3. Liburua: “Principios de la psicología”, José Luis Pinillos, Alianza Universidad. 226-328 orriak Interneteko erreferentziak: • Arduino ikasteko: ◦ http://www.tr3sdland.com/2011/11/arduino-mi-primer-hola-mundo/ ◦ http://www.tr3sdland.com/2011/11/tutorial-arduino-0004-sensor-ldr/ ◦ http://electronicavm.net/2012/03/29/wii-nunchuk-arduino/ • Pulsadorea: http://www.luisllamas.es/2014/09/leer-un-pulsador-con-arduino/ • Soinua/Musika: ◦ http://opironelectronics.blogspot.com.es/2013/02/primeros-pasos-con-un-buzzer.html • • • ◦ http://elcajondeardu.blogspot.com.es/2014/01/tutorial-haciendo-sonidos-con-ardu.html ◦ https://neutrongeek.wordpress.com/2012/03/17/musica-de-mario-con-arduino/ 7 segmentu display: http://www.electrontools.com/2014/08/registro-de-desplazamiento74hc595.html?m=1 Servo: https://www.arduino.cc/en/Reference/Servo Brainwave-Bluetooth: ◦ https://www.pantechsolutions.net/interfacing-mindwave-mobile-with-arduino ◦ http://www.instructables.com/id/Connecting-NeuroSkys-MindWave-Mobile-with-aPJRCs-/?ALLSTEPS ◦ http://arduinofy.blogspot.com.es/2013/10/tutorial-programming-hc-05-at-modewith.html ◦ http://blog.theinventorhouse.org/como-conectar-bluetooth-hc-05-arduino-y-diademamindwave-neurosky/ 11 ARDUINO/PROCCESSING PROGRAMAK NIVEL 1: LEDS ROJOS CONSTANTEMENTE ENCENDIDOS PERMITIENDO ABRIR TRAMPILLA // inicialmente definimos variables e inicializamos librerías y elementos #include <Servo.h> // incluimos la biblioteca Servo Servo miservo; // creamos un objeto servo para controlar el motor int pulsador = 8; //Definimos el puerto del pulsador int conta = 0; int ledrojo1 = 3; int ledrojo2 = 4; int ledrojo3 = 5; int ledrojo4 = 6; int ledverde1 = 12; int ledverde2 = 13; int buzzer = 11; int servo = 10; int posiniservo = 10; int pinLatch = 2; // Pin connected to Pin 12 of 74HC595 (Latch) int pinDatos = 9; // Pin connected to Pin 14 of 74HC595 (Data) int pinClock = 7; // Pin connected to Pin 11 of 74HC595 (Clock) byte numDisp[16] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0 b01111101,0b00000111,0b01111111,0b01100111}; // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 // A continuación definimos las notas para que suene la canción de Rocky. int c[5]={131,262,523,1046,2093}; // frecuencias de diferentes octavas de Do int cs[5]={139,277,554,1108,2217}; // Do# int d[5]={147,294,587,1175,2349}; // Re int ds[5]={156,311,622,1244,2489}; // Re# int e[5]={165,330,659,1319,2637}; // Mi int f[5]={175,349,698,1397,2794}; // Fa int fs[5]={185,370,740,1480,2960}; int g[5]={196,392,784,1568,3136}; int gs[5]={208,415,831,1661,3322}; int a[5]={220,440,880,1760,3520}; int as[5]={233,466,932,1866,3729}; int b[5]={247,494,988,1976,3951}; // Fa# // Sol // Sol# // La // La# // Si void setup(){ // se preparan las entradas y salidas de Arduino Uno pinMode(pulsador, INPUT); //Declaramos el interruptor como entrada digitalWrite(pulsador, LOW); //Activamos la resistencia Pull-Up pinMode(ledrojo1, OUTPUT); //Declaramos el led como salida pinMode(ledrojo2, OUTPUT); pinMode(ledrojo3, OUTPUT); pinMode(ledrojo4, OUTPUT); pinMode(ledverde1, OUTPUT); pinMode(ledverde2, OUTPUT); pinMode(buzzer, OUTPUT); miservo.attach(servo); // declaramos los pines como de salida pinMode(pinLatch, OUTPUT); pinMode(pinClock, OUTPUT); pinMode(pinDatos, OUTPUT); // pone a cero el display 7 segmentos digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[0]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero delay(1000); } 13 void loop(){ // Cuerpo del programa miservo.write(posiniservo); digitalWrite(ledrojo1, HIGH); //Encendemos el LED digitalWrite(ledrojo2, HIGH); digitalWrite(ledrojo3, HIGH); digitalWrite(ledrojo4, HIGH); Accionar (); } void Accionar() // Función principal definida para accionar el sistema {boolean estado = digitalRead(pulsador); //Leemos el estado del interruptor if(estado == LOW){ digitalWrite(ledverde1, LOW); //leds apagados digitalWrite(ledverde2, LOW); } else{ conta++; if(conta < 10){ //Incrementa el contador NumeroEnDisplay (conta); digitalWrite(ledrojo1, LOW); digitalWrite(ledrojo2, LOW); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); digitalWrite(ledverde1, HIGH); //Encendemos el LED digitalWrite(ledverde2, HIGH); EmitirSonido (); AbrirTrampilla (); delay (2000); //dejamos dos segundos con luz y trampilla abierta digitalWrite(ledverde1, LOW); //leds apagados 14 digitalWrite(ledverde2, LOW); Sonar(); } else{ digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[9]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero digitalWrite(ledrojo1, LOW); digitalWrite(ledrojo2, LOW); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); delay (1000); // espera 1 segundo con leds rojos apagados for (int x=0;x<1000;x++){ // que parpadeen los leds rojos 100 veces en señal de que se ha acabado el experimento digitalWrite(ledverde1, HIGH); //Encendemos el LED digitalWrite(ledverde2, HIGH); delay (500); digitalWrite(ledverde1, LOW); //apagamos el LED digitalWrite(ledverde2, LOW); delay (500); } } } } void NumeroEnDisplay (int conta) // dibuja el nº toques palanca en display { digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[conta]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero shiftOut(pinDatos, pinClock, MSBFIRST, 0); // apaga todos los leds digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero delay(100); 15 } void EmitirSonido (){ // suena cuando la trampilla deja caer comida int numTones = 26; int tones[] = {261, 349, 392, 440, 392, 330, -10, 261, 349, 392, 440, 392, -10, -10, 261, 349, 392, 440, 392, 330, -10, 330, 349, 330, 261, 261}; for (int i = 0; i < numTones; i++) { tone(buzzer, tones[i]); delay(50); } noTone(buzzer); } void AbrirTrampilla () { // la trampilla se abre para dejar caer comida delay (1200); for(int angulo = 10; angulo > 150; angulo += 2) { // un ciclo para mover el servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(3); // espera unos milisegundos para que el servo llegue a su posicion } for (int i =0; i<40; i++){ // provoca una vibración en un recorrido de 10 grados de ida y vuelta for(int angulo = 150; angulo > 140; angulo -= 2) { // un ciclo para mover el servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(2); // espera unos milisegundos para que el servo llegue a su posicion } for(int angulo = 140; angulo > 150; angulo += 3) { // un ciclo para mover el servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(2); // espera unos milisegundos para que el servo llegue a su posicion } } miservo.write(posiniservo); } 16 void Sonar() { // Suena la canción de Rocky nota (e[1],100);noTone(buzzer);delay(50); nota (g[1],200);noTone(buzzer);delay(100); nota (a[1],800);noTone(buzzer);delay(200); nota (a[1],100);noTone(buzzer);delay(50); nota (b[1],200);noTone(buzzer);delay(100); nota (e[1],800);noTone(buzzer);delay(400); } void nota(int frec, int t) //lee las notas musicales para la canción de Rocky { tone(buzzer,frec); // suena la nota frec recibida delay(t); // para despues de un tiempo t } NIVEL 2: LEDS ROJOS SE ENCIENDEN ALEATORIAMENTE ENTRE 1-20 SEGUNDOS #include <Servo.h> // incluimos la biblioteca Servo Servo miservo; // creamos un objeto servo para controlar el motor int pulsador = 8; //Definimos el puerto del pulsador int conta = 0; int ledrojo1 = 3; int ledrojo2 = 4; int ledrojo3 = 5; int ledrojo4 = 6; int ledverde1 = 12; int ledverde2 = 13; int buzzer = 11; 17 int servo = 10; int posiniservo = 10; int pinLatch = 2; // Pin connected to Pin 12 of 74HC595 (Latch) int pinDatos = 9; // Pin connected to Pin 14 of 74HC595 (Data) int pinClock = 7; // Pin connected to Pin 11 of 74HC595 (Clock) byte numDisp[16] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0 b01111101,0b00000111,0b01111111,0b01100111}; // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 int c[5]={131,262,523,1046,2093}; int cs[5]={139,277,554,1108,2217}; int d[5]={147,294,587,1175,2349}; int ds[5]={156,311,622,1244,2489}; int e[5]={165,330,659,1319,2637}; int f[5]={175,349,698,1397,2794}; int fs[5]={185,370,740,1480,2960}; int g[5]={196,392,784,1568,3136}; int gs[5]={208,415,831,1661,3322}; int a[5]={220,440,880,1760,3520}; int as[5]={233,466,932,1866,3729}; int b[5]={247,494,988,1976,3951}; // frecuencias de diferentes octavas de Do // Do# // Re // Re# // Mi // Fa // Fa# // Sol // Sol# // La // La# // Si void setup(){ pinMode(pulsador, INPUT); //Declaramos el interruptor como entrada digitalWrite(pulsador, LOW); //Activamos la resistencia Pull-Up pinMode(ledrojo1, OUTPUT); //Declaramos el led como salida pinMode(ledrojo2, OUTPUT); pinMode(ledrojo3, OUTPUT); pinMode(ledrojo4, OUTPUT); pinMode(ledverde1, OUTPUT); pinMode(ledverde2, OUTPUT); pinMode(buzzer, OUTPUT); miservo.attach(servo); // declaramos los pines como salida pinMode(pinLatch, OUTPUT); pinMode(pinClock, OUTPUT); pinMode(pinDatos, OUTPUT); // pone a cero el display 7 segmentos 18 digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[0]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero delay(1000); Sonar(); } void loop(){ miservo.write(posiniservo); digitalWrite(ledrojo1, HIGH); //Encendemos LEDs que parten de estar encendidos digitalWrite(ledrojo2, HIGH); digitalWrite(ledrojo3, HIGH); digitalWrite(ledrojo4, HIGH); Accionar (); } void Accionar() {boolean estado = digitalRead(pulsador); //Leemos el estado del interruptor if(estado == LOW){ digitalWrite(ledverde1, LOW); //leds apagados digitalWrite(ledverde2, LOW); } else{ conta++; if(conta < 10){ //Incrementa el contador NumeroEnDisplay (conta); digitalWrite(ledrojo1, LOW); 19 digitalWrite(ledrojo2, LOW); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); digitalWrite(ledverde1, HIGH); //Encendemos el LED digitalWrite(ledverde2, HIGH); EmitirSonido (); AbrirTrampilla (); delay (2000); //dejamos dos segundos con luz y trampilla abierta digitalWrite(ledverde1, LOW); //leds apagados digitalWrite(ledverde2, LOW); miservo.write(posiniservo); int espera= random (1000,20000); //genera un tiempo entre 1 y 20 segundos delay(espera);// espera entre cada vez que se enciendan los leds Sonar(); } else{ digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[9]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero digitalWrite(ledrojo1, LOW); digitalWrite(ledrojo2, LOW); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); delay (1000); // espera 1 segundo con leds rojos apagados for (int x=0;x<1000;x++){ // que parpadeen los leds rojos 100 veces en señal de que se ha acabado el experimento digitalWrite(ledverde1, HIGH); //Encendemos el LED digitalWrite(ledverde2, HIGH); delay (500); digitalWrite(ledverde1, LOW); //apagamos el LED digitalWrite(ledverde2, LOW); delay (500); }} 20 } } void NumeroEnDisplay (int conta) { digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[conta]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero shiftOut(pinDatos, pinClock, MSBFIRST, 0); // apaga todos los leds digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero delay(100); } void EmitirSonido (){ int numTones = 26; int tones[] = {261, 349, 392, 440, 392, 330, -10, 261, 349, 392, 440, 392, -10, -10, 261, 349, 392, 440, 392, 330, -10, 330, 349, 330, 261, 261}; for (int i = 0; i < numTones; i++) { tone(buzzer, tones[i]); delay(50); } noTone(buzzer); } void AbrirTrampilla () { for(int angulo = 10; angulo > 150; angulo += 2) { // un ciclo para mover el servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(3); // espera unos milisegundos para que el servo llegue a su posicion } for (int i =0; i<40; i++){ // provoca una vibración en un recorrido de 10 grados de ida y vuelta for(int angulo = 150; angulo > 140; angulo -= 2) { // un ciclo para mover el 21 servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(2); // espera unos milisegundos para que el servo llegue a su posicion } for(int angulo = 140; angulo > 150; angulo += 3) { // un ciclo para mover el servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(2); // espera unos milisegundos para que el servo llegue a su posicion } } miservo.write(posiniservo); } void Sonar() { nota (e[1],100);noTone(buzzer);delay(50); nota (g[1],200);noTone(buzzer);delay(100); nota (a[1],800);noTone(buzzer);delay(200); nota (a[1],100);noTone(buzzer);delay(50); nota (b[1],200);noTone(buzzer);delay(100); nota (e[1],800);noTone(buzzer);delay(400); } void nota(int frec, int t) { tone(buzzer,frec); // suena la nota frec recibida delay(t); // para despues de un tiempo t } 22 NIVEL 3: LEDS ROJOS SE ENCIENDEN CON MENTE (SE SUPONE QUE A PARTIR DE 2 LEDS ROJOS ENCENDIDOS CON BRAINWAVE FUNCIONA – Pendiente mejora ya que no va fino, cambiar definiciones, entender y simplificar el programa) #include <Servo.h> // incluimos la biblioteca Servo Servo miservo; // creamos un objeto servo para controlar el motor int pulsador = 8; //Definimos el puerto del pulsador int conta = 0; int Ledcalidad=2; // BRAINWAVE int BAUDRATE=57600; int DEBUGOUTPUT=0; int powercontrol=10; // checksum variables byte generatedChecksum = 0; byte checksum = 0; int payloadLength = 0; byte payloadData[64] = { 0}; byte poorQuality = 0; byte attention = 0; byte meditation = 0; // system variables long lastReceivedPacket = 0; boolean bigPacket = false; int ledrojo1 = 3; int ledrojo2 = 4; int ledrojo3 = 5; int ledrojo4 = 6; int ledverde1 = 12; int ledverde2 = 13; int buzzer = 11; 23 int servo = 10; int posiniservo = 10; int pinLatch = 2; // Pin connected to Pin 12 of 74HC595 (Latch) int pinDatos = 9; // Pin connected to Pin 14 of 74HC595 (Data) int pinClock = 7; // Pin connected to Pin 11 of 74HC595 (Clock) byte numDisp[16] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0 b01111101,0b00000111,0b01111111,0b01100111}; // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 int c[5]={131,262,523,1046,2093}; int cs[5]={139,277,554,1108,2217}; int d[5]={147,294,587,1175,2349}; int ds[5]={156,311,622,1244,2489}; int e[5]={165,330,659,1319,2637}; int f[5]={175,349,698,1397,2794}; int fs[5]={185,370,740,1480,2960}; int g[5]={196,392,784,1568,3136}; int gs[5]={208,415,831,1661,3322}; int a[5]={220,440,880,1760,3520}; int as[5]={233,466,932,1866,3729}; int b[5]={247,494,988,1976,3951}; // frecuencias de diferentes octavas de Do // Do# // Re // Re# // Mi // Fa // Fa# // Sol // Sol# // La // La# // Si void setup(){ pinMode(pulsador, INPUT); //Declaramos el interruptor como entrada digitalWrite(pulsador, LOW); //Activamos la resistencia Pull-Up/Down pinMode(ledrojo1, OUTPUT); //Declaramos el led como salida pinMode(ledrojo2, OUTPUT); pinMode(ledrojo3, OUTPUT); pinMode(ledrojo4, OUTPUT); pinMode(ledverde1, OUTPUT); pinMode(ledverde2, OUTPUT); pinMode(buzzer, OUTPUT); miservo.attach(10); 24 // declaramos los pines como de salida pinMode(pinLatch, OUTPUT); pinMode(pinClock, OUTPUT); pinMode(pinDatos, OUTPUT); // pone a cero el display 7 segmentos digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[0]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero delay(1000); pinMode(Ledcalidad, OUTPUT); //BRAINWAVE Serial.begin(BAUDRATE); } //////////////////////////////// // Read data from Serial UART BRAINWAVE // //////////////////////////////// byte ReadOneByte() { int ByteRead; while(!Serial.available()); ByteRead = Serial.read(); #if DEBUGOUTPUT Serial.print((char)ByteRead); // echo the same byte out the USB serial (for debug purposes) #endif return ByteRead; } 25 void loop(){ miservo.write(posiniservo); // AQUI AÑADO LA PROGRAMACIÓN DEL BRAINWAVE (obtenido de Internet) // Look for sync bytes if(ReadOneByte() == 170) { if(ReadOneByte() == 170) { payloadLength = ReadOneByte(); if(payloadLength > 169) 169 return; //Payload length can not be greater than generatedChecksum = 0; for(int i = 0; i < payloadLength; i++) { payloadData[i] = ReadOneByte(); //Read payload into memory generatedChecksum += payloadData[i]; } checksum = ReadOneByte(); //Read checksum byte from stream generatedChecksum = 255 - generatedChecksum; //Take one's compliment of generated checksum if(checksum == generatedChecksum) { poorQuality = 200; attention = 0; meditation = 0; for(int i = 0; i < payloadLength; i++) { // Parse the payload switch (payloadData[i]) { case 2: i++; poorQuality = payloadData[i]; bigPacket = true; break; 26 case 4: i++; attention = payloadData[i]; break; case 5: i++; meditation = payloadData[i]; break; case 0x80: i = i + 3; break; case 0x83: i = i + 25; break; default: break; } // switch } // for loop #if !DEBUGOUTPUT // Es donde se definen los niveles de atención para encender leds (funcionó pero no está estable) if(bigPacket) { if(poorQuality == 0) digitalWrite(Ledcalidad, HIGH); else digitalWrite(Ledcalidad, LOW); Serial.print(" Attention: "); Serial.print(attention, DEC); Serial.print("\n"); if (attention <20) { digitalWrite(ledrojo1, LOW); digitalWrite(ledrojo2, LOW); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); 27 } if (attention <30 and attention >=20) { digitalWrite(ledrojo1, HIGH); digitalWrite(ledrojo2, LOW); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); Accionar(); } if (attention <50 and attention >=30){ digitalWrite(ledrojo1, HIGH); digitalWrite(ledrojo2, HIGH); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); Accionar(); } if (attention < 70 and attention >=50){ digitalWrite(ledrojo1, HIGH); digitalWrite(ledrojo2, HIGH); digitalWrite(ledrojo3, HIGH); digitalWrite(ledrojo4, LOW); Accionar(); } if (attention > 70){ digitalWrite(ledrojo1, HIGH); digitalWrite(ledrojo2, HIGH); digitalWrite(ledrojo3, HIGH); digitalWrite(ledrojo4, HIGH); Accionar(); } } #endif bigPacket = false; } else { // Checksum Error } // end if else for checksum } // end if read 0xAA byte } // end if read 0xAA byte 28 //AQUI TERMINA El resto es similar a otro nivel y debe funcionar } void Accionar() {boolean estado = digitalRead(pulsador); //Leemos el estado del interruptor if(estado == LOW){ digitalWrite(ledverde1, LOW); //leds apagados digitalWrite(ledverde2, LOW); } else{ conta++; if(conta < 10){ //Incrementa el contador NumeroEnDisplay (conta); digitalWrite(ledrojo1, LOW); digitalWrite(ledrojo2, LOW); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); digitalWrite(ledverde1, HIGH); //Encendemos el LED digitalWrite(ledverde2, HIGH); EmitirSonido (); AbrirTrampilla (); delay (2000); //dejamos dos segundos con luz y trampilla abierta digitalWrite(ledverde1, LOW); //leds apagados digitalWrite(ledverde2, LOW); miservo.write(posiniservo); Sonar(); } else{ 29 digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[9]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero digitalWrite(ledrojo1, LOW); digitalWrite(ledrojo2, LOW); digitalWrite(ledrojo3, LOW); digitalWrite(ledrojo4, LOW); delay (1000); // espera 1 segundo con leds rojos apagados for (int x=0;x<1000;x++){ // que parpadeen los leds rojos 100 veces en señal de que se ha acabado el experimento digitalWrite(ledverde1, HIGH); //Encendemos el LED digitalWrite(ledverde2, HIGH); delay (500); digitalWrite(ledverde1, LOW); //apagamos el LED digitalWrite(ledverde2, LOW); delay (500); } } } } void NumeroEnDisplay (int conta) { digitalWrite(pinLatch, LOW); // pone en pin de latch en LOW para transmitir shiftOut(pinDatos, pinClock, MSBFIRST, numDisp[conta]); // carga el byte en el registro digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero shiftOut(pinDatos, pinClock, MSBFIRST, 0); // apaga todos los leds digitalWrite(pinLatch, HIGH); // pone en pin de latch en HIGH para desplegar el numero delay(100); } void EmitirSonido (){ int numTones = 26; 30 int tones[] = {261, 349, 392, 440, 392, 330, -10, 261, 349, 392, 440, 392, -10, -10, 261, 349, 392, 440, 392, 330, -10, 330, 349, 330, 261, 261}; for (int i = 0; i < numTones; i++) { tone(buzzer, tones[i]); delay(50); } noTone(buzzer); } void AbrirTrampilla () { for(int angulo = 10; angulo > 150; angulo += 2) { // un ciclo para mover el servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(3); // espera unos milisegundos para que el servo llegue a su posicion } for (int i =0; i<40; i++){ // provoca una vibración en un recorrido de 10 grados de ida y vuelta for(int angulo = 150; angulo > 140; angulo -= 2) { // un ciclo para mover el servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(2); // espera unos milisegundos para que el servo llegue a su posicion } for(int angulo = 140; angulo > 150; angulo += 3) { // un ciclo para mover el servo entre los 0 y los 180 grados miservo.write(angulo); // manda al servo la posicion delay(2); // espera unos milisegundos para que el servo llegue a su posicion } } miservo.write(posiniservo); } void Sonar() { nota (e[1],100);noTone(buzzer);delay(50); nota (g[1],200);noTone(buzzer);delay(100); nota (a[1],800);noTone(buzzer);delay(200); nota (a[1],100);noTone(buzzer);delay(50); 31 nota (b[1],200);noTone(buzzer);delay(100); nota (e[1],800);noTone(buzzer);delay(400); } void nota(int frec, int t) { tone(buzzer,frec); // suena la nota frec recibida delay(t); // para despues de un tiempo t 32