Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed nRF24L01P mbed-dsp
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 }}
Generated on Sat Feb 25 2023 13:10:03 by
1.7.2