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.