BLE test for specific board mheuve sensor ENSMM CROC

Dependencies:   mbed Driver_BLE_Mheuve BLE_API

These two pictures show how to connect the Mheuve Sensor to the ST-Link debugger (don't forget to disable ST-link jumpers and JP5 on the board! ):

https://os.mbed.com/media/uploads/jimbaud/1611739514454.jpghttps://os.mbed.com/media/uploads/jimbaud/1611739514453.jpg

These two pictures show how to connect the Mheuve Sensor TX RX to the ST-Link debugger (don't forget to cross TX and RX, it means Mheuve sensor TX on ST-Link RX and ST-Link TX on Mheuve sensor RX ):

https://os.mbed.com/media/uploads/jimbaud/1611739514450.jpg https://os.mbed.com/media/uploads/jimbaud/1611739514452.jpg

The Mheuve sensor board needs to be powered by an external battery.

The result appears on a BLE terminal smartphone application (like BLE terminal on Android) under BLE UART specification data, it prints periodically "coucou".

https://os.mbed.com/media/uploads/jimbaud/screenshot_2021-01-27-10-53-36-782_com.mightyit.gops.bleterminal.jpg

Committer:
jimbaud
Date:
Wed Jan 27 09:58:19 2021 +0000
Revision:
0:25d5fe1d290e
BLE test for specific board mheuve sensor ENSMM CROC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jimbaud 0:25d5fe1d290e 1 #include "mbed.h"
jimbaud 0:25d5fe1d290e 2 #include "ble/BLE.h"
jimbaud 0:25d5fe1d290e 3 #include "ble/services/UARTService.h"
jimbaud 0:25d5fe1d290e 4 #include "Serial.h"
jimbaud 0:25d5fe1d290e 5 #include "stdlib.h"
jimbaud 0:25d5fe1d290e 6
jimbaud 0:25d5fe1d290e 7 #define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN)
jimbaud 0:25d5fe1d290e 8
jimbaud 0:25d5fe1d290e 9
jimbaud 0:25d5fe1d290e 10 const static char DEVICE_NAME[] = "Mheuve";
jimbaud 0:25d5fe1d290e 11 UARTService *uartServicePtr;
jimbaud 0:25d5fe1d290e 12
jimbaud 0:25d5fe1d290e 13 //PWM output
jimbaud 0:25d5fe1d290e 14
jimbaud 0:25d5fe1d290e 15 DigitalOut Green(PC_4); //Red LED
jimbaud 0:25d5fe1d290e 16 DigitalOut Red(PC_5); //Green LED
jimbaud 0:25d5fe1d290e 17
jimbaud 0:25d5fe1d290e 18 Ticker tempo;
jimbaud 0:25d5fe1d290e 19
jimbaud 0:25d5fe1d290e 20 // Tableau et index de communication avec UART
jimbaud 0:25d5fe1d290e 21 static char uartBuff[UART_BUFFER];
jimbaud 0:25d5fe1d290e 22
jimbaud 0:25d5fe1d290e 23 // Routine de traitement des erreurs
jimbaud 0:25d5fe1d290e 24 void onBleError(ble_error_t error);
jimbaud 0:25d5fe1d290e 25
jimbaud 0:25d5fe1d290e 26 /****************************************************/
jimbaud 0:25d5fe1d290e 27 /* Ticker actif lorsque la connexion BLE est présente */
jimbaud 0:25d5fe1d290e 28 /****************************************************/
jimbaud 0:25d5fe1d290e 29 void ConnectedBLE(void)
jimbaud 0:25d5fe1d290e 30 {
jimbaud 0:25d5fe1d290e 31 // Signal de vie: allumer et éteindre la LED
jimbaud 0:25d5fe1d290e 32 Red = 0;
jimbaud 0:25d5fe1d290e 33 Green = 1 ;
jimbaud 0:25d5fe1d290e 34
jimbaud 0:25d5fe1d290e 35 }
jimbaud 0:25d5fe1d290e 36
jimbaud 0:25d5fe1d290e 37 void message(void)
jimbaud 0:25d5fe1d290e 38 {
jimbaud 0:25d5fe1d290e 39 //Integre les trois chaines de caractere contenant les accelerations dans la chaine uartBuff
jimbaud 0:25d5fe1d290e 40 sprintf(uartBuff, "coucou") ;
jimbaud 0:25d5fe1d290e 41 //Envoie la chaine uartBuff sur le sevice TX UART BLE
jimbaud 0:25d5fe1d290e 42 uartServicePtr->write(uartBuff, UARTService::BLE_UART_SERVICE_MAX_DATA_LEN);
jimbaud 0:25d5fe1d290e 43 // Réinitialiser la chaîne uartBuff en entrant 0 dans les premiers caractères UART_BUFFER
jimbaud 0:25d5fe1d290e 44 memset(uartBuff, 0, UART_BUFFER);
jimbaud 0:25d5fe1d290e 45
jimbaud 0:25d5fe1d290e 46 }
jimbaud 0:25d5fe1d290e 47
jimbaud 0:25d5fe1d290e 48 /*************************/
jimbaud 0:25d5fe1d290e 49 /* Connexion BLE réussie */
jimbaud 0:25d5fe1d290e 50 /*************************/
jimbaud 0:25d5fe1d290e 51 void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
jimbaud 0:25d5fe1d290e 52 {
jimbaud 0:25d5fe1d290e 53 // Signal de connexion BLE: allume / éteint la LED avec une période de 1 seconde
jimbaud 0:25d5fe1d290e 54 ConnectedBLE();
jimbaud 0:25d5fe1d290e 55 tempo.attach(message, 1);
jimbaud 0:25d5fe1d290e 56 }
jimbaud 0:25d5fe1d290e 57
jimbaud 0:25d5fe1d290e 58 /*****************************/
jimbaud 0:25d5fe1d290e 59 /* Déconnexion du client BLE */
jimbaud 0:25d5fe1d290e 60 /*****************************/
jimbaud 0:25d5fe1d290e 61 void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
jimbaud 0:25d5fe1d290e 62 {
jimbaud 0:25d5fe1d290e 63 (void)params;
jimbaud 0:25d5fe1d290e 64 // Redémarrer la publicité
jimbaud 0:25d5fe1d290e 65 tempo.detach();
jimbaud 0:25d5fe1d290e 66 BLE::Instance().gap().startAdvertising();
jimbaud 0:25d5fe1d290e 67
jimbaud 0:25d5fe1d290e 68 Green = 0;
jimbaud 0:25d5fe1d290e 69 Red = 1;
jimbaud 0:25d5fe1d290e 70
jimbaud 0:25d5fe1d290e 71 }
jimbaud 0:25d5fe1d290e 72
jimbaud 0:25d5fe1d290e 73 /***************************/
jimbaud 0:25d5fe1d290e 74 /* Rx de BLE et Rx vers USB*/
jimbaud 0:25d5fe1d290e 75 /***************************/
jimbaud 0:25d5fe1d290e 76 void BleOnDataWrittenCallback(const GattWriteCallbackParams *params)
jimbaud 0:25d5fe1d290e 77 {
jimbaud 0:25d5fe1d290e 78 char reception[UART_BUFFER];
jimbaud 0:25d5fe1d290e 79 char commande[2];
jimbaud 0:25d5fe1d290e 80 float valeur;
jimbaud 0:25d5fe1d290e 81
jimbaud 0:25d5fe1d290e 82 // Reçoit une chaîne de BLE
jimbaud 0:25d5fe1d290e 83 if (params->handle == uartServicePtr->getTXCharacteristicHandle()) {
jimbaud 0:25d5fe1d290e 84 // Copie de la chaine reçue dans reception
jimbaud 0:25d5fe1d290e 85 sprintf(reception,"%s", params->data);
jimbaud 0:25d5fe1d290e 86 // Copie dans la chaine commande des deux premier caracteres de la chaine reception
jimbaud 0:25d5fe1d290e 87 sprintf(commande,"%c%c", reception[0], reception[1]);
jimbaud 0:25d5fe1d290e 88 // Transformation des 3 caracteres suivants en valeur numerique
jimbaud 0:25d5fe1d290e 89 valeur = ((reception[2] - '0')* 100 + (reception[3] - '0')* 10 +(reception[4] - '0')) ;
jimbaud 0:25d5fe1d290e 90 valeur = valeur/255;
jimbaud 0:25d5fe1d290e 91
jimbaud 0:25d5fe1d290e 92 if( strcmp(commande, "LR")==0) {
jimbaud 0:25d5fe1d290e 93
jimbaud 0:25d5fe1d290e 94 }
jimbaud 0:25d5fe1d290e 95 if( strcmp(commande, "LV")==0) {
jimbaud 0:25d5fe1d290e 96
jimbaud 0:25d5fe1d290e 97 }
jimbaud 0:25d5fe1d290e 98
jimbaud 0:25d5fe1d290e 99 }
jimbaud 0:25d5fe1d290e 100 }
jimbaud 0:25d5fe1d290e 101
jimbaud 0:25d5fe1d290e 102 /***************************/
jimbaud 0:25d5fe1d290e 103 /* Erreur sur le canal BLE */
jimbaud 0:25d5fe1d290e 104 /***************************/
jimbaud 0:25d5fe1d290e 105
jimbaud 0:25d5fe1d290e 106 void onBleError(ble_error_t error)
jimbaud 0:25d5fe1d290e 107 {
jimbaud 0:25d5fe1d290e 108 Red = 1;
jimbaud 0:25d5fe1d290e 109
jimbaud 0:25d5fe1d290e 110 /* Entrer le traitement des erreurs */
jimbaud 0:25d5fe1d290e 111 }
jimbaud 0:25d5fe1d290e 112
jimbaud 0:25d5fe1d290e 113 /**************************************/
jimbaud 0:25d5fe1d290e 114 /* Initialisation du service BLE UART */
jimbaud 0:25d5fe1d290e 115 /**************************************/
jimbaud 0:25d5fe1d290e 116
jimbaud 0:25d5fe1d290e 117 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
jimbaud 0:25d5fe1d290e 118 {
jimbaud 0:25d5fe1d290e 119 BLE& ble = params->ble;
jimbaud 0:25d5fe1d290e 120 ble_error_t error = params->error;
jimbaud 0:25d5fe1d290e 121
jimbaud 0:25d5fe1d290e 122 if (error != BLE_ERROR_NONE) {
jimbaud 0:25d5fe1d290e 123
jimbaud 0:25d5fe1d290e 124 /* En cas d'erreur, transmettez le traitement d'erreur à onBleInitError*/
jimbaud 0:25d5fe1d290e 125 onBleError(error);
jimbaud 0:25d5fe1d290e 126 return;
jimbaud 0:25d5fe1d290e 127 }
jimbaud 0:25d5fe1d290e 128
jimbaud 0:25d5fe1d290e 129 /* Assurez-vous qu'il s'agit de l'instance par défaut de BLE */
jimbaud 0:25d5fe1d290e 130 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
jimbaud 0:25d5fe1d290e 131 return;
jimbaud 0:25d5fe1d290e 132 }
jimbaud 0:25d5fe1d290e 133
jimbaud 0:25d5fe1d290e 134 ble.gap().onConnection(BleConnectionCallback);
jimbaud 0:25d5fe1d290e 135 ble.gap().onDisconnection(BleDisconnectionCallback);
jimbaud 0:25d5fe1d290e 136 ble.gattServer().onDataWritten(BleOnDataWrittenCallback);
jimbaud 0:25d5fe1d290e 137
jimbaud 0:25d5fe1d290e 138 /* Configuration du service primaire. */
jimbaud 0:25d5fe1d290e 139 UARTService uartService(ble);
jimbaud 0:25d5fe1d290e 140 uartServicePtr = &uartService;
jimbaud 0:25d5fe1d290e 141
jimbaud 0:25d5fe1d290e 142 /* Configurer la publicité */
jimbaud 0:25d5fe1d290e 143 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
jimbaud 0:25d5fe1d290e 144 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
jimbaud 0:25d5fe1d290e 145 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
jimbaud 0:25d5fe1d290e 146 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jimbaud 0:25d5fe1d290e 147 ble.gap().setAdvertisingInterval(500); /* 500ms. */
jimbaud 0:25d5fe1d290e 148 ble.gap().startAdvertising();
jimbaud 0:25d5fe1d290e 149
jimbaud 0:25d5fe1d290e 150 // Attend les événements sur BLE
jimbaud 0:25d5fe1d290e 151 while (true) {
jimbaud 0:25d5fe1d290e 152 ble.waitForEvent();
jimbaud 0:25d5fe1d290e 153 }
jimbaud 0:25d5fe1d290e 154 }
jimbaud 0:25d5fe1d290e 155
jimbaud 0:25d5fe1d290e 156 /********/
jimbaud 0:25d5fe1d290e 157 /* MAIN */
jimbaud 0:25d5fe1d290e 158 /********/
jimbaud 0:25d5fe1d290e 159 int main(void)
jimbaud 0:25d5fe1d290e 160 {
jimbaud 0:25d5fe1d290e 161
jimbaud 0:25d5fe1d290e 162 // Initialiser LED
jimbaud 0:25d5fe1d290e 163 Green = 0;
jimbaud 0:25d5fe1d290e 164 Red = 1;
jimbaud 0:25d5fe1d290e 165
jimbaud 0:25d5fe1d290e 166
jimbaud 0:25d5fe1d290e 167
jimbaud 0:25d5fe1d290e 168 /****** START Initialiser BLE **********/
jimbaud 0:25d5fe1d290e 169 BLE &ble = BLE::Instance();
jimbaud 0:25d5fe1d290e 170 ble.init(bleInitComplete);
jimbaud 0:25d5fe1d290e 171 /******* FIN initialise BLE ***********/
jimbaud 0:25d5fe1d290e 172
jimbaud 0:25d5fe1d290e 173 }
jimbaud 0:25d5fe1d290e 174