#include "mbed.h" #include "Random.h" #include "ADXL345.h" #include "mpr121.h" #include Sound sound (p21 , p25); //BusOut myled(LED4,LED3,LED2,LED1); ADXL345 accelerometer(p5, p6, p7, p8); DigitalOut anode[9]={p12,p13,p14,p15,p16,p17,p18,p19,p20}; BusOut base_couleur(p30,p29,p28); BusOut collecteur(p24,p23,p22); // Create the interrupt receiver object on pin 26 InterruptIn interrupt(p26); // Setup the i2c bus on pins 9 and 10 I2C i2c(p9, p10); // Setup the Mpr121: // constructor(i2c object, i2c address of the mpr121) Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); int touche1, touche2, touche3, touche4, touche5, touche6; //détection de fin de fonctions bool lancer, anim, morp; //son à émettre void tone(uint8_t son) { Sound::sound_t TONALITE[] = { // hanon siji 0:b(flat) 1:tujo 2:#(sharp) // | C1 - B9 kan deno onkai(Gx ha 9x ni okikae te siji) 0xFF=end data // | | time (1/1[ms]/count) // | | | envelope(yoin) (1/1 [ms]/count) // | | | | {1,son,600,500}, {1,0xFF,1000,0}, // end }; //--------------------- // enso data no settei //--------------------- // sound.sound_enso("/local/enso.txt"); // mbed local file data "enso.txt" load (sita ni data no rei wo oite oku) sound.sound_enso((Sound::sound_t*)TONALITE); //--------------------------------------------------- // output tone //--------------------------------------------------- // tone1 Sound::sound_t oto = {1,0x95,200,100}; sound.sound_sound(oto); while(sound.sound_sound() == true){} // tone2 oto.hanon = 1; oto.onkai = 0xA5; oto.time = 2000; oto.envelope = 1000; sound.sound_sound(oto); while(sound.sound_sound() == true){} //--------------- // output merody //-------------- sound.sound_enso(true); } //éteint toutes les led pouvant etre allumées void led_eteinte(){ for (int i=0;i<9;i++) anode[i]=0; collecteur.write(0); base_couleur.write(0); } //sélectionne la couleur, la face et le numéro de la LED (entre 1 et 9) à allumer void allume_LED(int led, int face, char couleur){ led_eteinte(); // sélection anode ("face") if ((led == 1)||(led == 4)||(led == 7)){ if ((face == 1) || (face == 2)) anode[0]=1; else if ((face == 3) || (face == 4)) anode[3] = 1; else if ((face == 5) || (face == 6)) anode[6] = 1; } else if ((led == 2)||(led == 5)||(led == 8)){ if ((face == 1) || (face == 2)) anode[1] = 1; else if ((face == 3) || (face == 4)) anode[4] = 1; else if ((face == 5) || (face == 6)) anode[7] = 1; } else if ((led == 3)||(led == 6)||(led == 9)){ if ((face == 1) || (face == 2)) anode[2] = 1; else if ((face == 3) || (face == 4)) anode[5] = 1; else if ((face == 5) || (face == 6)) anode[8] = 1; } // sélection collecteur ("ligne" de LEDs) if ((face == 1)||(face == 3)||(face == 5)){ if ((led > 0) && (led < 4)) collecteur.write(0); else if ((led > 3) && (led < 7)) collecteur.write(1); else if ((led > 6) && (led < 10)) collecteur.write(2); } else if ((face == 2)||(face == 4)||(face == 6)){ if ((led > 0) && (led < 4)) collecteur.write(3); else if ((led > 3) && (led < 7)) collecteur.write(4); else if ((led > 6) && (led < 10)) collecteur.write(5); } //sélection couleur (base) if (couleur == 'r') base_couleur.write(4); // r = rouge else if (couleur == 'g') base_couleur.write(2); // g = vert (green) else if (couleur == 'b') base_couleur.write(1); // b = bleu else if (couleur == 'j') base_couleur.write(6); // j = jaune else if (couleur == 'v') base_couleur.write(5); // v = violet else if (couleur == 't') base_couleur.write(3); // t = turquoise else if (couleur == 'w') base_couleur.write(7); // w = blanc (white) wait(0.005); } //affiche un chiffre pendant une certaine durée en émettant une mélodie en fonction du chiffre void affiche_de(int chiffre, float time){ uint8_t melody[6]={0xC4,0xD4,0xE4,0xF4,0x94,0xA4}; Timer t; tone(melody[chiffre-1]); t.start(); while (t.read() <= time){ if (chiffre == 1) allume_LED(5,1,'r'); else if (chiffre == 2) { allume_LED(1,1,'r'); allume_LED(9,1,'r'); } else if (chiffre == 3) { allume_LED(1,1,'b'); allume_LED(5,1,'b'); allume_LED(9,1,'b'); } else if (chiffre == 4) { allume_LED(1,1,'b'); allume_LED(3,1,'b'); allume_LED(7,1,'b'); allume_LED(9,1,'b'); } else if (chiffre == 5) { allume_LED(1,1,'g'); allume_LED(3,1,'g'); allume_LED(5,1,'g'); allume_LED(7,1,'g'); allume_LED(9,1,'g'); } else if (chiffre == 6) { allume_LED(1,1,'g'); allume_LED(3,1,'g'); allume_LED(4,1,'g'); allume_LED(6,1,'g'); allume_LED(7,1,'g'); allume_LED(9,1,'g'); } } t.stop(); } void lancer_de() { Random r; int i; r.init(); //génération entier aléatoire entre 1 et 6 uint8_t chiffre = r.getByte(); chiffre = (chiffre % 6)+1; //petite animation for(i=1;i<10;i++) { if (i<4) allume_LED(i,1,'r'); else if ((i>3) && (i<7)) allume_LED(i,1,'b'); else if (i>6) allume_LED(i,1,'g'); wait_ms(200); } //affichage du chiffre random if ((chiffre > 0) && (chiffre < 7)) affiche_de(chiffre,15); lancer=true; } //une animation "d'ambiance", pour l'instant sur une seule face void animations(float duree_anim){ char couleurs[7] = {'w','j','r','p','b','g','t'}; int i,f; Timer t; //toutes les LEDs de la même couleur for(int j=0;j<7;j++){ i=1; f=1; t.start(); while (t.read() <= (duree_anim/7)){ while(f<7){ while(i<10){ allume_LED(i,f,couleurs[j]); i++; } if (i==10) i=1; f++; } if (f==7) f=1; } t.stop(); t.reset(); } anim=true; } //config tactile void fallInterrupt() { int key_code=0; touche1=0; touche2=0; touche3=0; touche4=0; touche5=0; touche6=0; int i=0; int t4, t3, t2, t1; int value=mpr121.read(0x00); value +=mpr121.read(0x01)<<8; // LED demo mod by J. Hamblen //pc.printf("MPR value: %x \r\n", value); i=0; // puts key number out to LEDs for demo for (i=0; i<12; i++) { if (((value>>i)&0x01)==1) key_code=i+1; } t4=key_code & 0x01; t3=(key_code>>1) & 0x01; t2=(key_code>>2) & 0x01; t1=(key_code>>3) & 0x01; if ((t1==0) && (t2==0) && (t3==0) && (t4==1)) touche1=1; else touche1=0; else if ((t1==0) && (t2==0) && (t3==1) && (t4==0)) touche2=1; else touche2=0; else if ((t1==0) && (t2==0) && (t3==1) && (t4==1)) touche3=1; else touche3=0; else if ((t1==0) && (t2==1) && (t3==0) && (t4==1)) touche4=1; else touche4=0; else if ((t1==0) && (t2==1) && (t3==1) && (t4==0)) touche5=1; else touche5=0; else if ((t1==0) && (t2==1) && (t3==1) && (t4==1)) touche6=1; else touche6=0; } /** morpion **/ //vérification victoire bool win(int grille[]){ bool v1=false, v2=false; bool ligne1=false, ligne2=false, ligne3=false, c1=false, c2=false, c3=false, d1=false, d2=false; //verif lignes if (!((grille[0]==0)&&(grille[1]==0)&&(grille[2]==0))){ v1=grille[0]==grille[1]; v2=grille[1]==grille[2]; ligne1=v1&&v2; } if (!((grille[3]==0)&&(grille[4]==0)&&(grille[5]==0))){ v1=grille[3]==grille[4]; v2=grille[4]==grille[5]; ligne2=v1&&v2; } if (!((grille[6]==0)&&(grille[7]==0)&&(grille[8]==0))){ v1=grille[6]==grille[7]; v2=grille[7]==grille[8]; ligne3=v1&&v2; } //verif colonnes if (!((grille[0]==0)&&(grille[3]==0)&&(grille[6]==0))){ v1=grille[0]==grille[3]; v2=grille[3]==grille[6]; c1=v1&&v2; } if (!((grille[1]==0)&&(grille[4]==0)&&(grille[7]==0))){ v1=grille[1]==grille[4]; v2=grille[4]==grille[7]; c2=v1&&v2; } if (!((grille[2]==0)&&(grille[5]==0)&&(grille[8]==0))){ v1=grille[2]==grille[5]; v2=grille[5]==grille[8]; c3=v1&&v2; } //verif diagonales if (!((grille[0]==0)&&(grille[4]==0)&&(grille[8]==0))){ v1=grille[0]==grille[4]; v2=grille[4]==grille[8]; d1=v1&&v2; } if (!((grille[2]==0)&&(grille[4]==0)&&(grille[6]==0))){ v1=grille[2]==grille[4]; v2=grille[4]==grille[6]; d2=v1&&v2; } bool win=ligne1||ligne2; win=win||ligne3; win=win||c1; win=win||c2; win=win||c3; win=win||d1; win=win||d2; return win; } void morpion(){ led_eteinte(); int grille[9]={0,0,0,0,0,0,0,0,0}; int tour=0; char coul; bool gagne=false; //déroulement de la partie while ((!gagne)||(tour<9)){ tour++; //"sélection" joueur : rouge pour joueur 1, vert pour joueur 2 if ((tour%2)==1) coul='r'; else coul='g'; //sélection case via touches //milieu if (touche2==1) { if (grille[4]==0){ allume_LED(5,2,coul); grille[4]=abs((tour%2)-2); //1 pour joueur 2, 2 pour joueur 1 } } else if (touche1==1) { wait(1); //haut gauche if (touche5==1) { if (grille[0]==0){ allume_LED(1,2,coul); grille[0]=abs((tour%2)-2); } } //bas gauche else if (touche6==1){ if (grille[6]==0){ allume_LED(7,2,coul); grille[6]=abs((tour%2)-2); } } //gauche else { if (grille[3]==0){ allume_LED(4,2,coul); grille[3]=abs((tour%2)-2); } } } else if (touche5==1) { wait(1); //haut gauche if (touche1==1) { if (grille[0]==0){ allume_LED(1,2,coul); grille[0]=abs((tour%2)-2); } } //haut droite else if (touche3==1){ if (grille[2]==0){ allume_LED(3,2,coul); grille[2]=abs((tour%2)-2); } } //haut else { if (grille[1]==0){ allume_LED(2,2,coul); grille[1]=abs((tour%2)-2); } } } else if (touche3==1) { wait(1); //bas droite if (touche6==1) { if (grille[8]==0){ allume_LED(9,2,coul); grille[8]=abs((tour%2)-2); } } //haut droite else if (touche5==1) { if (grille[2]==0){ allume_LED(3,2,coul); grille[2]=abs((tour%2)-2); } } //droite else { if (grille[5]==0){ allume_LED(6,2,coul); grille[5]=abs((tour%2)-2); } } } else if (touche6==1) { wait(1); //bas gauche if (touche1==1) { if (grille[6]==0){ allume_LED(7,2,coul); grille[6]=abs((tour%2)-2); } } //bas droite else if (touche3==1){ if (grille[8]==0){ allume_LED(9,2,coul); grille[8]=abs((tour%2)-2); } } //bas else { if (grille[7]==0){ allume_LED(8,2,coul); grille[7]=abs((tour%2)-2); } } } //allumage du reste de la grille for(int k=1;k<10;k++){ if (grille[k]==1) allume_LED(k,2,'r'); else if (grille[k]==2) allume_LED(k,2,'g'); } //vérif ligne complétée gagne=win(grille,ligne1,ligne2,ligne3,c1,c2,c3,d1,d2); } Timer t; //vérif victoire joueur 1 if(((tour%2)==1)&&(gagne)){ t.start(); while(t.read()<=5){ for(int i=0;i<9;i++){ allume_LED(i,2,'r'); } } t.stop(); } //vérif victoire joueur 2 else if (((tour%2)==0)&&(gagne)){ t.start(); while(t.read()<=5){ for(int i=0;i<9;i++){ allume_LED(i,2,'g'); } } t.stop(); } //vérif match nul else if ((tour==9)&&(!gagne)){ t.start(); while(t.read()<=5){ for(int i=0;i<9;i++){ allume_LED(i,2,'b'); } } t.stop(); } morp=true; } void prepatest_MPR121(){ //pc.printf("\nHello from the mbed & mpr121\n\r"); unsigned char dataArray[2]; int key; int count = 0; //pc.printf("Test 1: read a value: \r\n"); dataArray[0] = mpr121.read(AFE_CFG); //pc.printf("Read value=%x\r\n\n",dataArray[0]); //pc.printf("Test 2: read a value: \r\n"); dataArray[0] = mpr121.read(0x5d); //pc.printf("Read value=%x\r\n\n",dataArray[0]); //pc.printf("Test 3: write & read a value: \r\n"); mpr121.read(ELE0_T); mpr121.write(ELE0_T,0x22); dataArray[0] = mpr121.read(ELE0_T); //pc.printf("Read value=%x\r\n\n",dataArray[0]); //pc.printf("Test 4: Write many values: \r\n"); unsigned char data[] = {0x1,0x3,0x5,0x9,0x15,0x25,0x41}; mpr121.writeMany(0x42,data,7); // Now read them back .. key = 0x42; count = 0; while (count < 7) { char result = mpr121.read(key); key++; count++; //pc.printf("Read value: '%x'=%x\n\r",key,result); } //pc.printf("Test 5: Read Electrodes:\r\n"); key = ELE0_T; count = 0; while (count < 24) { char result = mpr121.read(key); //pc.printf("Read key:%x value:%x\n\r",key,result); key++; count++; } //pc.printf("--------- \r\n\n"); // mpr121.setProximityMode(true); //pc.printf("ELE_CFG=%x", mpr121.read(ELE_CFG)); } int main(){ int datax, datay, dataz; /** Préparation Accéléromètre **/ int readings[3] = {0, 0, 0}; //pc.printf("Starting ADXL345 test...\n"); //pc.printf("Device ID is: 0x%02x\n", accelerometer.getDevId()); //Go into standby mode to configure the device. accelerometer.setPowerControl(0x00); //Full resolution, +/-16g, 4mg/LSB. accelerometer.setDataFormatControl(0x0B); //3.2kHz data rate. accelerometer.setDataRate(ADXL345_3200HZ); //Measurement mode. accelerometer.setPowerControl(0x08); prepatest_MPR121(); interrupt.fall(&fallInterrupt); interrupt.mode(PullUp); accelerometer.getOutput(readings); while (1) { //13-bit, sign extended values. //pc.printf("%i, %i, %i\n", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2]); lancer = false; anim = false; morp = false; //secouer le dé pour lancer if (touche1==1){ while (!lancer){ wait(0.1); datax=readings[0]; datay=readings[1]; dataz=readings[2]; wait(0.01); accelerometer.getOutput(readings); if ((abs(datax-readings[0]) > 100) || (abs(datay-readings[1]) > 100) || (abs(dataz-readings[2]) > 100)) lancer_de(); } } //animations else if (touche2==1){ while (!anim) animations(60); } //morpion else if (touche3==1){ while (!morp) morpion(); } } }