IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Réception Bluetooth sur Nano


Sujet :

Arduino

  1. #1
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut Réception Bluetooth sur Nano
    Bonjour,

    Je me replonge dans un programme que j'avais fait marcher avec succès il y a 1 an sur une MEGA, mais que je n'arrive plus à faire fonctionner sur ma NANO, le temps ayant passé et mes souvenirs sont devenus parcellaires...

    Il reçoit les caractères Bluetooth depuis un module HC-06 via un Smartphone (désormais un HC-08 mais c'est pareil).
    Les pattes TX et RX du HC08 sont connectées aux pins RX et TX de la Nano.
    La connexion entre Smartphone et HC-08 s'établit correctement (la LED devient fixe).

    Voici le code Arduino du Setup qui passe à la compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void setup() 
    {
     
    	pinMode(0, INPUT); // définit la pin 0 de la Nano en Input, puisque c'est RX
    	pinMode(1, OUTPUT); // définit la pin 1 de la Nano en Output puisque c'est TX
    	HC06.begin(115200); // communication avec le Bluetooth
    	Serial.begin(115200); // figurait dans le code open classroom pour recevoir les commandes Bluetooth
                          // et aussi dans mon programme gérant l'I.R.: Démarre le Moniteur Série pour voir les résultats sur PC
    					  // on passe la vitesse à 115.200 car ça a été validé avec "Test_HC08_v120.ino"
    					  // Il faut penser à passer la fenêtre du Moniteur Série sur 115200 si on veut voir apparaître les résultats correctement
    	// Serial3.begin(9600); Cette instruction (mis dan sla version MEGA du prog) n'est peut-être pas nécessaire sur NANO ?? La valeur définissant la vitesse max, 
    	// 						la NANO devrait
    	//						être capable de recevoir les données du HC-08 même si on a mis 115.200 dans le Serial.begin avant
    	// permet d'initialiser le port série Serial3 sur lequel est connecté le HC08
    						 // les pins RX et TX du HC08 sont donc respectivement connectées aux Pins D14 (TX de Serial3) et D15 (RX de Serial3)
    	// Sur la NANO le HC-08 est connecté à RX et TX, il n'y a qu'un seul Serial donc enlever Serial3.
    	// VOIR S'IL FAUT FORCER LE HC-08 à 115.200 par une commande AT , ou pas ?
    	IrReceiver.enableIRIn(); // Starts the IR receiver
    	IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); // c'est l'instruction de remplacement donné par le Wiki Youtube
      // On définit les pins MOTOR de la MEGA en Output--> Rouvrir un pgm de la Nano pour voir la syntaxe
    et la partie intéressante du LOOP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    void loop()
    {
     
     
       // while(HC06.available()) // Je le laisse ne commentaire pour la NANO mais je ne sais pas s'il faut le réactiver ??
    							// à supprimer selon moi car remplacé par le "Serial.available" ci-dessous.
    	while(HC06.available()) // ici on met HC06 puisqu'on a définit "SoftwareSerial HC06(0,1)" plus haut
    	{
    		  delay(3);
    		  char c = HC06.read();  // ici on lit le contenu de HC08
    		  messageRecu += c;
    		  if(c == 'Z') // si le caratère reçu est 'Z' cela signifie que la commande est complète (j'utilise 'Z' car je n'arrive pas à détecter '\n')
    		  {
    			  // Serial.println(messageRecu); // en commentaire imprime donc la commande reçue du Smartphone qui est entière, par ex.: STOPZ
    			  break; // et on sort de la boucle While puisque la commande est complète et donc prête à être interprétée pour declencher des actions
    		  }
    	}
    Ensuite j'ai une batterie de IF sur la variable "messagerecu" qui me permettent de déclencher des actions.

    Mais rien ne se passe quand mon Smartphone envoie des caractères, on dirait que le HC08 ne transmet rien à la Nano: avez-vous une idée ?

    Dans l'intervalle je vais refaire un programme archi-basique faisant imprimer sur le Moniteur série les caractères reçus par Bluetooth, histoire de repartir du début.

    Merci pour vos réponses,

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    c'est qui HC06 dans ce code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	HC06.begin(115200); // communication avec le Bluetooth
    	Serial.begin(115200); // figurait dans le code open classroom pour recevoir les commandes Bluetooth
    sur la mega vous aviez sans doute (j'espère) utilisé un port série matériel (il y en a 4) pour parler au HC06.
    Sur la Nano vous n'avez qu'un seul port matériel (Serial sur les pins 0 et 1) mais qui sert aussi pour l'upload et le debug suivant le code

    ==> postez tout le code et partagez le schéma de montage

  3. #3
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    sur la mega vous aviez sans doute (j'espère) utilisé un port série matériel (il y en a 4) pour parler au HC06.
    Oui bien sûr, j'avais utilisé Serial3; mais depuis plus d'un an je ne m'y suis plus intéressé, donc j'ai un peu oublié...

    c'est qui HC06 dans ce code ?
    c'est une bonne question, et je sens bien que le problème pourrait venir de là: je me rappelle que j'avais renommé le HC08 en utilisant des commandes AT, pour éviter que le terme générique "HC-08" apparaisse.

    Supposons que je l'ai renommé "toto", est ce que je dois modifier le code en y incluant le nom "toto", ainsi:
    ou bien est-ce que comme il n'y a qu'un seul port série sur la Nano, il suffit de faire un
    ???

    Je crois que je me mélange les pinceaux entre ces 2 déclarations: pour démarrer le récepteur Bluetooth, doit-on l'appeler par son nom ou bien un "Serial.begin" suffit ? (peut-être qu'il faut démarrer les deux, càd le récepteur Bluetooth en l'appelant par son nom ainsi que le port série en utilisant Serial.begin ??)

    Merci pour votre éclairage

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    comme vous n'avez qu'un port série il faudrait en créer un second "virtuel" (émulation logicielle). On fait traditionnellement cela avec SoftwareSerial

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <SoftwareSerial.h>
     
    SoftwareSerial HC06(2, 3); // le pin 2 est le Rx (connectée au Tx du module) et la pin 3 le Tx (connectée au Rx du module)
     
    void setup() {
      Serial.begin(115200);
      HC06.begin(9600);
      ...
    HC06 ici est alors une instance de SoftwareSerial qui permet de parler au module et de lui envoyer des commandes AT et de recevoir les réponses.

  5. #5
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    comme vous n'avez qu'un port série il faudrait en créer un second "virtuel" (émulation logicielle). On fait traditionnellement cela avec SoftwareSerial
    Oui j'ai pensé à ça, mais j'utilise beaucoup de pins de la Nano et je n'ai plus grand chose de libre... et mes circuits imprimés sont conçus pour utiliser RX et TX de la Nano.

    J'ai lu qu'on pouvait continuer d'utiliser RX et TX, en débranchant le module Bluetooth le temps de télécharger le sketch: si c'est possible ce serait parfait car ça me permettrait de continuer à utiliser mes PCBs.

    Par contre je n'arrive toujours pas à communiquer correctement avec le module et c'est ça qui m'empêche d'aller plus loin. J'au utilisé le tuto ici:
    https://ledisrupteurdimensionnel.com...-avec-arduino/
    où se trouve ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #include <SoftwareSerial.h>
    SoftwareSerial BT(4,2); // RX de la Uno=pin AT4; TX de la Uno=pin 2
     
    void setup(){
      Serial.begin(9600);
      Serial.println("Enter AT commands:");
      BT.begin(9600);
    }
     
    void loop(){
      if (BT.available())
        Serial.write(BT.read());
     
      if (Serial.available()){
        String S = GetLine();
        BT.println(S); // Si avec cela le bluetooth ne marche pas éliminer le saut de ligne, remplacer par BT.print(S);
        Serial.println("---> " + S);
      }
    }
     
    String GetLine(){
      String S = "" ;
      if (Serial.available()){
        char c = Serial.read(); ;
        while (c != '\n'){
          S = S + c ;
          delay(25) ;
          c = Serial.read();
        }
        return( S ) ;
      }
    }
    que j'ai injecté dans une Uno classique avec mon module Bluetooth relié selon le tuto (abolument rien d'autre relié à cette carte) et la communication est foireuse:

    Lorsque je tape la commande "AT" il ne me répond pas "OK", et quand je tape "AT+RX" pour avoir les infos principales je n'ai pas de réponse.

    Seule la commande "AT+VERSION" me renvoie une info sans pour autant terminer par OK...---> voir la capture ci-jointe du Moniteur Série:
    Nom : Capture.JPG
Affichages : 569
Taille : 34,1 Ko

    Et pourtant j'ai bien sélectionné "Nouvelle ligne dans le Moniteur", et vitesse 9600 bauds: même si j'avais changé la config d'origine, ça devrait communiquer normalement.

    C'est donc ce problème de communication qu'il faut régler en 1er je pense, non ?

    Vous avez une idée, car je suis un peu paumé là...

  6. #6
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    Je viens de remplacer le module Bluetooth par un autre, neuf, qui est un HC08 n'ayant jamais servi.

    Cette fois j'obtiens bien la réponse "OK" quand je rentre la commande "AT", ce qui me laisse penser que la communication fonctionne.

    La commande "AT+VERSION" me renvoie: "OK:SH-V1.251"


    Par contre quand je rentre "AT+RX" pour avoir les infos de base comme le nom et la vitesse par exemple, là je n'obtiens aucune réponse: voir la capture d'écran ci-jointe:

    Nom : Capture2.JPG
Affichages : 547
Taille : 32,2 Ko

    Donc est-ce que je me trompe de commande AT pour obtenir les infos de base ???

    P.S.:
    Je suis arrivé à avoir le nom en tapant "AT+NAME?" (il m'a répondu:
    ---> AT+NAME?
    OK+Name:SH-HC-08
    mais les autres commandes AT que j'ai pu trouver, du style AT+UART? (pour connaitre la vitesse) ne répondent rien (même pas OK). Donc j'ai comme l'impression que le jeu de commandes AT reconnues diffère selon les modèles.

    Quant au 1er module HC06, il ne répond pas aux commandes AT, mais j'ai remarqué qu'il clignote très rapidement alors que le HC08 (celui qui répond) clignote lentement (au rythme de 2 secondes allumé, 2s éteint).

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    si votre module BT est connecté sur le port série, effectivement il faut le débrancher au chargement mais ensuite le code utilise directement Serial pour parler au module...

    ==> il n'est plus question de créer un port virtuel, faut virer tout ce qui se rapporte à BT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // A ENLEVER #include <SoftwareSerial.h>
    // A ENLEVER SoftwareSerial BT(4,2); // RX de la Uno=pin AT4; TX de la Uno=pin 2
     
    void setup(){
      Serial.begin(9600);
    // A ENLEVER   Serial.println("Enter AT commands:");
    // A ENLEVER   BT.begin(9600);
    }
    ou éventuellement vous déclarez Serial sous le nom de BT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define BT Serial
     
    void setup(){
      BT.begin(9600);
    }
    vous ne pouvez bien sûr plus utiliser la console série pour le debug, tout ce qui est envoyé sur Serial arrive au module BT

  8. #8
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    si votre module BT est connecté sur le port série...
    vous ne pouvez bien sûr plus utiliser la console série pour le debug, tout ce qui est envoyé sur Serial arrive au module BT
    zut, ça veut dire que mes derniers circuits imprimés ne peuvent plus être utilisés pour du debug puisque j'ai des pistes en dur qui sont directement reliées à RX,TX... il va donc falloir que je débuggue mon programme avec mes anciens circuits imprimés qui permettent de relier le module Blutooth à n'importe quelle pin de la Nano. Car j'ai trop d'instructions de debug à base de Serial pour m'en passer...

    Les nouveaux PCB ce sera poubelle !

    Je viens de constater qu'il me reste juste 2 pins inutilisées sur la Nano, A1 et A2, donc je devrais pouvoir relier le module Blutooth à A1 et A2, en utilisant le code que tu m'as donné plus haut:

    ce qui donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <SoftwareSerial.h>
    *
    SoftwareSerial toto(A1, A2); // la pin A2 est le Rx (connectée au Tx du module) et la pin A3 le Tx (connectée au Rx du module)
    *
    void setup() {
      Serial.begin(115200);
      toto.begin(9600);
      ...
    La question qui me reste est: si mon module Bluetooth avait été renommé "toto" par une commande AT (il y a 1 an je l'avais renommé), est-ce que je dois remplacer "HC06" par "toto" dans le code? il me semble évident de répondre oui, n'est-ce pas ?

    et dans ma boucle de lecture, je dois utiliser "toto.read", par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(toto.available())
    {
    ...
    char c = toto.read();
    je demande confirmation car je me mélange les pinceaux entre là où je dois utiliser "Serial" et là où je dois utiliser "toto": il me semble que Serial est relatif au Moniteur Série et "toto" au module Bluetooth (?)

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    le nom du module c'est juste pour ce qu'on voit quand essaye de découvrir les points d'accès bluetooth, c'est une sorte de nom publicitaire, ça n'a rien à voir avec le code et le nom de la variable que vous allez utiliser pour envoyer des commandes sur le port série

    attention le commentaire est faux par rapport aux pins choisies
    // la pin A2 est le Rx (connectée au Tx du module) et la pin A3 le Tx (connectée au Rx du module)

  10. #10
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    Bon, j'ai changé le code pour celui de cette page: http://www.martyncurrey.com/arduino-and-hc-06-zs-040/, simplifié le câblage sur la plaque d'essai (toujours possible de faire une erreur là...)

    et je suis finalement arrivé à établir une connexion et à avoir les réponses suivantes:

    AT---> "OK"
    AT+VERSION---> "HC-06-20190901"

    YOUPI, et merci JayM pour ta patience!

    le nom du module c'est juste pour ce qu'on voit quand essaye de découvrir les points d'accès bluetooth, c'est une sorte de nom publicitaire, ça n'a rien à voir avec le code et le nom de la variable que vous allez utiliser pour envoyer des commandes sur le port série
    ça je l'ai compris entre-temps, vu que ça fait un après-midi que je perds la dessus ! Merci JayM !

    Maintenant que ça fonctionne avec une carte Uno dédiée à ce test, il va falloir que je réintègre le code dans mon système avec plusieurs cartes connectées, pilotées par une Nano.

    Sur cette Nano, il ne me reste que [A1 et A2] pour relier [RX et TX] du module (j'ai aussi A6 et A7 mais elles sont purement analogiques sur une Nano je crois): je suppose que c'est possible d'utiliser A1 et A2 ?

    Le code faisant 35 pages, je ne vais poster que les parties concernant la réception Bluetooth...
    Voici ce qui s trouve avant le void setup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // ==============================================================
    // DEBUT DES DECLARATIONS POUR RECEPTION DES COMMANDES BLUETOOTH
     
    	#include <SoftwareSerial.h> // utilisé par le code open classroom pour recevoir les commandes Bluetooth
     
    	// SoftwareSerial HC06(18, 19); mis en commentaire pour utiliser les pins RX et TX classiques de la MEGA 2562
    	SoftwareSerial BTserial(A1,A2); // connecter TX du module directement à A1 de la Nano (la A1 de la Nano=RX)
    									// connecter RX du module à A2 de la Nano (A2=TX) via le Pont diviseur de tension
     
    	String messageRecu; // contiendra la commande BLUETOOTH reçue complète terminée par 'Z' majuscule tel que définit dans mon appli APPINVENTOR.
     
    // FIN DES DECLARATIONS POUR RECEPTION DES COMMANDES BLUETOOTH       
    // ===========================================================
    Ensuite voici ce qui se trouve dans le void setup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void setup() 
    {
     
    	Serial.begin(115200);	// Démarre le Moniteur Série pour voir les résultats sur PC
    							// on passe la vitesse à 115.200 car ça a été validé avec "Test_HC08_v120.ino"
     
    	// Sur la NANO le HC-08 sera connecté à A1 et A2, il n'y a qu'un seul Serial donc enlever Serial3 utilisé dans la 
    	// Mega.
    	// Ultérieurement on verra s'il faut augmenter la vitesse du BT à 115.200bauds, pour les fonctions futures par ex.
    	BTserial.begin(9600);	// vitesse du module Bluetooth
    							// Le nom donné au module est un nom commercial sans rapport avec le programme
    	IrReceiver.enableIRIn(); // Starts the IR receiver
    	IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); // c'est l'instruction de remplacement donné par le Wiki Youtube
    													 // pour la librairy IRremote version 3.3.0
      // On définit les pins MOTOR de la MEGA en Output--> Rouvrir un pgm de la Nano pour voir la syntaxe
    et voici la partie qui se trouve dans void loop et qui est sensée lire ce que reçoit le module Bluetooth (ignorez les quelques références à la Mega qui peuvent encore se trouver dans les commentaires):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    void loop()
    {
     
     
       // while(HC06.available()) // Je le laisse ne commentaire pour la NANO mais je ne sais pas s'il faut le réactiver ??
    							// à supprimer selon moi car remplacé par le "Serial.available" ci-dessous.
    	while(BTserial.available()) // ici on met Serial et pas Serial3, car on est sur NANO
    	{
    		  delay(3);
    		  char c = BTserial.read();  // ici aussi on met Serial3.read (non Serial.read) car on a connecté le HC08 à Serial3
    		  messageRecu += c;
    		  if(c == 'Z') // si le caractère reçu est 'Z' cela signifie que la commande est complète (j'utilise 'Z' car je n'arrive pas à détecter '\n')
    		  {
    			  // Serial.println(messageRecu); // en commentaire imprime donc la commande reçue du Smartphone qui est entière, par ex.: STOPZ
    			  break; // et on sort de la boucle While puisque la commande est complète et donc prête à être interprétée pour declencher des actions
    		  }
    	}
    Est-ce que ça vous semble correct ?

    Mille mercis pour votre patience !

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    Difficile de dire avec does snippets…

    L’écoute du port série n’est pas robuste car vous risquez de vider le buffer avant la réception du Z et donc sortit du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while(BTserial.available()
    On ne met pas de délais quand on écoute le port série, on lit quand les données arrivent de manière asynchrone

  12. #12
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir grizzli06

    Côté smartphone, quel application utilises tu?

    Une méthode pour lire le port Bluetooth:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(BTserial.available())  // attente d'une entrée sur Serial Bluetooth
          {
    	  messageRecu = BTserial.readStringUntil('\n');
    	  messageRecu.trim();
    	  Serial.print(messageRecu);
    	  if (messageRecu == "Z")
              {
    Si tu n'a pas de terminaison, tu peux utiliser BTserial.readString(), à condition de mettre un timout au port série , BTserial.setTimeout(100);

    J'utilise ces 2 méthodes, sans problème.

    Cordialement
    jpbbricole

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Une méthode pour lire le port Bluetooth:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(Serial.available());  // attente d'une entrée sur Serial
          {
    A quelques détails près

  14. #14
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    A quelques détails près
    if(Serial.available()); // attente d'une entrée sur Serial
    {
    @Jay M:
    Bon là vous m'avez "confusionné" à nouveau !
    Puisque je déclare:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SoftwareSerial BTserial(A1,A2);
    il me semble logique d'utiliser "BTserial" dans l'instruction "while(BTserial.available()) {", un peu comme écrit par jppbricole ---> pourquoi indiques-tu "if(Serial.available()); {" ???

    Si tu utilises "Serial.available()" au lieu d'un "BTserial.available()", cela ne correspond plus à la définition qui a été faite au début , à savoir: "SoftwareSerial BTserial(A1,A2);" .Sauf si je loupe quelque chose bien sûr....

    Donc là je ne comprends plus rien à ce que je dois mettre dans mon code !

    L’écoute du port série n’est pas robuste car vous risquez de vider le buffer avant la réception du Z et donc sortit du
    c'est bien possible bien que je n'ai jamais eu de problème lorsque je l'utilisais, et je veux bien le rendre plus robuste en suivant tes conseils, mais d'abord il faut que j'arrive à lire quelques caractères pour m'assurer que "ça fonctionne à peu près": je m'y colle demain car je viens juste de rentrer.

    Ensuite j'essaierai d'implémenter ton code que je ne maîtrise pas à 1ère vue...

    @jppbricole:
    Côté smartphone, quel application utilises tu?
    J'utilise une appli que j'ai développée moi-même en utilisant AppInventor, et le fait qu'elle soit simpliste explique peut-être le fait que je n'ai pas vu de problèmes ressemblant à un 'vidage de buffer' (mais comme dit plus haut j'implanterai votre méthode plus robuste de lecture dès que je recevrai quelques caractères sur la Nano).

    L'application Smartphone est super simple:
    1-Connexion au récepteur Bluetooth: ça fonctionne parfaitement, et la LED du récepteur devient fixe une fois que l'appli est connectée.
    2-L'écran présente des boutons et quand on appuie sur un bouton, elle envoie au récepteur Bluetooth un court libellé terminé par le caractère 'Z': c'est ainsi que je lis le libellé envoyé.
    Les libellés les plus courts font 2 caractères (sans le 'Z') et le libellé le plus long fait 12 caractères sans le 'Z'.
    Et à partir de ce libellé reçu, je fais des "if" et je déclenche les actions correspondantes.
    C'est basique mais c'est exactement ce qu'il me faut.

    Lorsque la réception Bluetooth communiquait bien avec la Nano, je n'avais aucun pb.

  15. #15
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir grizzli06
    Citation Envoyé par grizzli06 Voir le message
    pourquoi indiques-tu "if(Serial.available()); {" ???
    C'est moi le responsable, avec if(Serial.available(), @Jay M citai un partie de mon article où j'avais fait cette erreur, corrigée depuis, navré. En effet, dans mon exemple, tout ce qui s'adresse à la communication Bluetooth, s'adresse à BTserial.

    Citation Envoyé par grizzli06 Voir le message
    J'utilise une appli que j'ai développée moi-même en utilisant AppInventor
    J'utilise aussi AppInventor.
    Tu as mis "Z" comme terminaison, c'est plus courant de mettre \n à la fin des commandes que tu envoies. Dans AppInventor, mets, à la place de Z, \n.
    Ainsi tu lis le port série :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    messageRecu = BTserial.readStringUntil('\n');
    Si tu le désires, je peux te faire un exemple complet de comment je "travaille" avec AppInventor. Eventuellement, donnes moi la liste des commandes venant de AppInventor.

    Cordialement
    jpbbricole

  16. #16
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    C'est moi le responsable, avec if(Serial.available(), @Jay M citai un partie de mon article où j'avais fait cette erreur, corrigée depuis, navré. En effet, dans mon exemple, tout ce qui s'adresse à la communication Bluetooth, s'adresse à BTserial.
    il y a toujours un problème:

    vous avez un if à la place d'un while (qui semble être ce que vous voulez faire vu le point virgule qui suit et le commentaire). Les accolades suivantes ne sont pas nécessaire. Donc je suppose que c'est plus cela que vous vouliez écire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      while (BTserial.available()) yield();  // attente d'une entrée sur Serial Bluetooth
      messageRecu = BTserial.readStringUntil('Z');  // ou \n qui est plus commun comme le dit @jpbricole
      messageRecu.trim();
      Serial.print(messageRecu);
      ...
    j'ai rajouté yield(); qui ne fait rien de particulier sur un UNO ou MEGA par défaut mais qui peut être utile si le watchdog est activé (ce qui est le cas sur certaines cartes comme les ESP) car l'attente peut être longue. Le yield() redonne temporairement la main au "système" ce qui lui permet de remettre à zéro le timer du watchdog et éviter un reboot intempestif.



    --------------------

    Bon là vous m'avez "confusionné" à nouveau !
    Puisque je déclare:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SoftwareSerial BTserial(A1,A2);
    il me semble logique d'utiliser "BTserial" dans l'instruction "while(BTserial.available()) {", un peu comme écrit par jppbricole ---> pourquoi indiques-tu "if(Serial.available()); {" ???
    Oui. quand je disais d'utiliser Serial, c'est si vous connectiez votre module BT sur les pins 0 et 1. Dans ce cas, comme on en a parlé, vous ne pouvez plus utiliser de debug, il faut débrancher le module lors du chargement du code et tout ce que vous envoyez ensuite sur Serial arrive au module et tout ce que le module répond / envoie arrive aussi sur Serial

  17. #17
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Jay M
    Citation Envoyé par Jay M Voir le message
    il y a toujours un problème:
    Oui, c'est le résultat quand on réponds dans la précipitation, sincèrement navré.
    Je mettrai un exemple complet et testé.

    Cordialement
    jpbbricole

  18. #18
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    Merci beaucoup à vous tous sur vos conseils pour recevoir de façon robuste et propre une chaîne Bluetooth: je vais implanter ceci dès que j'aurai résolu mon problème de réception Bluetooth...sur lequel je galère depuis 3 jours alors que je le faisais marcher sans problème !...

    Le diagnostic a un peu avancé:

    1-.Pour l'instant mon système complet (Carte Nano+cartes filles+récepteur BLE 4.0 HC08 dont le nom commercial est aussi HC08) ne reçoit strictement au niveau de la carte Nano: j'ai essayé d'utiliser mon application Smartphone perso et la Nano ne reçoit rien (puisqu'elle devrait m'afficher chaque commande reçue sur le moniteur série à des fins de débug).

    J'ai revérifié le câblage, et ça m'a l'air bon: TX du module relié à A2 de la Nano, et RX du module relié à A1 de la Nano.

    J'ai pensé à un bug de mon application Smartphone, donc j'ai juste utilisé une appli basique sur mon Smartphone "Serial Bluetooth Terminal", et c'est pareil: il se connecte bien (comme avec mon appli d'ailleurs) puisque la LED devient fixe, mais la Nano n'envoie aucun message au Moniteur Série alors qu'elle devrait (car j'ai mis des messages dans chaque fonction appelée pour voir où le programme passe)

    2-.J'ai un autre module, HC06 celui-ci (donc pas BLE), que j'ai relié à une carte UNO selon le montage montré ici: http://www.martyncurrey.com/arduino-and-hc-06-zs-040/
    et j'ai chargé le code sketch de cette page dans la UNO.
    L'appli basique "Serial Bluetooth Terminal" se connecte bien à ce HC06 (dont le nom commercial est différent), la LED devient fixe aussi, et cette fois toute chaîne ASCII envoyée depuis le Smartphone est bien affichée sur la Moniteur Série.
    Donc la UNO reçoit bien les infos en provenance du module HC06.

    Je vais donc implanter ce module HC06 dans mon système complet et voir ce que ça donne: je ne peux pas juste les intervertir car mon module BLE est soudé dans mon système: puisque ça marchait il y a un an....

    C'est peut-être le récepteur BLE qui est HS ?? ou bien il y a peut-être des particularités avec les modules BLE qui n'existent pas avec les modules HC06 ???

    En attendant vos lumières, je vais dessouder le module HC08 BLE de mon système, y mettre un socket pour l'interchanger facilement, et voir avec le HC06 ce que ça donne.

  19. #19
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    Bon les choses se précisent grandement après l'interchange des modules HC06 et HC08 (mais je ne m'explique pas pourquoi ça marchait il y a 1 an...).

    1-.Je viens de mettre le module HC06 dans mon système complet, et celui-ci n'est plus détecté par mon application qui détectait parfaitement le HC08...

    Donc je pense que la méthode de détection des HC06 par AppInventor doit différer de celle des HC08

    @jppbricole:
    Comme tu utilises aussi AppInventor, je vais poster plus loin mon code AppInventor et tu me diras si tu fais la détection comme moi ou pas

    2-.L'application "Serial Bluetooth Terminal" détecte parfaitement le HC06 dans mon système, tout en faisant la distinction entre Bluetooth "normaux" et BLE (càd HC08): il y a 2 écrans de détection différents me laissant penser que la méthode de détection par l'appli Smartphone diffère.
    D'ailleurs le HC06 est détecté et apparait dans la page de détection des devices Bluetooth normaux et n'apparait pas dans la page de détection des devices BLE.

    D'autre part, une fois ce HC06 détecté, "Serial Bluetooth Terminal" s'y connecte parfaitement.

    Et ce qui est super , c'est quand j'envoie par "Serial Bluetooth Terminal" les mêmes commandes que mon appli smartphone est supposée envoyer, ma Nano les affiche bien sur le Moniteur Série et déclenche les actions correspondantes.

    En conclusion, il y a je pense le problème suivant:

    Mon appli Smartphone a un problème pour détecter (et donc se connecter) au HC06 classique alors qu'elle se connectait au HC08 parfaitement (mais les commandes n'étaient pas reçues par le HC08).

    Ca n'explique pas pourquoi le HC-08 connecté à la UNO avec le programme basique, reçoit bien les ordres venant de Serial Bluetooth Terminal, alors qu'il ne semblait rien recevoir de mon appli Smartphone qui s'y connectait.

    Mais comme la priorité est de faire fonctionner le HC06, réglons d'abord le problème de connexion AppInventor au HC06 !

    Je vous poste ci-dessous un extrait de mon appli Smartphone pour cerner le problème:

  20. #20
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 228
    Par défaut
    Comme promis plus haut, voici le code AppInventor.

    Vous constaterez (comme je viens de le faire) que le bloc de détection s'appelle "BluetoothLE1", ce qui est logique puisque mon appli devait fonctionner avec du HC-08 BLE (pour être compatible à la fois Android et iOS).

    Mais vu la galère sans fin, faisons la fonctionner avec du HC06 classique, ce sera déjà bien !

    @jppbricole: tes lumières sont les bienvenues ! et celles des autres aussi d'ailleurs

    AppInventor début:
    Nom : AppInv_01.JPG
Affichages : 495
Taille : 82,4 Ko

    AppInventor suite:
    Nom : AppInv_02.JPG
Affichages : 502
Taille : 80,5 Ko

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Bluetooth sur acer 9303 wsmi
    Par sou123 dans le forum Hardware
    Réponses: 3
    Dernier message: 27/02/2008, 14h03
  2. Réponses: 1
    Dernier message: 08/01/2008, 09h23
  3. installer jeux java via bluetooth sur samsung
    Par bil_home dans le forum Java ME
    Réponses: 7
    Dernier message: 26/02/2007, 14h55
  4. [vb6] Evénement de réception/envoi sur port COM
    Par Original Prankster dans le forum VB 6 et antérieur
    Réponses: 31
    Dernier message: 13/12/2006, 00h05
  5. Comment utiliser un connecteur bluetooth sur pc!
    Par keishah dans le forum Composants
    Réponses: 2
    Dernier message: 23/09/2006, 10h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo