Programme Beacon Bluetooth

Bonjour/bonsoir à vous.

je viens ici demander un petit peu d'aide dans le cas d'un projet incluant des Beacons BLE (Bluetooth Low Energy).

Pour être plus précis, ce projet est un projet de BAC (je suis en Terminale Sti2D Spé SIN) avec comme objectif de créer une interface de Géolocalisation Indoor ( à but social, EHPAD/Hôpitaux).

nous avons, moi et mon équipe, choisi, pendant notre travail de revue n°0 et n°1 (que je peux vous fournir si vous le souhaitez), de nous pencher sur une géolocalisation en utilisant des Beacons BLE, n'ayant que 4 mois pour finir ce projet (-2 à 3 semaines de travail de Revues).

Dans ma partie de travail, je dois m'occuper de la locasation. pour répondre à ce besoin, on s'est décidé, avec mes camarades, de créer des Beacons à partir d'une carte arduino, avec module Bluefruit LE Friend en émetteur, et créer le système de géolocalisation avec une autre carte Arduino avec un module Bluetooth HM-06 en Récepteur.

et donc nous arrivons à mon problème : ayant reçu la carte et le module émetteur, je suis parti chercher des propositions de codes, pour les utiliser et surtout les comprendre (pour éviter de passer pour un flemmard pendant l'oral de BAC), j'ai donc pu trouvez plusieurs bibliothèque adaptée pour le module que j'utilise et je profite de plus d'un programme "exemple" de Beacon

le lien des bibliothèques : https://github.com/adafruit/Adafruit_BluefruitLE_nRF51

dans le cas du programme, j'ai pu comprendre certaines commandes (comme FACTORYRESET) mais j'ai vraiment du mal à comprendre le reste

/*********************************************************************
 This is an example for our nRF51822 based Bluefruit LE modules

 Pick one up today in the adafruit shop!

 Adafruit invests time and resources providing this open source code,
 please support Adafruit and open-source hardware by purchasing
 products from Adafruit!

 MIT license, check LICENSE for more information
 All text above, and the splash screen below must be included in
 any redistribution
*********************************************************************/

#include <Arduino.h>
#include <SPI.h>
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"

#include "BluefruitConfig.h"

#if SOFTWARE_SERIAL_AVAILABLE
  #include <SoftwareSerial.h>
#endif

/*=========================================================================
    APPLICATION SETTINGS

    FACTORYRESET_ENABLE     Perform a factory reset when running this sketch
    
                            Enabling this will put your Bluefruit LE module
                            in a 'known good' state and clear any config
                            data set in previous sketches or projects, so
                            running this at least once is a good idea.
   
                            When deploying your project, however, you will
                            want to disable factory reset by setting this
                            value to 0.  If you are making changes to your
                            Bluefruit LE device via AT commands, and those
                            changes aren't persisting across resets, this
                            is the reason why.  Factory reset will erase
                            the non-volatile memory where config data is
                            stored, setting it back to factory default
                            values.
       
                            Some sketches that require you to bond to a
                            central device (HID mouse, keyboard, etc.)
                            won't work at all with this feature enabled
                            since the factory reset will clear all of the
                            bonding data stored on the chip, meaning the
                            central device won't be able to reconnect.

    BEACON_MANUFACTURER_ID  Company Identifier assigned by Bluetooth SIG
                            Full list of Manufacturer ID can be found here
                            https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers
    BEACON_UUID             16-bytes UUID in hex format AA-BB-...
    BEACON_MAJOR            16-bit major nunber
    BEACON_MINOR            16-bit minor nunber
    BEACON_RSSI_1M
    -----------------------------------------------------------------------*/
    #define FACTORYRESET_ENABLE      0

    #define MANUFACTURER_ADAF         "0x0822"
    #define MANUFACTURER_NORDIC        "0x0059"

    #define BEACON_MANUFACTURER_ID     MANUFACTURER_ADAF
    #define BEACON_UUID                "01-12-23-34-45-56-67-78-89-9A-AB-BC-CD-DE-EF-F0"
    #define BEACON_MAJOR               "0x0000"
    #define BEACON_MINOR               "0x0000"
    #define BEACON_RSSI_1M             "-54"
/*=========================================================================*/

// Create the bluefruit object, either software serial...uncomment these lines
/*
SoftwareSerial bluefruitSS = SoftwareSerial(BLUEFRUIT_SWUART_TXD_PIN, BLUEFRUIT_SWUART_RXD_PIN);

Adafruit_BluefruitLE_UART ble(bluefruitSS, BLUEFRUIT_UART_MODE_PIN,
                      BLUEFRUIT_UART_CTS_PIN, BLUEFRUIT_UART_RTS_PIN);
*/

/* ...or hardware serial, which does not need the RTS/CTS pins. Uncomment this line */
// Adafruit_BluefruitLE_UART ble(BLUEFRUIT_HWSERIAL_NAME, BLUEFRUIT_UART_MODE_PIN);

/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);

/* ...software SPI, using SCK/MOSI/MISO user-defined SPI pins and then user selected CS/IRQ/RST */
//Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_SCK, BLUEFRUIT_SPI_MISO,
//                             BLUEFRUIT_SPI_MOSI, BLUEFRUIT_SPI_CS,
//                             BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);


// A small helper
void error(const __FlashStringHelper*err) {
  Serial.println(err);
  while (1);
}

/**************************************************************************/
/*!
    @brief  Sets up the HW an the BLE module (this function is called
            automatically on startup)
*/
/**************************************************************************/
void setup(void)
{
  while (!Serial);  // required for Flora & Micro
  delay(500);

  Serial.begin(115200);
  Serial.println(F("Adafruit Bluefruit Beacon Example"));
  Serial.println(F("---------------------------------"));

  /* Initialise the module */
  Serial.print(F("Initialising the Bluefruit LE module: "));

  if ( !ble.begin(VERBOSE_MODE) )
  {
    error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
  }
  Serial.println( F("OK!") );

  if ( FACTORYRESET_ENABLE )
  {
    /* Perform a factory reset to make sure everything is in a known state */
    Serial.println(F("Performing a factory reset: "));
    if ( ! ble.factoryReset() ){
      error(F("Couldn't factory reset"));
    }
  }

  /* Disable command echo from Bluefruit */
  ble.echo(false);

  Serial.println("Requesting Bluefruit info:");
  /* Print Bluefruit information */
  ble.info();

  Serial.println(F("Setting beacon configuration details: "));

  // AT+BLEBEACON=0x0059,01-12-23-34-45-56-67-78-89-9A-AB-BC-CD-DE-EF-F0,0x0000,0x0000,-54
  ble.print("AT+BLEBEACON="        );
  ble.print(BEACON_MANUFACTURER_ID ); ble.print(',');
  ble.print(BEACON_UUID            ); ble.print(',');
  ble.print(BEACON_MAJOR           ); ble.print(',');
  ble.print(BEACON_MINOR           ); ble.print(',');
  ble.print(BEACON_RSSI_1M         );
  ble.println(); // print line causes the command to execute
  Serial.println("ca passe");
  # Enable Nordic Beacon emulation
# Manufacturer ID = 0x0059
AT+BLEBEACON=0x0059,01-12-23-34-45-56-67-78-89-9A-AB-BC-CD-DE-EF-F0,0x0000,0x0000,-59
OK
# Reset to change the advertising data
ATZ
OK

  // check response status


  Serial.println();
  Serial.println(F("Open your beacon app to test"));
}

/**************************************************************************/
/*!
    @brief  Constantly poll for new command or response data
*/
/**************************************************************************/
void loop(void)
{  
Serial.println (ble.read());
delay(100);
}

je n'ai donc que deux requêtes à vous présenter :

1- pouvez-vous m'expliquer les autre commandes de ce programme
2- est-ce que peut m'aider à pouvoir coder ce Beacon afin qu'il puisse envoyer de manière répétée un texte, récupérable et lisible par la carte et module récepteurs

Je vous remercie de votre attention et de votre aide, si vous avez besoin de précisions, demandez le moi (je vais essayer d'être régulier sur le site).

Bonjour
Cette balise emet les données UUID, Major et minor. Rien d'autre car le format iBeacon n'est pas conçu pour envoyer autre chose, la trame est courte
Une balise iBeacon n'envoie que son identifiant.

HM-06 , connais pas par contre le HM-10 fait un bon scanneur de balises BLE , il peut egalement être configuré pour jouer tout seul , sans carte Arduino le rôle de balise iBeacon. J'ai montré la configuration a la fin d'un tutoriel de J-M-L consacré au HM10

S'inspiree de codes existabts nene dispense pads de travailler les concepts du BLE et en particulier içi des trames iBeacon (format le plys simple de balises BLE)

Je ne connais pas le module Adafruit une documentation détaillée est sans doute disponible sur leur site.Je n'ai pratiqué sommairement le BLE qu'avec HM-10 et ESP32 moins couteux

al1fch:
Bonjour
Cette balise emet les données UUID, Major et minor. Rien d'autre car le format iBeacon n'est pas conçu pour envoyer autre chose, la trame est courte
Une baluse iBeacon n'envoie que son identifiant.

HM-06 , connais pas par contre le HM-10 fait un bon scanneur de balises BLE , il peut egalement être configuré pour jouer tout seul , sans carte Arduino le rôle de balise iBeacon. J'ai montré la configuration a la fin d'un tutoriel de J-M-L consacré au HM10
Je ne connais pas le module Adafruit une documentation détaillée est sans doute dispinible sur leur site
Je n'ai pratiqué sommairement le BLE qu'avec HM-10 et ESP32 moins couteux

Merci de ta réponse.

dans le cas présent le module HM-06 ne sert que de récepteur (donc aucun envoi de données par bluetooth de ce côté la).
ensuite comment configure tu le HM-10 ?? (cela peut mettre très utile)
et enfin, oui, il y a une documentation sur le site de adafruit (Introduction | Introducing the Adafruit Bluefruit LE UART Friend | Adafruit Learning System), mais je n'ai pas réussi à y trouvez mon bohneur

Un lien vers le module HM-06 ?
Chercher dans les tutoriels de ce forum le HM-10 par J-M-L, ma config y figure vers la fin
A mon retour au domicile dans 2 ou 3 jours je retrouverai qq liens.
Adafruit a des forumrs dédiés a ses divers produits

al1fch:
Un lien vers le module HM-06 ?
Chercher dans les tutoriels de ce forum le HM10 par J-M-L, ma config y figure vers la fin
A mon retour au domicile dans 2 ou 3 jours je retrouverai qq liens.

je crois qu'il viens de chez SeeedStudios

Lien non cliquable = lien non suivi (sur smartphone)

al1fch:
Lien non cliquable = lien non suivi (sur smartphone)

Voilà le lien cliquable : Grove - Serial Bluetooth v3.0 | Seeed Studio Wiki

Je vois un module Bluetooth "V2.0+EDR(Enhanced Data Rate" qui gère le 'Bluetooth Classique'pas le BLE (= Bluetooth V4) donc incapable de détecter des iBeacons BLE.
Le BLE est un Bluetooth très particulier, incompatible avec le BT classique.

Dans le programme d'Adafruit montre plus haut voici l'identifiant (UUID) diffusé par la balise (il est modifiable en respectant la longueur

"01-12-23-34-45-56-67-78-89-9A-AB-BC-CD-DE-EF-F0"

Sont aussi modifiables les valeurs de MAJOR et MINOR

Içi le détail de la structure d'un paquet iBeacon (format de balise BLE initié par Apple, le plus répandu)
https://support.kontakt.io/hc/en-gb/articles/201492492-iBeacon-advertising-packet-structure

Image extraite d'un autre article : ESP32 (32) – BLE, iBeacon – lucadentella.it

(Pour Major et Minor je mets la date de mise en service de la balise , j'en ai une avec 2018 et 428, qui tourne depuis le 28 04 2018 alimentée par la même pile CR2232) , balise réalise par un HM-10 en 'solo'

Deux application sur smartphone sont utiles pour la mise au point avec BLE

"nRF Connect" , incontournable et éventuellement "BlueFruit LE Connect"

Voilà une balise iBeacon (HM10 en solo) vue par nRF Connnect
iBeacon avec HM10.png

on y voit l'adresse MAC fixe ainsi que les valeurs arbitraires de UUID, Major et Minor
nRF Connect reçoit içi le signal avec un RSSI de -74 dB, l'écart avec le "RSSI à 1m" ( constaté à -59dB, valeur diffusée par la balise) permet d'avoir une idée approximative de la distance.

iBeacon avec HM10.png

Merci de tes réponse et précision (cela me facilite l’appréhension et la compréhension du Beacon BLE)

cependant, mon souci principal est assez particulier :

Le beacon à pour mission d'émettre un simple texte (dans le cas présent, le nom d'une salle, ex: H-176) de manière répétée (toute les 1 secondes) et que cette information puisse être reçue par un micro-contrôleur arduino. or comme tu la dit :

Içi le détail de la structure d'un paquet iBeacon (format de balise BLE initié par Apple, le plus répandu)

Le système de beacon de plus répandu est celui de Apple et malheureusement pour moi, après plusieurs recherches, j'ai constaté que l'utilisation du beacon se faisait souvent avec le téléphone (non pas pour configurer le beacon mais tout simplement comme récepteur)

donc ma question principale est : est-il possible au moins de pouvoir emmètre une simple information, qu'un contrôleur arduino puisse recevoir ?

donc ma question principale est : est-il possible au moins de pouvoir emmètre une simple information, qu'un contrôleur arduino puisse recevoir ?

oui , sans difficulté en BLE , si la carte Arduino équipée BLE : carte Arduino basique+module HM-10 ou carte plus sophistiquée

-Le format iBeacon avec ses 16 octets libres permet sans problème de diffuser périodiquement dans sa trame une chaînearbitraire allant jusqu'à 16 caractères. On met ce que l'on veut dans UUID : ans le code Adafruit montré au message initial c'est une variante de suite 012345678...

#define BEACON_UUID     "01-12-23-34-45-56-67-78-89-9A-AB-BC-CD-DE-EF-F0"

-Tout dispositif BLE sait scanner et restituer les trames émises par les balises à sa portée, ce n'est pas réservé aux smartphones. (souvent ne veut pas dire toujours !)

Le module BLE HM-10 qui s'interface facilement à une carte Arduino basique possède au moins une commande AT ( AT+DISI? ) déclenchant un scan + l'affichage de toutes les trames diffusées en advertizing , dont celles des iBeacon du voisinage. Il suffit alors d'extraire de la trame hexadécimale la partie représentant la chaîne de caractère utile

Voir le message #20 dans le tutoriel de J-M-L sur le module HM-10, on y voit la réponse à la commande AT+DISI? avec, vers la fin, une ligne reçue d'une balise iBeacon perso (avec dans la trame les 16 octets de l'UUID)

içi j'avais, dans la balise perso, laissé l'UUID par défaut : 74278BDAB64445208F0C720EAF059935, mais c'est éditable, il n'y a pas d'UUID imposé et ont peut tout à fait y caser H-176 en ASCII soit 48 2d 31 37 36

Au final on peut faire ses iBeacons avec des HM-10 'en solo' et les récepteurs avec des HM-10 associés à des cartes Uno, Mini , Micro..

merci de ces informations (vraiment très utiles).

je souhaite juste savoir de quelle manière on configure le module Bluetooth

c-à-d la manip à faire (et non le code car je l'ai récupéré sur le post que tu m'a indiqué)

est-ce que l'on doit brancher le module à une carte et il pourra ensuite 'travailler seul' ??

Je ne connais pas du tout ce module d'Adafruit, il faut etudier sa documentation.

Un HM-10 se configure en iBeacon par des comandes AT envoyés sur son entrée Rx et travaille tout seul ensuite.

ok.

Vraiment merci de ton aide, cela va pouvoir me faciliter la tâche dans mon travail.
cela me permettra peut-être de finir dans les temps ?! (projet final à rendre pour début Avril...)
merci donc d'avoir pu donner de ton temps, je suis beaucoup plus éclairé maintenant ^^

une dernière petite question, pour la commande AT+ADVI, tu met F pour l'intervalle le plus long, mais pour l'intervalle la plus court, c'est quelle lettre ? (A ?)

En ballade..... je n'ai pas la liste des commandes AT du HM-10 sous la main.....chercher HM-10 sur le site de Martin Currey