Récupérer les infos d'un capteur BLE, les traiter et les afficher sur 7 segments

Bonjour à tous/toutes,

Je découvre ce forum et c'est bien normal, je viens aussi de découvrir le matériel Arduino
depuis seulement 15 jours
=> je suis donc ultra-novice et moyennement doué en électronique, par contre coté
programmation (C, etc.) ça ira ...

Voici ce qui m'amène pour de nombreux échanges sur ce forum si affinité :wink: :


J'ai un capteur/module Bluetooth Smart ou BLE qui capte des informations ...
Je cite :
"... ce capteur détecte la cadence de pédalage et la vitesse ainsi que la distance parcourue. Il permet de suivre et analyser les données jour après jour. De plus, si le cycliste n'a pas son smartphone, les informations sont tout de même stockées dans le Sensor et peuvent être synchronisées au retour..."

Je souhaite maintenant en lieu et place d'un (smartphone + application), recueillir et traiter ces données sur du matos Arduino ... grâce au Bluetooth

Je pensais donc acheter une carte Arduino Uno + module Bluetooth avec une rôle "central device" pour collecter les infos ..;
Avez-vous une référence de module Bluetooth à me proposer pour le montage envisagé ?
J'insiste sur le rôle "central device" car je veux recueillir des informations du capteur grâce à ce module et non pas ... piloter le capteur !?


Voici où j'en suis : j'ai envoyé un mail aux boutiques semageek, et snootlab en leur adressant cette même demande ... mais je voudrais travailler sur un module le plus standard possible pour ne pas compliquer mon cas :
J'hésite donc avec les modules / solutions suivantes :

1)Ma recherche perso => HM-10
2)Réponse Semageek => Le Shield Bluetooth
3)Réponse Snootlab => Redbearlab => Ma sélection Blenano
4)Mais est-ce une bonne idée ? => Bluno

Ce que je souhaite c'est brancher physiquement MAIS facilement ma carte Arduino sur le module (rappel
je suis peu doué en électronique) , brancher le tout à mon PC sous Windows10 ou Linux et
utiliser un langage de programmation et librairies standards chez les fans d'Arduino

Voili voilou ... pour un 1er message je vais pas charger plus :o

Merci pour votre lecture et réponses éventuelles

Laurent

pour choisir le composant il vous faut déterminer si c'est du Bluetooth "normal" ou du bluetooth 4 dit BLE ou BTLE pour low energy.

le HM-10 est un BTLE et qui peut le plus peut le moins, donc le HM-10 va remplacer avantageusement un HC-05 (Maître ou esclave), HC-06 (esclave seulement) qui ne supportent pas le LE.

donc je partirai sur ce composant - MAIS car il y a des mais - ensuite il faut savoir comment votre "capteur qui détecte la cadence de pédalage et la vitesse ainsi que la distance parcourue" parle à l'autre appareil car c'est là que les choses peuvent se compliquer.

Le BT est une norme radio qui définit une fréquence pour échanger des informations entre appareils, mais le format des messages échangés dépend de ce que l'on appelle un profil. Un profil correspond à une spécification fonctionnelle d'un usage particulier. Les profils peuvent également correspondre à différents types de périphériques. Ils ont pour but d'assurer une interopérabilité entre tous les appareils Bluetooth et définissent la manière d'implémenter un usage défini, les protocoles spécifiques à utiliser ainsi que les contraintes et les intervalles de valeurs de ces protocoles.

Les différents profils sont :
GAP : Generic Access Profile
SDAP : Service Discovery Application Profile
SPP : Serial Port Profile
HS Profile : Headset Profile
DUN Profile : Dial-up Networking Profile
Fax Profile
GOEP : Generic Object Exchange Profile
SP : Synchronization Profile
OPP : Object Push Profile
FTP : File Transfer Profile
CTP : Cordless Telephony Profile
IP : Intercom Profile
A2DP : Advanced Audio Distribution Profile (profil de distribution audio avancée)
AVRCP : Audio Video Remote Control Profile (Commande à distance)
HFP : HandsFree Profile
PAN : Personal Area Network Profile (accès réseau local)
VDP : Video Distribution Profile
BIP : Basic Imaging Profile
BPP : Basic Printing Profile
SYNC : Synchronisation Profile
SAP : SIM Access Profile
PBAP : PhoneBook Access Profile
HIDP : Human Interface Device Profile
MAP : Message Access Profile
...

les modules que vous trouvez sur le marché pour votre Arduino vont souvent implémenter seulement le profil SPP, c'est à dire qu'il ne savent que gérer des transmission équivalentes à ce qui se passe sur un port série.

Si votre capteur sur le vélo répond à un profil SPP, alors vous pourrez établir une liaison et ensuite il faudra comprendre quel est le language de commande supporté par le capteur. pour cela il faudra vous rapprocher du vendeur et voir si c'est quelque chose qu'ils documentent (souvent ils gardent cela pour eux et fournissent juste une application qui sait parler ce langage de commande aux utilisateurs).

Merci beaucoup J-M-L !

Je progresse ... je vais tâcher de trouver un capteur + documentation sur le profil utilisé.
Ou encore (ça m'étonnerait) !? ... voir si je peux accéder au code source d'une application exploitant
les données du capteur

Maintenant peut-être qu'un autre profil m'éviterait de tâtonner ?
ou carrément un autre technologie sans fil comme Ant+ ?
Je ne voudrais pas me compliquer inutilement la vie (quelle-technologie-radio-pour-les-objets-connectes)

"... ce capteur détecte la cadence de pédalage et la vitesse ainsi que la distance parcourue. Il permet de suivre et analyser les données jour après jour. De plus, si le cycliste n'a pas son smartphone, les informations sont tout de même stockées dans le Sensor et peuvent être synchronisées au retour..."

c'est quoi le capteur? parce que c'est lui qui a l'info qui vous intéresse.. donc il faut choisir une techo qui sait lui parler...

Le capteur n'est pas encore acheté, ça ressemblera à ce genre là
[EDIT] Lien réactualisé ...
Capteur vélo exemple
Maintenant je cherche la liaison sans fil (Bluetooth, Ant+,etc.)
qu'il me sera le plus facile de traiter avec Arduino l

la bonne nouvelle c'est qu'ils disent qu'il est compatible avec "MapMyRide, Wahoo Fitness, Strava, Cyclemeter, Imaze et Runtastic Roadbike" donc ils ont filé le protocole à plusieurs développeurs... c'est déjà bon signe sur leur volonté d'ouverture...

Bonjour pepe,

Pour vous répondre ainsi qu'à J-M-L,

Ce que je recherche en priorité c'est la facilité de récupérer les informations (vitesse, distance parcourue etc.)
maintenant le capteur m'importe peu ... du moment qu'il soit sans fil et me transmette ces informations !

Si vous me dites que je vais m'embêter avec un profil Bluetooth / SPP et que le profil XXX serait
idéal (format d'échange de données standardisé par exemple)
ou encore que le ANT+ c'est quand même plus simple ...
... alors je vais chercher de mon coté ... et revenir vers vous avec un capteur correspondant ...

J'espère être plus clair ... j'en suis vraiment au début de mes recherches
et je ne veux pas acheter un matériel quelconque... qui ne correspondrait pas vraiment à mes attentes,
donc je me renseigne AVANT sur ce forum :wink:

vous pouvez vous même fabriquer le petit capteur avec un petit arduino...

il suffit de fixer un aimant sur un des rayons et un détecteur magnétique (genre REED) proche du rayon. à chaque fois que la roue fait un tour, l'aimant passe devant le capteur, votre arduino reçoit une interruption et rajoute '1' à un compteur et si vous voulez plus tard la vitesse éventuellement une mesure du temps.

ensuite ajoutez un petit module BT SPP à votre montage pour interagir..

en vous organisant bien ça peut tenir sans doute dans un petit boitier étanche avec une pile.

ça vous fera bricoler un peu et explorer les approches pour limiter la consommation de courant et faire dormir votre montage au maximum

ensuite pour convertir le nombre d'impulsions en distance ou vitesse il suffit de connaître le rayon de la roue --> vous obtenez la circonférence en faisant 2 x PI x rayon et donc à chaque impulsion de l'aimant c'est la distance parcourue.

Effectivement J-M-L, ça pourrait être une bonne solution, voire une très bonne solution même

Donc un module

  • BT SPP (transmetteur Bluetooth) + REED (capteur effet HALL) alimenté par une pile
    pour compter les tours et transmettre des impulsions
    par Bluetooth d'une part ...
    et une
  • carte Arduino + HM-10
    pour réceptionner les impulsions et réaliser les calculs c'est ça ?

Si oui les informations vitesse moyenne, kilomètrage seraient
stockées où ?
Si je coupe l'alimentation de ma carte Arduino, est-ce que je vais tout perdre ?
Car la finalité c'est d'envoyer ces infos sur des afficheurs (ex:7 segments)
et pas sur un smartphone ...

Ouf ... qu'est ce que j'écris aujourd'hui :wink:

Et pour en revenir à ANT+ apparemment c'est complétement normalisé et donc idéal pour s'y retrouver

par rapport au profil SPP (non normalisé) !

Je vais me renseigner sur le site "ANT" et je reviens ...
je voudrais aussi préciser que le montage que j'envisage va subir quelques chocs et
mauvaises conditions météos (boue, pluie)... c'est pourquoi à la réflexion je pense
utiliser un capteur déjà existant
donc toujours à priori ANT ou BLE bien compact dans sa coque hermétique (étudié pour quoi ...)

D'où mes tergiversations !? Mais ça n'est pas anormal ... je suppose pour un newbie :wink:

ANT semble avoir un programme développeur et des API déjà définies et accessibles en s'enregistrant sur leur site, donc effectivement à explorer.

Une discussion intéressante sur le module HM-10 BLE ici
HM-10 BLE / PANOBIKE
Apparemment avec le capteur "panobike" les développeurs ont des soucis de connexion mais juste sous Windows !?

Ainsi si je partais sur [ce capteur "panobike"] + [module bluetooth HM-10 sur carte Arduino], avec un environnement de programmation Arduino/Linux/c je peux quand même supposer que j'ai de grandes chances compte tenu des échanges de la discussion de faire fonctionner le tout,
non ?
Si ça parait pas déconnant comme raisonnement, je tenterai ça
et pour le ANT+ PROPRIO je verrai ça plus tard :wink:

J'ai commandé le matériel, je rouvrirai un autre sujet si j'ai des soucis.
Bon démarrage de semaine !

Vlà autre chose ;-(

Je suis en train d'avancer petit à petit et je viens de m'apercevoir
que j'ai commandé apparemment un "fake" du HM-10 http://wiki.makespacemadrid.org/images/7/72/HM-10-fake.jpg

Sur cette image ... mon module semble être celui du milieu ... est-ce grave docteur ?
Connaissez-vous les différences entre un vrai HM-10 et un fake !?

Merci

Pour ce module HM-10 ("fake" donc ...),
Ma carte arduino uno est reliée à un afficheur LCD, il est correctement relié
et je peux y afficher des infos

Ma carte arduino uno est aussi reliée à mon module HM-10 (voyant rouge clignotant lentement)

D'un autre coté j'ai un capteur bluetooth BLE sur une roue
Si je fais tourner la roue, mon smartphone détecte la liaison Bluetooth

Maintenant je tente de récupérer des infos de mon capteur via le HM-10 sur mon LCD
à travers ce code
=>

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
 
//Vérifier les broches !

LiquidCrystal lcd(11,10,5,4,3,2); //liaison 4 bits de données

#define RxD 6                //Arduino pin connected to Tx of HM-10
#define TxD 7                //Arduino pin connected to Rx of HM-10

SoftwareSerial mySerial(RxD,TxD);

void setup() {  
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  //
  Serial.begin(9600);
  // If the baudrate of the HM-10 module has been updated,
  // you may need to change 9600 by another value
  // Once you have found the correct baudrate,
  // you can update it using AT+BAUDx command 
  // e.g. AT+BAUD0 for 9600 bauds
  mySerial.begin(9600);
  // Commande AT => http://blog.blecentral.com/2015/05/05/hm-10-peripheral/
  //  AT+MODE0 (default value): It only accepts AT commands over the serial connection (RXD/TXD)
  //  until a central device connects to the module
  // AT+MODE2 Same as MODE0 but once a connection is established, AT commands can be sent over
  // BLE by the central device. This feature can be used to change remotely the value 
  //of a GPIO pin of the HM-10 
  mySerial.print("AT+MODE2"); 
  //AT+ROLEx (x: 0-1; 0 - peripheral; 1 - central  
  mySerial.print("AT+ROLE1"); 
  delay(1000);
}

void loop() {  
  char c;
  if (Serial.available()) {
    c = Serial.read();
    //mySerial.print(c);
    lcd.setCursor(0, 1);
    lcd.print(c);
  }
  if (mySerial.available()) {
    c = mySerial.read();
    //Serial.print(c);    
    lcd.setCursor(0, 1);
    lcd.print(c);
  }
}

Et rien ne s'affiche, pas de réaction ... des suggestions ?

Faites des myserial.println pour les commandes AT

(Et pendant que vous y êtes changez mySerial en quelque chose de plus parlant genre hm10 :slight_smile: )

Merci J-M-L pour la réponse

Voici mon code modifié et plus parlant ...

Mais rien de mieux pour l'instant

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
 
//Vérifier les broches !

LiquidCrystal lcd(11,10,5,4,3,2); //liaison 4 bits de données

#define RxD 6                //Arduino pin connected to Tx of HM-10
#define TxD 7                //Arduino pin connected to Rx of HM-10

SoftwareSerial hm10(RxD,TxD);

void setup() {  
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  //
  Serial.begin(9600);
  // If the baudrate of the HM-10 module has been updated,
  // you may need to change 9600 by another value
  // Once you have found the correct baudrate,
  // you can update it using AT+BAUDx command 
  // e.g. AT+BAUD0 for 9600 bauds
  hm10.begin(9600);
  // Commande AT => http://blog.blecentral.com/2015/05/05/hm-10-peripheral/
  //  AT+MODE0 (default value): It only accepts AT commands over the serial connection (RXD/TXD)
  //  until a central device connects to the module
  // AT+MODE2 Same as MODE0 but once a connection is established, AT commands can be sent over
  // BLE by the central device. This feature can be used to change remotely the value 
  //of a GPIO pin of the HM-10 
  hm10.println("AT+MODE2"); 
  //AT+ROLEx (x: 0-1; 0 - peripheral; 1 - central  
  hm10.println("AT+ROLE1"); 
  delay(1000);
}

void loop() {  
  char c;
  if (Serial.available()) {
    c = Serial.read();
    //mySerial.print(c);
    lcd.setCursor(0, 1);
    lcd.print(c);
  }
  if (hm10.available()) {
    c = hm10.read();
    //Serial.print(c);    
    lcd.setCursor(0, 1);
    lcd.print(c);
  }
}

comme vous écrivez tous les caractères lus sur le LCD en (0,1) et que vos lignes finissent toujours par \n\r ça défile peut être rapidement et vous ne voyez rien... êtes vous sûr que le LCD fonctionne? affichez quelque chose dessus au début du SETUP

que voyez vous dans la console si vous enlevez le commentaire dans la loop?

  if (hm10.available()) {
    c = hm10.read();
    Serial.print(c);    // ENLEVER LE COMMENTAIRE ICI
    lcd.setCursor(0, 1);
    lcd.print(c);
  }

êtes vous sûr que votre HM10 est à 9600 bauds? vous l'alimentez bien en 3.3V?

de mémoire je crois qu'on ne peut envoyer des commandes AT que tant qu'ils n'est pas apparié avec un appareil

Du mieux!

Apparemment mon HM10 ou plutôt BT05 marche en 9600 bauds
et sur une des faces il est écrit Power : 3,6 - 6V
comme sur cette photo

Donc j'alimente le HM10/BT05 en +5V, est-ce correct ?

J'ai lu dans une doc à propos du HM10/BT05

LED in master mode
– quick flash 300ms on, 300ms off – searching/waiting for a connection.
– on – connected.

LED in slave mode
– slow flash (800ms on, 800ms off) – waiting for pairing
– on – connected

J'ai donc changé le mode pour être en slave et la led ne clignotait pas
plus lentement alors j'ai fait une inversion de branchement Tx/Rx et
là j'ai vu que ma commande AT était prise en compte :wink:

J'ai modifié le code pour avoir quelques messages
J'ai sur le LCD un message "START" qui pulse régulièrement
suivi de "AVAIL" suivi d'un caractère +/- spécial

#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
 
//Vérifier les broches !

LiquidCrystal lcd(11,10,5,4,3,2); //liaison 4 bits de données

#define RxD 7                //Arduino pin connected to Tx of HM-10
#define TxD 6                //Arduino pin connected to Rx of HM-10

SoftwareSerial hm10(RxD,TxD);

void setup() {  
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  //
  Serial.begin(9600);
  // If the baudrate of the HM-10 module has been updated,
  // you may need to change 9600 by another value
  // Once you have found the correct baudrate,
  // you can update it using AT+BAUDx command 
  // e.g. AT+BAUD0 for 9600 bauds
  hm10.begin(9600);
  // Commande AT => http://blog.blecentral.com/2015/05/05/hm-10-peripheral/
  //  AT+MODE0 (default value): It only accepts AT commands over the serial connection (RXD/TXD)
  //  until a central device connects to the module
  // AT+MODE2 Same as MODE0 but once a connection is established, AT commands can be sent over
  // BLE by the central device. This feature can be used to change remotely the value 
  //of a GPIO pin of the HM-10 
  hm10.println("AT");
  //hm10.println("AT+PIN=000000");

 
  hm10.println("AT+VERSION"); 
 
  hm10.println("AT+MODE2"); 
  //AT+ROLEx (x: 0-1; 0 - peripheral; 1 - central  
  hm10.println("AT+ROLE1"); 
  delay(1000);
  //lcd.setCursor(0, 1);
  //lcd.print("x");
  //delay(1000);

}

void loop() {  
  char c;
  lcd.setCursor(0, 1);
  lcd.print("START");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("     ");
  delay(1000);
  
  if (Serial.available()) {
    c = Serial.read();
    //mySerial.print(c);
    lcd.setCursor(0, 1);
    lcd.print("S-AVAIL");
    delay(1000);
    lcd.setCursor(0, 1);
    lcd.print("       ");
    delay(1000);
    lcd.setCursor(0, 1);
    lcd.print(c);
    delay(1000);
      }
  if (hm10.available()) {
    c = hm10.read();
    //hm10.print(c);    
    lcd.setCursor(0, 1);
    lcd.print("AVAIL");
    delay(1000);
    lcd.setCursor(0, 1);
    lcd.print("     ");
    delay(1000);
    lcd.setCursor(0, 1);
    lcd.print(c);
    delay(1000);
    
  }
}

Maintenant comment afficher une quelconque donnée en provenance du capteur
pour être certain que la communication est établie ?

[EDIT] En modifiant l'affichage, j'ai finalement une succession de INQE, INQS et "DEVICES FOUND 0"
qui s'affiche ... je n'arrive donc pas à établir une connexion en mode MASTER.
(En mode SLAVE le HM10/BT05 est tout de suite détecté par mon smartphone par exemple)