Projet bateau arduino/ESP8266 Bluetooth

Bonjour a tous!

J'ai un petit soucis que je n'arrive pas a résoudre et que je ne comprends pas.

J'ai développé un code a la base sur un Arduino uno branché sur un module bleutooth HC06 pour contrôler un bateau radio commandé en bleutooth et qui marche très bien à quelques finalisation en développement.

#include <Servo.h> //bibliotheque servo
Servo gouv;
//declaration des pins
#define pinmotav 16 // D0 pwm Pin moteur vitesse moteur avant
#define pinmotar 5 // D1 PWM Pin moteur vitesse moteur arriere
#define marcmot 4 // D2 marche moteur
#define ledpos 0 // D3 pin pour  feux
#define ledphare 2// D4 pin pour phare
#define mesure A0// A0 lecture ana batterie

//Varibles 
unsigned char serval=90;
unsigned char motval=0;
unsigned char motint=65;
char Ledphare = 0;
char Ledpos=0;
char BluetoothData;
bool Stop=0;
bool startstop=0;
bool startstop_1=0;
int lecture;
float tension;
int Gtension;
unsigned long milli;
unsigned long past_milli;
unsigned long tens_milli;
char test;

void setup() {
  // Initialise pins as outputs
  pinMode(pinmotar, OUTPUT);
  pinMode(pinmotav, OUTPUT);
  pinMode(ledpos, OUTPUT);
   pinMode(ledphare, OUTPUT);
  pinMode(marcmot,OUTPUT);
  pinMode(mesure,INPUT);
  gouv.attach(14); // D5 on déclare le servo sur la broche 4
  //initialsie  communication
  Serial.begin(115200);
}

void loop(){ 
    //on recupère millis
milli=millis();

    //test batterie
  
  lecture= analogRead(mesure);
tension=7.7/77*lecture;
if (milli - tens_milli >= 500 ){
Serial.print("*D");
Serial.print(tension);
Serial.println("*");
Gtension=tension*100;
Serial.print("*E");
Serial.print(Gtension);
Serial.println("*");
tens_milli=milli;
 }
    //si batterie faible on fait clignoté les feux
   
if (tension<=6.9){
if (milli - past_milli >= 300 ){
  bool pos =digitalRead(ledpos);
  pos=1-pos;
  digitalWrite(ledpos,pos);
 digitalWrite(ledphare,pos);
  past_milli=milli;
}
}
  //le bluetooth
  if (Serial.available())
  {
    BluetoothData=Serial.read(); 
    if(BluetoothData=='a') motint=Serial.parseInt(); 
    if(BluetoothData=='b') serval=Serial.parseInt(); 
      if(tension>6.9){
    if(BluetoothData=='c') Ledpos=1;
    if(BluetoothData=='d') Ledpos=0; 
    if(BluetoothData=='e') Ledphare=1; 
    if(BluetoothData=='f') Ledphare=0; 
    }
    if(BluetoothData=='g') startstop=1; 
    if(BluetoothData=='h') startstop=0; 
  }
  
  //controle de var
Serial.println(BluetoothData);

//controle coommande arret
if (startstop-startstop_1==1){
  gouv.write(90);
   analogWrite(pinmotar,255);
    analogWrite(pinmotav,255);
    Stop=1;
    delay(1500);
    startstop_1=startstop;
}
else{
  Stop=startstop;
 }
 if (startstop==0){
  Stop=0;
  startstop_1=0;
 }
 
// arret du bateau
  if(Stop==1)
  {
    gouv.write(90);
     analogWrite(pinmotar,0);
    analogWrite(pinmotav,0);
    digitalWrite(marcmot,LOW);
  }
  else
  {
    //start du moteur
    digitalWrite(marcmot,HIGH);
    //commande du moteur
    if (motint<=60)
    {
      motval= 60-motint;
      motval= map(motval,0,60,85,151);
      analogWrite(pinmotav,0);
      analogWrite(pinmotar,motval);
    }
    else
    {
      if(motint>=70)
      {
        motval= motint-70;
        motval= map(motval,0,185,85,151);
        analogWrite(pinmotar,0);
        analogWrite(pinmotav,motval);
      }
      else
      {
        analogWrite(pinmotar,255);
        analogWrite(pinmotav,255);
      }
    }
    
    // commande du servo
    gouv.write(serval);
  }
  //commandes LED manuel
  if (tension>6.9){
    digitalWrite(ledpos,Ledpos);
    digitalWrite(ledphare,Ledphare);
  }
}

Suite à cela, je décide d'essayer de charger le programme sur une carte AZ-delivry NodeMCU Lua Lolin V3 Module ESP8266 ESP-12F WIFI Wifi

Je change les définitions de pins pour fonctionner et là c'est le drame les commande bluetooth fonctionne a moitié...

déjà ce qui fonctionne:
-l'envoie de mes tensions pas de problème ca remonte jusqu'à mon afficheur dans un format qui va bien

le reste ne fonctionne qu'a moitié... Je m'explique:
-Si je regarde ce qui passe dans mon série j'ai une écriture continu de "-1", mes écritures de tension je les vois passé en claire dans sérial.
-si j'envoie un commande en Bluetooth. j'ai des valeurs incohérente et qui ne corresponds pas a ce que je devrait recevoir. Mes variable récupère 1 fois sur 10 une valeur et qui correspond a rien de cohérant la plus part du temps.

J'ai 2 hypothèse:
-le module wifi de la carte pollue le serial en le serial de la carte en "-1" qui me coupe ce que je reçois du Bluetooth faut-il coupé ou renvoyer le module wifi sur un autre serial? ou possibilité de la désactivé?
-pour une raison que j'ignore le format de ce que je reçois change... mais cela explique pas pourquoi une partie des commande arrive a passer....

je suis un peu perdu sur la cause de ce problèmes, auriez vous une idée?

Bonjour

le fait de brancher l'adaptateur Buletooth sur le port série utilisé par le circuit d'adaptation USB peut poser problème .
Il existe une version de la librairie SoftSerial compatible avec ESP8266 , elle permettrait de différencier les ports série , celui dédié à l'interface USB, celui dédié au HC06

Par ailleurs il me semble (c'est à vérifier) que la ligne suivante permet de couper le WiFi

WiFi.mode(WIFI_OFF);

merci de ta réponse rapide,

déjà fais le test de passer par softserial mais le constat est le même...
La communication n'est pas meilleur quand la carte est autonome (prise USB debranché)
la commande WIFI.Mode(WIFI_OFF); semble être bonne a la condition d'appeler #include <ESP8266WiFi.h>

j'ai même rajouté cela au setup:

WiFi.disconnect();
 WiFi.mode(WIFI_OFF);
 WiFi.forceSleepBegin();
 delay(1);

le wifi ne semble pas être la cause... :frowning:

Si ça fonctionnait avec le uno mais plus avec le NodeMCU, ça doit venir d'un problème d'alimentation ou de tension. L'esp8266 est en 3.3V, le Uno en 5V.

Peux-tu décrire comment tout est branché ? Module Bluetooth, leds, moteurs...

le tous est alimenté avec un batterie lipo, je pilote le moteur avec un shield moteur équipé d'un L298N. le moteur est alimenté en par la tension de la batterie et le shield moteur me fournis le 5v qui rentre par la pin VIN pour que la carte NodeMCU génère sont 3.3V. le servo du gouvernail est alimenté en 5V. le HC06 est alimenté en 3.3 par le NodeMCU tous les négatif sont interconnecté.

le arduino j'utilise tous en 5V mais j'ai testé d'alimenté le HC06 en 3.3v et tous fonctionne bien.

mais j'avais pas fait l'inverse... j'ai branché l'alimentation du HC06. sur le shield du moteur et la tous ce passe bien dans la com! merci lesept !

bon maintenant je vois bien que le l298N et le servo n'aime pas les commande en 3.3v ... il leur faut 4.8V pour qu'ils fonctionnent.... je vais attendre mes Arduino nano ces esp8266 semble pas être un matériel polyvalent... mais bons ca fais 15 jour que je me suis lancé dans ce matériel faut faire ses expériences !

merci a vous !

je vais attendre mes Arduino nano ces esp8266 semble pas être un matériel polyvalent

non il faut juste soigner les alimentations; Passer au travers du régulateur de la carte (qui alimente aussi l'ESP) c'est prendre des risques. mettez un régulateur (efficace) externe qui vous donne du 3.3V directement sur la batterie et alimentez les composants par ce bias là

bon maintenant je vois bien que le l298N et le servo n'aime pas les commande en 3.3v

J'ai fait un essai avec un L293D commandé en 3.3V. Cela a fonctionné mais c'est hors spécification.

Rien ne s'oppose à alimenter l'ARDUINO et le L298 en 3.7V avec un convertisseur STEP-UP 5V.
L'autre solution est d'alimenter en double batterie (7.4V) et un convertisseur STEP-DOWN 5V.

Pour cela il faut connaître le courant nécessaire, dont on a aucune idée :confused: