Salut a tous je reviens avec un projet pour une 2CV

Salut...

Et un salut particulier a J-M-L :wink: ....que je ne sait toujours pas comment remercier pour son travail sur mon projet de commande de boite de vitesse séquentielle pour tracteur tondeuse de course !!!! :smiley: :smiley:

Bref ... pour mon second projet arduino ... je suis un deuchiste qui roule tous les jours avec sa titine....
Et sur ce coup.... j'aimerais apprendre a programmer ... et ne pas compter sur la bienveillance et l’intérêt de certains d'entre vous pour un projet "fun" et que je remercie encore au passage (J-M-L !!!! your're THE BEST !!!!!!!!!!!!!!! :wink: ) .... qui m'ont mâcher ... voir même "régurgiter" comme un oisillon dans son nid .... le travail de façons plus que digeste !....

Et donc... je me lance dans la conceptions ( non "kéké tuning" ... je précise !) de feux arrières led ronds séquentiels a base de leds ws2812 ....pour ma 2cv6 de 1978 ...

Pour ce projet ... je me base sur cette vidéo qui implique une bande led ws2812 standard ... mais qui correspond parfaitement au fonctionnement que je recherche dans le cadre de feux ronds pour garder l'effet retro et éviter de tomber dans le kéké tuning .... :

je vous met donc le lien de mon projet .... pour ceux qui voudrais s'inscrire sur le forum 2cv de référence ... DSL .... inscription obligatoire pour y avoir aces ... :
https://forum2pattes.forumactif.com/t106129-feux-arrieres-led-tout-en-un-sequentiels-pilote-par-arduino#1866824

Mais qui résume mon projet et mon état d'esprit :wink:

Et donc ... je m’égare ... alors je recolle a ce qui nous intéresse ici ... c'est a dire l'arduino !....

Je cherche des infos et des conseils pour programmer une matrice de leds ws2812 ronde tel que celle la :

Qui fonctionne merveilleusement bien !

Mais dont j'aimerais modifier le programme de base de la vidéo pour ajouter des Smiley/emoji de façons a d'une part ... remercier les automobilistes courtois ... qui sont très rares... mais aussi manifester mon mécontentement aux chauffards ( quitte a programmer un gros doigt !!!!) a l'aide de commandes au volant ... :wink: :smiley:

Et donc je cherche partout sur le net ....
il y a des solutions simples pour des matrices carré ou rectangulaires.... mais rien pour les rondes !

je me vois dejas être obliger de dessiner mes 2X133 leds sur une feuille blanche .... attribuer leur numéros de led a chacune... ... et sortir le papier calque pour programmer UN a UN chaque pixels a droite ET a gauche !!!!!

donc voila .... ca s'annonce une bonne grosse prise de tete pour pas grands chose.... mais je suis prêt a relever le défit ... ... mais a tout hasard ... si vous avez des solutions qui me faciliterais la vie dans ce projet ... je vous en remercie d'avance !!! :wink:

Bonjour akoirium

Ah! la 2 lapins!!! Une grande partie de mon enfance, mon père était mécano chez Citroën :wink:

Pourquoi pas imaginer un outil de programmation qui générerai les lignes de code pour l'Arduino.
Je partirai avec le tableur Excel, par exemple. Je ne te cacherai pas que des panneaux carrés ou rectangulaires faciliteraient le travail.

Cordialement
jpbbricole

1 Like

Bonjour akoirium
il existe pas mal de programme pour generer les effets/motifs de ws2812 chainées
le seul mais gros probléme est de gerer la transposition lineaire en circulaire.

tu recherche quelle taille ,
Idée rapide : une solution hybride genre couronne de x ws2812 autour d'une matrice de 8X8 65X65 mm ne te suffirais pas ?

si tu prend (exemple ) un anneau de 24 leds et une matrice 8X8 çà peut facilement se résumer
en une matrice 8X11 , beaucoup plus facile (intellectuellement) à programmer

Attention, l'image est trompeuse. Ce qu'on voit sur l'image dans ce lien c'est un groupe d'anneaux de leds posés de manière concentrique. En plus clair, ce sont 8 anneaux séparés de rayons croissants et une led au centre.

Donc pas possible de dessiner un visage ou un doigt avec ça...
Si tu veux un exemple de programme : projet lunettes animées

Ce sont bien des anneaux sécable indépendants mais que l on peut souder facilement ensembles pour avoir l équivalent d une bande led en spirale... :

C est donc possible de programmer tout ça mais pas comme une matrice XY ... et cela risque d etre fastidieux !...

Par contre ... bonne idée le tableur exel... je vais y réfléchir...
Merci !....

Bonsoir akoirium

J'ai déjà créé des "bouts" de code pour un programme Arduino, cela générai un .h inséré avec un #include

Cordialement
jpbbricole

Comme j'en avais sous la main , juste pour se rendre compte de l'encombrement qui est déjà pas mal

Je pense qu'il est plus facile et plus efficace d'utiliser une matrice rectangulaire, quitte à ne jamais allumer les leds des angles. Avec les anneaux concentriques, je ne sais pas comment les dessins vont paraitre en final.

C est vrai que j ai pas pensé a une matrice carrée dans un anneau de led...

Mais le truc, c est que j ai dejas mon montage fonctionel :

Il ne me manque plus que les plafonniers led que j ai commandé et dont je vais virer les leds blanche qui vont me servir de boitier étanches...

C'est vrai que pour des animations de ce genre, les anneaux sont préférables. Mais pour des messages différents, ce sera plus dur...

:wink:
j'avais raté ce post ! je vois que vous êtes entre de bonnes mains.

Pouvez vous poster un bout de code qui commande une animation d'un bandeau? (l'effet remplissage rouge en spirale par exemple)

avec un peu de maths on doit pouvoir associer une matrice bitmap carrée à la position sur les cercles... ça agite un peu les méninges :slight_smile:

Salut...

bon j'ai pas trop avancé sur la modification du code...
J'en suis toujours a la phase " ingurgiter et digérer " les nombreux tutos sur les base de la programmation arduino ... :wink:

Par contre... j'ai fini mon montage des feux et compte les installer aujourd’hui sur ma 2cv...
J'ai tout de même dus revoir le nombre de leds a la baisse et retirer un anneau de leds car le tout ne rentrait pas dans les downtight qui me servent de boîtier...

Bref ca rend pas trop mal et vous ferai une petite vidéo une fois le tout installer...

Si non voici le code que j'utilise... celui du lien vidéo, avec juste les modifs de nombres de leds total et de clignotants ..., les vitesses d'animations ... , et une legére modification de la couleur des clignotants qui etait plus jaune que orange ... :

// HAZI TECH
// Program by Hasitha Jayasundara
// Subscribe to my YouTube Channel - http://www.youtube.com/c/HAZITECH?sub_confirmation=1

#include "Arduino.h"
#include <FastLED.h>

#define LED_PIN 2 //LED Strip Signal Connection 
#define ParkSignal 3 //Park Signal Connection
#define BrakeSignal 5 //Brake Signal Connection
#define LeftSignal 7 //Left Blinker Signal Connection
#define RightSignal 9 //Right Blinker Signal Connection
#define ReverseSignal 11 //Reverse Signal Connection

#define NUM_LEDS 186 //Total no of LEDs in the LED strip
#define BlinkerLEDs 56 //No of LEDs for Left/Right Blinker 

int BlinkerSpeed = 5; //Turn Signal Running LED Speed. Adjust this to match with your vehicle turn signal speed.
int BlinkerOffDelay = 100; //Turn Signal Off time. Adjust this to match with your vehicle turn signal speed.

int StartupSpeed = 5;
int ParkDetect = 0;

CRGB leds[NUM_LEDS];


void setup() 
{
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
pinMode(ParkSignal, INPUT);
pinMode(BrakeSignal, INPUT);
pinMode(LeftSignal, INPUT);
pinMode(RightSignal, INPUT);
pinMode(ReverseSignal, INPUT);
}


void loop() 
{
if(digitalRead(ReverseSignal)==1)
{
if(digitalRead(BrakeSignal)==0) //Reverse Light
{   
Reverse();
}

if(digitalRead(BrakeSignal)==1) //Brake Light
{   
BrakeFull();
}
}

if(ParkDetect == 0)
{
if(digitalRead(ParkSignal)==1) 
{
ParkDetect = 1;
}
}

if(ParkDetect == 2)
{
if(digitalRead(ParkSignal)==0) 
{
ParkDetect = 3;
}
}

if(ParkDetect == 1)
{
ParkON();
ParkDetect = 2;  
}

if(ParkDetect == 3)
{
ParkOFF();
ParkDetect = 0;  
}


if(digitalRead(ParkSignal)==0)
{
if(digitalRead(ReverseSignal)==0)
{
if((digitalRead(BrakeSignal)==0)&&(digitalRead(LeftSignal)==0)&&(digitalRead(RightSignal)==0)) //Brake Light
{
AllOff();
}

if((digitalRead(BrakeSignal)==1)&&(digitalRead(LeftSignal)==0)&&(digitalRead(RightSignal)==0)) //Brake Light
{
BrakeFull();
}
    
if((digitalRead(LeftSignal)==1)&&(digitalRead(RightSignal)==0)&&(digitalRead(BrakeSignal)==0)) //Left Blinker
{
RightOff();
LeftBlinker();
LeftDim();
delay (BlinkerOffDelay);
}

if((digitalRead(RightSignal)==1)&&(digitalRead(LeftSignal)==0)&&(digitalRead(BrakeSignal)==0)) //Right Blinker
{
LeftOff();
RightBlinker();
RightDim();
delay (BlinkerOffDelay);
}

if((digitalRead(LeftSignal)==1)&&(digitalRead(RightSignal)==0)&&(digitalRead(BrakeSignal)==1)) //Left Blinker & Brake
{
LeftDim();
RightFull(); 
LeftBlinker();
LeftDim();
delay (BlinkerOffDelay);
}

if((digitalRead(RightSignal)==1)&&(digitalRead(LeftSignal)==0)&&(digitalRead(BrakeSignal)==1)) //Right Blinker & Brake
{
RightDim();
LeftFull();
RightBlinker();
RightDim();
delay (BlinkerOffDelay);
}

if((digitalRead(LeftSignal)==1)&&(digitalRead(RightSignal)==1)&&(digitalRead(BrakeSignal)==0)) //Dual Blinker / Hazard
{
MiddleOff();
DualBlinker();
LeftDim();
RightDim();
delay (BlinkerOffDelay);
}

if((digitalRead(LeftSignal)==1)&&(digitalRead(RightSignal)==1)&&(digitalRead(BrakeSignal)==1)) //Dual Blinker / Hazard + Brake
{
LeftDim();
RightDim();
BrakeMiddle();
DualBlinker();
LeftDim();
RightDim();
delay (BlinkerOffDelay);
}
}
}


if(ParkDetect == 2)
{
if(digitalRead(ReverseSignal)==0)
{
if((digitalRead(LeftSignal)==0)&&(digitalRead(RightSignal)==0)&&(digitalRead(BrakeSignal)==0)) //Park Light
{   
ParkFull();
}

if((digitalRead(BrakeSignal)==1)&&(digitalRead(LeftSignal)==0)&&(digitalRead(RightSignal)==0)) //Brake Light
{
BrakeFull();
}
    
if((digitalRead(LeftSignal)==1)&&(digitalRead(RightSignal)==0)&&(digitalRead(BrakeSignal)==0)) //Left Blinker
{
LeftDim();
RightLit(); 
LeftBlinker();
LeftDim();
delay (BlinkerOffDelay);
}

if((digitalRead(RightSignal)==1)&&(digitalRead(LeftSignal)==0)&&(digitalRead(BrakeSignal)==0)) //Right Blinker
{
RightDim();
LeftLit();
RightBlinker();
RightDim();
delay (BlinkerOffDelay);
}

if((digitalRead(LeftSignal)==1)&&(digitalRead(RightSignal)==0)&&(digitalRead(BrakeSignal)==1)) //Left Blinker & Brake
{
LeftDim();
RightFull(); 
LeftBlinker();
LeftDim();
delay (BlinkerOffDelay);
}

if((digitalRead(RightSignal)==1)&&(digitalRead(LeftSignal)==0)&&(digitalRead(BrakeSignal)==1)) //Right Blinker & Brake
{
RightDim();
LeftFull();
RightBlinker();
RightDim();
delay (BlinkerOffDelay);
}

if((digitalRead(LeftSignal)==1)&&(digitalRead(RightSignal)==1)&&(digitalRead(BrakeSignal)==0)) //Dual Blinker / Hazard
{
LeftDim();
RightDim();
ParkMiddle();
DualBlinker();
LeftDim();
RightDim();
delay (BlinkerOffDelay);
}

if((digitalRead(LeftSignal)==1)&&(digitalRead(RightSignal)==1)&&(digitalRead(BrakeSignal)==1)) //Dual Blinker / Hazard + Brake
{
LeftDim();
RightDim();
BrakeMiddle();
DualBlinker();
LeftDim();
RightDim();
delay (BlinkerOffDelay);
}
}
}


}




















void ParkON()
{
for (int i = 0; i < (NUM_LEDS/2); i++)
  {
    leds[i] = CRGB(30, 0, 0);
    leds[i-1] = CRGB(0, 0, 0);
    leds[(NUM_LEDS-1)-i] = CRGB(30, 0, 0);
    leds[(NUM_LEDS)-i] = CRGB(0, 0, 0);
    FastLED.show();
    delay (StartupSpeed);    
  }
  
  for (int j = ((NUM_LEDS/2)-1); j >= 0; j--)
  {
    leds[j] = CRGB(30, 0, 0);
    leds[(NUM_LEDS/2-1)+((NUM_LEDS/2)-j)] = CRGB(30, 0, 0);
    FastLED.show();
    delay (StartupSpeed);    
  }

  for (int j = ((NUM_LEDS/2)-1); j >= 0; j--)
  {
    leds[j] = CRGB(255, 0, 0);
    leds[(NUM_LEDS/2-1)+((NUM_LEDS/2)-j)] = CRGB(255, 0, 0);
    FastLED.show();
    delay (StartupSpeed);    
  }

  for (int j = 255; j >= 60; j--)
  {  
    for (int i = 0; i < NUM_LEDS; i++)
    {
    leds[i] = CRGB(j, 0, 0);
    }
    FastLED.show();  
    delay (5);
  }
}

void ParkOFF()
{
  for (int j = 60; j <= 255; j++)
  {  
    for (int i = 0; i < NUM_LEDS; i++)
    {
    leds[i] = CRGB(j, 0, 0);
    }
    FastLED.show();  
    delay (5);
  }

  for (int j = 0; j <= ((NUM_LEDS/2)-1); j++)
  {
    leds[j] = CRGB(255, 0, 0);
    leds[j-1] = CRGB(30, 0, 0);
    leds[(NUM_LEDS-1)-j] = CRGB(255, 0, 0);
    leds[(NUM_LEDS)-j] = CRGB(30, 0, 0);
    FastLED.show();
    delay (StartupSpeed);    
  }

  leds[((NUM_LEDS/2)-1)] = CRGB(30, 0, 0);
  leds[((NUM_LEDS/2)-1)+1] = CRGB(30, 0, 0);
  FastLED.show();
  
  for (int j = 0; j <= ((NUM_LEDS/2)-1); j++)
  {
    leds[j] = CRGB(30, 0, 0);
    leds[j-1] = CRGB(0, 0, 0);
    leds[(NUM_LEDS-1)-j] = CRGB(30, 0, 0);
    leds[(NUM_LEDS)-j] = CRGB(0, 0, 0);
    FastLED.show();
    delay (StartupSpeed);    
  }
}

void AllOff()
{
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(0, 0, 0);
  }
    FastLED.show();  
}

void LeftOff()
{
  for (int i = 0; i < (NUM_LEDS - BlinkerLEDs); i++)
  {
    leds[i] = CRGB(0, 0, 0);
  }
    FastLED.show();
}

void RightOff()
{
  for (int i = BlinkerLEDs; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(0, 0, 0);
  }
    FastLED.show();
}

void MiddleOff()
{
  for (int i = BlinkerLEDs; i < (NUM_LEDS - BlinkerLEDs); i++)
  {
    leds[i] = CRGB(0, 0, 0);
  }
    FastLED.show();  
}

void Reverse()
{
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(255, 255, 255);
  }
    FastLED.show();  
}

void BrakeFull()
{
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(255, 0, 0);
  }
    FastLED.show();  
}

void BrakeMiddle()
{
  for (int i = BlinkerLEDs; i < (NUM_LEDS - BlinkerLEDs); i++)
  {
    leds[i] = CRGB(255, 0, 0);
  }
    FastLED.show();  
}

void ParkFull()
{
  for (int i = 0; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(60, 0, 0);
  }
    FastLED.show();
}

void ParkMiddle()
{
  for (int i = BlinkerLEDs; i < (NUM_LEDS - BlinkerLEDs); i++)
  {
    leds[i] = CRGB(60, 0, 0);
  }
    FastLED.show();  
}

void LeftBlinker()
{
  for (int i = (BlinkerLEDs-1); i >= 0; i--)
  {
    leds[i] = CRGB(255, 127, 0);
    FastLED.show();
    delay (BlinkerSpeed);    
  }
}

void LeftDim()
{
  for (int i = 0; i < BlinkerLEDs; i++)
  {
    leds[i] = CRGB(0, 0, 0);
  }
    FastLED.show();
}

void LeftLit()
{
  for (int i = 0; i < (NUM_LEDS - BlinkerLEDs); i++)
  {
    leds[i] = CRGB(75, 0, 0);
  }
    FastLED.show();
}

void LeftFull()
{
  for (int i = 0; i < (NUM_LEDS - BlinkerLEDs); i++)
  {
    leds[i] = CRGB(255, 0, 0);
  }
    FastLED.show();
}

void RightBlinker()
{
  for (int i = (NUM_LEDS - BlinkerLEDs); i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(255, 127, 0);
    FastLED.show();
    delay (BlinkerSpeed);
  }
}

void RightDim()
{
   for (int i = (NUM_LEDS - BlinkerLEDs); i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(0, 0, 0);
  }
    FastLED.show();
}

void RightLit()
{
  for (int i = BlinkerLEDs; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(75, 0, 0);
  }
    FastLED.show();
}

void RightFull()
{
  for (int i = BlinkerLEDs; i < NUM_LEDS; i++)
  {
    leds[i] = CRGB(255, 0, 0);
  }
    FastLED.show();
}

void DualBlinker()
{
  for (int i = (BlinkerLEDs-1); i >= 0; i--)
  {
    leds[i] = CRGB(255, 127, 0);
    leds[NUM_LEDS-1-i] = CRGB(255, 127, 0);
    FastLED.show();
    delay (BlinkerSpeed);
  }
}

Salut

pour comprendre comment c'est câblé , pouvez vous filmer ce que ce code fait ?

#include <FastLED.h>

const byte  LED_PIN  = 2;   // pin de contrôle de la bande LED
const int   NUM_LEDS = 186; // Nombre total de LEDs
CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}

void loop() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CRGB::Red;
    FastLED.show();
    delay(10);
  }
  
  delay(3000);
  
  for (int i = NUM_LEDS - 1; i >= 0 ; i--) {
    leds[i] = CRGB::Black;
    FastLED.show();
    delay(10);
  }

  delay(3000);
}

ça allume les LEDs les une après les autres en rouge, petite pause de 3s, puis ça les éteint en sens inverse et ça recommence (si je ne me suis pas trompé).

Avec une pause de 10ms, autant allumer tout d'un coup, on ne doit pas voir la différence, non ?
La méthode fill_solid le fait en une seule ligne

il y a 186 LEDs, donc 1860ms pour tout allumer = presque 2s... ➜ si ça doit se voir normalement

C'est juste...

Ha ... bhen en fait... j ai dejas monter le tout sur ma titine :

( bon ok... je me suis loupé sur la pose... car les animations ne sont pas symétriques... je vais rectifier ça si je suis motivé ou me suis fait recaler au prochain CT...)

Mais pour le câblage...
Je rentre en Din sur l anneau extérieur du feu gauche... et ressort en Dout pour attaquer le Din de l anneau suivant... et ainssi de suite jusqu'au centre...
Puis ... pour le droit... c est le contraire... je rentre au centre pour aller vers l extérieur... :wink:

Donc 2 spirales symétriques...

Mais bon... avant les smiley... je vais me faire les dents sur une idée que m as soufflé un membre du forum 2cv...

L ajout de la fonction anti-brouillard :wink:

Ca devrais pas me poser trop de problèmes grâce à mes compétences en " reverse engeneering " :smiley:

OK - joli montage !

Je rentre en Din sur l anneau extérieur du feu gauche... et ressort en Dout pour attaquer le Din de l anneau suivant... et ainssi de suite jusqu'au centre...
Puis ... pour le droit... c est le contraire... je rentre au centre pour aller vers l extérieur

Les anneaux tournent en sens horaire ou anti-horaire ?
Par exemple sur le feu gauche, la LED 1 est donc sur l'anneau extérieur et la 2 est de quel côté ? est-ce que c'est cohérent sur tout le montage ? et j'imagine qu'à droite ça tourne dans l'autre sens ?

en gros est-ce que la numérotation est comme cela (en plus dense bien sûr au niveau des pixels)

PS:
on sait où vous habitez maintenant :slight_smile:

image