Go Down

Topic: Probleme Arduino Drone ! (Read 4055 times) previous topic - next topic

Loïc

Bonjour!
Je réalise avec mon IUT, un projet de drone birotor.
Le probleme, c'est que j'arrive à lire mon capteur 9dof IMU, mais faire fonctionner les servomoteurs en même temps pose probleme.
J'ai beau chercher, je trouve pas la solution.
Donc je vous met mon programme au cas ou vous trouverez la solution :

/////////////////////////////////////////////////////////////////////////////////

 #include <NewSoftSerial.h>
 #include <Servo.h>

 int RESET = 7;
 const int servo1 = 10;
 Servo mon_servo1;
 const int servo2 = 9;
 Servo mon_servo2;
 byte pinRx=6;
 byte pinTx=8;
 char TabX[10],TabY[10],TabZ[10];
 byte Resultat=0;
 int Calc=0,i=0,Res=0,Res2=0;


 NewSoftSerial IMU(pinRx,pinTx);

 void setup()
 {
   pinMode(RESET,OUTPUT);
   Serial.begin(115200);
   IMU.begin(9600);
   pinMode(pinRx, INPUT);
   pinMode(pinTx, OUTPUT);
   pinMode(servo1, OUTPUT);
   pinMode(servo2, OUTPUT);  
   mon_servo1.attach(servo1);
   mon_servo2.attach(servo2);
 }
 
 void loop()
 {
   int X1=0,Y1=0,Z1=0;
   int x=0,y=0,z=0;
   delay(1);
   if(IMU.available()>0)
     {
     Resultat=IMU.read();
     if(Resultat==':'){
     do{
     if(IMU.available()>0)
     {
     Resultat=IMU.read();
     if(Resultat!=','){
     TabX
  • =Resultat;
         x++;}
         }
         }while(Resultat!=',');
         TabX
  • ='\0';
         do{
         if(IMU.available()>0)
         {
         Resultat=IMU.read();
         if(Resultat!=','){
         TabY[y]=Resultat;
         y++;}
         }
         }while(Resultat!=',');
         TabY[y]='\0';  
         do{
         if(IMU.available()>0)
         {
         Resultat=IMU.read();
         if(Resultat!=0xD){
         TabZ[z]=Resultat;
         z++;}
         }
         }while(Resultat!=0xD);
         TabZ[z]='\0';
         X1=atoi(TabX);
         //Serial.print("X = ");
         //Serial.print(X1);
         //Serial.print("    ");
         Y1=atoi(TabY);
         Serial.print("Y = ");
         Serial.println(Y1);
        // Serial.print("    ");
         Z1=atoi(TabZ);
         //Serial.print("Z = ");
         //Serial.println(Z1);
         }
         }
         Res=90-(2*Y1);
         Res2=90+(2*Y1);
         if((Res2>=0)&&(Res2<=150)){
         mon_servo1.write(Res2);}
         if((Res>=30)&&(Res<=180)){
         mon_servo2.write(Res);}
         if(Res2<0){
         Res2=0;
         mon_servo1.write(Res2);  
         }
         if(Res>180){
         Res=180;
         mon_servo2.write(Res);  
         }
         delay(20);      
     }

    //////////////////////////////////////////////////////////////////////////////

    La vitesse que j'ai choisis pour mon IMU et de 9600.

    Voilà, si vous avez sinon un programme simple, pour m'inspirer la solution, pour que je puisse lire les valeurs de l'IMU en même temps que de commander les servo.

    Sinon, j'ai une intuition sur les temps de communication, car l'IMU est a 960Hz et les servo a 50Hz.

    merci d'avance de votre aide.

Teiva

Surement que IMU et servo se bouffent le nez, tu as vérifié qu'ils n'utilisent pas le même timer.

L'ancienne version d'ArduImu utilisait un 328 tu peux regarder comment ils ont fait :
http://diydrones.com/

A+ Teiva


www.Zartronic.fr : Robots & Arduino


www.Zartronic.fr : Arduino & Robotique

Loïc

Bonjour!

J'ai mon programme qui lit correctement mon IMU en dissociant L'axe X, Y et Z. Grace à la librairie <NewSoftSerial.h>, qui crée un RX et TX supplémentaire sur les broches digital. Car attention, mon IMU 9dof razor est tout nouveau, il fonctionne donc en série.
Donc là, pas de probleme, mais quand j'ajoute la librairie <servo.h>, même sans instruction, la lecture de l'IMU bug ainsi que les servos.

Enfin, j'ai cherché des solutions sur internet mais pas moyen de ressoudre mon probleme.

S'il vous plait, aidez-moi, je conçois en ce moment même, un drône différent de tous les autres, j'espere que vous pourrez m'aider à résoudre ce probleme.

J'attend vos réponses, merci.

Loïc

Bonjour!
J'actualise mon sujet, car j'attend une réponse.
merci.

Loïc

Le probleme est exactement le meme que dans ce sujet :
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1262033431/all

Mais les conseils ne m'aide pas, si vous trouvez une solution.
merci de m'aider.

Jean-François

#5
Dec 29, 2010, 08:46 am Last Edit: Dec 29, 2010, 10:11 am by jfs Reason: 1
Essaye en mettant la même valeur de Baudrate pour les deux:

Code: [Select]
Serial.begin(115200);
  IMU.begin(9600);
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

piflechien54

Salut :)

je vais peut être dire une connerie mais tu déclare :

int RESET = 7;
const int servo1 = 10;
Servo mon_servo1;
const int servo2 = 9;
Servo mon_servo2;

tu devrais pas plus tôt déclarer :  :-?

int RESET = 7;
const int mon_servo1 = 10;
Servo mon_servo1;
const int mon_servo2 = 9;
Servo mon_servo2;


car sinon t'es servo ne sont déclarés qu'à moitié, non ?
enfin je dis ça, je dis rien  :P

Voilà @plus et bon courage ;)
Proverbe Tibétain : Un mensonge est un saut du haut du toit

Luj06

#7
Dec 29, 2010, 04:16 pm Last Edit: Dec 29, 2010, 04:19 pm by julien@pobot.org Reason: 1
Bonjour,

En fait servo1 et servo2 sont utilisées comme paramètre de l'opération attach donc les servomoteurs sont bien déclarés, pas de souci de ce côté là.

Il faut utiliser une autre librairie pour les servos, à cause du problème d'interruptions désactivées dans NewSoftSerial.

++


Loïc

Bonjour!
Je connais bien le club pobot de sophia-antipolis, j'habite pas très loin, un jour je viendrais apporter ma contribution à ce club, enfin quand j'arriverais a avoir mon permit. lol.
En tout cas, j'aime beaucoup ce que vous faites.

Sinon, pour revenir à mon sujet :
Il faut trouver une solution pour contourner le probleme des librairies, car il y a un conflit entre les deux.

Pour vous décrires le probleme:
l'IMU commence à envoyer les données à l'arduino, le servo réagit, puis plantage de l'IMU aucune donnée n'est envoyé, le servo ne réagit plus, et même le bluetooth semble se désactiver.


Loïc

Bonjour!!!
Et Biensûr, Bonne Annee 2011 à tous!!!!!

Voilà, lundi j'attaque une semaine de projet sur mon drone, et j'aimerais bien terminer mon cahier des charges, pour le voir enfin  décoler.
Mais bon, le probleme de conflit, me pose vraiment une colle.
Par contre, je ne sais pas si augmenter le baudrate, va changer quelquechose, car l'arduino va accumuler les informations en masse et j'ai peur qu'il ne suit plus.
Après, normalement, un seul microcontroleur devrait suffir, car j'ai déjà vu des drones pilotés par des mini arduino.

Enfin voilà, d'autres idée ?

Jean-François

#10
Jan 01, 2011, 05:36 pm Last Edit: Jan 01, 2011, 07:42 pm by jfs Reason: 1
Tu devrais plutôt aller vers une valeur moyenne pour le Baudrate.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Loïc

Bonjour à tous!
Bon, je voulais garder l'exclusivité, ou la surprise, mais bon.
Je vous présentes mon drone birotor arduino de type V22 Osprey.





Bientôt, je ferait un site internet avec le projet open source.
J'espere que maintenant, cette initiative va permettre de motiver certain, pour m'aider, un peu plus.

Mon soucis premier est un conflit entre la bibliotheque servo et newsoftserial. Un probleme d'interruption perturbé.

Mon deuxieme soucis est du choix de lecture du capteur, ainsi que de son asservissement.


jeq

Bonsoir et bonne Année

je vais peut etre commencer l'année par une conner....e
mais
pourquoi utiliser NewSoftSerial avec une arduino méga
tu peut gérer plusiieurs séries

j'ai un projet en quadri mais pas assez de temps et je bloque
sur un 6DOF mon cerveau a du mal a comprendre la difference entre
gyroscope et accelerometre

A+

voodou

Pour infos, sur internet tout est déjà dispo en tri, quadri, ...

voodou

Voilà le lien pour inspiration:

http://radio-commande.com/experimental_projects/triwiicopter/

Go Up