play boys: maskota teknologikoa - Zientzia

Anuncio
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
Descargar