J'ai testé pour vous: librairie graphique pour le VMA412

Téléchargements de ma bibliothèque graphique

QuelPilote.zip: délivre sur le moniteur série le code du driver. Si il vous retourne 7781 ou 7783 (sur le moniteur série), ma bibliothèque fonctionnera. Dans le cas contraire, je parierai presque que non, il me faudrait alors votre afficheur pour pouvoir écrire et tester un driver optimisé! Attention cela fonctionne qu'avec une carte VMA412 montée sur une carte UNO.

Demo_VMA412.zip: démonstration de certaines possibilités de ma bibliothèque. Les répertoires contenant les images sont à mettre dans la racine de la carte SD qui comportera donc 4 répertoires. Cette démo fonctionne avec le VMA412 équipé d'un ST7783 et une carte UNO ou MEGA. Dans le cas d'une carte MEGA, voir le paragraphe "Problème avec la carte MEGA".

 

La carte mémoire micro SD

Pour afficher des images, il faut un format particulier. La librairie téléchargeable associée à l'afficheur ne reconnaît que le format bitmap .BMP car il est simple à afficher. La reconnaissance des autres formats nécessiterait plus de code et avec un UNO, on est un peu limité. D'ailleurs seuls les BMP au format 24 bits couleurs sont reconnus (ceci exclu les noir et blanc ainsi que les compactés.

Si on veut pouvoir afficher un bitmap qui contient 3 octets par pixel, et que l'on veut remplir l'écran, il faut mémoriser       3 x 240 x 320 octets soit environ 230ko. Avec un Arduino UNO qui a une RAM de 2ko et une FLASH de 32ko, c'est impossible. Avec une carte MEGA, on peut stocker une image dans la mémoire FLASH (programme) car on dispose en tout de 248ko. Mais il en reste trop peu pour le programme! C'est pour cela que certains afficheurs disposent d'un lecteur de carte micro SD.

Sans la carte SD, le programme de démonstration que je fournis ne peut donc pas afficher des images. Mais le reste fonctionne parfaitement.

 

Problèmes avec la carte MEGA

Le dialogue série avec la carte mémoire micro SD utilise des broches spécifiques MOSI, MISO et SCK qui se trouvent sur les broches 11 à 13 des cartes UNO, et accessibles pour le VMA412. Par contre sur une carte MEGA, ces broches correspondent aux broches 50 à 52. Comme elles ne sont pas au même endroit, le lecteur de carte sera introuvable et ne fonctionnera pas.

Pour remédier à ce problème, je pense équiper ma future maquette d'un lecteur indépendant que je brancherai sur les bonnes broches. Cela me permettra de travailler avec une carte SD au lieu d'une micro SD. Pour moi, ce pet être intéressant car le dialogue entre mon PC et ma carte se fera par ce biais. Et pour mes gros doigts, c'est plus pratique.

Si vous n'avez besoin de la carte que pour afficher des images, utilisez alors le lecteur interne, mais pontez les broches pour que la carte MEGA les retrouve au bon endroit. Il faut alors relier les broches:
SS10 avec 53
MOSI11 avec 51
MISO12 avec 50
SCK13 avec 52

Pour faire les essais et vérifier que cela fonctionne, et pour que ce soit simple, j'ai ponté grâce à une carte à dominos (voir ci-contre). On voit en jaune un des 4 fils liant les broches.


Sans carte SD, on n'a pas d'images, mais le reste fonctionne.

Avec la carte SD, on peut avoir les images.

Si on enfiche l'afficheur sur une carte UNO, les 8 fils de données sont répartis sur deux ports différents, mais sont correctement positionnés. Avec une carte MEGA, les fils de données sont répartis sur 3 ports différents et no sont pas en bonne place. Le logiciel doit les traiter comme cinq morceaux à assembler. C'est pour cela qu'avec une MEGA, les temps sont deux fois plus long. On peut aussi en utilisant un branchement personnalisé mettre les données sur un seul port et dans le bon sens. On serait alors deux fois plus rapide qu'avec une UNO. Au passage, on est un peu obligé de faire cela pour la carte SD. Pourquoi ne pas faire pareil avec les autres broches?

 

Vidéos de démonstration


Mode paysage

Mode portrait

 

La bibliothèque graphique officielle

Dans les téléchargements, il y a des exemples et des librairies. Voici les reproches que j'ai à propos de ces fichiers:
- il n'y a quasiment pas de commentaires. Certaines partie du code sont ainsi très difficile à lire et donc à modifier. Je ne comprends pas comment est définie une fonte, et je ne sais pas rajouter les accents.
- je n'ai pas réussi à faire fonctionner certains exemples. En particulier l'affichage de fichiers BMP.
- il n'est pas prévu de pouvoir utiliser les lettres accentuées. Et ça en tant que français c'est inacceptable!
- la fonte employée est une fonte matricielle et cela supporte très mal l'agrandissement.
- le code n'est pas optimisé, ni en taille, ni en vitesse. Certaines fonctions sont lentes, notamment l'effacement d'écran
- il est possible d'utiliser plusieurs types de circuits drivers, mais je n'en ai qu'un seul (le fameux ST7783). Autant supprimer la lecture du circuit et l'initialisation des boîtiers que je n'ai pas. C'est toujours des octets en moins.
- il est possible de dessiner dans les 4 directions. Mais le choix des directions d'affichage peut se faire en cours de programme. Cela va prendre des octets et du temps pour écrire au bon endroit. En ne gérant qu'une seule direction, cela sera plus optimisé. A priori, mes projets n'écriront jamais à l'envers. Il me suffit alors d'avoir un mode portrait ou un mode paysage, mais pas les deux dans le même projet.

 

Ma bibliothèque graphique personnelle

J'ai cherché un peu plus à optimiser les fonctions graphiques. Parfois on peut économiser la taille ET la vitesse. Parfois optimiser l'un dégrade l'autre. Il y a des compromis à faire!

Voici quelques caractéristiques de ma bibliothèque:
- il n'y a qu'un seul mode, paysage OU portrait. C'est surtout pour les textes et les images, car pour les points, cercles, droites... cela ne change que les coordonnés. La première ligne de la librairie permet de choisir. Cette méthode est un peu plus compliquée, mais permet de minimaliser la taille du code. La démo permet les deux modes sans modifications du code. Il suffit de changer les commentaires des deux premières lignes du fichier "vma412_ST7781.h".
- la fonte de caractère que j'ai dessinée permet d'utiliser les accents. Cette fonte est vectorielle, et permet donc la variation de taille, l'italique (mais pas terrible), le gras, et les empattements (petits traits horizontaux en haut et en bas des lignes verticales des caractères). Autre très gros avantage, la fonte n'est définie que sur 721 octets (soit environ 6 octets par caractère!).
- la librairie est optimisée autant que faire se peut. Par exemple l'effacement de l'écran est environ 4 fois plus rapide qu'avec la librairie officielle.
- il est possible d'afficher des images au format .BMP mais aussi de les écrire sur la carte. On peut aussi lire ou écrire des images au format .BPX ; ce format est adapté à cet afficheur et s'affiche 30% plus vite que les .BMP
- au lieu de se faire suer avec une classe "Point" comprenant une abscisse et une ordonnée, j'ai préféré garder les valeurs x et y. Ainsi si on veut par exemple déplacer un curseur, on n'est pas obligé de définir un point et de le remplir.

 

Note à propos des fichiers bitmaps

Le format bitmap windows reconnu par la librairie officielle contient 3 octets par pixels. Ce serait bien adapté pour le mode 260.000 couleurs. Mais le mode qui est en général pris est le mode 64.000 couleurs. Ce qui signifie que pour afficher un pixel, il faut convertir les trois octets RVB en un mot de 16 bits contenant 5 bis rouges, 5 bits bleus et 6 bits verts, le tout bien placé. Comme ce format est facilement accessible par la plupart des logiciels d'images, j'ai gardé ce format.

Le format BPX est un format calqué sur le VMA412, il contient en plus de la taille de l'image, un mot de 16 bits correspondant à la couleur qu'il faut donner à l'afficheur. Pour afficher une image, il suffit de lire un mot et de l'envoyer. On n'a donc pas de calcul à faire, et un pixel occupe 16 bits au lieu de 24. C'est pour cela que j'ai développé ce format.

Pour des images variées, utilisez le format BMP, par contre pour des images fixes (toujours les mêmes), il vaut mieux utiliser le format BPX. Pour transformer un BMP en BPX, vous pouvez par exemple dessiner sur l'afficher le BMP et le sauvegarder sous forme de BPX:

BMP_Draw("Fichier.bmp",0,0); // Dessine le bitpmap dans le coin
BPX_Save("Fichier.bpx",0,0,taille_X,tille_Y); // Sauve le BPX, si on veut tout l'écran taille_X=319, 239 ou MAX_X...

 

Les fichiers de cette librairie

Dans l'exemple, vous avez 3 ensembles de fichiers (plus des répertoires contenant des images):
- Demo_VMA412.ino qui est le programme de démonstration. C'est de lui dont vous allez vous inspirer pour votre application. Vous n'allez pas le garder, mais vous allez écrire votre propre programme.
- Pecheux_XXXX.XXX c'est la librairie graphique qui comprend toutes les fonctions de base. En principe, vous n'allez pas trop y toucher. Toutefois comme elle fournie avec des commentaires et que je vais peut-être faire une liste de diffusion, si vous voulez aller plus loin, si vous voulez des adaptations, il est possible d'y trifouiller quelque peu. Elle comprend:

- Pecheux_Graph.XXX qui est la librairie graphique et ses principales fonctions. Elle dépend peu du matériel, cela devrait fonctionner avec toutes les résolutions, et sans doute avec les afficheurs pour lequel le dialogue est série. Toutefois elle utilise des modes d'écriture spécifiques aux pilotes du VMA412, que l'on retrouve dans bon nombre d'autres pilotes; elle utilise la notion de zone de travail, de point de départ des tracés de points.
- Pecheux_font.h qui contient la définition de la fonte de caractère. C'est aussi modifiable si vous avez besoin de caractères saugrenus.
- vma412_ST7781.XXX contient l'interface bas niveau entre l'afficheur et la librairie graphique. C'est elle qui définit un certain nombre de constantes et de routines de base. Elle dépend donc du pilote, et de la carte Arduino. Avec un autre afficheur, il faudrait réécrire ces fichiers.

Dans un premier temps, mettez les fichiers Pecheux_XXXX.XXX et vma412_ST7781.XXX avec votre application.

 

Constantes et fonctions disponibles

Note: pour passer en mode paysage, éditez vma412_ST7781.h et faire que les deux premières lignes ressemblent à :

//#define PORTRAIT
#define PAYSAGE
pour passer en mode portrait éditez vma412_ST7781.h et faire que les deux premières lignes ressemblent à :
#define PORTRAIT
//#define PAYSAGE

Constantes
MAX_X: Abscisse maximum des points. C'est 319 en mode paysage, 239 en mode portrait
MAX_Y: Ordonnée maximum des points. C'est 239 en mode paysage, 319 en mode portrait
LARGEUR: Largeur de l'écran. C'est 320 en mode paysage, 240 en mode portrait
HAUTEUR: Hauteur de l'écran. C'est 240 en mode paysage, 320 en mode portrait

MAX_RED: Valeur maximum de la composante rouge. C'est 31 car on est en mode 16 bits (32 valeurs)
MAX_GREEN: Valeur maximum de la composante verte. C'est 63 pour cet afficheur, en mode 16 ou 18 bits
MAX_BLUE: Valeur maximum de la composante rouge. C'est 31 car on est en mode 16 bits (32 valeurs)
MAX_GREY: Valeur maximum des gris. C'est 31 car on est en mode 16 bits (32 valeurs)

BLACK: Constante définissant le noir (les couleurs sont définies sur 16 bits)
BLUE: Bleu
GREEN: Vert
CYAN: Cyan
RED: Rouge
MAGENTA: Magenta
YELLOW: Jaune clair
WHITE: Blanc; c'est aussi la valeur maximale des couleurs. Pour avoir une couleur au hasard: random(WHITE);
DARK_BLUE: Bleu nuit
DARK_GREEN: Vert foncé
DARK_CYAN: Cyan foncé
DARK_RED: Rouge sombre
MAROON: Marron
DARK_MAGENTA:Magenta foncé
PURPLE: Violet
DARK_YELLOW: Jaune foncé
OLIVE: Olive
GRAY: Gris
SILVER: Argent

Fonctions
Couleur: Transforme un triplet RGB ou une valeur de gris en un code couleur
Init_Pecheux_Graph: Initialisation de l'écran et de son pilote
ClearScreen: Efface l'écran ou le remplit d'une couleur
Point: Dessine un point
Get_Point: Retourne la couleur d'un point

Box: Trace une boîte pleine
Horizontal_line: Trace une ligne horizontale
Vertical_line: Trace une ligne verticale
Line: Trace une ligne
Rectangle: Trace les bords d'un rectangle
Arc: Trace des arcs par huitième de cercle
Circle: Trace un cercle

Text_color: Choisit la couleur du texte
Text_cursor: Impose l'abscisse ou le point-curseur (point le plus en haut à gauche du prochain caractère)
Get_text_x: Lit l'abscisse du point-curseur
Get_text_y: Lit l'ordonnée du point-curseur
Text_size: Taille des caractères: la hauteur est environ de 7*taille pixels
Text_bold: Gras ou pas
Text_serif: Avec ou sans empattement
Text_italic: Italique ou normal
Text: Écrit du texte

BMP_Draw: Dessine un bitmap de format windows .BMP qui est stocké sur la carte SD
BMP_Save: Lit une zone de l'écran et sauvegarde sur la carte SD un bitmap de format windows .BMP
BPX_Draw: Dessine un bitmap de format natif .BPX qui est stocké sur la carte SD
BPX_Save: Lit une zone de l'écran et sauvegarde sur la carte SD un bitmap de format natif .BPX

IsTouch: Retourne true si on a appuyé sur l'écran, et mémorise les coordonnés du point
GetTouch_x: Donne l'abscisse du point de touche mémorisé par IsTouch
GetTouch_y: Donne l'ordonné du point de touche mémorisé par IsTouch

 

Taille occupée en mémoire

En gros la librairie de la carte SD occupe 10ko de mémoire, et ma librairie graphique occupe 7ko de mémoire. Cela veut dire qu'avec une carte UNO, la moitié de la mémoire est prise. Avec une MEGA, on n'est qu'à 10%.


dansetrad.fr Contactez-moi