Bizarrerie avec la librairie Neomatrix

Bonjour,

J’ai un comportement étrange avec un ruban de leds ws2812b que je veux utiliser en matrice pour faire une wordclock.

Si je le teste avec la librairie neopixel, et donc les couleurs en rgb, tout fonctionne correctement.

Par contre, problème avec neomatrix, et les couleurs en uint16_t … je n’arrive pas à avoir du rouge !

Si j’utilise matrix.drawFastHLine(0, i, 16, 0xFF0000); rien ne s’allume , alors que avec matrix.drawFastHLine(0, i, 16, matrix.Color(255, 0, 0)); j’en ai … (le vert et le bleu ne posent pas de problème en uint16_t).

Le problème est que pour ma wordclock, j’utilise un tableau dans lequel je déclare les couleurs que je veux utiliser, et qui sont choisies aléatoirement avec un random. Mais du coup, dans mon tableau, je ne peux pas mettre matrix.Color(255, 0, 0).

J’ai essayé avec des rouges plus “légers” (0xAF0000 par exemple), mais même résultat.

Dernière précision, les exemples fournis avec la librairie m’affichent bien du rouge.

Quelqu’un aurait une idée ?

Voilà mon code de test, qui ne fonctionne pas mieux que celui de ma wordclock

#include <Adafruit_NeoMatrix.h>
#include <gamma.h>

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, A2,
  NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);

void setup() {
    matrix.begin();
}

void loop () 
{

  for(int i=0; i<16; i++) { 
    matrix.fillScreen(0); 
    matrix.drawFastHLine(0, i, 16, 0xFF0000);
    matrix.show(); 
    delay(500); 
  }
}

Je ne connais pas la librairie mais 0xFF0000 c’est 3 octets donc ne tient pas dans un uint16_t qui n’en compte que 2 (S’il faut un octet pour R, un pour G et un pour B il faut 3 octets - donc partir sur un uint32_t qui en offre 4)

Edit: suis allé voir la doc

Because the Adafruit_GFX library was originally designed for LCDs (having limited color fidelity), it handles colors as 16-bit values (rather than the full 24 bits that NeoPixels are capable of). This is not the big loss it might seem. A quirk of human vision makes bright colors less discernible than dim ones. The Adafruit_NeoMatrix library uses gamma correction to select brightness levels that are visually (though not numerically) equidistant. There are 32 levels for red and blue, 64 levels for green.

The Color() function performs the necessary conversion; you don’t need to do any math. It accepts 8-bit red, green and blue values, and returns a gamma-corrected 16-bit color that can then be passed to other drawing functions.

Il faut 5 bits pour 32 valeurs et 6 pour 64 => 5R + 6G + 5B = 16 bits

En binaire vous devez sans doute mettre les bits comme cela: [color=red]RRRR R[/color][color=green]GGG GGG[/color][color=blue]B BBBB[/color]
donc tout rouge serait
[color=red]1111 1[/color][color=green]000 000[/color][color=blue]0 0000[/color] = 0xF800
À essayer mais il n’y aura pas la compensation en gamma que la fonction color apporte

Tu ne nous dis pas tout : quel arduino utilises-tu, qu'est-ce que la bibliothèque gamma.h?
Comment connectes-tu ton ruban pour faire ta matrice ?

Pour aller dans le sens de J-M-L, voici les codes couleurs tirés de la bib adafruit GFX

// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

On retrouve donc bien le 0xF800 pour le rouge :slight_smile: cool

Et si on reste sur l’idée du codage: [color=red]RRRR R[/color][color=green]GGG GGG[/color][color=blue]B BBBB[/color], tout vert serait
[color=red]0000 0[/color][color=green]111 111[/color][color=blue]0 0000[/color] = 0x07E0 donc conforme au define ci dessus

Ou tout bleu
[color=red]0000 0[/color][color=green]000 000[/color][color=blue]1 1111[/color] = 0x001F qui là encore colle au define

Donc ça doit bien être cela pour l’ordre des bits

Rouge + vert à fond doit faire jaune:
[color=red]1111 1[/color][color=green]111 111[/color][color=blue]0 0000[/color] = 0xFFE0 on retrouve bien aussi le YELLOW du define ci dessus

Bref ça a l’air de marcher :slight_smile:

Bonjour,

C'est vrai que je n'ai pas pensé au fait que les couleurs se codaient sur 2 octets, je vais corriger ça et tester ce soir.

Pour répondre à lesept, la bibliothèque gamma.h s'ajoute quand je sélectionne la neomatrix, mais je ne sais pas à quoi elle sert ... et pour mon ruban, il est sur la pin A2 d'un nano.

Merci pour vos réponses

pour le gamma c'est dans l'explication que j'ai mentionnée ci dessus, c'est lié à la perception des couleurs pour l'oeil humain qui n'est pas linéaire sur les 3 composantes RGB.

A quirk of human vision makes bright colors less discernible than dim ones. The Adafruit_NeoMatrix library uses gamma correction to select brightness levels that are visually (though not numerically) equidistant.

ça marche nickel, merci pour votre efficacité.

ça m'apprendra à ne faire que survoler les documentations :wink:

:slight_smile:

Cool