Russification de la bibliothèque openGLCD pour Arduino

L'écriture de texte en langue russe sur des écrans graphiques avec le contrôleur ks0108 ou ses analogues présente toujours des difficultés importantes. La bibliothèque openGLCD, qui est recommandée par les sites officiels Arduino, dans la configuration originale de la dernière version pour le moment ne contient aucune police cyrillique, à l'exception de la police cp437font8x8. En pratique, il est peu utile, car dans la partie en langue russe, il prend en charge le codage Win-1251 . Par conséquent, pour afficher des caractères dans une telle police, ils doivent soit être insérés dans le texte avec des codes octaux ou hexadécimaux (et en même temps, il y a des ambiguïtés avec la lettre minuscule "I", comme le créateur de la police l'indique lui-même dans le commentaire), ou encore écrire une fonction de conversion distincte, comme celle-ci arduinecpour la bibliothèque Adafruit-GFX.

De plus, cp437font8x8 est grand pour les écrans de 128x64 pixels. La taille de police optimale pour les étiquettes auxiliaires sur un tel écran reste System5x7. Ici, nous nous concentrons sur la russification de la police système, bien que le lecteur puisse indépendamment russifier toute autre police basée sur cet échantillon (surtout si elle a un écran plus grand).

Quel est le problème?


Pour commencer, creusons les racines du problème. L'Arduino IDE est un éditeur de texte Windows standard qui fonctionne en encodage UTF-8 universel , comme tout autre dans les versions modernes de Windows (Bloc-notes, par exemple). UTF-8 est une version économique du codage multi-octets UNICODE. En UTF-8, les caractères, les chiffres, les points-virgules et toutes les autres icônes de langue anglaise sont représentés par un octet qui correspond au codage ASCII standard . Par conséquent, leur représentation dans le code d'esquisse ne présente aucune difficulté: après la compilation, la chaîne de caractères de langue anglaise est transférée dans le fichier hex chargeable sans modifications et est claire pour le contrôleur 8 bits, comme on dit «sans traduction».

Lors de cette conversion, chaque caractère, comme dans tout programme dans n'importe quel langage de programmation, est représenté directement sous la forme de son code, c'est-à-dire le numéro de série dans la table des polices, dont le programme extrait le style graphique du caractère correspondant. Dans le fichier de police System5x7.h de la bibliothèque openGLCD , le nombre de caractères est représenté par la variable font_Char_Count de type uint8_t , c'est-à-dire qu'il ne peut pas dépasser un octet. Par conséquent, les caractères cyrilliques, qui en UTF-8 occupent deux octets , ne peuvent pas être transmis au contrôleur de la manière habituelle.

Tentatives précédentes
, . Arduino 1.0.x (, , 1.6.0) , ( , UTF-8 , 0xD0, 0xD1). GLCD v3, , UTF-8 ( 0x80 0xBF). « ». — Arduino IDE 1.0.x GLCD v3, .

Arduino IDE . , , . .

Solution


L'auteur n'est pas allé dans les entrailles des fonctions de bibliothèque, mais a écrit pour openGLCD un complément sous la forme de la fonction outstr () , qui itère sur tous les éléments de la chaîne d'entrée, en les passant par l'opérateur de sélection Switch . Il capture les caractères cyrilliques de la chaîne et les remplace par des codes à un octet correspondant au fichier de police mis à niveau System5x7R.h .

Par exemple, pour la lettre russe majuscule "F", la chaîne de remplacement sera comme ceci:

case '': GLCD.PutChar(0xA4); break;

Ici 0xA4 est l'octet de poids faible de l'encodage de la lettre "F" en UTF-8 (voir lien ci-dessus). Conformément à cet encodage, un nouveau fichier de polices System5x7R.h a été compilé . En principe, avec cette approche dans la police, vous pouvez utiliser n'importe quel encodage de caractères russes et tout autre glyphe que vous souhaitez insérer dans la police. Si seul leur nombre total ne dépasse pas 128 pièces: du début du tableau au caractère 0x7F (127 est le dernier caractère du tableau ASCII standard), il est conseillé de laisser la police intacte.

Certes, je me suis accordé quelques libertés avec la table ASCII. Le fait est que dans la police d'origine System5x7.hl'icône de degré est placée dans la dernière ligne du tableau, occupant le caractère 0x80, que nous avons déjà en cyrillique. Afin de ne pas violer la procédure de construction d'une table cyrillique conforme à UTF-8, cette ligne a été supprimée du fichier. Et l'icône de degré est attachée à la place du caractère ASCII «~» (numéro 0x7E), qui dans la police n'était toujours pas utilisé pour son usage prévu. Mais un tel remplacement vous permet de saisir l'icône de degré dans le texte d'esquisse directement à partir du clavier sous la forme d'un symbole «~».

Une autre liberté est due au fait que l'auteur ne tolère pas le zéro barré - l'archaïque des affichages de texte ADCU et monochrome. Par conséquent, le zéro dans la police modernisée est remplacé par le glyphe de la lettre «O». Ceux qui adhèrent aux principes puristes peuvent simplement supprimer le fichier de police System5x7R.hcet insert (l'ancien glyphe de zéro barré est laissé en commentaire, son code est 0x30).

Dans la bibliothèque openGLCD modernisée , que vous pouvez télécharger à partir du lien à la fin de l'article, une correction supplémentaire a été apportée - l'ordre de connexion des broches pour les écrans avec le contrôleur ks0108 a été modifié. La raison pour laquelle l'auteur de la bibliothèque a choisi cette commande (voir le tableau sur le lien sur le site officiel d'Arduino ) est inconnue. Dans la version mise à niveau, la connexion d'affichage (par exemple, le populaire MT-12864J est sélectionné) est effectuée selon ce schéma:

Schéma de connexion du MT-12864J
image

La résistance variable R1 est connectée ici selon la recommandation du fabricant , et la résistance R2 sert à limiter le courant de rétroéclairage si elle n'est pas connectée à la tension 5 V, mais directement à la source d'alimentation d'entrée (sortie Vin Arduino) avec une tension plus élevée.

Un exemple de l'affichage de l'alphabet russe MT-12864J mélangé au latin, ainsi que des chiffres et l'icône de degré, est montré sur la photo:

image

Esquissez le texte de cet exemple:

Le texte du croquis avec la conclusion de l'alphabet russe
#include <openGLCD.h> // 
#include <outstr.h> //     
#include <System5x7R.h> //    

void setup() {
      GLCD.Init(); //
      GLCD.ClearScreen();
      }

void loop()
      {
      GLCD.SelectFont(System5x7R);  // 
      GLCD.CursorTo(0,0); //     
      //  - : 
      outstr("ABC \n");
      outstr("PRQ \n");
      outstr("nts \n");
      outstr("xyz \n");
      GLCD.println("1234567890");
      GLCD.CursorTo(19,4); //     5-  
      GLCD.print("~C"); //  
      GLCD.println("@;/.,|<>()=-_{}\"'");
            GLCD.CursorTo(4,7); //    4  8
      GLCD.print("MT-12864J");
      }



Étant donné que les fichiers avec la fonction outstr.h et la police System5x7R.h se trouvent dans le répertoire racine de la bibliothèque mise à niveau, ils doivent être placés avec des liens distincts au début de l'esquisse à l'aide de la directive #include . Pour les inscriptions en anglais, il est toujours pratique d'utiliser les fonctions standard println / print , mais si vous devez traduire une ligne dans le texte russe, vous devez spécifier explicitement le caractère "\ n".

Vous pouvez télécharger la version corrigée de la bibliothèque ici . La bibliothèque décompressée (dossier openGLCD ) doit être placée dans le dossier Arduino \ bibliothèquescomme d'habitude. Un exemple d'esquisse se trouve séparément dans la même archive (pas dans le dossier Exemples de la bibliothèque). La connexion d'un écran au contrôleur ks0108 conformément à cette bibliothèque est illustrée dans le schéma ci-dessus. Si vous souhaitez également modifier l'ordre de connexion des broches, recherchez le fichier PinConfig_ks0108-Uno.h dans le dossier Arduino \ bibliothèques \ openGLCD \ config \ ks0108 et modifiez les lignes qu'il contient sous le titre "Définitions des broches de données" et plus loin, en vous concentrant sur les corrections de l'auteur.

Dans la prochaine publication, nous essaierons de traiter de la russification des écrans minuscules. Comme vous le verrez, avec eux, tout est à la fois plus facile et plus compliqué.

Source: https://habr.com/ru/post/fr400749/


All Articles