Wafaa Bousaid / Mbed 2 deprecated point_bluetooth_prof

Dependencies:   mbed nRF24L01P mbed-dsp

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //programme a mettre sur les cartes de l'equipe 1, pour l'equipe 2 le calcul sur le tire sur un coequipier doit changer
00002 
00003 #include "mbed.h"
00004 #include "arm_math.h"
00005 #include "dsp.h"
00006 #include "arm_common_tables.h"
00007 #include "arm_const_structs.h"
00008 #include "nRF24L01P.h"
00009 
00010 #define TRANSFER_SIZE           8
00011 #define SAMPLES                 512             /* 256 real party and 256 imaginary parts */
00012 #define FFT_SIZE                SAMPLES / 2     /* FFT size is always the same size as we have samples, so 256 in our case */
00013  
00014 float32_t Input[SAMPLES];
00015 float32_t Output[FFT_SIZE];
00016 bool      trig=0;
00017 int       indice = 0;
00018 
00019 DigitalOut  myled(D13);
00020 AnalogIn    myADC(A0);
00021 Serial      debug_pc(USBTX, USBRX);
00022 Ticker      timer;
00023 
00024 DigitalIn bouton(D7);
00025 
00026 // nRF24
00027 char k;
00028 char    dataToSend[TRANSFER_SIZE] = {0xAA, 0x01, 0x10, 0xF0,0xAA, 0x01, 0x10, 0xF0};
00029 char    dataReceived[TRANSFER_SIZE] = {0};
00030 char    rxDataCnt;
00031 
00032 nRF24L01P       nRF24_mod(D11, D12, D13, D10, D9, PB_8);
00033 // MOSI, MISO, SCK, CSN, CE, IRQ
00034 
00035 #define index_equipe1      73 /* a  corriger */
00036 #define index_equipe2      64  /* a corriger */
00037 #define epsilon  2
00038 
00039 /* definition des entrees des 3 capteurs: epaule droit, gauche et ventre */
00040 AnalogIn cap_ventre(A0);
00041 AnalogIn cap_epaule_droit(A1);
00042 AnalogIn cap_epaule_gauche(A2);  
00043 
00044 float32_t Input_ventre[SAMPLES];
00045 float32_t Output_ventre[FFT_SIZE];
00046 
00047 float32_t Input_epaule_droit[SAMPLES];
00048 float32_t Output_epaule_droit[FFT_SIZE];
00049 
00050 float32_t Input_epaule_gauche[SAMPLES];
00051 float32_t Output_epaule_gauche[FFT_SIZE];
00052 
00053 int nbr_pts_equipe1;
00054 int nbr_pts_equipe2;    
00055 
00056 // Fonction d'initialisation du module BT nRF24L01
00057 void initNRF24(){
00058     nRF24_mod.powerUp();
00059     wait_us(100000);
00060     nRF24_mod.setAirDataRate(NRF24L01P_DATARATE_250_KBPS);
00061     nRF24_mod.setRfFrequency(2400);
00062     wait_us(100000);
00063     debug_pc.printf( "nRF24L01+ Frequency    : %d MHz\r\n",  nRF24_mod.getRfFrequency() );
00064     debug_pc.printf( "nRF24L01+ Output power : %d dBm\r\n",  nRF24_mod.getRfOutputPower() );
00065     debug_pc.printf( "nRF24L01+ Data Rate    : %d kbps\r\n", nRF24_mod.getAirDataRate() );
00066     debug_pc.printf( "Transfers are grouped into %d characters\r\n", TRANSFER_SIZE );
00067     nRF24_mod.setTransferSize( TRANSFER_SIZE );
00068     nRF24_mod.setReceiveMode();
00069     nRF24_mod.enable();
00070 }
00071 
00072 // Fonction de test du module BT nRF24L01
00073 void testNRF24(void){
00074     /* Lecture donnée depuis nRF24 */
00075     if ( nRF24_mod.readable() ) {
00076 debug_pc.printf(" 1");
00077         // ...read the data into the receive buffer
00078         rxDataCnt = nRF24_mod.read( NRF24L01P_PIPE_P0, dataReceived, TRANSFER_SIZE);
00079 debug_pc.printf(" 2");
00080         // Display the receive buffer contents via the host serial link
00081         debug_pc.printf("\tD = ");
00082         for ( int i = 0; i < rxDataCnt; i++ ) {
00083             debug_pc.printf(" %d \t", dataReceived[i]);
00084             debug_pc.printf(" Recu");
00085         }
00086         debug_pc.printf("\r\n");
00087     }  
00088     debug_pc.printf(" 3") ;
00089     /* Transmission donnée depuis nRF24 */
00090     if(dataReceived[0] == 0){
00091         nRF24_mod.setRfFrequency(2400);
00092         nRF24_mod.write( NRF24L01P_PIPE_P0, dataToSend, TRANSFER_SIZE );
00093         debug_pc.printf( "Nombre de point equipe 1: %d \r \n Nombre de point equipe 2: %d \r \n, largeur du signal: %d \r \n", 10 * dataToSend[1],10 * dataToSend[2],dataToSend[3]);
00094         debug_pc.printf( "SENDED\r\n");
00095     }
00096 }
00097 
00098 // echantillonnage
00099 void sample(){
00100     myled = 1;
00101     if(indice < SAMPLES){
00102         Input_ventre[indice] = cap_ventre.read() - 0.5f;
00103         Input_epaule_droit[indice] = cap_ventre.read() - 0.5f;
00104         Input_epaule_droit[indice] = cap_ventre.read() - 0.5f;    
00105         
00106         //Real part NB removing DC offset
00107         Input_ventre[indice + 1] = 0;    
00108         Input_epaule_droit[indice + 1] = 0;
00109         Input_epaule_gauche[indice + 1] = 0;    
00110                  
00111         //Imaginary Part set to zero
00112         indice += 2;
00113     }
00114     else{ trig = 0; }
00115     myled = 0;
00116 }
00117  
00118 int main() {
00119     float maxValue_ventre;            // Max FFT value is stored here (la largeur du care envoye par la led et detecte par la photodiode place sur le ventre) 
00120     float maxValue_epaule_droit;   
00121     float maxValue_epaule_gauche;  
00122     
00123     uint32_t maxIndex_ventre;         // Index in Output array where max value is
00124     uint32_t maxIndex_epaule_droit;
00125     uint32_t maxIndex_epaule_gauche;
00126     
00127     initNRF24();
00128     while(1) {
00129         if(trig == 0){
00130             
00131 //calcul de la TF du signal detecte pour recuperer sa largeur 
00132             timer.detach();
00133             // Init the Complex FFT module, intFlag = 0, doBitReverse = 1
00134             //NB using predefined arm_cfft_sR_f32_lenXXX, in this case XXX is 256
00135             arm_cfft_f32(&arm_cfft_sR_f32_len256, Input_ventre, 0, 1);
00136             arm_cfft_f32(&arm_cfft_sR_f32_len256, Input_epaule_droit, 0, 1);
00137             arm_cfft_f32(&arm_cfft_sR_f32_len256, Input_epaule_gauche, 0, 1);
00138  
00139             // Complex Magniture Module put results into Output(Half size of the Input)
00140             arm_cmplx_mag_f32(Input_ventre, Output_ventre, FFT_SIZE);
00141             arm_cmplx_mag_f32(Input_ventre, Output_epaule_droit, FFT_SIZE);
00142             arm_cmplx_mag_f32(Input_ventre, Output_epaule_gauche, FFT_SIZE);
00143             
00144             Output_ventre[0] = 0;
00145             Output_epaule_droit[0] = 0;
00146             Output_epaule_gauche[0] = 0;
00147             Output[0] = 0;
00148             //Calculates maxValue and returns corresponding value            
00149             arm_max_f32(Output_ventre, FFT_SIZE/2, &maxValue_ventre, &maxIndex_ventre);
00150             arm_max_f32(Output_epaule_droit, FFT_SIZE/2, &maxValue_epaule_droit, &maxIndex_epaule_droit);
00151             arm_max_f32(Output_epaule_gauche, FFT_SIZE/2, &maxValue_epaule_gauche, &maxIndex_epaule_gauche);
00152             
00153 
00154             
00155 // Calcul des points
00156             //Tire sur un coequipier :
00157             if (maxIndex_ventre<(index_equipe1+epsilon) && maxIndex_ventre>(index_equipe1-epsilon) )
00158             {
00159                 nbr_pts_equipe1=nbr_pts_equipe1-2; // -2pts pour l'equipe du tireur
00160             }
00161             if (maxIndex_epaule_droit<(index_equipe1+epsilon) && maxIndex_epaule_droit>(index_equipe1-epsilon) )
00162             {
00163                 nbr_pts_equipe1=nbr_pts_equipe1-2; // -2pts pour l'equipe du tireur
00164             }
00165             if (maxIndex_epaule_gauche<(index_equipe1+epsilon) && maxIndex_epaule_gauche>(index_equipe1-epsilon) )
00166             {
00167                 nbr_pts_equipe1=nbr_pts_equipe1-2; // -2pts pour l'equipe du tireur
00168             }
00169             
00170             //Tire sur le ventre   
00171             if (maxIndex_ventre<(index_equipe2+epsilon) && maxIndex_ventre>(index_equipe2-epsilon)) 
00172             {
00173                 nbr_pts_equipe1=nbr_pts_equipe1-1; //Tire sur le ventre : -1pts pour l'equipe de la victime
00174                 nbr_pts_equipe2=nbr_pts_equipe2+5; //Tire sur le ventre : +5pts pour l'equipe du tireur
00175             }   
00176             
00177             //Tire sur l'epaule
00178             if ((maxIndex_epaule_droit<(index_equipe2+epsilon))&& (maxIndex_epaule_droit>(index_equipe2-epsilon)) || ((maxIndex_epaule_gauche<(index_equipe2+epsilon))&& (maxIndex_epaule_gauche>(index_equipe2-epsilon))))
00179             {
00180                 nbr_pts_equipe1=nbr_pts_equipe1-1; //Tire sur l'epaule : -1pts pour l'equipe de la victime
00181                 nbr_pts_equipe2=nbr_pts_equipe2+10; //Tire sur l'epaule : +10pts pour l'equipe du tireur
00182             }
00183             
00184 // Envoie du nombre de point au ordinateur par bluetooth 
00185             if (bouton==1){
00186             dataToSend[1] = nbr_pts_equipe1;
00187             dataToSend[2] = nbr_pts_equipe2;
00188             dataToSend[3] = maxValue_ventre;
00189             testNRF24();
00190             wait(0.5);}            
00191          
00192 
00193 // Relance de l'acquisition
00194             trig = 1;
00195             indice = 0;
00196             //(version prof) timer.attach_us(&sample,40);      //20us 50KHz sampling rate
00197             timer.attach_us(&sample,50); //critere de shannon
00198         }
00199     
00200 
00201 }}