Servo et PWM

Bonjour à tous,
J’ai un petit problème: Les fonctions s’exécutent l’une après l’autre et pas en même temps. Ce qui fait que le servo fait un balayage, attends la fin de la fonction moteur et ainsi de suite…alors que je souhaite qu’il balaye en même temps que les moteurs accélère comment corriger cet anomalie (dont je suis sans aucun doute le responsable!).
Voici mon code:
/*Commande servomoteur -45°,0,+45° pour tourelle LeD IR
*et commande PWM des moteurs
*/
#include <Servo.h> //Librairie servomoteur
const int broche_servo_IR=13; //pin servo tourelle IR
Servo servo_IR; //Crée un objet servo tourelle_IR
const int moteurA=3; //PWM moteur 1 (ATT! PWM pin 9, 10 ne fonctionnent pas avec lib servo)
const int moteurB=11; //PWM moteur 2
int demarre=1; //variable cde démarrage
void setup()
{
servo_IR.attach(broche_servo_IR); //Attache l’objet servo à la broche de cde du servo
pinMode (broche_servo_IR, OUTPUT); //Configure la broche servo en SORTIE
}
void cde_servo()
{
servo_IR.write(950); //Positionne le servo à -45°(min 550)
delay (300);
servo_IR.write(1440); //Positionne le servo à 0°
delay (300);
servo_IR.write(1890); //Positionne le servo à +45° (max 2330)
delay (300);
servo_IR.write(1440); //Positionne le servo à 0
delay (300);
}
void mes_moteurs()
*{ *
for (int i=30; i<240; i++) //Accélération au démarrage

  • {*
  • analogWrite(moteurA,i);*
  • analogWrite(moteurB,i);*
  • delay(50); // le délai détermine la pente de l’accélération*
  • }*
    }
    void loop()
    {
    cde_servo();
    mes_moteurs();
    }
    Si vous pouvez m’expliquer…

Il faut que tu séquences avec une seule fonction ? Doit y avoir mieux, mais je sais pas trop... ce sont les delays qui mettent la zone...

proposition: faire ton loop avec des modulos %5 sur une variable qui incremente avec un delay de 10 ou presque et des switch case ? voir le référentiel et wikipedia pour le modulo :disappointed_relieved: c'est l'heure de la soupe j'ai pas le temps, ma chérie m'appelle!

Si elle t'appelle : vas y vite! Pour le reste, je n'ai pas compris ce que viennent faire les modulos, alors je vais essayer de comprendre. A +

:stuck_out_tongue:

genre:
attention pas testé.

int toto;
int i;

loop {
delay(50)
toto++

switch (toto%25) {
  case 6:// donc tous les 300 millis (6 *50)
    break;
  case 12:  // à 600 millis (12 * 50)
    break;
  case 18: // à 900 ms (18 * 50)
     break;
  case 24: // ...
    break;
  default: // le reste du temps
    break;
}
  (toto> 250) ?toto= 0 : toto; // permet à toto de pas trop grossir... je sais plus jusque combien va un int
// à chaque pas tu fais ton truc 
  (i< 240) ?i++ : i= 30;
  analogWrite(moteurA,i);
  analogWrite(moteurB,i);

}

sinon tes valeurs dans l’instruction write sont trop grandes non ?
c’est pas sensé être entre 0 et 180 ?
regarde les spec de ton servo et ajuste les paramètres avec servo.attach(pin, min, max)
Les valeurs de min et max sont écrites dans les spécs…
enfin mon essai avec un minservo m’a donné des résultats approximatifs pour les butées (il a fallu que je requalibre de façon empirique :blush:)

moi j’aurai fais quelque chose comme sa … a la vas vite…

#include <Servo.h> //Librairie servomoteur

const int broche_servo_IR=13; //pin servo tourelle IR
Servo servo_IR; //Crée un objet servo tourelle_IR

const int moteurA=3; //PWM moteur 1 (ATT! PWM pin 9, 10 ne fonctionnent pas avec lib servo)
const int moteurB=11; //PWM moteur 2

int demarre=1; //variable cde démarrage

int plageServo[] = {950, 1440, 1890, 1440};
int iServo = 0;
int countDelay = 0; //initialise countDelay a 6 pour 6 * 50 = 300 ^^, initialise a 6 pour que le servo tourne des le démarage.

void setup() {
  servo_IR.attach(broche_servo_IR); //Attache l'objet servo à la broche de cde du servo
  pinMode (broche_servo_IR, OUTPUT); //Configure la broche servo en SORTIE
}

void loop() {
  for (int i=30; i<240; i++) {//Accélération au démarrage;
    cde_servo();
    mes_moteurs(i);
    delay(50);
  }
}

void cde_servo() {
  if(countDelay == 0)
    servo_IR.write(plageServo[iServo]); // pas compliqué on a définie iServo a 0 donc la premiere appele sera 950 
    if(iServo == 3) iServo++; // tant que l'on est pas sur le dernier chiffre du tableau on augmente la valeur de iServo de 1
    else iServo = 0; // sinon repase a zero;
    countDelay ++;
  } else if(countDelay == 6) { //countDelay a 6 pour 6 * 50 = 300 ^^
    countDelay = 0;
  } else {
    countDelay ++;
  }
}

void mes_moteurs(int i) { 
  analogWrite(moteurA,i);
  analogWrite(moteurB,i);
}

tu peut toujours mettre ton delay dans mes_moteurs(i); mais n’oublie pas de supprimer dans le loop…
ensuite l’erreur dans ton programme … c’est qu’il ne faut pas oublier que le code et lu bout a bout par le controle … donc des que tu fais un for() {} il termine d’abord cette boucle avant de passer a la suite… d’ou tes séquences… pour faire tout en presque simultané … il faut réduire au maximun les boucles et les delay() ou les prendre en compte comme dans le code que je t’ai mis… je compte le nombre de fois que l’on passe dans la boucle … et hop … on passe 6 fois … donc on a attendu 6 fois delay(50); donc 300 ^^… voilà … je pense qu’il y a surement une erreur dans mon code… suis pas sur… lol

ça fait pareil en plus verbieux :drooling_face:

désole pas vue ton poste.. ^^.. au moin il aura le choix. ^^..

puis maintenant il devrais savoir pourquoi sa n'allez pas sont code.. ^^..

(puis j'ai tendance a programmer comme je fais en java .. " Full Object " .. mais la sa vas.. sinon j'aurai bien fais en assembleur .. mais bon .. me souviens plus de toute les commandes.. lol.. )

Je viens de vos réponses et je vous en remercie. Je fais des essais demain et je vous tiens au courant. A+