led NEOPixel et arduino -> optimisation du code

Modérateur : Dehas

Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

Salut les mecs!

Je me tourne vers la section Codes et Programmations a des fins d'optimisation d'un code qui aussi, je pense, peu vous intéresser. Bref je profite de ce partage de création pour chercher de l'aide aussi! ;)

Ce que je voulais faire:

Mettre des bandes de leds neopixel sur mon 250 et les piloter via un arduino. Même si je sais que la FC CC3D peut les prendre en charge via cleanflight, je souhaite rester sous openpilot (d'ou l'ajout d'un arduino nano.)

Je souhaite modifier le jeux d'éclairage par au moins 2 entrées PWM (pitch et throttle par exemple)

Ce que j'ai fait:


Je me sert du signal PWM de la sortie gimbal de la CC3D en pitch pour modifier le jeu éclairage des leds.

Voici ce que mon prototype donne:



https://youtu.be/lwqDGxLYiyA

ici sur un APM 2.6 (test)


https://youtu.be/UX4WwejS_Yo

Ce que j'ai du mal a faire

Dans les deux videos précédentes je ne traite qu'un seul signal PWM.

Si j'en traite un deuxième, l'arduino se met a ramer. Je m'en rend compte avec la vitesse de scintillement qui ralenti énormément.

Et alors?

bein et alors, il y a surement un moyen d'optimiser tout ça (les FC traitent bien au moins 4 entrées + traitement + sortie) sauf que je ne sais pas du tout coder en C (c'est mon tout premier code et je n'ai pas honte de le dire mais entre les recherches, le codage (adaptation de code existant), les tests j'ai mis 2 jours ^^, bref je manque de méthodes et d’expériences en la matière.

Et j'aimerai également vous mettre le code source a dispo mais comment et ou? 8/

pour les intéressés voici la masse et l'encombrement global :]

Image

Tcho! et merci d'avance.


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Dehas »

Pour le code tu le poste entre les balise code !!


Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

how yeah!

le voici

Code : Tout sélectionner


//Déclarations relatives aux signaux PWM

//THRO
int rcPin1 = 3; //PWM signal arduino pin pour channel 1
//PITCH
int rcPin2 = 4; //PWM signal arduino pin pour channel 2
int ch1 = 0;    //Receiver channel 1 pwm value
int ch2 = 0;    //Receiver channel 2 pwm value

//Déclarations relatives aux LEDs

#include <FastLED.h>

#define LED_PIN     2 //Pin signal pour leds
#define COLOR_ORDER GRB
#define CHIPSET     WS2811
#define NUM_LEDS    8

#define BRIGHTNESS  200
#define FRAMES_PER_SECOND 60

CRGB leds[NUM_LEDS];

// Fire2012 with programmable Color Palette
//
// This code is the same fire simulation as the original "Fire2012",
// but each heat cell's temperature is translated to color through a FastLED
// programmable color palette, instead of through the "HeatColor(...)" function.
//
// Four different static color palettes are provided here, plus one dynamic one.
// 
// The three static ones are: 
//   1. the FastLED built-in HeatColors_p -- this is the default, and it looks
//      pretty much exactly like the original Fire2012.
//
//  To use any of the other palettes below, just "uncomment" the corresponding code.
//
//   2. a gradient from black to red to yellow to white, which is
//      visually similar to the HeatColors_p, and helps to illustrate
//      what the 'heat colors' palette is actually doing,
//   3. a similar gradient, but in blue colors rather than red ones,
//      i.e. from black to blue to aqua to white, which results in
//      an "icy blue" fire effect,
//   4. a simplified three-step gradient, from black to red to white, just to show
//      that these gradients need not have four components; two or
//      three are possible, too, even if they don't look quite as nice for fire.
//
// The dynamic palette shows how you can change the basic 'hue' of the
// color palette every time through the loop, producing "rainbow fire".

CRGBPalette16 gPalx;
CRGBPalette16 gPal8;
CRGBPalette16 gPal7;
CRGBPalette16 gPal6;
CRGBPalette16 gPal5;
CRGBPalette16 gPal4;
CRGBPalette16 gPal3;
CRGBPalette16 gPal2;
CRGBPalette16 gPal1;
//CRGBPalette16 gPal0;

void setup() {
  
  //Setup relatif aux signaux PWM
  
  pinMode(rcPin1, INPUT);
  Serial.begin(7200);
  
  pinMode(rcPin2, INPUT);
  Serial.begin(7200);
  
  //Setup relatif aux LEDS
  
  delay(300); // sanity delay
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness( BRIGHTNESS );

  // This first palette is the basic 'black body radiation' colors,
  // which run from black to red to bright yellow to white.
  //gPal = HeatColors_p;
  
  // These are other ways to set up the color palette for the 'fire'.
  // First, a gradient from black to red to yellow to white -- similar to HeatColors_p
  // gPal = CRGBPalette16( CRGB::Black, CRGB::Red, CRGB::Yellow, CRGB::White);
  

  //Avant MAX
  gPal8 = CRGBPalette16( CRGB::Orange, CRGB::Yellow, CRGB::Orange,  CRGB::Red);
  
  //Avant toute +
  gPal7 = CRGBPalette16( CRGB::Black, CRGB::Yellow, CRGB::Orange,  CRGB::Orange);
  
  //Avant toute
  gPal6 = CRGBPalette16( CRGB::Black, CRGB::Green, CRGB::Yellow,  CRGB::Yellow);  
  
  //Avant Leger +
  gPal5 = CRGBPalette16( CRGB::Black, CRGB::Green, CRGB::Yellow,  CRGB::Green);
    
  //Avant Léger
  gPal4 = CRGBPalette16( CRGB::Black, CRGB::Green, CRGB::Green,  CRGB::Blue);
  
  //A plat.
  gPal3 = CRGBPalette16( CRGB::Black, CRGB::Blue, CRGB::Aqua,  CRGB::Blue);
  
  //Arrière léger
  gPal2 = CRGBPalette16( CRGB::Black, CRGB::Blue, CRGB::Purple,  CRGB::Red);
  
  //Arrière fort
  gPal1 = CRGBPalette16( CRGB::Red, CRGB::Purple, CRGB::Orange,  CRGB::Red);
  
  //Defaut, mauvais inputs
  //gPal0 = CRGBPalette16( CRGB::Red, CRGB::Blue, CRGB::Green,  CRGB::White);
}

void loop()
{
  // Add entropy to random number generator; we use a lot of it.
  random16_add_entropy( random());

  // Fourth, the most sophisticated: this one sets up a new palette every
  // time through the loop, based on a hue that changes every time.
  // The palette is a gradient from black, to a dark color based on the hue,
  // to a light color based on the hue, to white.
  //
  //   static uint8_t hue = 0;
  //   hue++;
  //   CRGB darkcolor  = CHSV(hue,255,192); // pure hue, three-quarters brightness
  //   CRGB lightcolor = CHSV(hue,128,255); // half 'whitened', full brightness
  //   gPal = CRGBPalette16( CRGB::Black, darkcolor, lightcolor, CRGB::White);


  Fire2012WithPalette(); // run simulation frame, using palette colors
  
  FastLED.show(); // display this frame
  FastLED.delay(1000 / FRAMES_PER_SECOND);
}


// Fire2012 by Mark Kriegsman, July 2012
// as part of "Five Elements" shown here: http://youtu.be/knWiGsmgycY
//// 
// This basic one-dimensional 'fire' simulation works roughly as follows:
// There's a underlying array of 'heat' cells, that model the temperature
// at each point along the line.  Every cycle through the simulation, 
// four steps are performed:
//  1) All cells cool down a little bit, losing heat to the air
//  2) The heat from each cell drifts 'up' and diffuses a little
//  3) Sometimes randomly new 'sparks' of heat are added at the bottom
//  4) The heat from each cell is rendered as a color into the leds array
//     The heat-to-color mapping uses a black-body radiation approximation.
//
// Temperature is in arbitrary units from 0 (cold black) to 255 (white hot).
//
// This simulation scales it self a bit depending on NUM_LEDS; it should look
// "OK" on anywhere from 20 to 100 LEDs without too much tweaking. 
//
// I recommend running this simulation at anywhere from 30-100 frames per second,
// meaning an interframe delay of about 10-35 milliseconds.
//
// Looks best on a high-density LED setup (60+ pixels/meter).
//
//
// There are two main parameters you can play with to control the look and
// feel of your fire: COOLING (used in step 1 above), and SPARKING (used
// in step 3 above).
//
// COOLING: How much does the air cool as it rises?
// Less cooling = taller flames.  More cooling = shorter flames.
// Default 55, suggested range 20-100 
#define COOLING  100

// SPARKING: What chance (out of 255) is there that a new spark will be lit?
// Higher chance = more roaring fire.  Lower chance = more flickery fire.
// Default 120, suggested range 50-200.
#define SPARKING 200


void Fire2012WithPalette()
{
// Array of temperature readings at each simulation cell
  static byte heat[NUM_LEDS];

  // Step 1.  Cool down every cell a little
    for( int i = 0; i < NUM_LEDS; i++) {
      heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
    }
  
    // Step 2.  Heat from each cell drifts 'up' and diffuses a little
    for( int k= NUM_LEDS - 1; k >= 2; k--) {
      heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
    }
    
    // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
    if( random8() < SPARKING ) {
      int y = random8(7);
      heat[y] = qadd8( heat[y], random8(160,255) );
    }

    // Step 4.  Map from heat cells to LED colors
    
    // Mise a jour de la Pallette a jouer
    
      //Read in the lenght of the signal in microseconds
  //ch1 = pulseIn(rcPin1, HIGH, 25000);
  ch2 = pulseIn(rcPin2, HIGH, 25000);
  
  //calcul PITCH inclinaison dans un if avec résolution de 8 valeurs
  //valeurs Min 911 et Max 1925 observées dans Outil -> Moniteur Série
  if (ch2 < 1037) {gPalx = gPal1;} //Arrière fort
  else if (ch2 >= 1037 && ch2 < 1163 ) {gPalx = gPal2;} //Arrière léger
  else if (ch2 >= 1163 && ch2 < 1289 ) {gPalx = gPal3;} //A plat.
  else if (ch2 >= 1289 && ch2 < 1415 ) {gPalx = gPal4;} //Avant Léger
  else if (ch2 >= 1414 && ch2 < 1541 ) {gPalx = gPal5;} //Avant Leger +
  else if (ch2 >= 1541 && ch2 < 1667 ) {gPalx = gPal6;} //Avant toute
  else if (ch2 >= 1667 && ch2 < 1793 ) {gPalx = gPal7;} //Avant toute +
  else if (ch2 > 1793) {gPalx = gPal8;} //Avant MAX
  
     
  
  //DEBUG
  //Print pour vérifier les valeurs. Outil -> Moniteur Série
  //Serial.print("Channel #1: THRO: ");
  //Serial.println(ch1);
  
  //Serial.print("Channel #2: PITCH: ");
  //Serial.println(ch2);
  
  //FIN Print pour vérifier les valeurs. Outil -> Moniteur Série
    
    
    //Surchage de la variable gPalx pour tests
    //gPalx = gPal0;
    //FIN Surchage de la variable gPalx pour tests
    
    
    // Fin Mise a jour de la pallette a jouer
    for( int j = 0; j < NUM_LEDS; j++) {
      // Scale the heat value from 0-255 down to 0-240
      // for best results with color palettes.
      byte colorindex = scale8( heat[j], 240);
      leds[j] = ColorFromPalette( gPalx, colorindex);
    }
}


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Avatar du membre
bruno
Pilote toutes catégories
Messages : 1820
Enregistré le : mar. 15 avr. 2014 11:39
Réputation : 1
Localisation : Créteil (94)

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par bruno »

Le pb est que les pixels led sont gourmante de mémoire et comme une nabi ne dipose que 2k de RAM ça vas très vite.
Mon idée serait de ne pas utiliser une nabi mais uno. Pb c'est pas la même taille.
Donc utiliser les capacités de la FC sera ton seul moyen. Ou n'utiliser que peu de les 3 avant et 3 arrière par exemple.


Avatar du membre
bruno
Pilote toutes catégories
Messages : 1820
Enregistré le : mar. 15 avr. 2014 11:39
Réputation : 1
Localisation : Créteil (94)

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par bruno »

Un autre truc:
Que ce passe t-il lorsque tu fait la modif du begin(7200) en plus ou moins ?


Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

salut Bruno

ca va mieu quand on baisse la valeur, a l'origine c’était 9600.

A priori c'est encore trop pour faire deux lecture de signal. Tu as une recommandation pour cette valeur?

La partie test avec le if ne te parait pas trop chargée?


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Avatar du membre
bruno
Pilote toutes catégories
Messages : 1820
Enregistré le : mar. 15 avr. 2014 11:39
Réputation : 1
Localisation : Créteil (94)

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par bruno »

Oui effectivement.
Mon avis serais de me modifier les valeurs lue sur une plage, d'instancier un boolean afin de modifier les pixels Led en cas de changement de ce dernier.
Mais ceci ne changera pas beaucoup ton pb de manque de mémoire, et là franchement y-a beaucoup de solution.
Mais des tests sont à faire.
Quel est le poids du sketch ?
Parvenir à une utilisation qui puisse permetre le sketch + 4 ou 5 octets par led sans que tous ceci ne dépasse 2 ko.
Un chalenge, c'est bien ;)


Avatar du membre
Tomdu38
Pilote toutes catégories
Messages : 1104
Enregistré le : dim. 19 mai 2013 17:01
Réputation : 0

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Tomdu38 »

Salut,

Beau challenge en effet. :super:

C'est quoi ton objectif ? Utiliser ces indications lumineuses pour du vol à vue ? Ou pour du fpv ?

Parce que si c'est pour être vu en fpv, Il faut vraiment être proche. Dans cette utilisation, il me semble, qu'il faudrait juste une bande clignotante, et si tu freines
que la bande de leds passe au rouge fixe... par exemple.

De même que dans cleanflight tu as les options clignontants ...etc en fpv il est difficile de distinguer ces variations.

Dans mon cas, j'ai un attiny qui me fait clignoter la barre en vert, c'est pour moi la couleur qui se voit la mieux. Mais en voyant ton projet, j'ai trouvé l'idée de la signalisation "freinage" sympa ... il faut voir si on arrive à distinguer en fpv cette variation.

Bonne continuation.


Service de découpe CNC pour les membres du forum NON DISPO POUR LE MOMENT
FPV Racer 250 (HomeMade)
*** In 4S high trust ***
Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

bruno a écrit :Oui effectivement.
Quel est le poids du sketch ?

Salut :) j'imagine que tu me demande le poid du binaire ? J'utilise l'interface arduino, a part téléversé directement après compilation je ne saurai te dire ou générer juste le binaire compilé.


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

Tomdu38 a écrit :
C'est quoi ton objectif ? Utiliser ces indications lumineuses pour du vol à vue ? Ou pour du fpv ?

Parce que si c'est pour être vu en fpv, Il faut vraiment être proche. Dans cette utilisation, il me semble, qu'il faudrait juste une bande clignotante, et si tu freines
que la bande de leds passe au rouge fixe... par exemple.

hello,

C'est purement pour le FPV.
En fait je me doute que dans l'absolu derrière les lunettes on voit mal ce genre d'effet lumineux. Je compte surtout sur un mec derrière moi avec sa mobius ^^, en gros c'est uniquement pour les vidéos post vol plutôt que pour le vol en lui même.

Puis aussi pour l'effet chiadé du show du feu arrière juste comme ça. ::d


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Avatar du membre
bruno
Pilote toutes catégories
Messages : 1820
Enregistré le : mar. 15 avr. 2014 11:39
Réputation : 1
Localisation : Créteil (94)

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par bruno »

Lowrendzow a écrit :
bruno a écrit :Oui effectivement.
Quel est le poids du sketch ?

Salut :) j'imagine que tu me demande le poid du binaire ? J'utilise l'interface arduino, a part téléversé directement après compilation je ne saurai te dire ou générer juste le binaire compilé.
Tu pourra connaitre cette taille simplement en compilant le sketch.


Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

Ha,

donc j'ai 6240 octets sur un max de 30 720.

d'ailleurs.... je fais des essais mais j'interviens qu'a taton.

La ligne : Serial.begin(9600) permet juste une lecture de l'arduino depuis la console? Dans ce cas c'est inutile pour ce que je veux en faire.

Quand je baisse la valeur 1 ca va bien mieux. 2 ca n'a pas l'air d'influer sur le fonctionnement que je demande.


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Avatar du membre
bruno
Pilote toutes catégories
Messages : 1820
Enregistré le : mar. 15 avr. 2014 11:39
Réputation : 1
Localisation : Créteil (94)

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par bruno »

Serial.begin(9600) par exemple est la vitesse d'affichage du serial (qui la est la sortie moniteur) ceci peux être utiles dans ton cas pour du debug tu pourra le retirer plus tard.
Je pas regarde en profondeur ton code mais il me semble que quoi qu'il arrive dans ta boucle loop() tu fasse la mise à jour des pixel Led. Pourquoi ne pas plus tôt le faire que si la valeur actuelle est supérieur de x%.
Mais c'est une idée comme ça.


Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

Ha oui mais c'est une bonne idée.!!!!


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Avatar du membre
bruno
Pilote toutes catégories
Messages : 1820
Enregistré le : mar. 15 avr. 2014 11:39
Réputation : 1
Localisation : Créteil (94)

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par bruno »

Lowrendzow a écrit :Ha oui mais c'est une bonne idée.!!!!
A toi de voir.
J'ai plus de pixel les sous la main.
Mais en générale il est préférable de ne rafraîchir qu'en cas de changement.
C'est une des solution.


Avatar du membre
lamenace
Quadricopter
Messages : 188
Enregistré le : jeu. 10 juil. 2014 14:03
Réputation : 0

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par lamenace »

Tu as trouvé une solution a ton problème ?

Pour ma part j'ai réécrit tout mon code de gestion de mes leds pour ne plus utiliser du tout les delays. je ne me sert plus que du millis() et ça marche super bien, on peut executer plusieurs actions en simultané car c'est non bloquant.


Tarort FY650, Pixhawk 2.4.5, GPS NEO-7N, ESC ZTW Spider Series 30A, Sunnysky v3508 580kV, Nacelle 3D RCTimer
Reptile 500, Pixhawk Lite 2.4.6, ESC ZTW Spider Series 30A, Sunnysky v2216 800kV
Radio Hitec Aurora 9
Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

Salut!

Je n'y ai pas touché depuis un moment, j'ai profiter de clenflight avec une naze 32 pour faire mumuse avec les neopixels.

Cependant ce n'est pas un projet abandonné!

As tu un exemple de l'utilisation du fameux millis() ?


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Avatar du membre
lamenace
Quadricopter
Messages : 188
Enregistré le : jeu. 10 juil. 2014 14:03
Réputation : 0

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par lamenace »

Oui, le voici
https://learn.adafruit.com/multi-taskin ... for-timing" onclick="window.open(this.href);return false;


Tarort FY650, Pixhawk 2.4.5, GPS NEO-7N, ESC ZTW Spider Series 30A, Sunnysky v3508 580kV, Nacelle 3D RCTimer
Reptile 500, Pixhawk Lite 2.4.6, ESC ZTW Spider Series 30A, Sunnysky v2216 800kV
Radio Hitec Aurora 9
Avatar du membre
Lowrendzow
Tricopter
Messages : 132
Enregistré le : mar. 8 juil. 2014 08:57
Réputation : 0
Contact :

Re: led NEOPixel et arduino -> optimisation du code

Message non lu par Lowrendzow »

merci m'sieur! ;)


SNAFU: Situation Normal, All Fucked Up


https://www.youtube.com/channel/UCJWkL7 ... FXdq_c2qoQ
Répondre

Retourner vers « Codes et Programmations »