Bonjour à tous,
Dans le cadre de l'un de mes projets, je récupère des données de capteurs et je les envoie avec un système composé d'une Arduino Nano et d'un module Bluetooth HC-05. Les données sont envoyés sous forme d'une chaine de caractères. La première étape a été de réaliser une application Android sur téléphone pour acquérir les données par Bluetooth et les afficher (cette application fonctionne).
La seconde étape est de convertir cette application pour fonctionner sur Google Glass (première édition). J'arrive à convertir l'application mais je me heurt à un problème simple d'appairage.
En effet, la Google Glass se comporte comme un casque Bluetooth ou des écouteurs sans fil (appairage en cliquant sur une fenêtre apparaissant sur un téléphone) et ne propose pas d'appairer via le code PIN du HC-05. Cela est problématique car je ne peux pas appairer mes lunettes avec mon HC-05 et donc tester mon application.
Auriez-vous des idées ?
Je vous remercie d'avance.
J-M-L
February 22, 2022, 12:45pm
2
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.
Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”
il se peut que les Google Glass n'ait pas du bluetooth avec profil SPP mais juste un profil audio... que dit la doc?
Bonjour,
Merci pour votre retour et désolé pour la mauvaise section.
Je ne trouve pas l'information relative au profil dans la documentation mais il doit s'agir d'un profil SPP car j'arrive à transférer une chaine de caractère d'un téléphone Android à la Google Glass.
Le soucis est vraiment d'appairage
J-M-L
February 22, 2022, 1:24pm
4
en utilisant quoi ? BT ou BLE ?
En utilisant le BT, je n'ai jamais utilisé le BLE de la Google Glass.
La difficulté est l'appairage car le HC-05 n'est pas en mesure d'accepter l'appairage demandé par la Glass
J-M-L
February 22, 2022, 1:40pm
6
qui est le maître et qui est l'esclave ?
postez du code et plus de détails
Ici, le maitre est la Google Glass et l'esclave est le module HC-05. Mais peut-être qu'il faudrait échanger les rôles.
Voici le code de l'Arduino :
/*---------------------------------------*/
/*********** Librairies ******************/
/*---------------------------------------*/
#include "Arduino.h"
#include <math.h>
#include <Arduino_LPS22HB.h>
#include <Arduino_HTS221.h>
#include <Arduino_LSM9DS1.h>
#include <Arduino_APDS9960.h>
#include <SparkFun_Ublox_Arduino_Library.h>
#include <Wire.h>
/*---------------------------------------*/
/************ Classes *******************/
/*---------------------------------------*/
SFE_UBLOX_GPS myGPS ;
UART hc05(digitalPinToPinName(4), digitalPinToPinName(3), NC, NC) ;
/*---------------------------------------*/
/*********** Variables ******************/
/*---------------------------------------*/
boolean BT_STATE = true ;
float static_pressure = 0.0 ;
float temperature = 0.0 ;
float humidity = 0.0 ;
float dew_point = 0.0 ;
float altitude_baro = 0.0 ;
float angle_to_north = 0.0 ;
float xmag = 0.0 ;
float ymag = 0.0 ;
float zmag = 0.0 ;
const int xmin = -26 ;
const int xmax = 15 ;
const int ymin = 18 ;
const int ymax = 58 ;
int xmagc = 0 ;
int ymagc = 0 ;
float xacc = 0.0 ;
float yacc = 0.0 ;
float zacc = 0.0 ;
float xgyr = 0.0 ;
float ygyr = 0.0 ;
float zgyr = 0.0 ;
int current_time = 0 ;
float latitude = 0 ;
float longitude = 0 ;
float speed = 0 ;
long altitude_GPS = 0;
int hour_UTC = 0 ;
int min_UTC = 0 ;
float cap = 0.0 ;
long heading = 0 ;
byte satellites = 0;
int timeout = 50 ;
float roll = 0.0 ;
float pitch = 0.0 ;
float mean_altitude = 0.0 ;
int numberFrame = 0 ;
int r, g, b, a;
String string_status ;
String string_numberFrame ;
String string_current_time ;
String string_hour_UTC ;
String string_min_UTC ;
String string_temperature ;
String string_humidity ;
String string_static_pressure ;
String string_dew_point ;
String string_latitude ;
String string_longitude ;
String string_speed ;
String string_satellites ;
String string_cap ;
String string_roll ;
String string_pitch ;
String string_mean_altitude ;
String string_angle_to_north ;
String string_final ;
/*---------------------------------------*/
/*********** Prototypes *****************/
/*---------------------------------------*/
float dewPoint(float celsius, float humidity) ;
float calcAltitudeBaro(float pressure) ;
/*---------------------------------------*/
/*********** SETUP SYSTEM ***************/
/*---------------------------------------*/
void setup()
{
Serial1.begin(9600); // UART to GPS
hc05.begin(9600);
pinMode(3, INPUT);
pinMode(4, OUTPUT);
if (IMU.begin() && HTS.begin() && BARO.begin() && APDS.begin() && myGPS.begin(Serial1))
{
string_status = "OK" ;
}
else
{
string_status = "NOK" ;
//Rajouter des codes erreurs et led pour erreur Bluetooth
}
}
/*---------------------------------------*/
/*********** LOOP SYSTEM ****************/
/*---------------------------------------*/
void loop()
{
if (BT_STATE == true)
{
current_time = millis()/1000 ; //s
static_pressure = BARO.readPressure()*10 ; //kPa to hPa
temperature = HTS.readTemperature(); //°C
humidity = HTS.readHumidity() ; //%
altitude_baro = calcAltitudeBaro(static_pressure) ; //ft
IMU.readMagneticField(xmag, ymag, zmag); //uT
IMU.readAcceleration(xacc, yacc, zacc); //G
IMU.readGyroscope(xgyr, ygyr, zgyr); // °/s
latitude = myGPS.getLatitude(timeout)*0.0000001 ; //°
longitude = myGPS.getLongitude(timeout)*0.0000001 ; //°
speed = myGPS.getGroundSpeed(timeout)*0.0036 ; //km/h
altitude_GPS = myGPS.getAltitudeMSL(timeout)/1000*3.281 ; //ft
satellites = myGPS.getSIV(timeout);
hour_UTC = myGPS.getHour(timeout);
min_UTC = myGPS.getMinute(timeout);
heading = myGPS.getHeading(timeout)*0.00001 ; //°
dew_point = dewPoint(temperature, humidity) ; //°C
roll = 0.25 * (roll + float(xgyr) * 0.1) + 0.75 * atan2((double)yacc, (double)zacc) * 180 / PI; //X
pitch = 0.25 * (pitch + float(ygyr) * 0.1) + 0.75 * atan2((double)xacc, (double)zacc) * 180 / PI; //Y
mean_altitude = (altitude_baro + altitude_GPS)/2 ;
cap = heading ; //rajouter angle to north
APDS.readColor(r, g, b, a) ; //à utiliser
xmagc = map(xmag, xmin, xmax, -1000, 1000) ;
ymagc = map(ymag, ymin, ymax, -1000, 1000) ;
angle_to_north = atan2(ymagc, xmagc) * 180 / PI ; //Magnetic North in ° par rapport à x (heading)
if (angle_to_north > 360.0) angle_to_north -= 360.0 ;
if (angle_to_north < 0.0) angle_to_north += 360.0 ;
string_numberFrame = String(numberFrame) ;
string_current_time = String(current_time) ;
string_hour_UTC = String(hour_UTC);
string_min_UTC = String(min_UTC);
string_temperature = String(temperature) ;
string_humidity = String(humidity) ;
string_dew_point = String(dew_point) ;
string_static_pressure = String(static_pressure) ;
string_latitude = String(latitude) ;
string_longitude = String(longitude) ;
string_speed = String(speed);
string_satellites = String(satellites) ;
string_cap = String(cap);
string_roll = String(roll) ;
string_pitch = String(pitch) ;
string_mean_altitude = String(mean_altitude) ;
string_angle_to_north = String(angle_to_north) ;
numberFrame++ ;
string_final = string_numberFrame + "/" + string_current_time + "/" + string_hour_UTC + ":" + string_min_UTC
+ "/" + string_temperature + "/" + string_humidity + "/" + string_dew_point + "/" + string_static_pressure
+ "/" + string_latitude + "/" + string_longitude + "/" + string_speed + "/" + string_satellites
+ "/" + string_cap + "/" + string_roll + "/" + string_pitch + "/" + string_mean_altitude
+ "/" + string_angle_to_north ;
hc05.println(string_final);
}
delay(100) ; //Délai pour GPS
}
/*---------------------------------------*/
/*********** DECLARATION ****************/
/*---------------------------------------*/
float calcAltitudeBaro(float pressure) //Faire calibration thermique et vérifier (param en hPa)
{
pressure = pressure * 100 ;
float A = pressure/101325;
float B = 1/5.25588;
float C = pow(A,B);
C = 1 - C;
C = C /0.0000225577;
return C*3.281; //conversion en ft
}
float dewPoint(float celsius, float humidity)
{
const float a = 17.27;
const float b = 237.7;
float temp = (a * celsius) / (b + celsius) + log(humidity * 0.01);
return (b * temp) / (a - temp);
}
Mais il n'est pas vraiment utile pour la problématique (il envoie seulement des données par liaison série sur le HC-05). Je réceptionne les données via un terminal Bluetooth série sur android. D'où la problématique d'appairage en amont.
Le HC-05 est configuré ainsi :
ROLE = 0
CMODE = 0
PSWD = 1234
J-M-L
February 22, 2022, 2:32pm
8
si l'appairage n'est pas effectué, c'est sûr que ça ne fonctionnera pas
Comment déclenchez vous cet appairage côté lunettes ?
Justement, là est la problématique. Le code est fonctionnel mais il manque l'appairage.
Pour l'appairage, je lance le scan coté lunette. La lunette finit par trouver le HC-05, je sélectionne le HC-05 et la lunette tente un appairage. En vain, car elle ne me propose pas d'inscrire de code PIN et l'appairage échoue.
Avec un téléphone, un pop-up apparait (sur mon téléphone) et me propose d'accepter ou non l'appairage et cela fonctionne.
J-M-L
February 22, 2022, 2:52pm
10
enlevez le code pin pour commencer
D'accord, je vais tenter cela merci.
Existe t'il une méthode pour enlever le code PIN ou l'authentification par commande AT sur le HC-05 ?
J-M-L
February 22, 2022, 4:40pm
12
j'ai parlé trop vite, il se peut que sur ce module on ne puisse pas le virer...
Visiblement, il est impossible de le supprimer. Serait-il possible de modifier les paramètres CMODE et BIND du HC-05 pour réaliser un appairage automatique ?
J-M-L
February 22, 2022, 5:54pm
14
pas si vous êtes un esclave et que les lunettes sont maître...
Et si je décide d'échanger les rôles ?
Je pourrais passer le ROLE du HC-05 en maitre et essayer de réaliser l'appairage de ce coté, j'imagine.
J-M-L
February 22, 2022, 6:24pm
18
il faut que les lunettes veuillent bien jouer le rôle de l'esclave cependant
sans avoir de spec ni de détails, difficile de savoir ce qu'il se passe
Je vais tenter et voir le résultat. Les Google Glass Explorer Edition ont tellement peu été vendu qu'il est difficile de trouver de la documentation.
Je reviendrai vers vous.
J-M-L
February 22, 2022, 6:59pm
20
oui, ils ne sont plus supportés par google non plus...