[Aide] Arduino + drone + neopixels

Bonjour,

Je vous explique mon petit projet vite fais.

J'ai construit mon propre quadricoptere que vous pouvez voir ici Sign in - Google Accounts

J'avais déjà installer de simple LED RGB avec 2 couleurs que j'ai choisit.

Bleu pour le devant et vert pour l’arrière. Mais je trouver ça trop ennuyeux d'avoir 2couleurs fixe.

Alors je viens ici demander de l'aide pour programmer mes leds selon mes envies.

Sur mon quadri j’ai 2ruban de 29 néopixel et un de 8. (1rubande de 29led a l’arrière, plus un de 8led, et 1ruban devant)

Je suis totalement débutant avec arduino !

J'utilise FastLed qui a des effet de lumières vraiment pas mal !

Pour commencer

J'aimerais donc avoir des effets différents sur différentes bandes.

J'aime beaucoup l'effet SnowSparkle que j'aimerais utiliser pour l’arrière de mon drone. (1bande de 29led (PIN10) et une de 8led (PIN11))

J'arrive a changer la couleur j'ai choisit rouge avec les étincelles blanches( très très jolie)

Et pour le devant je voudrais un effet tel que KITT en vert. (1bande de 29led (PIN8))

J'ai aussi 2 petits spot blanc pour les cameras que j'aimerais déclencher d'un interrupteur sur la télécommande.

Pour le câblage j’ai mis une résistance de 470ohm sur chaque câble data des bandes de led et un condensateur de 1000uhf 6.3V entre le noir et rouge.

Pour les spot blanc j'utilise un transistor tel que L7805CV j'ai pris l'alim 12V du drone que je relis au 2premieres broches du transistor (le rouge sur la première et le noir sur celle du milieux ) L'alim des leds sont aussi relier sur ses broches la.Quand a la dernière broche du transistor je la relie a la PIN 9 de l'arduino. Je suis pas sur de ce câblage ?

Par la suite j'aimerais que les leds réagissent aux différents mouvements du drone.

Merci d'avance pour vos réponses.

Commencez par vous familiariser avec l'Arduino et jouez avec la librairie fastLED; il y a plein d'exemples pas très compliqués à comprendre

Ensuite essayez de faire un bout de code et postez le si vous avez des pbs

Bonjour,

Oui j'ai déjà pas mal fais "mumuse" avec les exemples de FastLed.

J'aimerais comprendre comment gérer plusieurs bandes et attribuer des effets différents dans un même code.

J'ai beau chercher sur le net je trouve pas d'explication la dessus.

il faut bien se souvenir qu'un effet, c'est une succession de commandes d'affichage. quand vous n'avez qu'un strip c'est simple, vous définissez des couleurs, vous les affichez vous attendez un peu et vous recommencez

quand vous avez plusieurs strip qui doivent bouger à différents moments alors l'approche ci dessus ne va plus - vous ne pouvez pas vous permettre d'attendre un peu.

il faut donc gérer plusieurs timing séparés. ça se fait en utilisant la fonction millis() et en laissant la boucle tourner.

voici un exemple de code avec 3 timing différents pour des actions. (ici juste imprimer t1, t2, t3 à des moments non coordonnés.

const unsigned long tempo1 = 300ul;
const unsigned long tempo2 = 700ul;
const unsigned long tempo3 = 1100ul;

unsigned long t1, t2, t3;

void setup() {
  Serial.begin(115200);
  t1 = millis();
  t2 = t1;
  t3 = t1;
}

void loop() {

  if (millis() - t1 >= tempo1) { // la tempo1 est passée
    Serial.println("t1");
    t1 += tempo1; // prochain moment d'action
  }

  if (millis() - t2 >= tempo2) { // la tempo2 est passée
    Serial.println("t2");
    t2 += tempo2; // prochain moment d'action
  }

  if (millis() - t3 >= tempo3) { // la tempo3 est passée
    Serial.println("t3");
    t3 += tempo3; // prochain moment d'action
  }

  // ici vous pouvez faire autre chose si c'est pas bloquant / trop long

}

l'idée c'est de faire la même chose avec vos LEDs, avec des tempos plus courtes sans doute pour le mouvement des pixels et un if en plus pour savoir si l'effet doit avoir lieu.

Bonjour,

Merci de votre réponses.
Je ne sais pas si je me suis bien fais comprendre…?

J’aurais plus vue quelque choses comme ca moi.

#include "FastLED.h"

#define NUM_LEDS 29
#define NUM_STRIPS 3

CRGB leds[NUM_LEDS];
CLEDController *controllers[NUM_STRIPS];
uint8_t gBrightness = 128;

void setup() { 
  controllers[0] = &FastLED.addLeds<WS2812,8, GRB>(leds, NUM_LEDS);
  controllers[1] = &FastLED.addLeds<WS2812,10, GRB>(leds, NUM_LEDS);
  controllers[2] = &FastLED.addLeds<WS2812,11, GRB>(leds, NUM_LEDS);
}

void loop() { 
  // draw led data for the first strand into leds
  fill_solid(leds, NUM_LEDS, CRGB::Green);
  controllers[0]->showLeds(gBrightness);

  // draw led data for the second strand into leds
  fill_solid(leds, NUM_LEDS, CRGB::Red);
  controllers[1]->showLeds(gBrightness);

  // draw led data for the third strand into leds
  fill_solid(leds, NUM_LEDS, CRGB::Blue);
  controllers[2]->showLeds(gBrightness);
}

Mais au lieu d’avoir une simple Led qui s’allume je voudrais des effet differents
Par exemple:
controller0 = KIIT OU KNIGHTRIDER
controller1 = Snowswparkle
controller2 = snowsparkle ou autre (strip de 8led) mais j’ai déjà définis un nombre de LEDde 29 (#define NUM_LEDS 29)

Ben oui tout est là le problème

Si vous appelez d'abord controller0 il va faire son show, puis controller1 puis controller2 mais i vous ne les aurez pas en même temps.

Allez regarder le code source des animations que vous voulez effectuer. Par exemple

void loop() {
  SnowSparkle(0x10, 0x10, 0x10, 20, random(100,1000));
}

void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
  setAll(red,green,blue);
  
  int Pixel = random(NUM_LEDS);
  setPixel(Pixel,0xff,0xff,0xff);
  showStrip();
  delay(SparkleDelay);
  setPixel(Pixel,red,green,blue);
  showStrip();
  delay(SpeedDelay);
}
[code]

Vous voyez que la boucle appelle sans cesse SnowSparkle avec un délai de 20 utilisé entre 2 affichages, puis un autre aléatoire entre 100 et 1000ms avant de revenir  la loop()

Donc le pb de ce code c'est ces attentes actives. Il faut les virer et rebâtir l'animation en gérant le temps avec millis() comme montré plus haut.

Bonjour,

Je suis désolé mais je crois que vous n'avez pas bien compris ce que je voulais.

J'ai un strip de 29 LED pour le devant du drone qui est brancher sur la PIN 8
2 petit spot blanc egalement devant le drone qui est brancher sur la PIN 9

Un strip de 29 LED pour l'arriere du drone qui est brancher sur la PIN 10
Un strip de 8 LED pour l'arriere du drone qui est brancher sur la PIN 11

Sur la PIN 8 je veux un effet tel que KIIT ou Knightrider, les 2spot blanc je veux pouvoir les allumer d'un inter sur ma télécommande.

Sur la PIN 10 je veux l'effet Snowsparkle (je crois que le 20 fais reference a la durer d'une étincelles)

Et la PIN 11 je voudrais aussi l'effet Snowsparkle ou remplir le strip de rouge avec les 2ou3 LED du milieux en mode stroboscope.

Désolé si je rabâche les choses mais je ne suis pas sur que vous ayez bien compris ce que je voulais faire..

Merci

est-ce que vous voulez qu'il puisse s'exécuter en même temps?

Oui tous en même temps, quand j’allume mon drone.

alors j'ai bien compris ce que vous voulez faire... et je me répète, pour que les effets ne soient pas les uns derrières les autres mais en même temps, il faut décomposer chacun des effets en une séquence d'affichages et ensuite jouer ces séquences en même temps avec le bon timing.

Bonjour,

Je reviens vous solliciter car je n'arrive pas a trouver de véritable informations qui pourrais m'aider..
Je ne parviens pas a gérer plusieurs strip avec plusieurs effet.

Si on pourrais me donner un bout de code avec juste 2strip et 2effets différents que je puisse m'en servir comme exemple serais très cool =)

Merci bonne journée

bonsoir,

il n'y a pas d'exemple facile à coder à partir des codes unitaires qui plus est quand le timing est aléatoire.

imaginez que les lettre de l'alphabet soient des actions sur des LEDs, par exemple

effet 1: AABAC
effet 2: EFEFG

quand vous appelez effet 1, il joue les "lettres" dans l'ordre avec 1 affichage après chaque lettre puis s'arrête quand vous appelez effet 2, il joue les "lettres" dans l'ordre avec 1 affichage après chaque lettre puis s'arrête

Donc les effets sont l'un après l'autre.

Ce que vous voulez faire c'est

AE + affichage
AF + affichage
BE + affichage
AF + affichage
CG + affichage

==> il faut analyser quel est le timing commun de vos effets puis déterminer à un instant T quels sont les LEDs allumées et envoyer cela

Bonjour merci de votre réponses rapide et de prendre du temps pour m'expliquer c'est cool :slight_smile:
Je crois avoir saisie ce que vous m'avez dit.

Mais pour l'instant je suis incapable d’écrire un code en entier tout seul je suis novice ici.
J'ai beaucoup de mal a comprendre le langage qui est pas facile qui plus est la plupart des sujet que je trouve sont en anglais.. :confused:

Il n'y aurais vraiment pas moyen de m’écrire un bout de code avec au moins de 2PIN et 1effet différent pour chaque PIN ? Pour que je vois a quoi ça ressemble et que je puisse prendre appui dessus.

J'essaye de m'inspirer de celui la Blingged up Avada Quadcopter with WS2812B leds and Arduino - YouTube

hello
j'ai un peu de mal à te suivre.tu ne précises pas quelle est ta platine arduino. et tu dis:

Pour les spot blanc j'utilise un transistor tel que L7805CV j'ai pris l'alim 12V du drone que je relis au 2premieres broches du transistor (le rouge sur la première et le noir sur celle du milieux ) L'alim des leds sont aussi relier sur ses broches la.Quand a la dernière broche du transistor je la relie a la PIN 9 de l'arduino. Je suis pas sur de ce câblage ?

le 7805 est un régulateur et pas un transistor.
les inscriptions étant vers toi
selon ta description: tu alimentes la bête en +12V par la patte de gauche, tu mets le GND sur la patte du milieu. les spots sont raccordés à ces pattes là. donc tes spots sont alimentés en 12 V et fonctionnent en permanence. ensuite, tu dis que tu raccordes la sortie( patte de droite) du 7805 ( qui est du +5V) sur la pinoche 9 de l'arduino tu veux parler de D9?

oui, j'ai vraiment du mal à suivre...

data sheet ici

Blacklight92:
Mais pour l’instant je suis incapable d’écrire un code en entier tout seul je suis novice ici.
J’ai beaucoup de mal a comprendre le langage qui est pas facile qui plus est la plupart des sujet que je trouve sont en anglais… :confused:

Il n’y aurais vraiment pas moyen de m’écrire un bout de code avec au moins de 2PIN et 1effet différent pour chaque PIN ? Pour que je vois a quoi ça ressemble et que je puisse prendre appui dessus.

Si vous ne savez pas programmer ça va être difficile. Voici un bout de code qui travaille sur 2 strips différentes, la première avec 29 LEDs et la seconde avec 8 et fait un effet SnowSparkle sur les 2 en même temps avec la première à une luminosité de 128 et la seconde de 64

j’ai tapé ça sans tester, donc pas garanti que ça fonctionne mais ça vous donnera une idée de comment procéder: en gros vous avez une zone mémoire qui représente vos pixels pour chaque strip, vous mettez des couleurs sur le pixel qui va bien puis vous affichez, puis vous recommencer…

#include <FastLED.h>

#define NUM_LEDS_STRIP1 29
CRGB ledStrip1[NUM_LEDS_STRIP1];
CLEDController *controller1; // utile si on veut piloter que la strip #1 (la doc de la classe est ici http://fastled.io/docs/3.1/class_c_l_e_d_controller.html)
uint8_t gBrightness1 = 128;

#define NUM_LEDS_STRIP2 8
CRGB ledStrip2[NUM_LEDS_STRIP2];
CLEDController *controller2; // utile si on veut piloter que la strip #2
uint8_t gBrightness2 = 64;


void setup() {
  controller1 = &FastLED.addLeds<NEOPIXEL, 4>(ledStrip1, NUM_LEDS_STRIP1); // sur la pin 4
  controller2 = &FastLED.addLeds<NEOPIXEL, 5>(ledStrip2, NUM_LEDS_STRIP2); // sur la pin 5

  // on remplit strip1 en blanc
  fill_solid(ledStrip1, NUM_LEDS_STRIP1, CRGB::White);
  controller1->showLeds(gBrightness1); // exemple de controle uniquement sur strip1

  // on remplit strip2 en blanc
  fill_solid(ledStrip2, NUM_LEDS_STRIP2, CRGB::White);
  controller2->showLeds(gBrightness2);// exemple de controle uniquement sur strip2
}


void loop() {
  int p1, p2;

  // on choisit un pixel au hasard sur chaque strip
  p1 = random(0, NUM_LEDS_STRIP1);
  p2 = random(0, NUM_LEDS_STRIP2);

  // on leur donne une valeur
  ledStrip1[p1].setRGB(0x10, 0x10, 0x10);
  ledStrip2[p2].setRGB(0x10, 0x10, 0x10);

  // on affiche les 2 strips d'un coup
  FastLED.show();

  // on attend up peu
  delay(20);

  // on remet les pixels blancs
  ledStrip1[p1] = CRGB::White;
  ledStrip2[p2] = CRGB::White;

  // on affiche les 2 strips d'un coup
  FastLED.show();

  // on attend un peu de manière aléatoire entre 100ms et 1s
  delay(random(100, 1001));
}

ici le timing est synchrone, c’est à dire que les pauses sont au même moment sur chaque strip - si vous voulez des tempo différentes il faut gérer cela un peu différemment avec un test temporel pour chaque strip du genre

void loop()
{
  static unsigned long derniereActionStrip1 = 0;
  static unsigned long derniereActionStrip2 = 0;
  static unsigned long delaiStrip1 = random(100, 1001);
  static unsigned long delaiStrip2 = random(100, 1001);

  if (millis() - derniereActionStrip1 >= delaiStrip1) {
    // jouer avec les pixels de strip1
    int pixel = random(0, NUM_LEDS_STRIP1);
    ledStrip1[pixel].setRGB(0x10, 0x10, 0x10);
    controller1->showLeds(gBrightness1);
    delay(20);
    ledStrip1[pixel] = CRGB::White;
    controller1->showLeds(gBrightness1);
    derniereActionStrip1 += delaiStrip1;
    delaiStrip1 = random(100, 1001);
  }

  if (millis() - derniereActionStrip2 >= delaiStrip2) {
    // jouer avec les pixels de strip1
    int pixel = random(0, NUM_LEDS_STRIP2);
    ledStrip2[pixel].setRGB(0x10, 0x10, 0x10);
    controller2->showLeds(gBrightness2);
    delay(20);
    ledStrip2[pixel] = CRGB::White;
    controller2->showLeds(gBrightness1);
    derniereActionStrip2 += delaiStrip2;
    delaiStrip2 = random(100, 1001);
  }
}

Blacklight92:
J'essaye de m'inspirer de celui la Blingged up Avada Quadcopter with WS2812B leds and Arduino - YouTube

Est ce que tu as vu que dans la description tu as deux lien?
l'un avec la librairie neopixel
et le deuxieme avec le programme .

pourquoi tu t'en inspire pas??

dfgh:
le 7805 est un régulateur et pas un transistor.
les inscriptions étant vers toi
selon ta description: tu alimentes la bête en +12V par la patte de gauche, tu mets le GND sur la patte du milieu. les spots sont raccordés à ces pattes là. donc tes spots sont alimentés en 12 V et fonctionnent en permanence. ensuite, tu dis que tu raccordes la sortie( patte de droite) du 7805 ( qui est du +5V) sur la pinoche 9 de l’arduino tu veux parler de D9?

oui, j’ai vraiment du mal à suivre…

data sheet ici

Bonjour, oui tu as bien suivis c’est exactement ça ! La patte de droite sur la pin 9.
J’ai vu plusieurs montage comme ça et j’avais bien regarder le datasheet.
Ce n’est pas bon ? Pour l’instant ce montage n’est pas sous tension. J’utilise une UNO et pour le drone se seras une Pro Mini.

J-M-L:
la première avec 29 LEDs et la seconde avec 8 et fait un effet SnowSparkle sur les 2 en même temps avec la première à une luminosité de 128 et la seconde de 64

j’ai tapé ça sans tester, donc pas garanti que ça fonctionne mais ça vous donnera une idée de comment procéder: en gros vous avez une zone mémoire qui représente vos pixels pour chaque strip, vous mettez des couleurs sur le pixel qui va bien puis vous affichez, puis vous recommencer…

#include <FastLED.h>

#define NUM_LEDS_STRIP1 29
CRGB ledStrip1[NUM_LEDS_STRIP1];
CLEDController *controller1; // utile si on veut piloter que la strip #1 (la doc de la classe est ici FastLED: CLEDController Class Reference)
uint8_t gBrightness1 = 128;

#define NUM_LEDS_STRIP2 8
CRGB ledStrip2[NUM_LEDS_STRIP2];
CLEDController *controller2; // utile si on veut piloter que la strip #2
uint8_t gBrightness2 = 64;

void setup() {
 controller1 = &FastLED.addLeds<NEOPIXEL, 4>(ledStrip1, NUM_LEDS_STRIP1); // sur la pin 4
 controller2 = &FastLED.addLeds<NEOPIXEL, 5>(ledStrip2, NUM_LEDS_STRIP2); // sur la pin 5

// on remplit strip1 en blanc
 fill_solid(ledStrip1, NUM_LEDS_STRIP1, CRGB::White);
 controller1->showLeds(gBrightness1); // exemple de controle uniquement sur strip1

// on remplit strip2 en blanc
 fill_solid(ledStrip2, NUM_LEDS_STRIP2, CRGB::White);
 controller2->showLeds(gBrightness2);// exemple de controle uniquement sur strip2
}

void loop() {
 int p1, p2;

// on choisit un pixel au hasard sur chaque strip
 p1 = random(0, NUM_LEDS_STRIP1);
 p2 = random(0, NUM_LEDS_STRIP2);

// on leur donne une valeur
 ledStrip1[p1].setRGB(0x10, 0x10, 0x10);
 ledStrip2[p2].setRGB(0x10, 0x10, 0x10);

// on affiche les 2 strips d’un coup
 FastLED.show();

// on attend up peu
 delay(20);

// on remet les pixels blancs
 ledStrip1[p1] = CRGB::White;
 ledStrip2[p2] = CRGB::White;

// on affiche les 2 strips d’un coup
 FastLED.show();

// on attend un peu de manière aléatoire entre 100ms et 1s
 delay(random(100, 1001));
}




ici le timing est synchrone, c'est à dire que les pauses sont au même moment sur chaque strip - si vous voulez des tempo différentes il faut gérer cela un peu différemment avec un test temporel pour chaque strip du genre



void loop()
{
 static unsigned long derniereActionStrip1 = 0;
 static unsigned long derniereActionStrip2 = 0;
 static unsigned long delaiStrip1 = random(100, 1001);
 static unsigned long delaiStrip2 = random(100, 1001);

if (millis() - derniereActionStrip1 >= delaiStrip1) {
   // jouer avec les pixels de strip1
   int pixel = random(0, NUM_LEDS_STRIP1);
   ledStrip1[pixel].setRGB(0x10, 0x10, 0x10);
   controller1->showLeds(gBrightness1);
   delay(20);
   ledStrip1[pixel] = CRGB::White;
   controller1->showLeds(gBrightness1);
   derniereActionStrip1 += delaiStrip1;
   delaiStrip1 = random(100, 1001);
 }

if (millis() - derniereActionStrip2 >= delaiStrip2) {
   // jouer avec les pixels de strip1
   int pixel = random(0, NUM_LEDS_STRIP2);
   ledStrip2[pixel].setRGB(0x10, 0x10, 0x10);
   controller2->showLeds(gBrightness2);
   delay(20);
   ledStrip2[pixel] = CRGB::White;
   controller2->showLeds(gBrightness1);
   derniereActionStrip2 += delaiStrip2;
   delaiStrip2 = random(100, 1001);
 }
}

Cool merci beaucoup pour le code je vais pouvoir y voir un peut plus clair.

hazerty565:
Est ce que tu as vu que dans la description tu as deux lien?
l’un avec la librairie neopixel
et le deuxieme avec le programme .

pourquoi tu t’en inspire pas??

Oui bien sur j’ai bien lu la description et télécharger le code je l’ai essayer et essayer de le mettre a ma sauce mais ça marche très bizarrement j’ai l’impression que mais changement ne sont pas vraiment pris en compte

#include <Adafruit_NeoPixel.h> //Use the Adafruit Neopixel library as that deals with all the fiddly timing and such

//Just an easy way to remember which pins are assigned to which strips. You dont have to have 3 strips you can have more or less
#define LEFT_STRIP_PIN 4
#define BOTTOM_STRIP_PIN 5
#define RIGHT_STRIP_PIN 6
#define FRONT_STRIP_PIN 7

//How many LED pixels we have in each strip.
#define LEFT_STRIP_LED_COUNT 5
#define BOTTOM_STRIP_LED_COUNT 7
#define RIGHT_STRIP_LED_COUNT 5
#define FRONT_STRIP_LED_COUNT 4

Si je change le nombre de leds a 29 pour “front et bottom” le premier effet trail fonctionne jusqu’a la 7eme led et ce stop et puis plus rien…
Desfois si je met le même nombre de led partout ça se stop toujours a la 7eme led et ensuite ça enchaine sur l’effet police (qui est vraiment pas mal) mais ce stop au bout de 2sec aussi car je manque de puissance (la UNO est alimenter en usb) impossible de descendre la luminositer.

j’ai tapé ça sans tester, donc pas garanti que ça fonctionne mais ça vous donnera une idée de comment procéder:

Je viens de tester le code ca ne s’affiche pas bien et quand je televerse de nouveau projet.
Au debut j’ai ce message :

In file included from Strobe.ino:1:0:
C:\Users\**** pc\Documents\Arduino\libraries\FastLED-3.1.3/FastLED.h:17:21: note: #pragma message: FastLED version 3.001.003
 #    pragma message "FastLED version 3.001.003"
                     ^

Les pragma c’est juste la librairie qui fait sa pub… pas important c’est un faux warning

ça veut dire quoi “ça ne s’affiche pas bien”?

Non enfait ça va l'affichage car la luminosité étais trop forte donc après le blanc virer au rouge.
Par contre les étincelles ne sont pas pareil au lieux de briller, je crois que ça s'éteint.
J'ai mis un strip en rouge mais quand les étincelles apparaissent le pixel reste blanc et ne redevient pas rouge :confused:

Regardez mon code... il y a un commentaire qui dit  // on remet les pixels blancsdonc c'est un peu normal qu'ils ne redeviennent pas rouge... j'ai mis des commentaires, essayez de comprendre ce que ça fait