Je débute dans l'univers Arduino, qui s'annonce passionnant !
J'ai acquis un Arduino Nano 33 iot, qui me semble-t-il peut communiquer en Bluetooth et en Wifi avec d'autres appareils.
Je n'arrive cependant pas à détecter le signal émis par un Chipolo One (petite balise porte clé Beacon BLE).
Pour faire mes tests, j'utilise la librairie ArduinoBLE.h puis la commande BLE.scan(); pour retrouver tous les périphériques Bluetooth autour de l'Arduino.
J'ai peur de m'être planté entre Bluetooth "classique" et BLE. L'Arduino est-il capable de détecter un signal BLE ? Si oui, la méthode que j'utilise est-elle la bonne ? Si non, est-il possible de détecter mon Chipolo à l'aide d'un composant supplémentaire ?
Chippolo c'est bien du BLE, pas du Bluetooth Classique.
j'ai fait la manip avec un Chippolo et un ESP32 muni de sa librairie BLE, la balise était bien détectée après activation du Chippolo (appui long sur le bouton si mes souvenirs sont bon ....et insertion d'une pile !!)
la carte Arduino Nano 33 IOT comporte un module u-blox Nina W102 qui n'est autre qu'un ESP32 'habillé'.
Le matériel est donc présent. rien à ajouter.
A priori , si la librairie BLE fournie par Arduino n'est pas trop buggée, elle doit être capale de faire détecter par le module u-blox les trames d'advertising envoyées périodiquement par les balises (beacons) BLE telles que les Chippolo.
PS : avec la librairie BLE utilisée y-a-t-il un exemple spécifique détection de balises, quelquechose comme un 'beaconscan' ? les balises sont des dispositifs BLE à part , elles envoient spontanément des trames partculières.
Il n'ya pas içi de combinaison services/caractéristiques.
cet exemple @nico78 affiche les services offerts par les dispositifs BLE découverts, ....s'ils en offrent
// print the advertised service UUIDs, if present
if (peripheral.hasAdvertisedServiceUuid()) {
Serial.print("Service UUIDs: ");
for (int i = 0; i < peripheral.advertisedServiceUuidCount(); i++) {
Serial.print(peripheral.advertisedServiceUuid(i));
Serial.print(" ");
}
Serial.println();
}
Si je me souviens bien ce n'est pas le cas des balises qui se contententent de diffuser une courte trame rudimentaire d'advertising au contenu particulier. Je crains que le programme ci dessus n'ait rien à afficher faute de service (au sens du BLE) offert par un Chippolo.
(Une balise BLE c'est comme un phare , ça n'a rien d'autre à proposer que sa présence et un motif peremettant de l'identifier, on ne communique pas avec une balsie, on la détecte et on l'identifie)
Un programme de scan de balises (Beacons de divers types) affiche leur adresse MAC et éventuellement le contenu d'une très courte trame permettant d'identifier le type de balise (IBeacon, d'Apple, Eddystone de Google, autres....)
le SI est important !! Ma mémoire m'a une fois encore joué un tour (confusion avec d'autres bidules du même ascpect)
Vérification faite sur le Chipolo que j'ai sous la main :
-ce n'est pas une balise (IBeacon ou autre) , contrairement a ce que j'évoquais auparavant
-c'est un 'device' BLE normal qui offre plusieurs services et auquel on peut se connecter
Il est donc découvrable par un scan BLE ordinaire , mis en marche il se signale environ toutes les 1,3 s
Pour activer mon Chipolo il faut appuyer une dizaine de secondes sur le boitier , jusqu'a ce qu'un son se fasse entendre
Voila comment l'application Android nRF Connect le voit :
Cela m'a bien aidé, et j'ai réussi à capter mon Chipolo via le Nano 33 iot
En fait, je pense que j'avais à peu près le bon code dès le début (je le joins en fin de message si cela peut aider quelqu'un dans le futur). J'ai réussi à débloquer la situation en dé-associant le Chipolo de mon smartphone. Peut-être qu'une fois associé, il se met dans un mode spécial qui l'empêche de communiquer avec d'autres appareils, qui le rend invisible... Je ne sais pas ! En tout cas, maintenant ça fonctionne très bien !
#include <ArduinoBLE.h>
void setup() {
Serial.begin(9600);
while (!Serial);
// begin initialization
if (!BLE.begin()) {
Serial.println("L'initialisation a échoué !");
while (1);
}
}
void loop() {
// On recherche le périphérique BLE via son adresse MAC
BLE.scanForAddress("d8:01:00:07:65:a6");
BLEDevice peripheral = BLE.available();
// Si le périphérique est trouvé, on affiche la force se son signal RSSI
if (peripheral) {
Serial.print("RSSI: ");
Serial.println(peripheral.rssi());
}
delay(75); // On attend 75ms avant de retester la présence de la balise BLE
}
merci du retour !! .....On a l'habitude de procéder systématiquement à une association en Bluetooth Classique, en BLE c'sest optionnel et visiblement ça a des effets de bord.....
ton code permet déjà détecter, sans connection, la présence d'un Chippolo particulier et afficher son rssi , juste par une écoute
En combinant le 'RSSi à 1m' diffusé comme info par le bidule et le Rssi effectif mesuré à la réception on peut se faire une idée très grossière de la distance)
en se connectant au Chipolo pour exploiter les bons 'services' et leurs bonnes 'caractéristiques' il serait possible il me semble de connaître l'état de la pile et je crois faire bipper le Chipolo... mais là la programmation devient plus lourde.....