Bluetooth HC-05: un tuto qui marche

Bonjour à tous,

J'essaie depuis trois jours de faire fonctionner un HC-05.
J'ai trouvé un tuto facile qui allume et éteint une led. C'est celui-ci
En voici le code

#include<SoftwareSerial.h>

#define TxD 3
#define RxD 2
#define LED_PIN 13

SoftwareSerial bluetoothSerial(TxD, RxD);

char c;

void setup() {
  bluetoothSerial.begin(9600);
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  Serial.println("Prêt");
  }

void loop() {
  if(bluetoothSerial.available()){
    c = bluetoothSerial.read();
    Serial.println(c);
    if(c=='1'){
      digitalWrite(LED_PIN, HIGH);          
    }
    if(c=='0'){
      digitalWrite(LED_PIN, LOW);
    }
  }
}

Avantages:
-Fonctionne, c'est bien le seul.
-Emploie la bibliothèque pour mettre Rx et Tx sur les pins au choix
Inconvénients:
-Ne peut lire qu'un char à la fois
-ne peut pas lire et utiliser un INT par exemple pour, disons, orienter un servomoteur

Il existe un autre tuto qui, lui, reçoit les CHAR, les stocke, les réassemble pour, après des calculs savants, construire un INT utilisable, enfin, selon lui...
Par ici le tuto
Voici le code:

// Example 3 - Receive with start- and end-markers

const byte numChars = 32;
char receivedChars[numChars];

boolean newData = false;

void setup() {
    Serial.begin(9600);
    Serial.println("<Arduino is ready>");
}

void loop() {
    recvWithStartEndMarkers();
    showNewData();
}

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char rc;
 
    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}

void showNewData() {
    if (newData == true) {
        Serial.print("This just in ... ");
        Serial.println(receivedChars);
        newData = false;
    }
}

Avantages:
-ça occupe une bonne heure à lire
Inconvénients:
-le code ne fonctionne pas
-pas de bibliothèque, pas de plan de montage (pour ça que ça marche pas)

J'aimerais que ceux qui sont intéressés à contribuer à ce tuto pour ENFIN avoir un truc qui marche pour les noobs dans mon genre le fassent de manière à ce que:
-je comprenne de quoi vous parlez
-vous répondiez à peu près dans l'ordre
-on ne se prenne pas la tête, on va y arriver. Enfin j'espère

Je construirai un code au fur et à mesure de mes avancées. Je ne demande pas que vous pondiez un code, mais que JE puisse comprendre ces deux codes pour les fusionner.
Je vais procéder par tâtonnements. Comme un gros noob que je suis.
Je m'efforcerai moi-même d'être organisé, de pas m'énerver, et de poser des questions claires et précises.

Attention, C'EST PARTI

1-résistances

Normalement, Tx est protégé par une résistance.
En fait, personne ou presque ne le fait. Pour avoir essayé sur breadboard, ça a compliqué le montage et ça ne marchait pas du tout. Je les ai virées, ça marche.
Le module ne chauffe pas.
A mon avis, c'est loin d'être utile, même si la datasheet les mentionne.
Pas de résistances: On se met d'accord là-dessus?

2-Il est vital de créer Tx et Rx sur les pins 2 et 3. Sinon, c'est le foutoir, il faut débrancher le module BT chaque fois qu'on téléverse. Ainsi, on conserve pins 0 et 1 pour le PC, et 2 et 3 pour le BT.
Ce tuto s'adressant à des débutants, je pense VRAIMENT que c'est mieux comme ça.
pour moi, le tuto numéro 2 NE PEUT pas fonctionner avec mes compétences, impossible de savoir qui communique avec qui.
On adopte ce principe des Tx et Rx du HC05 comme ceci?
TxBT = D3 arduino
RxBT = D2 arduino

Je précise que je fais ce montage sur NANO.

al1fch:
un tuto un peu 'brute et bourrin'.

haha, ouais^^
En même temps, c'est ma signature ^^

Donc ok pour ça, j'essaie d'ajouter des résitances dans mon montage, enfin celui qui fonctionne.

Je sais que tu as raison. Cela dit, même si ça peut paraître exagéré, le montage avec deux résistances dont une à la masse est vraiment difficile à comprendre pour un débutant. Sisi, je t'assure. On se trompe vite.
Apparemment, l'usage d'une seule est plus simple, mais ya sûrement une bonne raison d'en mettre deux.
Je m'y mets de suite.

Content que ça t'intéresse 8D

Alors, en fait je viens de comprendre pourquoi personne ne met de résistance, c'est simple:
On met 1k entre le pin 2 de l'arduino (Tx) et le pin RXD du HC-05.
Or, ces pins ne sont pas utilisés dans l'exemple de la led. On peut débrancher ces pins sans problème, ils ne servent pas. Je propose donc, dans un premier temps un montage simplifié faisant abstraction de ces pins.
le but dans un premier temps c'est d'envoyer un INT à arduino avec un smartphone.

Si on veut aller plus loin, ça va être sacrément difficile parce qu'il faudra coder sur android.

On se retrouve avec un montage super simple, qui fait le taf, simplement. Arduino RECOIT mais n'EMET PAS.

C'est faignant, mais on peut ainsi faire ce que nous voulons faire avec.... UN SEUL PIN !!!!!!

j'appelle ça de l'optimisation hihihihihi

On se met d'accord là-dessus?
Si oui, je poste un schéma de montage pour qu'on ait tous le même en tête, ou à la maison.

Mais où est donc passée la réponse d'al1fch ? ??? --> EDIT : elle est revenue :slight_smile:

Bon, n'y connaissant rien, je peux me permettre de donner mon avis... Je pense qu'il faut conserver les pins branchées, si elles sont là c'est pour quelque chose. Ce n'est pas parce que le code Arduino n'envoie pas de données vers le téléphone (par exemple) que le module BT n'émet rien. Les protocoles de communication sont peut-être plus complexes qu'un truc du genre "je dis rien tant que personne ne me demande de l'ouvrir"... Il doit y avoir des acknowledgment ou autres subtilités de protocole qui font que le module émet, ne serait-ce que pour signaler qu'il est appairé.

Moi, je n'ai fait qu'une seule mise en oeuvre de ce module, pour communiquer (émission et réception) avec un téléphone portable. Ça se passait comme ça :

#include <SoftwareSerial.h>
SoftwareSerial BTserial(2, 3); // RX | TX
// Paramètres BT
byte receivedNumber = 0;
char command;

Dans la loop: si quelque chose arrive, appel d'une fonction de traitement

 while (BTserial.available () > 0)  processIncomingByte (BTserial.read ());

La fonction :

void processIncomingByte (const byte inByte)
{
  switch (inByte)
  {
    case '*':   // endmarker
      process_data ();
      receivedNumber = 0;
      break;

    case '0' ... '9':
      receivedNumber *= 10;
      receivedNumber += inByte - '0';
      break;

    default:
      command = inByte;
      receivedNumber = 0;
      break;
  }
}

Mon protocole de communication était que le téléphone envoie une lettre pour indiquer le contenu (par exemple : U pour envoyer une couleur, O pour dire qu'un truc est 'ON') et si nécessaire une donnée en byte (le numéro de la couleur par exemple), et un caractère de fin de message '*'.

  • Si on reçoit un chiffre '0' à '9', on calcule la valeur associée
  • Si on reçoit une lettre, on la stocke dans la variable 'command' pour exécution plus tard
  • Si on reçoit l'étoile, on lance l'exécution de la commande (process_data ():wink:

Et le traitement était un switch / case.

Ça fonctionne super bien ! Les codes sont disponibles ici.

Bah oui Oo
Je l'ai supprimée tu crois?

ca va lesept? le voyage s'est bien passé?

Bonjour kammo

J'ai supprime et remplacé ma réponse initiale !!

Bonne idée de faire un tuto !!
Bonne idée aussi de le faire 'en direct' !!

Dans toute démarche empirique il y a les dangers liés à la généralisation à partir d'un HC05 pris au hasard dans l'ensemble des HC05 produits.
Certains ont la peau plus dure que les autres... ce que l'un supporte, tous ne le supportent pas.

Le fabricant de la puce Bluetooth qui reçoit Tx indique dans sa Datasheet les caractéristiques garanties pour tous les individus produits. Mieux vaut en tenir compte si on veut faire un tuto qui marche pour tous les HC05 et pas seulement pour certains d'entre eux

Généraliser sur un cas unique .... bof.......(la roulette russe est sans danger pour celui qui s'en sort)

A mon avis, c'est loin d'être utile, même si la datasheet les mentionne.
Pas de résistances: On se met d'accord là-dessus?

Pas d'accord vu ce qui précède

ou alors annonces la couleur : "tuto HC05 'roulette russe' qui marche sur mon HC05 !!"

kammo:
ca va lesept? le voyage s'est bien passé?

Oui, juste un petit voyage à Toulouse. Tu as changé d'avatar, j'aimais bien le précédent...

Certains HC05 possèdent déjà le 'level shifting' pour réaliser l'adaptation de niveau (5V/3V)
Si un HC05 est dans ce cas il n'est pas utile de refaire une seconde fois l'opération à l'extérieur !!
level shifting.jpg

Ouais, mais j'avais envie de montrer mon petit robot inutile ^^

Bon alors si je vous écoute:
on branche tous les pins, et avec des résistances.
Je veux bien, c'est le montage standard, sauf que, vu qu'on n'utilise pas un pin, on ne saura pas s'il y a une différence 'avec/sans' résistance.
Ca revient à faire un tuto pour utiliser un accéléromètre sans le gyroscope, ou utiliser un LCD en 4bits au lieu de 8... Ou faire un cassoulet sans porc... nan je déconne pour le cassoulet...

Mon point de vue (n'oubliez pas qu'en nooberie je suis le plus qualifié):

en premier: un montage et code très simples pour allumer une led, je copie le tuto existant

ensuite: un montage+code pour recevoir un INT (franchement pas gagné)

et enfin, un jour...: un tuto pour répondre au smartphone. franchement j'y crois pas.
ou: un tuto pour faire discuter deux arduino avec chacun un HC05, et là on justifie de tout bien brancher.

Je joins une photo du mien.

C'est impossible pour un novice de faire la distinction. Par contre, dès qu'on arrive au moment du tuto où l'on envoie des données, on pourra probablement, avec un multimètre, mesurer ce qui sort du HC05, et donc, savoir si OUI ou NON il faut mettre des résistances.

ca permet d'écarter une zone d'ombre (ne pas faire comme les autres juste parce qu'ils font ça ou qu'on me l'a dit) et d'amener la question en même temps qu'on crée un montage un peu plus complexe.
Ca fait monter lentement la complexité, et c'est pas un mal.

Ce n'est pas par flemme ni par opposition, mais je pense que, si on n'a pas besoin d'une fonction, il n'est pas utile de l'intégrer. Du moins, pas pour allumer une pauvre led.

Quand deux robots taperont la discussion en BT, là, on pourra justifier de se servir de tout, et de tout faire comme il faut. On branchera le pin en question, avec ou sans résistance après un test au voltmètre.

Pour répondre au smartphone, je faisais simplement :

BTserial.write("*DDrapeau Irlandais\n*");

ou pour transmettre une donnée :

BTserial.print("*DHeures : " + String(heures) + "\n*");

Le "*D" était le code pour dire au téléphone d'afficher le message sur la console et l'étoile à la fin signalait la fin du message.

Données multiples : j'envoyais une couleur en RGB, pour que le téléphone affiche sur mon IHM un rond de cette couleur. C'était fait comme ceci :
BTserial.print("*LR" + String(r) + "G" + String(g) + "B" + String(b) + "*");Le code "*L" était pour indiquer qu'il fallait lire les trois couleurs qui suivent et afficher le rond coloré en fin de message.

Je précise que je n'ai pas codé sur le téléphone mais que j'ai utilisé un soft GENIAL gratuit : Bluetooth Electronics de KeuwlSoft, qui permet de faire cette IHM assez puissante en deux temps trois mouvements (ou presque).

mesurer ce qui sort du HC05, et donc, savoir si OUI ou NON il faut mettre des résistances.

je ne parle pour l'instant que de ce qui entre sur le Rx du HC05
Il faut éviter d'envoyer 5V sur le Rx du HC05 si l'on est pas certain qu'il est équipé pour encaisser plus que 3,3V
le Tx de la carte Nano étant tantôt à 5 volts tantôt à 0 volts on le 'bride' avant qu'il arrive au HC05.....

Il est évident que si dans un montage très particulier il n'y avait pas à transmettre du Tx Nano vers le Rx HC05, le 'bridage' n'a plus de justification.

pour les autres résistances je ne sais pas , je n'ai pas tout suivi

Moi aussi je cherche toujours à faire des montages minimalistes, je comprends ton point de vue... mais 'il faut ce qu'i faut la où il faut' et ça, seules les notices de composants l'indiquent....pas les 'ont dit' (avec ou sans vidéo)

Justement, après avoir lancé la baballe à Fifi mon chien, j'ai eu une idée. ca m'arrive.

J'ai repris mon phone, et j'ai "oublié" le HC05, et l'ai réapprairé, mais en virant le fil inutile:
Il est bien inutile, même pour appairer!!!

Donc, dans un premier exemple, où arduino ne fait que recevoir des données, il n'est pas nécessaire de faire tous les branchements. Aussi, EN n'est pas connecté non plus!

L'idée de n'employer qu'un pin pour recevoir des données me fait rêver. C'est la panacée du débutant.
Dans un exemple plus complexe, comme celui de lesept, là, c'est nécessaire de tout connecter.

J'ai un montage SIMPLISSIME qui marche. J'ai un code qui marche. Je peux allumer une led en envoyant 1 et l'éteindre en envoyant 0. Cet exemple est très parlant et encourageant à mon niveau. Je pense sincèrement que c'est une très bonne base pour démarrer.

Dans cet exemple, il s'agit d'un char.
La grande question est de savoir comment adapter le second code pour 'décoder' les char, les stocker dans un tableau, et en construire un INT.

C'est ce qu'il dit faire dans son code, sauf que je ne vois pas comment il se débrouille, puisque son port COM est pris par le cable USB, et que, du fait, IL NE PEUT PAS communiquer avec son module HC05 puisqu'il n'utilise pas de bibliothèque pour créer un second port série.

Du coup, je vais étudier le code proposé par lesept qui, l'air de rien, est sans doute une excellente base pour le projet final qui consiste à communiquer dans les deux sens.

exemple1 : envoyer 1 ou 0 pour allumer et éteindre une led, youpi
exemple2 : envoyer un INT ou un BYTE pour commander un servo (j'adore les servos)
exemple3 : faire communiquer deux machines dans les deux sens, en mêlant INT, CHAR, BYTE...

Est-ce que a vous semble correct et complet?
Sachant qu'à ce jour, je ne suis capable de coder que le premier exemple.

J'ai fait un montage sur fritzing mais je ne trouve pas ça aussi clair qu'espéré.
Le mieux, c'est de filmer le montage sur planche à pain, tout doucement.
je ferai un schéma sous open Draw.
J'ai ajouté une led témoin sur STATE, on voit bien quand c'est apairé

Voici le code

// EXEMPLE 1
// Allumer/éteindre une led par Bluetooth sur Android


#include<SoftwareSerial.h> // Appelle la bibliothèque pour créer un port série

#define TxD 2 // HC05 Txd -> Arduino D2
#define RxD 3 // On le déclare mais on ne le connecte pas pour cet exemple
#define LedPin 13 // Patte longue sur D13, patte courte sur Grnd

SoftwareSerial bluetoothSerial(TxD, RxD); // On déclare notre nouveau port série

char c; // C'est la variable qui stocke le message reçu

void setup() {
  bluetoothSerial.begin(9600); // On démarre notre nouveau port série
  Serial.begin(9600); // On démarre le port série USB
  pinMode(LedPin, OUTPUT); // Ce pin est une sortie
  Serial.println("Prêt"); // On affiche un message sur le moniteur
  }

void loop() {
  if(bluetoothSerial.available()){ // Si port série Bluetooth actif
    c = bluetoothSerial.read(); // Alors on stocke ce qu'il reçoit dans c
    Serial.println(c); // On imprime c sur le moniteur
    if(c=='1'){ // Si c est le caractère '1'
      digitalWrite(LedPin, HIGH); // On allume la led     
    }
    if(c=='0'){ // Si c est le caractère '0'
      digitalWrite(LedPin, LOW); // On éteint la led
    }
  }
}

Ya un truc qui a fait pshiit et qui a fumé, la vache, ça pue! Ca me file mal au crâne ^^
je pense que c'est la bread board...

Si l'organisation du code ou les commentaires ne sont pas précis, ou erronés, merci de le détailler, je ferai les modifs

C'est vrai, je sens l'odeur jusqu'ici ! Ça doit être un court-jus : bienvenue au club !
En moto, on dit que tu n'es pas un vrai motard si tu n'es pas tombé. En électronique c'est pareil, tu n'es pas un vrai si tu n'as rien cramé !!!

Sympa pour les débutants..

mais j'aime pas ça :

#define LedPin 13 // Patte longue sur D13, patte courte sur Grnd

il manque une résistance pour limiter le courant dans la led..

Leptro:
Sympa pour les débutants..

mais j'aime pas ça :

#define LedPin 13 // Patte longue sur D13, patte courte sur Grnd

il manque une résistance pour limiter le courant dans la led..

Merci :slight_smile:
Oui, mais ça je pense le présenter en faisant le montage. A préciser c'est vrai. Faut pas oublier.

Bonjour,

Regarder ce tuto.

http://www.martyncurrey.com/connecting-2-arduinos-by-bluetooth-using-a-hc-05-and-a-hc-06-easy-method-using-cmode/

je m'en suis inspiré dans un projet pour transmettre des données issues d'une carte nano vers un PC dans le but de tracer des courbes d'intensité, tension, température etc....

Serge .D

kammo:
Ya un truc qui a fait pshiit et qui a fumé, la vache, ça pue! Ca me file mal au crâne ^^
je pense que c'est la bread board...

[HUM]
ET ... finalement c'est "koikacui" ? :wink: