15 mars 2019

Écran Sphérique - Étude - Modulation Binaire


Une autre méthode que le PWM (vue dans la précédente publication), rarement vue (hormis de par la personne qui me l'a enseigné que je salue au passage) et pourtant bien plus performante, la Modulation Binaire - Binary Modulation. Elle se révèle vraiment efficace surtout lorsqu’il s’agit de contrôler un grand nombre de sorties avec un fort échantillonnage (résolution).


À chaque cycles, on compare le nombre de cycles enregistrés dans la variable "Cycle" à la constante "CycleMax" dépendant à l'échantillonnage désiré. Pour n = 4 bits, nous aurons CycleMax = n = 4. Si "Cycle" est supérieur ou égal, on le réinitialise à 0. Puis on applique, à la sortie "Out", l’état du bit de la variable "Value" indexé par le compteur "Cycle".


La variable "Period", correspondant à la période du prochain cycle,  est le résultat de "IntialPeriod" multiplié par 2 à la puissance "Cycle". Enfin, on incrémente le compteur "Cycle".

Si vous avez bien suivi l'algorithme, vous aurez compris que la constante "InitialPeriod" doit être initialisée avec la plus petite période, correspondant au temps entre Cycle = 0 et Cycle = 1.

Notre rapport cyclique "Rcy" est bien modulé en conséquence par la variable "Value".
Avec cet algorithme nous avons besoin de beaucoup moins de cycles que celui du PWM et son traitement est quasiment similaire. Le tableau ci-contre résume le nombre nécessaire suivant l’échantillonnage et la méthode utilisée.

La Modulation Binaire permet un gain (traitement global et/ou énergie) non négligeable que ce soit sur un microcontrôleur ou un FPGA.
Cycles
Échantillonnage
n (bit)
PWM
Modulation Binaire
4
15
4
5
31
5
6
63
6
7
127
7
8
255
8
9
511
9
10
1023
10
11
2047
11
12
4095
12
13
8191
13
14
16383
14
15
32767
15
16
65535
16

Remarque : Pourquoi partir du bit de poids faible plutôt que celui de poids fort ?

Car en partant du bit de poids faible, nous passons par la multiplication (décalage des bits vers la gauche) plutôt que la division. Et nous nous abstenons, ainsi, d'une éventuelle division par 2 d'un nombre impaire (Si le calcul de "InitialPeriod" était mauvais).

Cependant, si le nombre de sorties est vraiment conséquent et l'échantillonnage élevé, afin de mieux répartir la charge globale sur le temps, nous pouvons diviser  équitablement  les sorties en deux listes. Chacune partant du bit de poids opposé. Ainsi, on évite la charge "brusque" demandée lors des cycles à faible période.

Écran Sphérique - Étude - Contrôle de l’Intensité Lumineuse


Pour contrôler l’intensité traversant chacune des leds RGB, et ainsi, varier sa couleur, une méthode bien connue est la modulation de la largeur des impulsions - PWM - Pulse Width Modulation.

Nous voyons que la tension moyenne résultante (en bleu) est proportionnelle au « temps haut » th et à la période T du signal. C’est ce que l’on appelle le rapport cyclique - Rcy.
Afin de moduler cette largeur des impulsions, nous utilisons un circuit programmable (microcontrôleur par exemple) et nous modifions l’état de sa sortie (« 0 » ou « 1 ») suivant un temps prédéfini.


À chaque cycle, on compare le nombre de cycle enregistré dans la variable "Cycle" à la constante "CycleMax" dépendant à l'échantillonnage désiré. Pour 4 bits, nous aurons CycleMax = 2^n - 1 = 2^4 - 1 = 15. Si "Cycle" est supérieur ou égal, on le réinitialise à 0. Puis on applique, à la sortie "Out", le résultat de la comparaison entre "Value" et "Cycle". Enfin, on incrémente notre compteur "Cycle". En modifiant la valeur d’entrée "Value" (0 → 15), alors nous modifions le rapport cyclique RCY en conséquence.
Plus nous utilisons de bits pour coder une valeur, plus le besoin en nombre de cycles grandit (2^n - 1) où n est le nombre de bits. Ce qui augmente considérablement le traitement du circuit programmable si l’on code une valeur sur 8 bits (255), 12 bits (4095) ou 16 bits (65535). Heureusement, beaucoup de ces circuits simplifient les traitements par accélération matérielle (électronique dédiée). Mais ces systèmes permettent de contrôler seulement un nombre limité de sorties.

La Modulation Binaire est une autre approche, bien meilleure lorsqu'il s'agit de contrôler un grand nombre de sorties avec un échantillonnage élevé.

Écran Sphérique - Étude - LEDs (Diode électroluminescente)


Les premières LED à être commercialisées ont produit de la lumière infrarouge, rouge, verte puis jaune. L'arrivée de la LED bleue, associée aux progrès techniques et d'assemblage, permet de couvrir la bande des longueurs d'onde d'émission s’étendant de l'ultraviolet (350 nm) à l’infrarouge (2 000 nm). De nombreux appareils sont munis de LED composites (trois LED réunies en un composant : rouge, vert et bleu) permettant d'afficher de très nombreuses couleurs.

LED RGB

Afin de contrôler une couleur à afficher, des leds RGB (Red, Green, Blue) seront utilisées. Elles permettent d’afficher une grande quantité de couleurs suivant l’intensité du courant les traversant.

Pour coder l’information d’un pixel, la majorité des logiciels utilisent 8 bits par couleur (2^8 = 256 nuances) soit un total de 24 bits (2^24 = 16 777 216 couleurs).

Bien que cela représente un grand nombre de couleurs, celui-ci est faible comparé à celles visibles par l’œil humain. Essayez de passer de la couleur (R=255, G=255, B=128) à (R=255, G=255, B=129). Vous verrez la différence ! Enfin non ! :) Car la majorité des écrans permettent d’afficher les couleurs avec une profondeur de 36 bits (3 x 12), voir 48 bits (3 x 16). Et par des algorithmes internes, le rendu et l’animation entre trames sont améliorés (Composition d’une image intermédiaire inexistante, voir plus, par le mélange de deux images).

14 mars 2019

The Book of Shaders

The Book of Shaders est un blog de Patricio Gonzalez Vivo et Jen Lowe. Tous deux passionnés de Shaders. Pour le codage, il existe deux langages : GLSL et HLSL (le premier OpenGL, le second, DirectX). Ils sont similaires au langage C et leurs différences sont maigres.

L'éditeur permet de prendre en main la programmation des Shaders. Il s’appuie sur le language GLSL (et ainsi 100% compatible avec Three.js). 

13 mars 2019

Écran Sphérique - Étude - Changement de Projection


Pour l'affichage sur un écran sphérique, nous avons besoin de changer la projection équidistante de la source vidéo en une projection sinusoïdale.

Pour un point (λ, φ) d’une image, ses coordonnées (x, y) pour une projection sinusoïdale sont simplement :
λ : Longitude φ : Latitude
Source
Écran sphérique
X
Y
λ
φ
X
Y
Haut-Gauche
0
0
-3,14
-1,5708
199,5
0
Milieu-Gauche
0
100
-3,14
0,0000
0,0
100
Bas-Gauche
0
200
-3,14
1,5708
199,5
200
Haut-Droite
399
0
3,14
-1,5708
199,5
0
Milieu-Droite
399
100
3,14
0,0000
399,0
100
Bas-Droite
399
200
3,14
1,5708
199,5
200
Milieu-Haut
199,5
0
0,00
-1,5708
199,5
0

199,5
50
0,00
-0,7854
199,5
50
Milieu
199,5
100
0,00
0,0000
199,5
100

199,5
150
0,00
0,7854
199,5
150
Milieu-Bas
199,5
200
0,00
1,5708
199,5
200

Comme nous avons une perte de pixels, il faut pouvoir « moyenner » la couleur de ceux qui se retrouvent sur la même position (projection sinusoïdale).

Écran Sphérique - Étude - Schéma Fonctionnel Simplifié



FP1 – Alimentation
En charge de fournir le courant et les tensions électriques nécessaires au fonctionnement de l’écran sphérique.

FP2 – Contrôleur Vidéo
En charge de la réception et du traitement du signal vidéo (HDMI). Il convertit également la source (rectangulaire) en une projection Sinusoïdale.

FP3 – Contrôleur Radio
En charge du transfert des données par liaison radio (Wi-Fi 4).
Le récepteur aiguille la sélection de la source, soit provenant du contrôleur vidéo, soit directement de part la liaison radio. 

FP4 – Contrôleur Données
En charge de gérer une mémoire tampon « circulaire » (buffer). Donne la consigne de vitesse de rotation au contrôleur moteur (50/60 Hz selon la source vidéo). Transmet les images au contrôleur Leds.

FP5 – Contrôleur Moteur
En charge d’assurer la bonne vitesse de rotation de l’arc selon la consigne reçue. Transmet au contrôleur Leds une consigne de synchronisation en rapport à sa vitesse réelle de rotation.

FP6 – Contrôleur Leds
En charge de moduler l’intensité des Leds se situant sur l’arc selon l’image en mémoire tampon (circulaire). Reçoit la prochaine image pendant l’affichage de celle actuellement en mémoire. (Mémoire 1 tour)

Fody / PropertyChanged

Fody est un "Weaver", c'est à dire qu'il va injecté du code par lien. Il est l'outil indispensable pour les développeurs C# MVVM (WPF/UWP/XAMARIN). Fody/PropertyChanged Injecte le code qui déclenche l'événement PropertyChanged dans les paramètres des propriétés des classes qui implémentent INotifyPropertyChanged. Ainsi, nous sommes débarrassés de la quantité importante de code de "plomberie".

5 mars 2019

WaveDrom

WaveDrom est un outil textuel de génération de chronogrammes. Vous pouvez utiliser l'outil en ligne, ou télécharger l'éditeur selon votre configuration. Un tutoriel est également disponible.

Caractères UNICODE®

Cet outil en ligne, permet d'afficher les codes des caractères au standard Unicode. Ce standard est constitué d'un répertoire de 137 929 caractères, couvrant une centaine d’écritures. Il est totalement compatible avec la table ASCII. Vous y trouverez le codage en décimal, hexadécimal et HTML.

PlantUML

PlantUML est un outil textuel de génération de diagrammes permettant de pouvoir représenter ceux à la norme UML. Vous devez télécharger le fichier plantuml.jar et l’exécuter. Une configuration de l'emplacement du dossier de travail sera nécessaire. Le programme se charge de détecter tous les fichiers ".txt" et les convertis s'ils sont "balisés" (@startuml, @enduml).