Présentation de PecheuxGraph

La carte mémoire micro SD

Pour afficher des images, il faut un format particulier. La bibliothèque 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.

 

Note à propos des fichiers bitmaps

Le format bitmap windows reconnu par la bibliothèque 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 par pixel 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"); // 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...

 

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, j'équiperai 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 peut ê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. Ma bibliothèque graphique met en haute impédance les broches 10 à 13 des cartes MEGA pour permettre ce pontage.


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

Avec la carte SD, on peut avoir les images.

Une autre solution est d'utiliser un module lecteur de SD externe. Cela a l'avantage d'avoir à manipuler des cartes SD au lieu des micro SD. D'après ce que j'ai oui-dire, il n'est pas nécessaire de connecter la broche 3,3V avec ce module, ce qui m'arrange, cette broche n'est plus accessible à cause de l'afficheur.

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 ne 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?

Ci-contre le montage d'essais permettant de mettre les données de l'afficheur sur un seul port (portK). Les essais montrent que l'on gagne un facteur 3 en vitesse pour les échanges avec l'afficheur, par exemple pour décaler l'écran. Pour les affichages d'images complètes, comme l'accès à la cartes SD est relativement longue, on ne gagne qu'une seconde par écran. Mais c'est toujours ça. Au niveau du programme, cela ne change quasiment rien.

 

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:
- on peut utiliser les 4 modes, paysage, portrait, paysage inversé ou portrait inversé. C'est surtout pour les images, car pour les points, cercles, droites... cela ne change que les coordonnés. En plus dans un mode donné, on peut écrire du texte dans les 4 directions. Le choix du mode est fait lors de l'initialisation de l'afficheur dans la fonction setGraphMode(). On passe le paramètre PORTRAIT, PAYSAGE, PORTRAIT_INVERSE ou PAYSAGE_INVERSE (vous avez échappé de peu à PORTRAIT, PAYSAGE, TIARTROP et EGASYAP). La plupart des exemples et des démos peuvent tourner dans les 4 modes.
- la bibliothèque est optimisée autant que faire se peut. Par exemple l'effacement de l'écran est environ 4 fois plus rapide qu'avec la bibliothèque 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. De même, j'ai supprimé la class tft (objet pour déclarer un écran). Je ne suis pas sûr que les programmateurs en comprennent bien la philosophie. Si vous préférez les objets, vous pouvez les définir vous-même. Les objets augmentent la taille du code et diminuent la vitesse.

 

Le système de coordonnés

L'origine de l'écran se trouve en haut à gauche. C'est donc le point de coordonnés (0,0). L'axe des abscisses est horizontal et croissant vers la droite. La dernière colonne a pour abscisse MAX_X, qui vaut donc 319 ou 239 suivant qu'on est en mode paysage ou en mode portrait. Les abscisses sont croissantes vers le bas. MAX_Y vaut donc 239 ou 319.

Il y a LARGEUR points horizontalement; LARGEUR vaut donc MAX_X+1. Et il y a HAUTEUR points horizontalement; HAUTEUR vaut donc MAX_Y+1.

 

Les couleurs

J'ai fait le choix d'utiliser le mode 16 bits (compromis entre, la taille et la vitesse du code, et la qualité). La relation entre couleur et valeur numérique n'est pas triviale, et c'est pour cela que je conseille d'utiliser les constantes définies ainsi que la fonction RGBcolor().

 

Le mode texte

Pour les textes, il y a un curseur (voir image ci-dessus). C'est le point le plus en haut à gauche du prochain caractère qui sera écrit. getTextCursorX() et getTextCursorY() permettent d'obtenir la valeur du curseur. setTextCursor() permet de le fixer.

Pour les fonctions graphiques pures (point, cercle, boîte...) la couleur doit être passée dans les paramètres. Pour les fonctions texte, on ne passe pas la couleur dans chaque fonction. Il faudrait sinon passer aussi les paramètres italique, gras, serif... C'est pour cela qu'il y a 6 fonctions pour définir les caractéristiques d'affichage des textes :
setTextColor() pour choisir la couleur
setTextSize() pour choisir la taille. Par défaut la taille vaut 2 (environ 14 pixels de haut)
setTextBold() pour le gras. C'est le nombre de lignes rajoutées de chaque côté
setTextItalic() pour passer ou revenir du mode italique
setTextSerif() pour commuter le mode empattement (petits traits en plus sur certains caractères
setTextOrient() pour choisir le sens de l'écriture

Pour les textes, on peut écrire dans les 4 directions. Le système de coordonnés sera alors différent du système graphique si l'on n'écrit pas vers la droite.

 


dansetrad.fr Contactez-moi