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);
 }

A.L.I.M.84

Atelier Lumière Interaction Machine Mardi 11 avril.Début de réflexion sur la programmation d’un séquentiel d’évènements scénographiques à l’aide d’arduino. Première séance : commencer par parler « pseudo-code »… (Séverine, Stefan, Joël, Xavier).

  Ce programme allume puis éteint progressivement une LED branchée sur la broche 3

  lorsque le bouton poussoir est appuyé en utilisant la boucle While

*/

int BP = 2; // broche du bouton poussoir

//int led1 = 3; // broche de la LED

//int led2 = 5; // broche de la LED

//int led3 = 6; // broche de la LED

int NB_LEDS = 3;

int leds[] = {3, 5, 6};

int vals[] = {0, 150, 250};

int pas[] = {-1, 1, 2};

//int i1 = 0; // variable de la boucle for Led1

//int i2 = 75; // variable de la boucle for Led2

//int i3 = 150; // variable de la boucle for Led3

void setup() //setup est déroulé une seule fois après la remise à zéro

{

  Serial.begin(9600);

  for (int i = 0; i < NB_LEDS; i++) {

   pinMode(leds[i], OUTPUT);

  }

}

void loop() // loop est déroulé indéfiniment

{

  for(int i = 0; i < NB_LEDS; i++) {

    if (vals[i] + pas[i] >= 255 || vals[i] + pas[i] <= 0) pas[i] = -pas[i];

    vals[i] += pas[i];

    analogWrite(leds[i], vals[i]);

    Serial.print(vals[i]);

    Serial.print(" ");

  }

  Serial.println();

  delay(10);