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
Revision 3:627354c99ba0, committed 2022-03-21
- Comitter:
- villemejane
- Date:
- Mon Mar 21 15:08:26 2022 +0000
- Parent:
- 1:47d90ce030a3
- Commit message:
- FFT and nRF24 transmission / LaserGame 1A
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| nRF24L01P.lib | Show annotated file Show diff for this revision Revisions of this file |
diff -r 47d90ce030a3 -r 627354c99ba0 main.cpp
--- a/main.cpp Tue Feb 09 14:34:53 2021 +0000
+++ b/main.cpp Mon Mar 21 15:08:26 2022 +0000
@@ -11,11 +11,12 @@
#include "mbed.h"
#include "arm_math.h"
-/* Include mbed-dsp libraries */
#include "dsp.h"
#include "arm_common_tables.h"
#include "arm_const_structs.h"
+#include "nRF24L01P.h"
+#define TRANSFER_SIZE 8
#define SAMPLES 512 /* 256 real party and 256 imaginary parts */
#define FFT_SIZE SAMPLES / 2 /* FFT size is always the same size as we have samples, so 256 in our case */
@@ -24,17 +25,94 @@
bool trig=0;
int indice = 0;
-DigitalOut myled(LED1);
-AnalogIn myADC(A0);
-AnalogOut myDAC(A2);
-Serial pc(USBTX, USBRX);
-Ticker timer;
-
+DigitalOut myled(D13);
+AnalogIn myADC(A0);
+Serial debug_pc(USBTX, USBRX);
+Ticker timer;
+
+// nRF24
+char k;
+char dataToSend[TRANSFER_SIZE] = {0xAA, 0x01, 0x10, 0xF0,0xAA, 0x01, 0x10, 0xF0};
+char dataReceived[TRANSFER_SIZE] = {0};
+char rxDataCnt;
+
+nRF24L01P nRF24_mod(D11, D12, D13, D10, D9, PB_8);
+// MOSI, MISO, SCK, CSN, CE, IRQ
+
+#define largeur_signal_carre_equipe1 4300 /* a corriger */
+#define largeur_signal_carre_equipe2 40 /* a corriger */
+#define epsilon 200
+
+/* definition des entrees des 3 capteurs: epaule droit, gauche et ventre */
+AnalogIn cap_ventre(A0);
+AnalogIn cap_epaule_droit(A1);
+AnalogIn cap_epaule_gauche(A2);
+
+float32_t Input_ventre[SAMPLES];
+float32_t Output_ventre[FFT_SIZE];
+
+float32_t Input_epaule_droit[SAMPLES];
+float32_t Output_epaule_droit[FFT_SIZE];
+
+float32_t Input_epaule_gauche[SAMPLES];
+float32_t Output_epaule_gauche[FFT_SIZE];
+
+int nbr_pts_equipe1;
+int nbr_pts_equipe2;
+
+// Fonction d'initialisation du module BT nRF24L01
+void initNRF24(){
+ nRF24_mod.powerUp();
+ wait_us(100000);
+ nRF24_mod.setAirDataRate(NRF24L01P_DATARATE_250_KBPS);
+ nRF24_mod.setRfFrequency(2400);
+ wait_us(100000);
+ debug_pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", nRF24_mod.getRfFrequency() );
+ debug_pc.printf( "nRF24L01+ Output power : %d dBm\r\n", nRF24_mod.getRfOutputPower() );
+ debug_pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", nRF24_mod.getAirDataRate() );
+ debug_pc.printf( "Transfers are grouped into %d characters\r\n", TRANSFER_SIZE );
+ nRF24_mod.setTransferSize( TRANSFER_SIZE );
+ nRF24_mod.setReceiveMode();
+ nRF24_mod.enable();
+}
+
+// Fonction de test du module BT nRF24L01
+void testNRF24(void){
+ /* Lecture donnée depuis nRF24 */
+ if ( nRF24_mod.readable() ) {
+
+ // ...read the data into the receive buffer
+ rxDataCnt = nRF24_mod.read( NRF24L01P_PIPE_P0, dataReceived, TRANSFER_SIZE);
+
+ // Display the receive buffer contents via the host serial link
+ debug_pc.printf("\tD = ");
+ for ( int i = 0; i < rxDataCnt; i++ ) {
+ debug_pc.printf(" %x \t", dataReceived[i]);
+ }
+ debug_pc.printf("\r\n");
+ }
+ /* Transmission donnée depuis nRF24 */
+ if(dataReceived[0] == 0){
+ nRF24_mod.setRfFrequency(2400);
+ nRF24_mod.write( NRF24L01P_PIPE_P0, dataToSend, TRANSFER_SIZE );
+ debug_pc.printf( "SENDED\r\n");
+ }
+}
+
+// echantillonnage
void sample(){
myled = 1;
if(indice < SAMPLES){
- Input[indice] = myADC.read() - 0.5f; //Real part NB removing DC offset
- Input[indice + 1] = 0; //Imaginary Part set to zero
+ Input_ventre[indice] = cap_ventre.read() - 0.5f;
+ Input_epaule_droit[indice] = cap_ventre.read() - 0.5f;
+ Input_epaule_droit[indice] = cap_ventre.read() - 0.5f;
+
+ //Real part NB removing DC offset
+ Input_ventre[indice + 1] = 0;
+ Input_epaule_droit[indice + 1] = 0;
+ Input_epaule_gauche[indice + 1] = 0;
+
+ //Imaginary Part set to zero
indice += 2;
}
else{ trig = 0; }
@@ -42,33 +120,72 @@
}
int main() {
- float maxValue; // Max FFT value is stored here
- uint32_t maxIndex; // Index in Output array where max value is
-
+ float maxValue_ventre; // Max FFT value is stored here (la largeur du caré envoyé par la led)
+ float maxValue_epaule_droit;
+ float maxValue_epaule_gauche;
+
+ uint32_t maxIndex_ventre; // Index in Output array where max value is
+ uint32_t maxIndex_epaule_droit;
+ uint32_t maxIndex_epaule_gauche;
+
+ initNRF24();
while(1) {
if(trig == 0){
timer.detach();
// Init the Complex FFT module, intFlag = 0, doBitReverse = 1
//NB using predefined arm_cfft_sR_f32_lenXXX, in this case XXX is 256
- arm_cfft_f32(&arm_cfft_sR_f32_len256, Input, 0, 1);
+ arm_cfft_f32(&arm_cfft_sR_f32_len256, Input_ventre, 0, 1);
+ arm_cfft_f32(&arm_cfft_sR_f32_len256, Input_epaule_droit, 0, 1);
+ arm_cfft_f32(&arm_cfft_sR_f32_len256, Input_epaule_gauche, 0, 1);
// Complex Magniture Module put results into Output(Half size of the Input)
- arm_cmplx_mag_f32(Input, Output, FFT_SIZE);
+ arm_cmplx_mag_f32(Input_ventre, Output_ventre, FFT_SIZE);
+ arm_cmplx_mag_f32(Input_ventre, Output_epaule_droit, FFT_SIZE);
+ arm_cmplx_mag_f32(Input_ventre, Output_epaule_gauche, FFT_SIZE);
+
+ Output_ventre[0] = 0;
+ Output_epaule_droit[0] = 0;
+ Output_epaule_gauche[0] = 0;
Output[0] = 0;
- //Calculates maxValue and returns corresponding value
- arm_max_f32(Output, FFT_SIZE/2, &maxValue, &maxIndex);
-
- myDAC=1.0; //SYNC Pulse to DAC Output
- wait_us(20); //Used on Oscilliscope set trigger level to the highest
- myDAC=0.0; //point on this pulse
-
- for(int i=0; i < FFT_SIZE / 2; i++){
- myDAC=(Output[i]) * 0.9; // Scale to Max Value and scale to 90 / 100
- wait_us(10); //Each pulse of 10us is 50KHz/256 = 195Hz resolution
+ //Calculates maxValue and returns corresponding value
+ arm_max_f32(Output_ventre, FFT_SIZE/2, &maxValue_ventre, &maxIndex_ventre);
+ arm_max_f32(Output_epaule_droit, FFT_SIZE/2, &maxValue_epaule_droit, &maxIndex_epaule_droit);
+ arm_max_f32(Output_epaule_gauche, FFT_SIZE/2, &maxValue_epaule_gauche, &maxIndex_epaule_gauche);
+
+ //Envoie du nombre de point au ordinateur par bluetooth
+ dataToSend[1] = 100;
+ nRF24_mod.write( NRF24L01P_PIPE_P0, dataToSend, TRANSFER_SIZE );
+
+ // Calcul des points
+ //Tire sur un coéquipier :
+ if (maxValue_ventre<(largeur_signal_carre_equipe1+epsilon) && maxValue_ventre>(largeur_signal_carre_equipe1-epsilon) )
+ {
+ nbr_pts_equipe1=nbr_pts_equipe1-20; // -20pts pour l'équipe du tireur
+ }
+ if (maxValue_epaule_droit<(largeur_signal_carre_equipe1+epsilon) && maxValue_epaule_droit>(largeur_signal_carre_equipe1-epsilon) )
+ {
+ nbr_pts_equipe1=nbr_pts_equipe1-20; // -20pts pour l'équipe du tireur
}
- myDAC=0.0;
- pc.printf("MAX = %lf, %d \r\n", maxValue, maxIndex);
- wait(0.2);
+ if (maxValue_epaule_gauche<(largeur_signal_carre_equipe1+epsilon) && maxValue_epaule_gauche>(largeur_signal_carre_equipe1-epsilon) )
+ {
+ nbr_pts_equipe1=nbr_pts_equipe1-20; // -20pts pour l'équipe du tireur
+ }
+
+ //Tire sur le ventre
+ if (maxValue_ventre<(largeur_signal_carre_equipe2+epsilon) && maxValue_ventre>(largeur_signal_carre_equipe2-epsilon))
+ {
+ nbr_pts_equipe1=nbr_pts_equipe1-10; //Tire sur le ventre : -10pts pour l'équipe de la victime
+ nbr_pts_equipe2=nbr_pts_equipe2+50; //Tire sur le ventre : +50pts pour l'équipe du tireur
+ }
+
+ //Tire sur l'épaule
+ if ((maxValue_epaule_droit<(largeur_signal_carre_equipe2+epsilon))&& (maxValue_epaule_droit>(largeur_signal_carre_equipe2-epsilon)) || ((maxValue_epaule_gauche<(largeur_signal_carre_equipe2+epsilon))&& (maxValue_epaule_gauche>(largeur_signal_carre_equipe2-epsilon))))
+ {
+ nbr_pts_equipe1=nbr_pts_equipe1-10; //Tire sur l'épaule : -10pts pour l'équipe de la victime
+ nbr_pts_equipe2=nbr_pts_equipe2+100; //Tire sur l'épaule : +100pts pour l'équipe du tireur
+ }
+
+ // Relance de l'acquisition
trig = 1;
indice = 0;
timer.attach_us(&sample,40); //20us 50KHz sampling rate
diff -r 47d90ce030a3 -r 627354c99ba0 nRF24L01P.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nRF24L01P.lib Mon Mar 21 15:08:26 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/krissl/code/nRF24L01P/#959c573e3bf5