Servomoteur mouvement progressif et led RGB dimable

Bonjour,
Je cherche à coder une action en boucle me permettant de faire bouger 2 servomoteurs de 0 à 180° progressivement sur une temporalité de 3 secondes puis retourner à leur position d'origine sur la même temporalité. En parallèle de ce mouvement, j'utilise des rubans leds RGB qui doivent s'allumer et s'éteindre progressivement en "blanc chaud" (r=225, G=255, B=255). Pour ceci j'ai réalisé le code suivant :

#include <Servo.h>



#define PIN_SERVO1 6
#define PIN_SERVO2 5

int RedPin = 10;      //Arduino driving pin for Red
int GreenPin = 11;    //Arduino driving pin for Green
int BluePin = 9;      //Arduino driving pin for Blue
int dur;

Servo servo1;
Servo servo2;


void setColor(int red, int green, int blue)
{
  analogWrite(RedPin, red);
  analogWrite(GreenPin, green);
  analogWrite(BluePin, blue);

}

void setup() {
  pinMode(RedPin, OUTPUT);    //Init Arduino driving pins
  pinMode(GreenPin, OUTPUT);
  pinMode(BluePin, OUTPUT);
  Serial.begin(9600);

  pinMode(PIN_SERVO1, OUTPUT);
  pinMode(PIN_SERVO2, OUTPUT);

  servo1.attach(PIN_SERVO1);
  servo2.attach(PIN_SERVO2);
}

void loop() {

  //delay(5);
  unsigned long t = millis();
  long dur = t % 6000;

  float servopos = 0 ;
  float servopos2 = 0;
  float r = 0;
  float g = 0;
  float b = 0;


  if (dur > 0 && dur < 3000) {
    servopos = map(dur, 0, 3000, 0 , 1800) / 10.;
    servopos2 = map(dur, 0, 3000, 0 , 1800) / 10. ;
    r = map(dur, 0, 3000, 0, 2350) / 10.;
    g = map(dur, 0, 3000, 0, 2550) / 10.;
    b = map(dur, 0, 3000, 0, 2550) / 10.;

    servo1.write(servopos);
    servo2.write(servopos2);

    analogWrite(RedPin, r);
    analogWrite(GreenPin, g);
    analogWrite(BluePin, b);

  
  else if (dur > 3000 && dur < 6000) {

     servopos = map(dur, 6001, 9000, 1800 , 0)/10.;
     servopos2 = map(dur, 6001, 9000, 1800 , 0)/10.;
     r = map(dur, 6001, 9000, 2350, 0)/10.;
     g = map(dur, 6001, 9000, 2550, 0)/10.;
     b = map(dur, 6001, 9000, 2550, 0)/10.;

    servo1.write(servopos);
    servo2.write(servopos2);

   
    analogWrite(RedPin, r);
    analogWrite(GreenPin, g);
    analogWrite(BluePin, b);
   


  }
  Serial.print("servo1: ");
  Serial.print(servopos);
  Serial.print(", servo2: ");
  Serial.print(servopos2);
  Serial.print(",red: ");
  Serial.print(r);
  Serial.print(",green: ");
  Serial.print(g);
  Serial.print(",blue: ");
  Serial.print(b);
  Serial.println();

}

Cependant après téléversement, le mouvement des servos est saccadé et les leds s'allument et s'éteignent progressivement mais uniquement en couleur verte quoi que je fasse... (j'ai testé les leds et autre et tous les composants du circuit sont bons).

Avez-vous une solution ?

Merci d'avance

Bienvenue sur le forum. Vous pouvez continuer ici, ou trouver la version en français de ces fora.

Si vous continuez ici, veuillez utiliser google translate en anglais, afin que nous n'ayons pas tous à le faire nous-mêmes.

Du moins ceux qui ne parlent pas français.

a7

(Code)

Like that.

a7

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

"➜ moved to the French forum."

Pourquoi? Why? Plenty of people do just fine here using google translate.

a7

Better that you read again the Forum Rules. The native laguage of OP is French so the French forum is the correct place.

Dans la doc de la librairie Servo on trouve ça.

The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins.
Donc il faudrait chercher d'autres pins pour tes LEDs

Autrement, tu as écrit ça

long dur = t % 6000;
.....
else if (dur > 3000 && dur < 6000) {
servopos = map(dur, 6001, 9000, 1800 , 0)/10.;
servopos2 = map(dur, 6001, 9000, 1800 , 0)/10.;

Tu ne vois pas quelque chose de bizarre dans les bornes des map()

Tu as écrit ça

r = map(dur, 0, 3000, 0, 2350) / 10.;
....
analogWrite(RedPin, r);

Or analogWrite() prend en argument pour le rapport cyclique une valeur comprise entre 0 et 255.

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