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