Go Down

Topic: problème de code (Read 478 times) previous topic - next topic

matsuru75

Apr 19, 2012, 08:26 pm Last Edit: Apr 20, 2012, 12:12 pm by matsuru75 Reason: 1
Bonjours à tous !!
Alors voila j'essaie de faire suivre une orientation à mon robot avec un capteur HMC5883L il est motorisé
avec 2 servos .
J'ai d'abord pris une orientation fixe 150 degrés malheureusement j'ai quelques problèmes dans le code
le robot suit la première action du code mais n' enchaîne pas avec les autres actions... en effet si il est a 120 degré il suit la première action arrive à 140 deg mais n'enchaine pas avec la 2ieme actions des roues

le code compile correctement mais je crois m'etre totalement trompé dans mes boucles??
les valeurs d'increment writeMicroseconds sont bon ce sont les if elseif qui m'en semble louche d apres mes observations


Merci de votre aide !!
je débute donc soyez patient :D merci !!

fdufnews

Déjà il y a 2 trucs qui me chiffonnent :
  La déclaration de myservo1 et myservo2 devrait être faites en global. Et myservo1.attach(9) et myservo2.attach(10) ne devraient apparaître qu'une fois dans le setup().

Ensuite
Code: [Select]
Wire.requestFrom(Addr, 6);   
  if(Wire.available() <=6) {   
    x = Wire.read() << 8 | Wire.read();
    z = Wire.read() << 8 | Wire.read();
    y = Wire.read() << 8 | Wire.read();
    degree = ((atan2(y,x)));
if ((atan2(y,x))>=0) degree = (atan2(y,x))*180/M_PI;
if ((atan2(y,x))<=0) degree = (360-((atan2(y,x))*(-180/M_PI)));     

  }

Dans cette partie de code, tu demandes la lecture de 6 octets par le request mais après tu testes si tu as reçu 6 octets ou moins et malgré tout tu fais 6 lectures

Quote
les valeurs d'increment writeMicroseconds sont bon ce sont les if elseif qui m'en semble louche d apres mes observations

pas sur. Les incréments sont corrects pour une position de départ donnée. Si tu pars d'une autre position il n'est pas dit que ce soit bon.
Il faudrait partir de la position tout droit (les deux servo ont la même consigne) et faire croître/décroître les consignes des servo jusqu'à atteindre l'angle attendu. L'incrément/décrément dépendant de l'écart entre l'angle mesuré et l'angle attendu. C'est un petit asservissement.

barbudor


Merci de votre aide !!
je débute donc soyez patient :D merci !!


Ouais, ils disent tous çà. Moi j'ai envie de sortir la Kala quand je vois çà comme code  ]:D

N'oublie pas les balises code (bouton #) ca rend le code plus lisible et ca évite que le Modo te morde !

Code: [Select]
  {
myservo1.attach(9);
myservo1.writeMicroseconds(1800);
myservo2.attach(10);                             ////// la roue gauche tourne plus vite pour reprendre la direction demandé
myservo2.writeMicroseconds(1500);
}


La fonction attach() n'a pas besoin d'être répétée plusieurs fois. Tu me déplace çà fissa 1 fois dans le setup et on en parle plus.

Tu utilises Servo.h pour commander des moteurs ?
Pourquoi pas dans le principe, ca reste du PWM de toute façon.
Je vois un inconvénient tout de même : le PWM de Servo doit tourner à 50Hz (période de 20ms, valeur standard pour les servo).
Pour le PWM d'un moteur j'ai plutot l'habitude de travailler plus haut en fréquence, entre 1kHz et 10kHz.
De mémoire il me semble que c'est plus efficace en hautes fréquences.

Ensuite pour rendre ton code plus lisible, coupe ton code dans des fonctions séparées :
- Une fonction pour lire le cap actuel
- Ensuite fait la différence entre le cap souhaité
- Une fonction d'asservissement qui travaille sur la différence de cap et pas sur des valeurs en dur
Ca parait bête mais une fois que ton code va commencer à marchoter avec des "if" va falloir passer a quelque chose de plus sérieux qui s'appelle le PID. Donc si ton code est bien découpé maintenant, ca ira tout seul pour le maintenir et le modifier après.

Les commentaires ne sont pas a jour. Tu as 2 cas "le moteur va tout droit" alors que les valeurs de contrôle sont différentes. Ou alors c'est que tu as 2 moteurs différents de chaque coté ? ;)

De toute façon dans les 4 cas, le servo1 tourne plus vite que le 2, donc jamais tu tourneras à droite.

Allez, un p'tit coup de balai, tu relis tranquillement ce que tu as écrit et tu le mets au propre.
Ce devrait aller tout seul après.

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

matsuru75

je viens de réecrire 2-3 petits trucs avec vos conseils et de vue les servos réagissent pas mal   la vitesse varie pas mal fonction de l'angle en degré!! le code à l'air de fonctionner correctement


je vais maintenant essayer d'ajouter une variable cap pour faire quelque chose d'un peu plus fonctionnel !!
de nouveaux problèmes risque d apparaître je vous mettrais au courant !! :)))))))

MErci beaucoup et a (tres.. ? ) bientôt  ^^



matsuru75

Quote
Tu utilises Servo.h pour commander des moteurs ?
Pourquoi pas dans le principe, ca reste du PWM de toute façon.
Je vois un inconvénient tout de même : le PWM de Servo doit tourner à 50Hz (période de 20ms, valeur standard pour les servo).
Pour le PWM d'un moteur j'ai plutot l'habitude de travailler plus haut en fréquence, entre 1kHz et 10kHz.
De mémoire il me semble que c'est plus efficace en hautes fréquences.


C'est surtout que je ne vois pas quoi utiliser d autre ? j'utilise des servos moteurs a rot continues !

zeric

@barbudor, le PWM sur les variateurs industriels est effectivement dans la bande audio supérieure 10-20KHz. (ceux pas trop récents, les derniers vont plus haut)
Par contre, le PWM arduino est à 490,xx Hz à l'oscillo  :smiley-roll:
(Mais il me semble avoir lu dans le fofo en "english" que certains programmeurs avaient joués à le monter plus haut).

barbudor

@zeric
Pas encore joué avec les moteurs sur Arduino mais c'est vrai de 490Hz c'est plutot bas. Mais c'est quand même mieux que 50Hz.
Sur mon robot suiveur de ligne à base de .NetMF, j'utilisait 10kHz. Par contre ca s'entend.
Un collègue me conseillait d'aller plus haut mais suggérais que je pouvais perdre en efficacité et qu'il faudrait peut être ajouter une capa en // sur le moteur. Pas encore essayé.

@matsuru75
Je n'ai pas d'expérience avec les servos débloqués. Mais j'avais pas compris qu'on pouvait vraiment régler la vitesse d'un tel servo. Pour moi la consigne que l'on donne à un servo est une consigne de position. Si le servo est débloqué, il va simplement tourner toujours dans un sens ou dans l'autre suivant que l'impulsion est plus petite ou plus grande que la valeur moyenne.
Tu dis que çà impacte aussi la vitesse ?
Je découvre....
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Go Up