Led-Servo Millis Probleme

Bonjour,

Petit soucis de coexistences de deux objects, des leds et des servomoteurs, séparément marchent super bien mais ensembles pas du tout, avec millis().

Le but c'est de ne pas utiliser des delay pour des raisons évidentes.

Voici les elements(Ajout - rectification selon demande)
Leds
Servo SG90
Arduino Nano(Atmega328)

Voici le schéma(rectification selon demande)
j'ai modifié selon demande je n'utilise plus le 9 et 10 sinon le 11 et 6

schema001

Voici le code;

#include <Servo.h>
Servo servo01;
Servo servo02;

int pos=1000;
int pos2=1000;

int LedPinDr = 11;   
int LedPinGa = 6;   

int brightness01 = 0; 
int brightness02 = 0; 

int increment = 10;  
unsigned long temps01 = 0;
unsigned long temps02 = 0;
unsigned long temps03 = 0;
unsigned long temps04 = 0;

void setup() 
{
  pinMode(LedPinDr, OUTPUT);
  pinMode(LedPinGa, OUTPUT);

  servo01.attach(3);
  servo02.attach(5);
  
  Serial.begin(9600);
}

void loop() 
{
  unsigned long temps = millis();
  Serial.println(temps);
  
  if (temps - temps01 >= 500) 
  {
    temps01 = temps;
    ledDroite();
  }
  if (temps - temps02 >= 50)
  {
    temps02 = temps;
    ledGauche();
  }
  if (temps - temps03 >= 500)
  {
    temps03 = temps;
    tacheservo01();
  }
  if (temps - temps04 >= 500)
  {
    temps04 = temps;
    tacheservo02();
  }
  
}

void ledDroite()
{
  brightness01 += increment;
    if (brightness01 >= 255) 
    {
      brightness01 = 255;
      increment = -increment;
    }
    else if (brightness01 <= 0) 
    {
      brightness01 = 0;
      increment = -increment;
    }
  analogWrite(LedPinDr, brightness01);
  analogWrite(LedPinGa, brightness01);
}

void ledGauche()
{
  brightness02 += increment;
    if (brightness02 >= 255) 
    {
      brightness02 = 255;
      increment = -increment;
    }
    else if (brightness02 <= 0) 
    {
      brightness02 = 0;
      increment = -increment;
    }
  analogWrite(LedPinGa, brightness02);
}

void tacheservo01()
{
  if(pos <=1000)
  {
    pos = 2000;
    servo01.writeMicroseconds(pos);
  }
  else
  {
    pos = 1000;
    servo01.writeMicroseconds(pos);
  }
}

void tacheservo02()
{
  if(pos2 <=1000)
  {
    pos2 = 2000;
    servo02.writeMicroseconds(pos2);
  }
  else
  {
    pos2 = 1000;
    servo02.writeMicroseconds(pos2);
  }
}

Il y a des limitations (voir le paragraphe usage)

J'ai un indice de réponse.

Sur les micro avr les fonction delay() comme millis() utilisent le timer 0.
La bibliothèque servo utilise aussi un timer mais je ne connais pas lequel.

Tu notes que j'ai supposé que tu utilisais un micro Atmel avr (cartes uno, nano, mega,etc)
Si tu utilises une carte basée sur un ARM Atmel (série MKR) la solution risque fort d'être différente.
Si tu utilise un ESP32 ce sera pareil.

J'espère que tu comprends maintenant que le message de bienvenue doit être lu et appliqué.
Bien décrire son matériel, donner un schéma.

Servo utilise des timers 16 bits, avec 1 timer pour 12 servos. Avec une uno/nano, pas de difficultés il n'y a que le timer 1 qui a 16 bits. Si tu tournes sur Uno ou nano, on ne peut donc pas utiliser le PWM des broches 9 et 10. Et c'est int LedPinDr = 10; qui met la pagaille. Il faut utiliser n'importe quelle broche pwm sauf 9 ou 10.

Avec une mega servo commence par le timer 5 qui est moins utilisé par les autres bibliothèques. J'en déduis que tu n'utilises pas une mega.

Avec les autres cartes, il faut regarder la doc, je ne connais pas par cœur les ressources utilisées.

Merci beaucoup pour vos réponses, j'ai fait les rectifications mais sans succès.
Pas d’utilisation des port 9 et 10 à cause de la librairie, je vous ai envoyé les elements utilisés et un schéma.
Je me pose la question si c'est aussi une question de timer?
Une vidéo ou explication à ce sujet?
Merci d'avance

Il faut au moins que tu précises la carte utilisée.

Oui, mais où?

Si il y a une modification du programme, il faut redonner le programme. Pour que l'on ait tous le même base.

hello
alors, par ou commencer?
tu utilises la meme variable pour les deux leds, et devine... dans les deux fonctions led gauche, led droite, elles se contrarient.
testes ce code pour pour voir que pour les leds, c'est reglé.

#include <Servo.h>
Servo servo01;
Servo servo02;

int pos = 1000;
int pos2 = 1000;

int LedPinDr = 11;
int LedPinGa = 6;

int brightness01 = 0;
int brightness02 = 0;


int increment1 = 10;
int increment2 = 10;
unsigned long temps01 = 0;
unsigned long temps02 = 0;
unsigned long temps03 = 0;
unsigned long temps04 = 0;

void setup()
{
  pinMode(LedPinDr, OUTPUT);
  pinMode(LedPinGa, OUTPUT);

  servo01.attach(3);
  servo02.attach(5);

  Serial.begin(115200);
}

void loop()
{
  unsigned long temps = millis();
  //Serial.print(temps);Serial.print('\t');
  //Serial.print(temps01);Serial.print('\t');
  //Serial.print(temps02);Serial.print('\t');
  //Serial.print(temps03);Serial.print('\t');
  //Serial.println(temps04);

  if (temps - temps01 >= 500)
  {
    temps01 = temps;
    ledDroite();
  }
  if (temps - temps02 >= 50)
  {
    temps02 = temps;
    ledGauche();
  }
  if (temps - temps03 >= 500)
  {
    temps03 = temps;
    tacheservo01();
  }
  if (temps - temps04 >= 500)
  {
    temps04 = temps;
    tacheservo02();
  }

}

void ledDroite()
{ //Serial.print(F("LD"));
  brightness01 += increment1;
  if (brightness01 >= 255)
  {
    brightness01 = 255;
    increment1 = -increment1;
  }
  else if (brightness01 <= 0)
  {
    brightness01 = 0;
    increment1 = -increment1;
  }
  // Serial.print(F(" brigh01 = "));
  //Serial.print(brightness01);
  //Serial.print(F("  incr = "));
  //Serial.println(increment1);
  analogWrite(LedPinDr, brightness01);
  analogWrite(LedPinGa, brightness01);
}

void ledGauche()
{ //Serial.print(F("LG"));
  brightness02 += increment2;
  if (brightness02 >= 255)
  {
    brightness02 = 255;
    increment2 = -increment2;
  }
  else if (brightness02 <= 0)
  {
    brightness02 = 0;
    increment2 = -increment2;
  }
  //Serial.print(F(" brigh02 = "));
  //Serial.print(brightness02);
  //Serial.print(F("  incr = "));
  //Serial.println(increment2);
  analogWrite(LedPinGa, brightness02);
}

void tacheservo01()
{ //Serial.println(F("S_1"));
  if (pos <= 1000)
  {
    pos = 2000;
    servo01.writeMicroseconds(pos);
  }
  else
  {
    pos = 1000;
    servo01.writeMicroseconds(pos);
  }
}

void tacheservo02()
{ //Serial.println(F("S_2"));
  if (pos2 <= 1000)
  {
    pos2 = 2000;
    servo02.writeMicroseconds(pos2);
  }
  else
  {
    pos2 = 1000;
    servo02.writeMicroseconds(pos2);
  }
}

Il y a aussi ça qu'est bizare:

C'est normal ce LedPinGa dans ledDroite()?

J'ai modifié le message de base :sweat_smile:

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