Pas Résolu, remonter PB chez Adafruit PB avec Sticks Néo Pixel et la brillance

Bonjours et joyeuses fêtes de fin d'année,
je rencontre un problème avec la brillance des sticks Néo Pixel, en effet la valeur envoyée au sticks est
normalement une valeur codée sur 24 bits, mais avec mon programme en pièce jointe certaines valeur de la brillance me génèrent une valeur codée sur 32 bits. Soit par les réglages potentiométrique soit par valeur fixe saisie dans le programme.
Résultat: comme le stick ne prend que 24 bits, certaines couleurs sont faussées.
Est ce du à mon programme ou un problème dans la librairie Adafruit ?
Merci de vos réponses.
D. Baudrier

TestBrill_pour_Neopixel.ino (16.8 KB)

Bonjour,

Je ne comprend pas ta question.
Comme tu le dis les couleurs envoyées doivent être sur 24 bits. Si tu envoies des couleurs sur 32 bits, il est à prévoir que ça va dysfonctionner.
Donc le problème est clairement du coté de ton programme.

Salut,
peux être me suis je mal expliqué, mais si tu regardes les 4 copies d'écrans jointes et les commandes envoyées au stick tu verras que j'envoie bien sur 24 bits sauf avec certaines valeur de la brillance qui pourtant varie de 0 à 255.
Je pense qu'il faut regarder les pièces jointes pour mieux comprendre.
Merci quand même.

Je ne comprend toujours pas (mais je suis sans doute un peu bête). La brillance est globale pour le strip et la couleur est sur 24 bits pour chaque pixel.

Pour faire plus simple, voila les valeurs R V B et Brillance

void prog15() {
Rvar = 255;
Vvar = 255;
Bvar = 255;
pixel.setBrightness(129);
for(int i=0;i<NumPix;i++){
pixel.setPixelColor(i, pixel.Color(Rvar,Vvar,Bvar ) );
}
Envoi();
}

Ecriture dans Néo Pixel

void Envoi() {
pixel.show();
delay(100);
Debug();
}

Le résultat de la lecture de la valeur des pixels

Pixel Numero :00 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :01 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :02 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :03 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :04 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :05 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :06 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :07 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :08 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :09 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :10 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :11 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :12 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :13 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :14 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin
Pixel Numero :15 = 4294942599 Dec FFFF9F87 Hex 11111111111111111001111110000111 Bin

Autres valeur R V B et Brillance

void prog15() {
Rvar = 255;
Vvar = 255;
Bvar = 255;
pixel.setBrightness(71);
for(int i=0;i<NumPix;i++){
pixel.setPixelColor(i, pixel.Color(Rvar,Vvar,Bvar ) );
}
Envoi();
}

Le résultat de la lecture de la valeur des pixels

Pixel Numero :00 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :01 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :02 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :03 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :04 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :05 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :06 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :07 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :08 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :09 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :10 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :11 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :12 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :13 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin
Pixel Numero :14 = 16579836 Dec FCFCFC Hex 111111001111110011111100 Bin

La commande du debogueur pour lire la valeur du pixel.

String ValBin = String(pixel.getPixelColor(i), BIN);

Merci Kamill, je ne peux pas faire mieux pour t'expliquer mon problème.
Si des spécialistes Néo Pixel voit ce post peut être pourront ils répondrent

Bonjour,

" .setPixelColor" fixe individuellement, la brillance de chaque composante.
La commande brillance joue sur les 3 couleurs R V B de façon uniforme.

La librairie fait sa tambouille avec les diverses commandes (localisation, brillance, couleurs, ...) calcule et produit 24 bits par neoPixel ,en attente du prochain envoi, et qui ne sont envoyés que lors de la commande "instance**.show**"
Si seule la brillance est changée, c'est intégré au données précédentes de N° de led, de couleurs,...
puis dispo pour l'envoi suivant.

(voir page 20 de la doc Adafruit)

....

avec

pixel.setBrightness(71);

tu forces une brillance générale des composantes égale au 71/255 de la brillance individuelle programmée dans setPixelColor, et celle-ci validée avant ou après setBrightness

Ca y est! Je pense avoir enfin compris ton problème.

Quand tu fais setBrightness(129) et que tu envoies 255 pour chaque couleur, tu t'attends à ce que getPixelColor te retournes 255*129/255=129 pour chaque couleur, et au minimum la même valeur pour chaque couleur.

Je viens de vérifier (sur simulateur io.circuit) et effectivement comme toi, je trouve que les valeurs retournées par getPixelColor() n'ont rien a voir avec les valeurs attendues et de plus sont différentes pour chaque couleur.
Comme toi je me demande si c'est un bug de la librairie ou si c'est volontaire, l'oeil humain n'ayant pas la même sensibilité pour les différentes couleur.

Re Salut,
comme le dit papybricol, la librairie fait sa tambouille mais je pense quelle tambouille mal.
En effet pour toutes les valeurs de brillance inférieures à 128 je suis en 24 bits et la plus forte valeur hexa est
FEFEFE soit pas brillance maxi.
De 128 à 254 je passe en 32 bits avec des valeurs louches par contre à 255 je repasse en 24 bits et la brillance passe à un niveau supérieur FFFFFF.
En fait à 127 je pense être à la moitié de la brillance vu la différence d'éclairement quand je passe à 255.
Je crains fortement à un PB de la librairie.
Je réalise mes test avec un stick Néo Pixel en service sur un arduino Leonardo.
Les Valeurs de brillance données et les résultats obtenus sont basés sur la couleur blanche soit R=255 V=255 B=255

A qui doit t'on s'adresser pour la Librairie Adafruit ?

Merci

En fait cela ne pose pas de problème si je ne fait que de l'écriture de pixel.
Par contre si je fais de la lecture pour réécrire sur un autre pixel la couleur est fausse.

Lecture couleur pixel X et Ecriture dans pixel Y. = Faux

Bon, j'ai trouvé l'explication en regardant les sources de la librairie.

Lors de setPixelColor() le programme multiplie la valeur par brightness puis divise par 256 puis la stocke
Lors de getPixelColor() le programme fait l'inverse il prend la valeur stockée la multiplie par 256 puis divise par brightness.

Mais comme les valeurs sont entières, la valeur à la lecture diffère de la valeur écrite

Exemple: brightness 129 et valeur 255
écriture: 255129/256 -> 128 (valeur stockée)
lecture: 128
256/129 -> 254 (0xFE différente de 255)

brightness 64 et valeur 255
écriture: 25564/256 -> 63 (valeur stockée)
lecture: 63
256/64 -> 252 (0xFC différente de 255)

Re Salut,

merci Kamill, ton analyse est bonne mais l'écart de couleur n'est que de + ou - 1, ce qui ne perturbe pas beaucoup l'affichage. Mais effectivement si je perd 1 à chaque lecture écriture j'arrive à 0. C'est effectivement ce qui ce produit.
En fait seules 2 valeurs de brillance fonctionnent pour la lecture et écriture soit 127 et 255 toutes les autres valeurs finissent par tout éteindre.
A 127 de brillance pour une couleur de 255 je suis à FE en hex soit couleur maxi - 1
A 255 de brillance pour une couleur de 255 je suis à FF en hex soit couleur maxi
De 128 à 254 je suis à n'importe quoi et la brillance réelle ne change pas

Surprenant que le problème n'est pas été vu.

@+