[ARDUINO] Simulation proteus

Bonjour,
Merci infiniment dfgh pour ta réponse.
Oui tu as raison, hier j'ai bien mis les servos sur les pin PMW car j'ai trouvé l'info en fouillant sur les forums.
NB: j'ai annulé le 2eme relais.
Et pour le calcul du cap oui je n'arrive pas a traduire ce que je veux (je n'ai pas toute la logique de la programmation pour rendre ma tache facile :slight_smile: mais c'est bien car j'apprends bcp de chose a force de pratiquer).
Les modification que tu m'a demandé de faire sont faites.

et le résultat?

Hello,
Désolé, j'etait trés occupé.
Alors je viens de refaire le test. et voila le résultat.
Volet 1:
Remarque 1:

  • on contaste que si je bouge la HMC le servo ne reagit pas qu'aprés soit quelques secondes ou degrés.
    Remarque 2:
  • Le servo quand t il depasse les degrés il tourne vers le sens contraire.
    Volet 2:
  • comment je peux ordonner le 2eme servo de fonctionner dés l'arret de la tempo désirée.
    NB: je joint la video et désolé pour le boutton :slight_smile:
    Merci

pour le manque de réactivité du compas, ajoute des Serial.print pour voir les valeurs que le compas te retourne et le resultat des calculs, notamment l'offset
regarde ce bout de code, il y a des print et une ligne de mise à jour du servo1

extinction_leds();

  /*Section du HMC5883l*/
  sensors_event_t event;
  mag.getEvent(&event);
  float cap = atan2(event.magnetic.y, event.magnetic.x);    //calcul du cap
  if(cap < 0){cap += 2*PI;}                                 //controle pour forcer le cap en positif ( > 0°)
  if(cap > 2*PI){cap -= 2*PI;}                              // controle si > 6 radians ( 360°)
  int cap_degres = (cap * 180 / M_PI);//3.14159265358979    //conversion du cap radians en degrés
  if (memo_cap_degres == 0){memo_cap_degres = cap_degres;}  //pour le premier passage
  Serial.print(F("cap (Initial): ")); Serial.println(memo_cap_degres);
  Serial.print(F("cap_degres: ")); Serial.println(cap_degres);
  int offset =   memo_cap_degres - cap_degres;
  servoPos1= (servoPos1 - offset);
  myservo1.write(servoPos1);  //rajout 
  Serial.print(F("offset ")); Serial.println(offset);
  Serial.print(F("servoPos1  ")); Serial.println(servoPos1);

pour le servo 2 regarde dans cette fonction
l'extinction des leds n'est demandé qu'une fois en fin de la tempo correspondante.
il semble judicieux d'y rajouter la commande de servo2
j te laisse voir les parametres que toi tu veux y mettre

void MINUTES(byte relais)
{
  for (byte m = 1; m <= 4; m++)
  {
    if (flag_tempo[m] == true)
    {
      if ((millis() - deb_tempo[m]) < tempo[m])
      {
        digitalWrite(Relais[relais], HIGH);
        digitalWrite(LED[m] , HIGH); //allume la led correspondant à la tempo
      }
      else
      { 
        flag_tempo[m] = false;
        digitalWrite(Relais[relais], LOW);
        digitalWrite(LED[m] , LOW); //allume la led correspondante
        myservo2.write(servoPos2 - offset2);
      }
    }
  }
}

Bonsoir @dfgh

j'ai oublié de mettre la video en ligne:

https://drive.google.com/file/d/1nZqtaXaBKxFSk74z_7JrkEORiY35857z/view?usp=sharing

Alors j'ai fait les modifications que tu m'a demandé et ca a marché (car je devait modifier le code il fallait declarer quelques variables), par contre soudainement rien ne fonctionne j'ai testé le servo tout seul il fonctionne aussi bien que la HMC.
Je trouve l'anomalie et je reviens vers toi, sinon je n'ai pas testé encore me 2eme servo.

Re Bonjour les amis,

@dfgh au fait j'ai compris ce qui c'est passé.
J'ai verifié le code sur l'IDE car il fallait déclarer int memo_cap_degres = 0;je l'ai mis à l'interieur de void loop, mais je n'ai pas televersé le code et j'ai cru que ca a fonctionné.
Donc le code ne fonctionne pas ou sinon je rate quelque chose (sur ton code pour la HMC l'offset ne change pas elle reste sur 0 tout le temps).
Et ce qui concerne l'arret du moteur, c'est du a l'alimentation car je l'alimenté avec la cart arduino.
Je viens de le branché avec une alim PC il fonctionne bcp mieux mais dés fois il s'arrete.
Le moteur tourne vers le sens contraire quand il arrive a sa limite (comment je peux faire pour remedier ca)
Là je vais tester la suite du code pour le 2eme servo pour voir quesque ca donne.

NB: j'utilise toujours mon code partie HMC l'ancien.
Aussi dés que j'ai mis le servo sur le pin PMW y a de l'amelioration coté reaction.

Merci

oui et pour la réactivité du servo, j'ai rajouté cette ligne.
car sans elle, tu demandais au servo d'aller à sa pos -offset. imagine 90°-offset de 1° = 89.°
puis tu ne mémorisais pas la nouvelle pos du servo ( 89°). si bien que si ta nouvelle correction était encore de 1°, tu refaisais le meme calcul 90°-1°=89°
le servo ne bougeait pas puisqu'il était déjà à 89°.

je comprends mais sur ton code l'offset est toujours 0 du coup le servo ne reagit pas.
C'est normal car servoPos1 - offset. EX servo déja sur 90 donc 90 - 0 ca donne 90 alors que le servo est sur cette degré donc c'est pour ca qu'il ne reagit pas.

Normalement ca ne doit pas etre le cas car :

int offset =   memo_cap_degres - cap_degres

j'au une valeur de memo_cap_degres et aussi pour cap_degres mais je ne comprends pas pour offset est 0 (alors comme tu peux le voir sur l'image que j'ai déja posté) faut que 235-203 = 32 donc offset 32.

annulé, passe au post suivant

oublie le code précédent et regarde celui ci, nota: cap est en radians
avec cap++; c'est trop brutal. change par cap+=0.01

void loop()
{
  extinction_leds();

  /*Section du HMC5883l*/
 //// sensors_event_t event;
  ////mag.getEvent(&event);
  ////float cap = atan2(event.magnetic.y, event.magnetic.x);    //calcul du cap
  
   cap++;
  Serial.print(F("cap = "));Serial.println(cap);
  if(cap < 0){cap += 2*PI;}                                 //controle pour forcer le cap en positif ( > 0°)
  if(cap > 2*PI){cap -= 2*PI;}                              // controle si > 6 radians ( 360°)
  int cap_degres = (cap * 180 / M_PI);//3.14159265358979    //conversion du cap radians en degrés
  if (memo_cap_degres == 0){memo_cap_degres = cap_degres;}  //pour le premier passage
  Serial.print(F("cap (Initial): ")); Serial.println(memo_cap_degres);
  Serial.print(F("cap_degres: ")); Serial.println(cap_degres);
 //memo_cap_degres=235;
 //cap_degres=203;
  
  int offset1 =   memo_cap_degres - cap_degres;
  servoPos1= (servoPos1 - offset1);
  myservo1.write(servoPos1);  //rajout 
  Serial.print(F("offset1 ")); Serial.println(offset1);
  Serial.print(F("servoPos1  ")); Serial.println(servoPos1);
  
  
  /*Fin Section du HMC5883l*/

  lecture_BP();

et le moniteur

Mon Cher,
j'ai toujours le meme souci avec:

int offset1 =   memo_cap_degres - cap_degres;

Offset1 = constament 0, mais quand je fait int offset1 = memo_cap_degres + cap_degres; les valeurs changent en fonction de la position de la HMC.
int c'est un nombre entier normalement doit comprends les valeurs negati

PI: la 2eme partie concernant le 2eme servo foncrionne mais je poursuis les tests pour etre sur.

il ne faut pas mettre int memo_cap_degres dans la loop, mais tout en haut du prg, avec la declaration des variables
en le mettant dans la loop, memo_ca_p_degres est recrée à chaque tour de loop, et donc il vaut zéro à chaque debut de loop.
puis dans la loop, tu as: si memo_cap_degres==0 alors memo_cap_degres=cap_degres
et ensuite tu soustrais memo_cap_degres et cap_degres. bien evidement tu obtiens zéro :grinning:

allez, tu déclares "memo_cap_degres" en haut du prg, avec la declaration des autres variables
et tu relances un test

j'été sur que je raté quelque chose merci infiniment je teste et je te faire un retour.

Le servo attaché a la HMC reagit bizzarement, il suit pas les meme degrés que la HMC.
car moi je souhaite que la HMC part de 0 à 180 comme le moteur.
Dans ce cas le moteur sera sur 90 degré donc dés que la HMC s'initialise, elle va pointé sur une direction quelconque. Pour moi cette position doit etre 90.
si on dévie vers le sens + le moteur doit devier de meme vers le sens - et vise versa.
Exemple: je demarre l'arduino la HMC va poiter vers 120, le moteur est sur 90.
si la HMC part vers 100 donc le servo doit bouger de 90 + 20 = 70 degré
c'est pour ca que sur mon prg je divise atan / 2 pour avoir que 180 degré.

tu n'es pas clair
au départ du prg, le servo est obligatoirement envoyer à 90°
le compas est n'importe ou ( disons 150°) et tu veux que le servo ne bouge pas.
si le compas est déplacé de 50°, tu veux que le servo suive de 50°

c'est bien ça?

ou

au départ du prg, le servo est obligatoirement envoyé à 90°
le compas lui est à 120°, le servo va à 120°
puis si on déplace le compas de 30°, le servo suivra de 30°

lequel de ces deux cas ? ou est ce une autre approche

Bonjour les amis,
desolé pour le retard.
dfgh merci.
Alors, franchement mon code pour la partie HMC fonctoinne comme je le veux donc je vais le garder pour cette utilisation et je vais juste le modifier pour que le servo ne depasse pas des limite (car si il depasse les 90 degrés il tourne automatiquement vers le sens contraire).

Par contre j'ai une question:
Est ce que je peux utiliser ce code sur un arduino nano (je viens de commandé 1) c-a-d y aura pas de changement a faire ni au niveau de librairie ou autre...
Car pour faire finctionner mon servo avec la HMC j'ai passé des mois et des mois pour y arriver.

Par avance merci

hello
UNO, NANO==> meme µ, memes pinoches

1 Like

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.