Problème sur commande moteur continu

Bonjour à tous,

Je suis nouveau sur ce forum et il me semble qu'il est le plus adapté pour parler de mon problème.

J'essaie de réaliser un drône (quadricoptère) à base d'arduino.

Les commandes de se drône se fait par rf (moindre coûts et tant pis pour les interférences).

J'ai réussi à faire la partie émettrice, l'ensemble de mes commandes sont bien transmise (via virtualwire), ma réception se fait aussi correctement.

J'arrive à contrôler mes moteurs (en suivant ce topic merveilleusement bien écris, un peu de pub ne fait pas de mal).

Du coup, j'ai assemblé mon code de la partie réception et des commandes moteurs (pour l'instant pas fini mais je procède par étape) :

#include <VirtualWire.h>

int donnee[5];
byte taille_message;

int identifiant = 555;

//définition des broches commande moteur
int mot_av_g = 3;
int mot_av_d = 5;
int mot_ar_g = 6;
int mot_ar_d= 9;

//initialisation des valeurs
int gaz = 0;
int tangage = 0;
int roulis = 0;
int lacet = 0;

void setup() 
{
  Serial.begin(9600);
  vw_setup(2000);
  vw_rx_start();
  pinMode(mot_av_g,OUTPUT);
  analogWrite(mot_av_g,0);
  pinMode(mot_av_d,OUTPUT);
  analogWrite(mot_av_d,0);
  pinMode(mot_ar_g,OUTPUT);
  analogWrite(mot_ar_g,0);
  pinMode(mot_ar_d,OUTPUT);
  analogWrite(mot_ar_d,0);
  delay(1000);
}

void loop() 
{
  reception();  
  if(donnee[0]=identifiant)// Si l'identifiant est le bon
  {
    gaz = donnee[1];
    tangage = donnee[2];
    roulis = donnee[3];
    lacet = donnee[4];
    Serial.print(donnee[1]); //affiche les gaz
    Serial.print(" ");
    Serial.print(donnee[2]); //affiche le tangage
    Serial.print(" ");
    Serial.print(donnee[3]); //affiche le roulis
    Serial.print(" ");
    Serial.print(donnee[4]); //affiche le lacet
  }
  Serial.println();
  commande_moteur();
}
void commande_moteur()
{  
  analogWrite(mot_av_g,gaz);
  analogWrite(mot_av_d,gaz);
  analogWrite(mot_ar_g,gaz);
  analogWrite(mot_ar_d,gaz);
}
void reception()
{  
  taille_message = sizeof(donnee);
  vw_wait_rx();
  if (vw_get_message((byte *) &donnee, &taille_message)) {
    // On copie le message, qu'il soit corrompu ou non
  }
}

Ce code fonctionne (les commandes sont bien reçue vue dans le terminal série et ce sans le branchement fait avec les moteurs)

Mais vous allez me dire : "d'où provient ton problème ?" et bien tout simplement lorsque je varie (pour l'instant la commande de gaz), mon script se fige dès que les moteurs tentent de se mettre en route (la led TX du récepteur ne clignote plus). La partie émettrice continu de fonctionner normalement.

Au début, je pensais qu'il y avait un soucis avec le branchement mais en reprenant étapes par étapes la commande moteur, les branchements semblent bons.

Je me pose la question suivante, l'appel de courant fait lors de la mise en marche des moteurs n'est-il pas trop important et vient bloquer le script soit :

  • en diminuant l'alimentation du récepteur qui arrête de recevoir des données
  • en diminuant l'alimentation de l'arduino

Comment faire? dois-je rajouter des diodes (peut-être un retour de courant inconnu lors du démarrage des moteurs)? dois-rajouter des condensateurs pour absorber le pic (mais où?)?

Pour infos, j'utilise une alimentation pour les moteurs et une alimentation pour les arduinos.

En pièce jointe, le câblage réalisé sur fritzing.

Pour info, j'ai tenté de déboguer le script, j'ai inséré un Serial.println("fonction reception") ici :

void reception()
{  
  taille_message = sizeof(donnee);
   Serial.println("fonction reception avant wait");
  vw_wait_rx();
  Serial.println("fonction reception apres wait");
  if (vw_get_message((byte *) &donnee, &taille_message)) 
  {
    // On copie le message, qu'il soit corrompu ou non
  }
}

Dans le terminal, dès que j'active les gaz, ça se fige sur le terminal, je vois "fonction reception avant wait" et sur la ligne d'après seulement "foncti".

Quand je démarre avec la commande déjà engagé, cela se fige aussi.

Par contre les autres commande de tangage, roulis lacet ne perturbe pas le script, donc cela viendrait de l'association moteur et rf. Lors de la réception d'un nouveau message, tout fige.

Merci pour les lecteurs de ce post, j'ai trouvé le problème.
Mon soucis ne provient pas du montage (enfin pas tout à fait)
J'avais regardé sur https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM, les broches gérant le PWM sont les 3, 5, 6, 9, 10 et 11.
Mes données du récepteur étaient sur la broche par défaut (c'est à dire la 11).
J'ai isolé un moteur qui posait le soucis, celui-ci était branché sur la 9 (correctement initialisé), j'ai essayé sur la 10, même soucis.
J'ai modifié la broche du récepteur en la mettant sur la 12 et j'ai placé la commande du dernier moteur sur la broche 11.
Voici le débit du code après modification.

#include <VirtualWire.h>

int donnee[5];
byte taille_message;

int identifiant = 555;

//définition des broches commande moteur
int mot_av_g = 3;
int mot_av_d = 5;
int mot_ar_g = 6;
int mot_ar_d=11;

//initialisation des valeurs
int gaz = 0;
int tangage = 0;
int roulis = 0;
int lacet = 0;

void setup() 
{
  Serial.begin(9600);

  vw_setup(2000);
  vw_set_rx_pin(12);
  vw_rx_start();
  pinMode(mot_av_g,OUTPUT);
  analogWrite(mot_av_g,0);
  pinMode(mot_av_d,OUTPUT);
  analogWrite(mot_av_d,0);
  pinMode(mot_ar_g,OUTPUT);
  analogWrite(mot_ar_g,0);
  pinMode(mot_ar_d,OUTPUT);
  analogWrite(mot_ar_d,0);
  delay(1000);
}

Maintenant, tous les moteurs sont correctement commandés.

Mon problème est donc résolu.

Cependant quelqu'un a-t-il une explication sur ce dysfonctionnement ?

Pour infos, voici le lien de ma carte arduino nano :https://www.amazon.fr/gp/product/B015MGHH6Q/ref=oh_aui_detailpage_o07_s00?ie=UTF8&psc=1

zigomato:
Cependant quelqu'un a-t-il une explication sur ce dysfonctionnement ?

parce que virtualwire utlise le timer1 donc en conflit avec le pwm sur les pins 9&10

Merci de cet info, c'est à noter, j'ai vu plein de post similaire sur plein de forums sans que de solution n'ai été apportée