Parasites sur Bluetooth?

Bonjour,
J'ai réalisé une voiture robot à 2 moteurs.
Dans un premier temps je la pilotais en "tout ou rien" depuis une appli (APP Inventor 2) et tout allait bien.
J'ai fait deux modifications:
1- j'ai mis des accus 12V pour les moteurs (ils tiraient trop sur l'alim commune 9V)
2-j'ai modifié l'appli pour piloter la direction par "clic long" (donc plus progressive).
A vide (donc sans l'alim moteur) tout va bien, je vois passer les "ordres" par le Bluetooth (1 pour AV, 2 pour AR, 3 pour Droite, 4 pour Gauche, 5 pour Tout droit et 9 pour arrêt).
Dès que j'alimente les moteurs, tout semble, au départ, bien se passer puis, rapidement, je vois apparaitre des "ordres" anormaux (-1, 288, 9676, etc..) qui, globalement n'influent pas sur le fonctionnement (j'utilise un Switch() Case) mais finissent souvent par bloquer (je suppose) le Bluetooth.
Je pensais le Bluetooth insensible aux perturbations? Est-ce le cas?
Comment se fait-il que, dans ma première version (1 alim 9V pour moteurs et Arduino) cela ne posait pas de problème?

Cdlt
Jean-Michel

Bonsoir loco28

Je ne crois pas trop aux parasites sur Bluetooth.
Ton récepteur Bluetooth c'est un HC-05 ou 06?
Si oui, essaies de mettre un condensateur de quelques centaines de uF aux bornes de l'alimentation du module HC-

Mets ton fichier AIA (à zipper) ainsi que ton programme Arduino (entre les balises :wink:)

Cordialement
jpbbricole

Bonsoir,
Moi aussi je suis surpris à la fois par ces "possibles" parasites et par le fait, qu'avant, sur la même alim 9V, je n'avais pas ce problème.
Le module est un hc05. Dans tout ce que j'ai fait jusqu'ici je n'ai pas constaté de problème avec.

Le fichier APP:
Pilotage_Voiture_clic_long.zip (57.8 KB)

et le code:

#include <SoftwareSerial.h>
SoftwareSerial hc06(2,3);

#define ENA        10       
#define IN1        9      
#define IN2        8       
#define IN3        7       
#define IN4        6        
#define ENB        5
int ordre = 0;       
int SP1 = 0;
int SP2 = 0;
int DIR = 0;
int max = 100;
int sens;
int oldsens;
void setup(){
 	Serial.begin(9600);
 	hc06.begin(9600);
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENB, OUTPUT);   
}
void loop(){
 	while(hc06.available()>0){
 			ordre = hc06.read();
 	}
 	if(ordre!=""){
 			Serial.println(ordre);            
 	    delay(100);
 	}
  switch(ordre){
    case 9:       //STOP
    SP1 = 0;
    SP2 = 0;
    motor(SP1,SP2,DIR);
    break;
    case 1:       //MARCHE AVANT
    SP1 = max;
    SP2 = max;
    DIR = 1;   
    motor(SP1,SP2, DIR);
    break;
    case 2:       //MARCHE ARRIERE
    SP1 = -max;
    SP2 = -max;
    DIR = 0;     
    motor(SP1,SP2, DIR);
    break;
    case 3:       //TOURNE DROITE
    SP2 = SP2-10;
    if(DIR == 1){
    SP1 = max;}
    else{
    SP1 = -max;}  
    motor (SP1, SP2, DIR);
    break;
    case 4:       //TOURNE A GAUCHE
    SP1 = SP1-10;
    if(DIR == 1){
    SP2 = max;}
    else{
    SP2 = -max;}  
    motor (SP1, SP2, DIR);
    break;
    case 5:       //TOUT DROIT
    if(DIR == 1){
    SP1 = max;
    SP2 = max;}
    else{
    SP1 = -max;
    SP2 = -max;}  
    motor (SP1, SP2, DIR);
    break;    
  } 
   ordre = "";
}

void motor(int speed1, int speed2, int sens){
//Serial.print("sens =   ");
//Serial.println(sens);        
  if(sens != oldsens){      //ARRET AVANT CHANGEMENT DE SENS
    analogWrite (ENA, 0);
    analogWrite (ENB, 0);    
    delay(500); }
  if (sens == 1){           //MARCHE AVANT  
  digitalWrite(IN1, LOW);                 
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);                 
  digitalWrite(IN4, HIGH);
  analogWrite (ENA, speed1);
  analogWrite (ENB, speed2);
}
  else {                    //MARCHE ARRIERE          
    digitalWrite(IN1, HIGH);                 
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);                 
    digitalWrite(IN4, LOW);  
    analogWrite(ENA, abs(speed1));
    analogWrite(ENB, abs(speed2));           
  }
  
//Serial.print("Vitesse =");
//Serial.print(speed1);
//Serial.print("   ");
//Serial.println(speed2);
oldsens = sens;
}

Cdlt
Jean-Michel

Pourquoi ce delay(100)?
Cela ajoute de la latence et peut faire perdre des caractères si le débit est un peu élevé.

Bonjour,

J'ai supprimé ce delay de 100 et j'ai abaissé la tension des accus de 12 à 9V.
Cela ne change rien si ce n'est que en marche AV (ordre = 1) cela semble mieux fonctionner mais pas en marche AR.
J'ai ajouté, dans la boucle "while" une impression (available) qui me dit que je passe bien par cette boucle et donc que le module BT est OK et je continue à imprimer l'ordre reçu.
Ci-joint le relevé de ce que je récupère sur le moniteur série.
On voit que le début est OK (1 marche AV, 9 Stop) mais dès que je passe en marche AR (2), "ordre" prend des valeurs sans, à priori, être passé par le "hc06.read"!
En plus, je perds complètement la main: pour récupérer, je dois couper le 9V moteur, et déconnecter l'Arduino (le reset ne suffit pas car du coup le moniteur série perd la liaison ?!
Là, je suis perdu!
Anomalie Bluetooth.pdf (33.9 KB)

Jean-Michel

Bonsoir loco28

Sans qu'il n'y ait d'action de ta part (sur le smartphone)?

Est ce que tes moteurs sont déparasités?

Cordialement
jpbbricole

Dans ton while(hc06.available()>0){ tu peux très bien lire plusieurs caractères d'un seul coup.

Essaie de remplacer ça

par ça

 	while(hc06.available()>0){
 	      ordre = hc06.read();
 	      if(ordre!=""){
 		    Serial.print(ordre);  Serial.println("/");            
 	      }
 	}

Cela permet de voir si tu reçois plusieurs caractères en même temps

Bonjour,

J'ai fait la petite modification de programme.
Ci-dessous un exemple de ce que j'ai constaté sur le moniteur série:
ordre reçu = 1/
ordre reçu = 9/
ordre reçu = 1/
ordre reçu = 9/
ordre reçu = 1/
ordre reçu = 4/
ordre reçu = 4/
ordre reçu = 4/
ordre reçu = 5/
ordre reçu = 9/
ordre reçu = 2/
ordre reçu = -1/
ordre reçu = -1/
Tout c'est bien passé jusqu'à ce que j'envoi "2", marche AR.
Et, dans ce cas là, la transmission du signal s'est bloquée.
Par contre sur d'autres essais, après les "-1" j'ai pu envoyer d'autres commandes.
J'ai un cas où aucun "parasites" n'est arrivé.
Un autre ou j'ai reçu un "255" mais j'ai pu continuer.

Sans que je puisse expliquer le "pourquoi", j'ai constaté que cela marche bien quand je n'ai qu'une seule alim pour l'ARDUINO (qui alimente le Bluetooth) et les moteurs (c'était le cas pour ma première réalisation mais la faible capacité d'une pile 9V fait que j'ai ajouté un bloc d'accus à part pour les moteurs). Quand je dis une seule alim, c'est aussi en n'étant pas relié à l'ordi par l'USB.
Je vais creuser dans ce sens mais il faut que j'adapte les pièces mécaniques d'une part pour supporter les accus (et un régulateur DC/DC) et d'autre part pour avoir un accès facile pour mettre des condos antiparasites.

Cdlt
Jean-Michel

Bonjour loco28

Dans ce cas, comment est alimenté l'Arduino et le HC-06.
Comment sont commandés les moteurs.
Quand tu as plusieurs alimentations, est ce que les GND sont bien connectés ensemble?

Cordialement
jpbbricole

Bonsoir,

Je pars d'un bloc d'accu 12V qui alimente les moteurs via une carte L298.
Avec le 12V, j'alimente aussi un convertisseur DC/DC que j'ai réglé à 7,5V et qui alimente l'ARDUINO via Vin.
L'ARDUINO fournit un 5V pour le Bluetooth et pour la carte L298.

Je viens de tout remettre au propre mais le problème subsiste.
Il faut que je trouve des condos (10micro pol et 0,1micro) pour mettre aux bornes des moteurs.

Le plus embêtant ce n'est pas les valeurs anormales que je reçois (le programme ARDUINO ne les traite pas) mais qu'à certains moments le Bluetooth se bloque et ne transmet plus rien.

Cdlt
Jean-Michel

Il ne transmet plus rien ou tu ne reçois plus rien?

Bonsoir,

Dans la mesure où je "lis" le Bluetooth et j'imprime immédiatement après, j'en déduis que plus rien n'arrive du Bluetooth d'autant plus que, dans ce cas, je ne vois pas la led Rx (entre R6 et R9) flasher.

Mais tout à l'heure, j'ai eu, sur le moniteur série, "ordre" puis plus rien.
Du coup je me demande si ce n'est pas plutôt ou aussi l'ARDUINO qui pose problème vis à vis des "parasites"

Pour corser le tout, je me suis remis dans la configuration initiale, c'est à dire, une seule pile 9V pour alimenter tout.
Et là, j'ai eu un fonctionnement correct, sauf que le moniteur série m'affichait le premier ordre, "ordre reçu = 1/", puis plus rien.

Cdlt
Jean-Michel

Il serait intéressant de voir si c'est la marche arrière qui est la cause du problème ou si c'est le changement de sens.
Actuellement tu fais : marche avant, tout droit, quelques virages, tout droit, marche arrière et là plantage.
Tu pourrais essayer de faire : marche arrière, tout droit, quelques virages, tout droit, marche avant
Et là:

  • si le plantage se produit dès le début, dans ce cas le problème c'est vraiment la marche arrière et la raison serait à éclaircir
  • si le plantage se produit à la fin, dans ce cas le problème c'est le changement de sens et il faudrait peut-être revoir la transition d'un sens de déplacement à l'autre. Peut-être ralentir, s'arrêter, repartir dans l'autre sens progressivement. actuellement tu arrêtes le moteur et tu fais une pause de 500ms, si le véhicule a un peu d'inertie il n'a peut-être pas le temps de réellement stopper auquel cas lorsque tu fais marche arrière à fond il doit y avoir un bel appel de courant.

Les 10µF sont inutiles. Les parasites sont des hautes fréquences. Si tu dois ajouter des gros condensateurs, c'est que ton alimentation ne fourni pas la puissance nécessaire.
Il vaut mieux partir sur quelque chose comme ça

OK, merci de l'info.
Je n'ai malheureusement aucun condo en stock d'où achat à faire.

Cdlt
Jean-Michel

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.