A.L.I.M.86

Atelier Lumière interaction machine Mardi 25 avril. Suite d’une réflexion sur la programmation d’un séquentiel d’évènements scénographiques à l’aide d’arduino (Xavier).

j'ai trouvé encore mieux (et moins tordu que l'exponentielle): un sinus(x) avec x entre 0 et pi/2, donne une valeur entre 0 et 1. Il suffit de lui donner une puissance paire (4, 10, 20, ...) pour "pincer" la courbe et trouver la progression qui te plaît. on peut même donner des coefficients différents à chaque sortie LED:


 J'ai codé un peu sur le simulateur et ça a l'air bon:

const float half_pi = (PI/2);    // pour eviter des calculs inutiles
 const int nb_leds = 3;              // nombre de leds à gérer
 const int led_pin[] = {3, 6, 9};
 
 const int pinch_factor[] = {  2,   4,   8};        // coeff de "pincement", chiffres pairs uniquement!
 const int step_divider[] = {256, 400, 140};      // plus le chiffre est grand, plus la vitesse est lente
 const int step_start[]   = {  0,   0,   0};                 // pour gérer un décalage au départ
 
 float step[nb_leds];            // la valeur de pas de chaque led (calculée selon la durée de cycle choisie)
 float led_angle[3];                // pour stocker l'angle courant de chaque led
 
 float led_value = 0;                // pour stocker temporairement le résultat du calcul
 
 // the setup routine runs once when you press reset:
 void setup() {
   for(int i=0; i<nb_leds; i++){
     pinMode(led_pin[i], OUTPUT);        // pin configurée en sortie
     digitalWrite(led_pin[i], LOW);        // pin passée à l'état bas
     step[i] = half_pi/step_divider[i];    // calcul de la valeur de pas de la led
   }
 }
 
 // the loop routine runs over and over again forever:
 void loop() {
   for (int i=0; i<nb_leds; i++){
     led_value = (pow(sin(led_angle[i]),pinch_factor[i])*255); // calcul de la valeur de PWM pour cette LED
     analogWrite(led_pin[i],round(led_value));
     if((led_angle[i]<0)||(led_angle[i]>half_pi)) step[i]=-step[i];  // inversion du pas si limites atteintes
     led_angle[i] += step[i];
   }
   delay(10);
 }

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *