dimanche 4 novembre 2018

Un ARDUINO musical


Un ARDUINO musical

A force de faire des montages sérieux, on finit par oublier de s'amuser.
L'idée de départ provient d'un sujet publié sur le forum ARDUINO :

Il s'agit de faire jouer une partition à un ARDUINO équipé d'un haut-parleur.

1. Le principe

Une pin PWM de l'ARDUINO est utilisée pour produire un son à l'aide la fonction tone().
Chaque note est représentée sous la forme d'une structure :
  • la note (DO, RÉ, MI, etc.)
  • le tempo (NOIRE, BLANCHE, CROCHE, etc.)
  • l'octave
Une partition, avec un peu d'entraînement, pourra être traduite assez facilement.

Les partitions sont des fichiers binaires produits sur le PC à l'aide d'un logiciel écrit en C.

Elles sont stockées ensuite sur une SDCARD pour être jouées par l'ARDUINO.

Un bouton-poussoir permet de passer au morceau suivant.

2. Le matériel

Pour réaliser ce montage il vous faudra :
  • un ARDUINO NANO, UNO, MINI, etc.
  • un petit haut-parleur de quelques watts
  • une résistance de 1K
  • un condensateur électrolytique de 10µF
  • un lecteur SDCARD SPI
  • un bouton-poussoir

3. Les branchements

Vous allez simplement brancher votre haut-parleur avec la résistance et le condensateur en série sur la pin D9 et alimenter l'ARDUINO par le cordon USB.
Le bouton-poussoir est branché entre D8 et GND.

Le condensateur est optionnel. Vous n'allez pas abîmer le haut-parleur ou l'ARDUINO en l'omettant. La résistance les protège. Utilisez une résistance de valeur plus élevée si vous désirez un son plus faible.

Le lecteur SD est connecté comme ceci :


Certains modules peuvent être alimentés en 5V, d'autres non.

4. L'IDE ARDUINO

Il vous faudra installer la bibliothèque ARDUINO suivante :

Pour récupérer la partie logicielle, voir plus bas : 7. Téléchargements.

C'est une archive contenant le sketch ARDUINO, le logiciel de génération des partitions en C, ainsi que 5 partitions toutes prêtes.
Le logiciel de génération des partitions est fourni compilé pour tourner sous LINUX. Sous Windows, il faudra le compiler en utilisant un compilateur GCC.
De nombreux tutos sont disponibles sur le WEB dont celui-ci :

5. Jouons

Branchez le câble USB sur l'ARDUINO. Insérez la MICRO-SD dans le lecteur.
Téléversez le sketch. C'est tout !
Sur le moniteur série, un premier message apparaît au démarrage :
 
card initialized. 

Celui-ci peut apparaître :

Card failed, or not present

Dans ce cas, vérifiez les branchements du module SDCARD et que la SD soit bien insérée.
 
Si tout va bien vous aurez le plaisir d'entendre :
  • la marche impériale
  • le french cancan
  • fireworks
  • la marseillaise
  • une musique baroque

6. Conclusion

Ce montage peut servir de base à la réalisation d'un carillon de porte d'entrée par exemple.
Il faudra certainement améliorer l'interface entre l'ARDUINO et le haut-parleur pour obtenir plus de puissance. Il est possible d'intercaler un petit amplificateur entre le condensateur de sortie et le haut-parleur, avec bien sûr un potentiomètre de volume.

Il existe des amplificateurs que l'on peut directement alimenter en 5V :

7. Téléchargements

Le logiciel : https://bitbucket.org/henri_bachetti/musical-arduino

Dans le répertoire music2bin se trouve un source écrit en C : music2bin.c 

Il contient 5 morceaux :

  • french_cancan
  • marche_imperiale
  • royal_fireworks
  • marseillaise
  • baroque

Il faut compiler ce fichier à l'aide de GNU GCC ou un autre compilateur C sur PC. Son exécution produira 5 fichiers ayant l'extension .zic, que l'on copiera sur la carte SD.

On peut bien entendu ajouter des morceaux dans le source, c'est d'ailleurs la partie la plus ardue du projet, une personne ayant l'habitude de lire une partition aura plus de facilité.


Cordialement
Henri

jeudi 1 novembre 2018

USB : un voltmètre-ampèremètre sensible

USB : un voltmètre-ampèremètre sensible

Cet article décrit la réalisation d'un voltmètre / ampèremètre USB.
Question : pourquoi en fabriquer un alors que les chinois nous inondent de produits de ce genre ?
La plupart de ces petits engins ont une résolution de 10mA.
De plus les faibles valeurs de courant sont surestimées. Celui que je possède affiche 0.03A alors que mon multimètre mesure 13mA.

Comment alors mesurer le courant consommé par notre petit ARDUINO quand on travaille à le rendre sobre ?

Pour cela nous avons besoin d'un instrument de mesure plus sensible. Nous allons nous fixer un objectif à atteindre de 10µA, soit mille fois mieux.

1. Objectif

J'ai déjà décrit sur ce blog un Banc de Mesure de Consommation, capable de mesurer des tensions allant jusqu'à 33V et des courants de 0.5µA à 0.8A. Il est particulièrement adapté à la mesure de consommation de montages à base d'ARDUINO PRO MINI ou STM32 alimentés par batterie.
Il permet de plus de récupérer une courbe de consommation sur l'écran du PC.
Il n'offre pas la possibilité de téléverser le sketch dans la carte en cours de mesure. Il faut pour cela utiliser un autre moyen : un convertisseur USB / série, une UNO en mode ISP, un USBASP, un USBTINY, etc.
Celui que nous allons décrire ici est plus adapté à des cartes ARDUINO UNO, NANO ou autres, alimentées par un port USB.
Il laisse la possibilité de téléverser le sketch dans la carte en cours de mesure.

Il faut savoir qu'un ARDUINO NANO par exemple est capable de descendre à 90µA de consommation, si on le modifie légèrement :
  • retrait de la LED POWER
  • retrait de son régulateur 5V
Si le convertisseur USB de la carte est actif (USB branché), la consommation est de l'ordre de 6 à 8mA.

2. Description

Ce voltmètre / ampèremètre sera développé sur une carte ARDUINO NANO.

L'appareil sera pourvu d'un connecteur USB-B en entrée. Vous pourrez donc le connecter au PC avec un câble USB d'ARDUINO UNO ou MEGA.
La sortie sera faite sur un connecteur USB-A. Vous pourrez donc la connecter à la carte à mesurer avec un câble adapté à celle-ci : USB-B, MINI-USB ou MICRO-USB.
Les pins DATA seront bien sûr connectées entre elles afin de permettre d'utiliser l'IDE ARDUINO (téléversement, moniteur série) sur la carte en cours de mesure.

Voici le schéma de câblage :
Nous allons l'équiper d'un petit afficheur graphique OLED de 128x32 pixels.
Laissons de côté le classique, horrible et encombrant LCD 2x16 caractères en mode ASCII.

Le voltmètre / ampèremètre pourra être alimenté de différentes façons :
  • un cordon MINI-USB relié directement à la NANO
  • une alimentation externe 7.5V à 12V grâce à un connecteur JACK implanté sur le PCB. Vous pourrez directement utiliser une  alimentation prévue pour une UNO ou une MEGA
  • deux batteries LITHIUM-ION 18650. Les deux batteries sont optionnelles et seront placées dans des supports soudés sous le PCB afin de ne pas occuper d'espace sur celui-ci.
Quel principe de mesure allons nous retenir ?

J'ai fait quelques essais infructueux avec l'ADC de l'ARDUINO. La piètre résolution de celui-ci (10 bits) conduirait à employer un shunt de valeur bien trop élevée, de l'ordre de 10Ω, ce qui pénaliserait lourdement la mesure de courants élevés.

Je me suis donc naturellement tourné vers l'INA226 (avec 16 bits c'est nettement plus confortable) précédemment utilisé sur mon banc de mesure. Après quelques essais avec un shunt de 100mΩ il semble bien que l'on puisse atteindre la résolution voulue.

La théorie :
La tension maximale aux bornes du shunt est de 81.92mV, ce qui correspond avec un shunt de 100mΩ à un courant maximal mesurable arrondi de 820mA.
La résolution est donc de 820 / 32768 = 25µA.
Pourquoi 32768 alors que l'ADC de l'INA226 est un 16bits ? Parce qu'il est capable de mesurer des courants négatifs, donc 16 bits moins le bit de signe cela fait 15, et 2 à la puissance 15 = 32768.
Je pense qu'avec un shunt de 250mΩ la résolution serait optimale, au prix d'une baisse du courant maximal mesurable : 330mA. Mais je n'ai que des shunts de 100mΩ sous la main.

Mais vous avez le choix :
  •  shunt de 100mΩ : résolution 25µA, courant maxi 820mA
  •  shunt de 200mΩ : résolution 12.5µA, courant maxi 410mA
  •  shunt de 250mΩ : résolution 10µA, courant maxi 330mA
Dans tous les cas, la chute de tension maximale aux bornes du shunt sera celle de l'INA226 : 81.92mV, ce qui est très acceptable.
Si vous avez besoin de 820mA de courant maxi et d'une résolution de moins de 10µA, le Banc de Mesure de Consommation que j'ai développé dispose de deux INA226, et de deux shunts de 100mΩ et 10Ω avec sélection automatique du calibre.

3. Le matériel

Pour réaliser ce montage il vous faudra :
  • un ARDUINO NANO
  • un module INA226
  • un shunt 100mΩ, 200mΩ ou 250mΩ CMS 2010 ou 2512
  • un afficheur SSD1306 0.91 pouces
  • 3 condensateurs de 100nF
  • deux connecteurs 15 broches femelle au pas de 2.54
  • un connecteur 8 broches femelle au pas de 2.54
  • un connecteur 4 broches femelle au pas de 2.54
  • un connecteur USB-A pour PCB
  • un connecteur USB-B pour PCB
  • un connecteur d'alimentation jack 5.5 x 2.1
  • un inverseur pour PCB
  • deux supports pour batterie 18650 (optionnel)
  • quatre colonnettes M3 longueur 10mm ou 30mm si vous installez les supports de batterie
Souvent les modules INA226 sont équipés d'un shunt 10mΩ.
Ils doivent être remplacés. Il s'agit de résistance CMS 2010 ou 2512.

La soudure que vous allez effectuer sur cette résistance ne sera pas aussi bien réalisée que celle d'un module INA226 produit en usine. Je vous conseille de dessouder la résistance d'origine, de  bien nettoyer les pads du module avec de la tresse à dessouder et de souder la nouvelle résistance avec soin en plaquant bien la résistance sur les pads.
Si vous constatez un petit écart entre la valeur affichée et ce que mesure votre multimètre préféré, c'est que votre soudure est imparfaite. Il vous faudra sans doute corriger la mesure dans le logiciel (voir paragraphe 6. Offset et étalonnage).

Si vous pouvez trouver un module INA226 avec un shunt de 100mΩ ou 200mΩ, n'hésitez pas.

4. Le schéma


Le schéma est réalisé à l'aide de KICAD.

Pour récupérer le projet voir plus bas : 9. Téléchargements

Vous pouvez aisément essayer ce montage sur une breadboard, avec un ARDUINO NANO, MINI ou UNO.

Comme vous le voyez, le montage est très basique. Le SSD1306 et l'INA226 communiquent par le bus I2C avec la NANO.
Le SSD1306 est alimenté par la broche 3.3V de la NANO.

5. L'IDE ARDUINO

Il vous faudra installer les bibliothèques ARDUINO suivantes :
Librairie INA226 : https://github.com/jarzebski/Arduino-INA226

Dans votre IDE (arduino-cc 1.8.5 par exemple), dans le menu "Outils/Type de Carte" choisir "Arduino NANO".
Dans le menu "Outils/Processeur", en fonction de l'âge de votre carte, il se peut que vous ayez à choisir "ATmega328P" ou "ATmega328P (Old Bootloader)".

Pour récupérer le projet voir plus bas : 9. Téléchargements

Dans ce sketch la valeur du shunt est de 112mΩ au lieu de 100mΩ. Ceci est certainement du à la qualité de la soudure que j'ai réalisé.

Si vous choisissez une valeur de shunt différente n'oubliez pas de reporter cette valeur dans le sketch aux lignes 8 et 9 :

#define ina226_OHM                0.200 // ohm
#define INA226_SHUNT              200 // mohm

 

6. Offset et étalonnage

L'INA226 n'est par d'une précision absolue. Il a un petit offset. Lors du premier démarrage, ne branchez rien sur le port de sortie USB-A. Il affiche une petite valeur de courant.
La valeur relevée sur mon exemplaire est de -0.04 mA.
Cette valeur doit être reportée en négatif dans le sketch à la ligne 11 comme ceci :

#define OFFSET                    0.04

Recompiler et recharger le sketch dans la NANO. Maintenant le voltmètre / ampèremètre doit afficher 0.00 ou -0.00.

Après cette opération, les mesures de faible valeurs seront beaucoup plus exactes.

Pour ceux qui le désirent, il est possible aussi d'ajuster la valeur du shunt dans le code par comparaison de la valeur affichée par le voltmètre / ampèremètre avec celle affichée par un multimètre branché en série avec la charge.
Pour cela il vous faudra bricoler un câble USB pour permettre d'insérer le multimètre sur le fil rouge (voir paragraphe suivant).

Il faut modifier la valeur dans le sketch aux lignes 8 et 9 :

#define ina226_OHM                0.112 // ohm
#define INA226_SHUNT              112 // mohm


Lorsque la valeur affichée correspond à celle donnée par le multimètre, c'est que votre étalonnage est correct. La précision dépendra bien entendu de celle de votre multimètre.

Inutile de chercher à atteindre les 0.1%. La précision de la mesure d'un courant n'est pas aussi cruciale que celle d'une tension. On cherche à avoir une bonne estimation de la consommation afin d'être capable de dimensionner correctement la capacité de l'alimentation ou de la batterie qui va fournir l'énergie au montage, rien de plus.

7. Utilisation

Maintenant que le voltmètre / ampèremètre est réalisé, comment s'en servir ?

Alimentons le voltmètre / ampèremètre. Vous avez le choix :
  • un câble  / mini-USB directement sur la NANO du voltmètre / ampèremètre
  • une alimentation 7.5V à 12V sur le JACK du voltmètre / ampèremètre
  • deux batteries LITHIUM-ION
Nous allons relier maintenant le port USB-B à un port USB du PC ou un HUB. Ensuite le port USB-A va être relié à l'aide d'un autre câble à la carte à tester, une NANO dans mon cas, donc un câble MINI-USB :


En bas : le câble MINI-USB d'alimentation du voltmètre / ampèremètre.
En haut à droite :  le câble USB-A / MINI-USB reliant le voltmètre / ampèremètre à la carte à mesurer (la NANO à gauche de la carte).
En haut à gauche :  le câble USB-A / USB-B reliant le voltmètre / ampèremètre au PC.

On aura pris soin de modifier cette NANO pour nos essais, car nous allons essayer de mesurer sa consommation en mode veille :
- retrait de la LED POWER
- retrait de son régulateur 5V

Chargeons ce petit sketch dans la carte à tester :

#include <LowPower.h>

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
}

Il ne s'agit pas de charger ce sketch dans la NANO située sur le voltmètre / ampèremètre bien entendu. Il faut être certain de choisir le bon port USB.
Si vous alimentez le voltmètre / ampèremètre par la prise JACK ou deux batteries, pas de confusion possible.

Si vous utilisez un câble USB-A / MINI-USB pour relier la NANO du voltmètre / ampèremètre au PC le plus simple est d'utiliser le port de charge d'un HUB USB, comme le port jaune de celui-ci :
Qu'affiche le voltmètre / ampèremètre ?
Tension = 5.29V et courant 5.8mA en veille, et quelques 25mA quand la LED clignote. Jusque là rien d'anormal. Les 5.8mA correspondent à la consommation du convertisseur USB / série de la NANO.

On ne peut donc éviter de mesurer ce courant non voulu, alors que plus haut nous disions que "Il faut savoir qu'un ARDUINO NANO par exemple est capable de descendre à 90µA de consommation, si on le modifie légèrement" ?

Mais comment allons nous mesurer la consommation réelle de la carte à tester en mode veille ?
Il faut donc rendre le convertisseur USB / série inactif, simplement en omettant de l'alimenter.

Nous allons nous aider d'un petit câble, que vous pouvez acheter ou fabriquer vous-même :
Si vous fabriquez ce câble vous-même vous utiliserez de préférence quatre connecteurs DUPONT à 1 broche séparés. Ce sera plus pratique. Dans le cas contraire, vous utiliserez deux fils DUPONT même / femelle pour le raccordement au 5V et GND de la carte à mesurer.

Il suffit de brancher ce câble sur le port USB-A du voltmètre / ampèremètre et de connecter uniquement le fil noir à la pin GND de la carte à tester et le fil rouge à la pin +5V.

Oh magie, un beau petit 0.08mA apparaît sur l'afficheur :


Par contre vous ne pouvez plus charger de sketch dans la NANO, et pour cause, les deux fils data ne sont pas branchés. Retour au câble USB normal donc, car vous avez besoin de poursuivre votre travail.

Mais vous avez au moins validé le fait que votre carte consomme peu. Il faudra simplement faire cette vérification une dernière fois lorsque votre application sera terminée.

8. Photos

Ci-dessous deux photos du montage réalisé :


Oui, l'afficheur est en haut à droite, c'est tout petit. A sa gauche, l'INA226.
 

9. Téléchargements

Le projet est disponible ici :

https://bitbucket.org/henri_bachetti/ina226-usb-amperemeter

Cette page vous donne toutes les informations nécessaires :
https://riton-duino.blogspot.com/p/migration-sous-bitbucket.html

10. Conclusion

Je reconnais que cet article est un peu long mais il faut bien expliquer comment concevoir ce genre d'appareil, et justifier les choix par un peu de théorie.

Sur ce blog vous avez certainement remarqué mon intérêt pour tout ce qui touche à l'alimentation par batterie de nos petits processeurs préférés. Ce genre d'appareil est précieux et indispensable quand il s'agit de mener à bien un projet basse consommation.

Bonnes bidouilles.
Cordialement
Henri

11. Mises à jour

04/11/2018 : ajout d'informations dans les paragraphe 2, 3, 6 et 10
17/11/2018 : ajout schéma de câblage et photos paragraphe 7. Utilisation


samedi 20 octobre 2018

ARDUINO : problèmes de téléversement

ARDUINO : problèmes de téléversement

Dans ce document nous allons essayer de recenser toutes les sources possibles de problèmes pendant le téléversement d'une carte ARDUINO.

1. Le principe

Lors du téléversement L'IDE ARDUINO affiche le message "Téléversement ...".
Ensuite les opérations suivantes s'enchaînent : 
  • reset de la carte par le fil DTR de la liaison série
  • le bootloader de l'ARDUINO se met à l'écoute de la ligne série
  • l'IDE envoie le fichier .hex au bootloader
  • celui-ci extrait les données binaires de chaque message et les écrit dans la mémoire FLASH
  • le bootloader lance l'application
Trop de débutants  confondent compilation et téléversement. Le code C n'est pas envoyé à l'ARDUINO tel quel, il est d'abord compilé pour fabriquer un fichier en langage machine, dépendant du processeur utilisé.

Dans un premier temps, l'IDE affiche "Compilation du croquis". S'il y a un problème dans votre code, le fichier .hex ne sera pas généré et le téléversement n'aura pas lieu.

Ensuite, si la compilation s'est bien passée, il affiche "Téléversement ...", et c'est à ce moment que les ennuis peuvent commencer.

Si le téléversement échoue, le bootloader lance l'application, qui est généralement l'exemple "blink" pour une carte neuve. Donc si la LED D13 clignote c'est normal.

2. Les drivers USB

Selon l'OS que vous utilisez, il vous faudra installer on non un driver pour le convertisseur USB / série implanté sur la carte.
Selon l'origine le convertisseur peut être de différents types :
  • FT232RL
  • CH340G
  • ATMEGA8 (anciennes version de UNO ou MEGA)
  • ATMEGA16U2
  • etc.

2.1. Windows

Il faut absolument identifier le convertisseur et utiliser le driver adapté. Pour une NANO par exemple, celui-ci est situé sous la carte.
Il faudra probablement utiliser une loupe si votre vue n'est pas excellente.

Il y a beaucoup de tutos sur le WEB qui expliquent cette opération, CELUI-CI par exemple.

Si votre carte possède un convertisseur CH340G, il faut télécharger le driver ICI. Il y a aussi des tutos, dont CEUI-CI.

Après l'installation, en branchant la carte ARDUINO, un port série supplémentaire doit apparaître dans le "Gestionnaire de Périphériques".
En débranchant la carte le port doit disparaître.

2.2. LINUX

Les possesseurs d'un système LINUX n'auront pas à installer de driver, car la majeure partie de ceux-ci font partie de la distribution.
Il suffit de vérifier avec dmesg que le branchement de  la carte ARDUINO provoque la création d'un nouveau port de communication.

[11319.753230] usb 2-1.1.1: new full-speed USB device number 12 using ehci-pci
[11319.846506] usb 2-1.1.1: New USB device found, idVendor=1a86, idProduct=7523
[11319.846512] usb 2-1.1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[11319.846515] usb 2-1.1.1: Product: USB2.0-Serial
[11319.846943] ch341 2-1.1.1:1.0: ch341-uart converter detected
[11319.848601] usb 2-1.1.1: ch341-uart converter now attached to ttyUSB1

A la déconnexion, avec dmesg vous verrez ceci :

[11484.934167] usb 2-1.1.1: USB disconnect, device number 12
[11484.934444] ch341-uart ttyUSB1: ch341-uart converter now disconnected from ttyUSB1
[11484.934479] ch341 2-1.1.1:1.0: device disconnected

Il se peut que l'IDE ne parvienne pas à ouvrir le port pour des raisons de privilèges. Suivez ces INSTRUCTIONS.
 

2.3. La suite

Tant que le port n'apparaît pas dans le "Gestionnaire de Périphériques" Windows ou dans les messages affichés par dmesg, c'est tout à fait inutile d'aller plus loin.
Cette étape est essentielle et obligatoire.

3. Les problèmes

3.1. Les broches de la carte

Certaines cartes dont la NANO, sont livrées avec deux barrettes de broches mâles. Ces barrettes doivent être soudées proprement sur la carte.
Cela ne devrait pas gêner le téléversement si les elles ne le sont pas, mais l'exécution du code pourrait poser problème.
Certains ont déjà essayé de faire tourner une application avec les barrettes enfichées dans une breadboard et la carte simplement posée dessus, sans soudures. Et ce n'est pas une blague, c'est malheureusement arrivé !

3.2. Le type de carte et le processeur

Le bon type de carte doit être sélectionné dans le menu "Outils / Type de carte".
Pour certaines cartes le processeur peut être choisi dans le menu "Outils / Processeur".

Cas particulier : avec l'ARDUINO NANO vous avez le choix entre :
  • ATmega328p
  • ATmega328p (Old Bootloader)
  • ATmega168
Le choix "ATmega328p (Old Bootloader)" correspond à une ancienne version du bootloader. Si en choisissant "ATmega328p" le téléversement ne fonctionne pas choisissez "ATmega328p (Old Bootloader)".

L'ARDUINO PRO MINI se décline en quatre versions :
  • ATmega328p (5V, 16MHz)
  • ATmega328p (3.3V, 8MHz)
  • ATmega168 (5V, 16MHz)
  • ATmega168 (3.3V, 8MHz) 
Choisissez bien l'option qui correspond à la carte que vous avez acheté. Si par exemple dans votre code vous ouvrez la ligne série à 115200 baud, que vous avez choisi l'option 115200 dans le moniteur série et que vous voyez des caractères étranges s'afficher, il est probable que la fréquence choisie pour le processeur ne soit pas la bonne.

3.3. L'USB

Le port de communication doit être choisi dans le menu "Outils / Port".
Il peut arriver que vous ayez plusieurs cartes branchées et que le port choisi ne corresponde pas à la carte voulue.
Vérifiez en branchant et débranchant la carte que le port choisi est le bon.
Lorsque l'on débute il vaut mieux travailler avec une seule carte à la fois.

Une source de problème peut être le câble USB. Utilisez un câble court et en bon état. Les cas de panne due au câble sont plutôt rares.

3.4. La ligne série

Le convertisseur USB / série envoie les caractères à transmettre à la ligne série de l'ATmega.
Les deux pins D0 (RX) et D1 (TX) ne doivent pas être reliées à d'autres composants ou modules (Bluetooth par exemple) pendant le téléversement.
Certaines cartes, la DUE par exemple, possèdent un port USB dédié. Utiliser de préférence ce port dit "Native USB Port".

3.5. Logiciels annexes

Certains logiciels peuvent bloquer l'accès au port série. Fermez tous les programmes susceptibles d'ouvrir les ports de communication, les terminaux série en particulier.
Certains dongles peuvent également poser problème, y compris certains dongles de souris / clavier. Essayez en les retirant.

3.6. Le RESET

Sur certaines cartes, le RESET automatique peut ne pas fonctionner, ou ne pas fonctionner avec certains PC.
Appuyez sur le bouton RESET un peu avant que le téléversement ne commence.

3.7. La panne

Vous avez peut effectué une manipulation précédente (erreur de tension d'alimentation par exemple) qui a détruit le convertisseur USB ou le processeur.
Si l'un des deux composants chauffe, il est probablement mort.
Cela vous incitera certainement à ne jamais commander une seule carte, sauf pour les modèles dont le prix est élevé.

3.8. Le bootloader

Il peut arriver que le bootloader soit détruit accidentellement à cause par exemple d'une chute lente de l'alimentation et des fuses mal programmés.

Dans un premier temps, il est judicieux de déterminer si c'est réellement la cause du problème. Lorsque vous appuyez sur le bouton RESET, la LED connectée sur la pin 13 doit s'allumer brièvement. Si ce n'est pas le cas, le bootloader est absent.

Il est possible de reprogrammer le bootloader en utilisant une autre carte UNO par exemple. Cette opération s'effectue en reliant le bus SPI de la UNO au connecteur ICSP de la carte à reprogrammer.

Un tuto est disponible ICI.

Dans ce tuto, vous verrez qu'il est possible de graver le bootloader d'une UNO à l'aide d'une MEGA. Je l'ai essayé, et cela fonctionne.
Il faut faire la manip suivante : 
  • branchement USB de la MEGA sur le PC 
  • branchement SPI MEGA / UNO
  • condo 10µF entre RESET et masse de la MEGA
  • ouverture sketch ArduinoISP 
  • choisir type de carte : Arduino/Genuino Mega or Mega2560 
  • téléversement du sketch dans la MEGA (bouton téléverser) 
  • choisir type de carte : Arduino/Genuino Uno 
  • choisir Programmateur : Arduino as ISP
  • Outils / Graver la séquence d'initialisation
On peut également utiliser un programmateur USBasp.

Sous LINUX, j'ai écrit un tuto ICI.

Il y a CELUI-CI aussi.

4. Travailler sans le bootloader

Le bootloader ARDUINO n'est pas absolument nécessaire. On peut fort bien s'en passer en utilisant un programmateur comme celui décrit dans le paragraphe précédent.

Cela permet de gagner 2K en mémoire FLASH.
Le port USB de votre carte pourra être connecté au PC pour bénéficier du moniteur série (console).

Dans l'IDE ARDUINO, choisir dans le menu Outils / Programmateur : "USBasp" ou "Arduino as ISP" ou un autre programmateur de votre choix.
Dans le menu "Croquis / Téléverser avec un programmateur"

Dans ce cas, l'application que vous allez téléverser va écraser le bootloader. En d'autres termes elle prend la place de celui-ci et il sera impossible après cette opération de téléverser par la voie normale qui utilise le câble USB. Il faut prendre l'habitude d'effectuer le téléversement par le menu "Croquis / Téléverser avec un programmateur".

Pour revenir à la situation "normale", avec bootloader et téléversement par l'USB, choisir dans le menu "Outils / Graver la séquence d'initialisation".


5. Références

Le guide officiel : https://www.arduino.cc/en/Guide/Troubleshooting#upload

6. Mises à jour

29/12/2018 : mise à jour paragraphe  3.8. Le bootloader

dimanche 14 octobre 2018

Batteries LITHIUM-ION : recharge en série

Batteries LITHIUM-ION : recharge en série

Nous allons dans cette page essayer de bâtir une solution de recharge de batteries LITHIUM-ION en série.

La recharge de batterie LITHIUM-ION en série ou série / parallèle, contrairement à ce que certaines personnes prétendent, est parfaitement réalisable à condition d'utiliser le matériel adapté. Sinon comment rechargerions-nous nos vélos ou autres trottinettes électriques ?

La solution n'a pas pour vocation de remplacer un chargeur du commerce, elle est plutôt destinée à être intégrée dans un montage à alimentation autonome, que l'on recharge régulièrement par le secteur ou un panneau solaire, sans démontage des batteries.

La solution recherchée est destinée à alimenter un montage en 12V, 18V, 24V ou plus, un préamplificateur de microphone ou une enceinte amplifiée par exemple.
Dans mon cas il s'agit d'un préamplificateur haut de gamme associé à un filtre actif.

La majeure partie des projets à base d'ARDUINO, ESP8266 ou STM32 ne requièrent qu'une seule batterie de 3.7V. Dans ce cas, inutile de s'encombrer avec ce qui suit. Il vaut mieux se tourner ver une petite solution à base de TP4056, très simple, efficace et bon marché.
On pourrait penser que charger 3 batteries en série en connectant les entrées de 3 TP4056 en série est possible, mais cette solution est déconseillée. En effet lorsque la première batterie sera chargée le TP4056 qui lui est raccordé va se couper, entraînant également la coupure des deux autres.

1. Un peu de théorie

La charge se passe généralement en deux phases, une première phase à courant limité de l'ordre de C/2 à 1 C (C étant la capacité de l'accumulateur). Cette phase permet une charge rapide jusqu'à environ 80 %, puis une deuxième phase à tension constante et courant décroissant pour se rapprocher des 100 % de charge en environ deux heures de plus. La charge est terminée lorsque le courant de charge chute en dessous d'une valeur appelée courant de fin de charge.

La tension de fin de charge des accumulateurs Li-ion peut être de 4,1 à 4,2 V suivant la spécification du fabricant de l'accumulateur. La tolérance couramment admise est de ± 0,05 V par élément, ils sont très sensibles à la surcharge et demandent une protection lorsqu'ils sont connectés en série.

Les chargeurs doivent être de bonne qualité pour respecter cette tolérance. Il importe de toujours respecter la feuille de données fournie par le fabricant, qui fait état des conditions de charge de l'accumulateur (tolérance, courant de charge, courant de fin de charge, etc.). Toutefois, certains éléments destinés au grand public possèdent une électronique interne qui les protège des mauvaises manipulations (surcharge, décharge profonde). En effet, la décharge doit être limitée à une tension de 3 V par élément, une tension de décharge inférieure à 2,5 V peut conduire à une destruction de l'élément.

Origine : WIKIPEDIA

2. Le matériel

Pour effectuer nos essais, nous allons utiliser quatre éléments :
  • une carte de protection
  • une carte d'équilibrage
  • une source de courant
  • 3 batteries 18650
Le choix de 3 batteries est adaptée à mon cas. On peut parfaitement utiliser cette solution pour charger 4, 5, 6 batteries ou plus, selon les besoins.

2.1. La carte de protection

La carte de protection est sensée protéger la ou les batteries contre les petits accidents indésirables :
  • surcharge en tension
  • surconsommation ou court-circuit
  • décharge profonde
La carte de protection ne régule pas le courant de charge. Son seul rôle est de  le couper en cas de problème.
En décharge elle assurera principalement la coupure de la batterie avant qu'elle ne tombe en décharge profonde.

Elle est normalement équipée d'un circuit de commande et de quelques transistors MOSFET de puissance.

La carte que je vais utiliser est une 3S. Cela veut dire qu'elle est capable de protéger 3 batteries en série. Elle est équipée d'un circuit S-8254A, c'est à dire d'un circuit intelligent capable d'enchaîner les deux cycles de charge, à courant constant, puis à courant décroissant.

L'offre en matière de carte de protection de batteries LITHIUM-ION est assez importante et il est difficile de faire son choix. Il est également difficile de trouver des petits modèles de 5A à 10A.

Il faut bien comprendre que c'est la source de courant (bloc secteur) en amont de la carte de protection qui fournit le courant et qui limite celui-ci. La carte de protection et équilibrage, même si elle est capable de laisser passer 10A ou 25A se contentera de ce que le chargeur lui donnera, 1A par exemple.
En d'autres termes choisir une carte de protection 10A ou 25A pour charger des batteries avec seulement 1A ne pose aucun problème.

2.2. La carte d'équilibrage

La carte d'équilibrage permet de répartir la charge entre les batteries.
Si le niveau de charge des batteries est légèrement différent, le courant de charge des éléments les plus chargés est dérivé à travers une résistance.
Une carte d'équilibrage est caractérisée par le courant de déséquilibre maximal qu'elle est susceptible de corriger.

La carte que je vais utiliser est aussi une 3S. Elle est sensée pouvoir corriger un déséquilibre de 66mA.
Cela veut clairement dire que la carte ne pourra pas compenser un déséquilibre très important. On chargera donc en série plusieurs batteries identiques dont l'état de décharge est semblable. Il serait impensable de charger en série deux batteries presque pleines et une batterie presque vide.

2.3. La carte de protection et équilibrage

Il existe des cartes combinant la fonction protection et la fonction équilibrage :
Cette carte est bien évidemment plus facile à câbler, mais on remarque assez facilement qu'elle est équipée uniquement de composants discrets, sans intelligence. Il serait étonnant qu'elle soit aussi performante que la solution précédente.
Je vais tester ce modèle provenant d'AliExpress.

2.4. La source de courant

La recharge doit être effectuée à l'aide d'une source de tension limitée en courant. Pour mes essais une alimentation de laboratoire est utilisée.
La tension est réglée sur 12.6V et la limitation de courant est fixée à 500mA.

Ce qu'il est important de comprendre est que l'alimentation réglée sur 12.6V et limitée à 500mA va essayer de produire cette tension, mais la limitation du courant fera chuter celle-ci si la tension de la batterie est plus faible. Ce sera le cas en début de charge, puisque la tension de la batterie sera d'environ 9V si elle est vide. La tension de sortie de l'alimentation sera donc également égale à 9V, et elle augmentera avec la charge, le courant restant constant.

On peut aussi utiliser un chargeur à découpage 12.6V / 1A (Les modèles 500mA sont moins courants) comme celui-ci :


Ces chargeurs sont normalement prévus pour être utilisés seuls, sans carte de protection ni d'équilibrage, mais il est impératif de ne charger que des batteries dont l'état de charge est très proche, sous peine de surcharger un ou plusieurs éléments.
Dans cette étude nous ne cherchons pas seulement à recharger des batteries. On désire le faire dans les meilleures conditions possibles et on a besoin d'ajouter un peu de sécurité, notamment un arrêt automatique de la charge et une coupure pour éviter les décharges profondes.

On peut également utiliser toute alimentation, à partir du moment où sa tension est ajustable et qu'elle possède une limitation de courant adaptée aux batteries à recharger. Il est important de choisir un modèle qui ne coupe pas sa sortie lorsque la limite de courant est atteinte.

Pour charger trois batteries 18650 2000mAH on choisira un modèle 12V / 1A. Il est préférable qu'elle possède un réglage de tension que l'on pourra ajuster sur 12.6V précisément.

La valeur de 12.6V est importante car elle va conditionner le passage de la charge à courant constant à la charge à courant décroissant.
Pendant la première partie de la charge, à courant constant, la tension de l'alimentation va augmenter naturellement et proportionnellement à celle de la batterie.

Je déconseille totalement d'utiliser une alimentation à découpage classique du genre alimentation à encastrer 12V :

Une alimentation à découpage de ce genre ne sera pas capable de limiter le courant. Elle coupera sa sortie si le courant dépasse ce qu'elle est capable de fournir.

2.5. Les batteries

Nous allons utiliser 3 batteries du type 18650, très répandues et bon marché.

Il est conseillé d'utiliser des batteries de capacité équivalentes, du même modèle de préférence et ayant le même age.

Ces batteries doivent être avoir été chargées au moins une fois, car même si nous allons la décharger pour nos essais, il ne faut pas décharger une batterie neuve. Au contraire, il convient de la recharger avant toute utilisation.

Au passage ne vous fiez pas à ce qu'il est écrit sur les batteries chinoises bon marché. La capacité promise de 6000mAH se révèle assez souvent plus proche de 1000mAH.

C'est le cas des batteries que je vais utiliser pour ce test, des Ultra-Fire.

Des supports de batteries sont indispensables :

3. Branchements

Les supports de batteries ainsi que les deux cartes seront équipés de fils de 0.5 mm2 terminés par des connecteurs mâles du type DUPONT.

Il faut relier le pôle négatif, le premier point milieu, le deuxième point milieu et le pôle positif des batteries sur les broches 0V, 4.2V, 8.4V et 12.6V de la carte de protection.
La carte d'équilibrage se branche en parallèle sur les batteries exactement de la même façon :

Suivant le cas, les cartes sont sérigraphiées de manière différente :
  • 0V, 4.2V, 8.4V et 12.6V
  • 0V, 3.7V, 7.4V et 11.1V
  • B1, B2, B3, B4
  • etc.

4. Mode opératoire

4.1. La décharge

Pour commencer nos essais de charge nous allons commencer par décharger nos batteries.
Pour cela le plus simple est d'utiliser une charge du type ampoule de feu de direction de voiture. Elle consomme 21W ce qui produira un courant de décharge de 1.75A sous 12V. Il faudra compter une bonne demi-heure pour décharger une batterie de 1000mAH.
Il faut brancher cette charge sur les connecteurs P- et P+ de la carte de protection.

Lorsque je connecte la charge la tension aux borne de la batterie chute de 12.6V à 10.8V. Les batteries que j'utilise sont des modèles chinois de piètre qualité, ayant probablement une résistance interne assez élevée.

Normalement la carte de protection doit limiter la décharge des batteries afin de ne pas occasionner de décharge profonde, ce qui serait dangereux pour elles. C'est la première vérification que nous allons effectuer.

Au bout de 30 minutes la carte de protection joue son rôle et la lampe s'éteint. Avec la carte que j'ai utilisé la valeur de la tension lors de la coupure est de 9.05V, ce qui donne 3V par batterie. Ce n'est pas mal du tout.
La carte fonctionne bien sur ce point, ce qui est positif.

Lorsque la décharge est interrompue, la tension remonte au dessus de 10V, ce qui est normal, car les batteries ne débitent plus de courant, et la résistance interne n'intervient plus dans la mesure.
Ces batteries ont une capacité de 1AH. La décharge que nous venons d'effectuer a été faite avec un courant assez important, ce qui fausse la mesure de la carte de détection à cause de la résistance interne des batteries, et donc coupe la décharge trop tôt, laissant une quantité d'énergie assez importante dans les batteries, peut-être de 15 à 20%.
Dans des conditions réelles et une consommation plus raisonnable, la décharge s'effectuerait sur une durée beaucoup plus importante et serait plus profonde.
Mais il est vrai aussi que dans la vie réelle d'une batterie il est rare de la décharger complètement. On la recharge avant que sa capacité ne chute trop bas, afin de stocker de l'énergie pour la prochaine utilisation.

4.1.1. La carte de protection et équilibrage
A noter : la carte présentée en 2.3. coupe la décharge plus tôt : 9.5V, donc 3.16V par élément.

4.2. La charge

Pour charger les batterie dont je dispose je règle l'alimentation sur un peu plus de 12.6V avec un multimètre précis, en lui faisant débiter 500mA à l'aide d'une résistance de 24Ω 15W, sans limitation de courant, après un temps de chauffe de quelques minutes.
Ceci est important car cela permet de s'assurer que l'alimentation fournira bien ces 12.6V à la fin de la charge à courant constant. Faire le réglage à vide produirait un résultat erroné, ne tenant pas compte des chutes de tension dans le câblage.
La limitation de courant est ensuite réglée sur 500mA (C/2).

Il n'y a plus qu'à débrancher la charge et brancher notre chargeur. On va pour cela utiliser les mêmes broches P- et P+ de la carte de protection.

Le multimètre est branché sur les batteries.

Avec l'alimentation de laboratoire et son ampèremètre, il va être facile de surveiller le courant de charge. Sinon, avec une alimentation sans ampèremètre, il faudra brancher un autre multimètre entre celle-ci et la carte de protection.

Ensuite, comment surveiller la charge de chacune des batteries ?
Sur la carte d'équilibrage il y a des résistances qui servent à dériver le courant excédentaire de chaque batterie. Elles sont facilement reconnaissables, ce sont des résistances CMS de puissance, d'une valeur de 100Ω à 1KΩ.
On pourra mesurer ce courant à l'aide d'un voltmètre, en s'aidant de la loi d'ohm (I=U/R). Si la tension aux bornes de chaque résistance est nulle, cela voudra dire que la charge se déroule très très bien, c'est à dire que les batteries sont dans le même état de charge pendant l'opération.

Commençons la charge. Au bout de quelques secondes la tension batterie monte à 11.5V, l'ampèremètre indique bien 500mA.

La tension aux bornes des résistances de la carte d'équilibrage est de 0.00V, ce qui veut dire que la charge de départ des batteries est homogène.

En dix minutes la tension aux bornes des batteries monte à 12V.
Au bout d'une heure de charge, la tension est de 12.58V. Normalement la carte de protection ne devrait pas intervenir, car cela reste une tension normale de fin de charge.

Le courant commence à décroître. Il atteint 360mA au bout de 1H15 de charge.
La charge à courant décroissant va durer quelques heures. Nous stopperons la charge lorsque le courant de charge tombera en dessous de 0.03C c'est à dire 30mA pour notre batterie de 1000mAH.

Au bout de deux heures de charge, le courant de charge est de 180mA.
Au bout de trois heures de charge, il est de 50mA.

Nous allons nous arrêter là. Au delà de 3 heures, cela devient un peu trop long. Les 30mA ne sont pas atteints mais j'ai peut être placé la barre un peu haut. Les batteries sont tout de même très bien chargées.

4.2.1. La carte de protection et équilibrage
A noter : la carte présentée en 2.3. coupe la charge au bout de 25 minutes, aussitôt que la tension de 12.6V est atteinte aux bornes de la batterie.
Une fois la charge coupée la tension aux bornes de la batterie retombe à 12.2V, ce qui correspond à 4.06V par élément. C'est insuffisant.
Il n'y a pas de phase de charge à courant décroissant, donc aucune chance que celle-ci soit chargée à bloc.

4.3. Le courant consommé à vide

Il  est intéressant de mesurer le courant consommé par les deux cartes sur la batterie, car s'il était trop important, cela les viderait plus ou moins rapidement aussitôt la source de courant débranchée.
La carte de protection est censée consommer 18µA. Je n'ai aucune donnée concernant la carte d'équilibrage.

Avant de mesurer il faut bien entendu débrancher l'alimentation, car cela fausserait la mesure.
Les deux cartes consomment 27µA, ce qui est tout à fait acceptable.

Les deux cartes pourront donc être laissées en permanence en parallèle sur les batteries sans que cela aie un impact important sur l'autonomie.
Seul la source de courant aura besoin d'être branchée pour la recharge.
 

5. Conclusion

5.1. Carte de protection intelligente + carte d'équilibrage

La solution semble fonctionner correctement. La carte de protection assure sa mission, la carte d'équilibrage aussi. Le résultat est encourageant.

La carte de protection n'a pas coupé la charge. Elle a probablement une tension de seuil de détection de surcharge légèrement supérieure à 12.6V.

Le point délicat reste la source de courant. Le courant de charge doit être choisi avec soin. En général il se situe aux alentours de C/2 à 1C. Je préfère C/2 car cela augmente leur durée de vie.
Dans le monde du modélisme, ce sera certainement 1C ou plus, mais les amateurs de cette discipline démontent les batteries pour les charger, et disposent de plusieurs jeux de remplacement.

Le choix de la source de courant dépendra donc du choix des batteries. Une batterie de 3000mAH sur un montage nécessitant de la puissance et un temps de charge réduit sera chargée à 3A.
Une batterie 500mAH en utilisation "standard" sera chargée à 250mA.

La majeure partie des batteries de marque ont des capacités élevées : 2500 à 3000 mAH. Elles peuvent en outre fournir un courant important. On trouve des batteries 18650 capables de délivrer 20A à 30A !
Si votre application est exigeante en courant tournez-vous plutôt vers ce genre de batteries.

Mais si votre application consomme peu, vous pouvez vous contenter de batteries bon marché aux performances faibles.
Mon thermomètre sur batterie tourne depuis décembre 2017 sur une batterie bon marché 16340 de 225mAH. Sa capacité est encore de 92%. Ce qui est recherché dans ce montage est l'autonomie et non pas la puissance instantanée.

J'ai mené cette petite expérimentation dans le but d'alimenter un montage audio dont la consommation devrait avoisiner les 100mA sous 2x12V.

La charge des batteries sera démarrée lorsque l'interrupteur marche / arrêt sera basculé sur OFF. Il faut également un dispositif capable de couper le chargeur lorsque le courant de charge descend en dessous d'un certain seuil (0.03C).
L'autonomie avec les batteries utilisées devrait être d'une dizaine d'heures, ce qui convient parfaitement.

Malgré tout, la résistance interne de ces batteries ne me satisfait pas. En effet ce n'est pas ce que l'on recherche en général dans un montage audio haut de gamme. Une résistance interne élevée de l'alimentation nuit à la dynamique.
Je me tournerai donc plutôt vers des batteries SONY 18650 VTC6 3000 mAH, ou MXJO IMR 18650 3000mah. Ce sont toutes deux des batteries de cigarette électronique de grosse puissance.

Lorsque l'on démarre ce genre d'étude, il n'est pas évident de déterminer le rôle de chaque élément dans la chaîne (chargeur, carte de protection) et je n'ai pas trouvé sur le WEB d'exemples pratiques de montages. J'ai donc décidé d'expérimenter par moi-même.

J'espère qu'avec cette petite expérimentation nous aurons quelque peu débroussaillé le terrain de la charge de ces accumulateurs en série.
Les remarques sont bien entendu les bienvenues.

5.2. La carte de protection et équilibrage
Comme dit plus haut la carte présentée en 2.3. n'est pas une carte intelligente, elle est incapable d'assurer les deux phases de charge (courant constant puis courant décroissant). Il n'est pas étonnant que la charge obtenue soit partielle.

Il faut donc privilégier les cartes équipées d'un contrôleur de charge intelligent du type S-8254A ou équivalents.

6. Le chargeur IMAX B6

Certains chargeurs du commerce sont très évolués, comme ce chargeur de chez SKYRC, le IMAX B6 :
Ce chargeur permet de recharger tous types de batteries :
  • LITHIUM-ION
  • LIPO
  • NI-CD
  • NI-MH
Il est livré avec un ensemble de cordons adaptateurs, permettant de le brancher sur divers types de batteries de modélisme.
Il est aussi capable de d'équilibrer la charge de batteries LITHIUM en série, grâce à cinq connecteurs JST sur le côté droit :
Il est possible d'équilibrer la charge de batteries de type 2S, 3S, 4S, 5S et 6S. Certaines batteries du commerce possèdent un connecteur d'équilibrage, comme celle-ci :
Après avoir branché le connecteur rouge sur les bornes de charge à l'aide de l'adaptateur adéquat, il suffit de brancher le petit connecteur blanc sur l'une des embases blanches du chargeur pour obtenir une charge de qualité.

7. Mises à jour

11/11/2018 : ajout paragraphe 6. Le chargeur IMAX B6
16/06/2020 : test d'une carte protection+équilibrage

lundi 8 octobre 2018

ARDUINO : cartes alternatives

ARDUINO : cartes alternatives

Nous allons examiner dans cette page quelques alternatives existantes aux cartes ARDUINO, en particulier celles produites par INHAOS.

1. MASSDUINO

Les cartes MASSDUINO sont équipées d'un processeur MD-328D, proche de l'ATMEGA328P.
Ce processeur offre quelques avantages intéressants :

  • alimentation 5V et 3.3V tout en conservant une horloge à 16MHz
  • ADC 10, 12 ou 16 bits
  • 2 sorties DAC 8 bits

Pour les cartes à base de MD-328D, un "support package" pour l'IDE ARDUINO existe ICI.
Arduino - MassDuino_Support_Package V46r2

Concernant la possibilité d'alimenter en 3.3V, cette possibilité impacte directement les GPIOs, qui vont avoir une tension de sortie de 3.3V. Cela permet de connecter des capteurs et des modules directement prévus pour cette tension.

1.1. Massduino UNO LC

Cette carte est au format ARDUINO UNO.
Par rapport à une UNO elle offre les avantages suivants :
  • connecteur micro-USB
  • connecteurs doublés mâle / femelle
  • alimentation 3.3V ou 5V, le choix se faisant par déplacement d'un cavalier
  • courant disponible 5V : 880mA
  • courant disponible 3.3V : 600mA
Le convertisseur USB / Série est un CH340G.

Dans l'IDE ARDUINO la carte à sélectionner est : MD328D-LQFP32.

1.2. Massduino UNO LC LITE

Cette carte est également au format ARDUINO UNO.
Elle ne possède pas de convertisseur USB / Série. Cela entraîne un gain de consommation d'environ 10mA.
Vous devrez utiliser un convertisseur extérieur pour la programmer.

1.3. Massduino NANO

Cette carte est au format ARDUINO NANO.
Par rapport à une NANO elle offre les avantages suivants :
  • connecteur micro-USB
  • alimentation 3.3V ou 5V. Le choix se fait par déplacement d'un cavalier
  • courant disponible 5V : 500mA
  • courant disponible 3.3V : 300mA

Le convertisseur USB / Série est CH340G.

Dans l'IDE ARDUINO la carte à sélectionner est : MD328D-LQFP32.

1.4. Massduino NANO LITE

Cette carte est également au format ARDUINO NANO.
Elle ne possède pas de convertisseur USB / Série. Cela entraîne un gain de consommation d'environ 10mA.
Vous devrez utiliser un convertisseur extérieur pour la programmer.

1.5. Massduino UNO CORE


Cette carte UNO a un format propriétaire.
Elle se distingue de la UNO par les points suivants :
  • alimentation VCC 3.3V ou alimentation VIN 4.5 à 12V
  • régulateur 3.3V LDO intégré
Elle ne possède pas de convertisseur USB / Série. Cela entraîne un gain de consommation d'environ 10mA.
Vous devrez utiliser un convertisseur extérieur pour la programmer.

2. Autres cartes INHAOS

INHAOS produit également des cartes ATMEGA et DUE sous un format réduit.

2.1. Mega2560-CORE/ Mini2560

La MEGA CORE :
Une MEGA sans USB qui se programme avec un convertisseur USB / série.

Attention, la sérigraphie de la carte est à interpréter à l'envers. Il faut relier le TX du convertisseur sur le TX de la carte et le RX du convertisseur sur le RX de la carte.

Apparemment, la datasheet dit vrai : la carte peut être alimentée en 3.3V.

Sa taille est de 51mm x 36mm.
Rien à dire de plus sinon qu'il vous faudra deux connecteurs femelle 40 points et un 20 points si vous voulez l'enficher sur un PCB.

2.2. DUE-CORE

Cette carte à base d'AT91SAM3X8E comme l'ARDUINO DUE dispose de l'USB natif pour la programmer.

Je n'ai pas réussi à la programmer avec un convertisseur USB / série par le connecteur "Programming Port". un bootloader est-il prévu pour cette utilisation ?

Avec l'USB natif cela fonctionne. On peut utiliser le Programming Port comme port de communication auxiliaire.
Le port USB natif peut être également utilisé pour émuler une souris ou un clavier USB.

Le device Serial de la librairie ARDUINO correspond au Programming port. Le device SerialUSB correspond au Native port.
Donc si l'on veut afficher des informations sur la console de l'IDE en utilisant le port USB il faudra écrire ceci :

  SerialUSB.begin(115200);
  SerialUSB.println("Hello !");


Sa taille est de 57mm x 54mm.
Il vous faudra deux connecteurs femelle 44 points et un 28 points si vous voulez l'enficher sur un PCB.

Voici la datasheet :

3. Convertisseur USB / série

Pour programmer les cartes MEGA, UNO CORE et UNO LC LITE j'ai préféré utiliser un convertisseur USB / série avec cavalier de sélection 5V / 3.3V comme celui-ci :

4. Références



Cordialement
Henri


dimanche 16 septembre 2018

LED, LCD, TFT et ARDUINO (et autres VFD, NIXIE)


LED, LCD, TFT et ARDUINO

(et autres VFD, NIXIE)

Lorsque l'on bricole sur ARDUINO, on pilote souvent des capteurs, des relais, des modules de communication, mais il arrive que l'on ait aussi besoin d'afficher des informations et même d'en obtenir de la part de l'utilisateur.
Cet article tente d'explorer le monde des afficheurs à LED, LCD, OLED et TFT utilisables sur nos chers petits microcontrôleurs.

Je vais commencer par une recommandation concernant les écrans TFT :
Il ne faut jamais acheter un écran TFT si le vendeur ne précise pas quel est le type de contrôleur utilisé (ST7735R, ILI9225, ILI9341, ILI9488, SSD1289, SSD1963, etc.).
Deuxièmement vous devez vérifier la disponibilité d'une librairie pour votre plateforme (ARDUINO, ESP8266, ESP32, STM32, etc.).

1. Les LEDs et afficheurs à LED

Les LEDs et afficheurs à LEDs comptent parmi les plus anciens composants d'affichages mais sont toujours utilisés. Ils peuvent être du type 7 segments, alphanumériques, barre ou matriciels.

1.1. La LED simple

Commençons par le plus simple :

Une LED peut être commandée directement par une sortie de microcontrôleur, pour peu que l'on respecte le courant de sortie maximal que la sortie peut produire.

Une LED a toujours besoin d'une résistance de limitation de courant :

La résistance R1 peut être calculée comme suit :

R1 = (VCC - VF) / I

  • VCC est la tension d'alimentation
  • VF est la chute de tension directe de la LED
  • I est le courant circulant dans la LED

Attention : la tension VF varie beaucoup en fonction de la couleur et du courant :

Les LEDs simples admettent en général un courant maximal de 20mA, mais il est rare de les faire fonctionner au maximum de leur capacité.

Par exemple une carte ARDUINO PRO MINI est équipée d'une LED POWER en série avec une résistance de 10KΩ. Le courant est donc de :

I = (VCC - VF) / 10000 = (5V - 1.5V) / 10000 = 0.35 mA.

Malgré ce courant assez faible, la LED est parfaitement visible.

1.2. La LED multicolore

Une LED multicolore, 3 ou 4 couleurs, est un assemblage de plusieurs LEDs :

Celle-ci est une LED RGB à anode commune. On trouve les deux modèles, anode ou cathode commune.

Le schéma ci-dessous montre une LED RGB à cathode commune :

Chaque LED ayant une tension VF différente, les résistances R1 à R3 auront forcément une valeur différente.

1.3. Les LEDs de puissance

Une LED de puissance est utilisée lorsqu'une puissance d'éclairage conséquente est nécessaire :

LED 1W

Elle nécessite également une résistance de limitation de courant.

On peut trouver des bandeaux de LEDs de puissance :

Ces bandeaux sont déjà équipés de résistances de limitation de courant. On trouve des modèles pouvant être alimentés sous 5V ou 12V.

Qu'il s'agisse de LEDs ou de bandeaux de LEDs, on ne pourra pas alimenter ces composants à l'aide d'une sortie de microcontrôleur. Il faudra forcément adopter une alimentation adaptée et un organe de commande de puissance : transistor, MOSFET, ou relais.

1.4. La LED adressable

Les LEDs adressables peuvent être reliées entre elles sur le même bus, et commandées une par une. La plus courante est la WS2812B :

WS2812B

Elles existent également sous forme de bandeaux :

Bandeau WS2812B

On peut faire varier leur couleur et leur luminosité à l'aide de quelques ligne de code.

L'avantage de ces LEDs est qu'elles peuvent être commandées à l'aide d'une seule sortie de microcontrôleur. L'alimentation devra être dimensionnée correctement, car chacune d'elles peut consommer jusqu'à 3 x 20mA.

Voici le schéma généralement utilisé :

Il existe des librairies capables de piloter ces LEDs :

  • FastLED
  • NeoPixel
  • etc.

Ces LEDs ont toutefois un inconvénient : il faut rafraîchir leur état en continu. Elles sont peu adaptées à des applications ayant des temps de traitement bloquants plus ou moins longs, ou aux applications multitâche.

Un autre type de LED adressable existe : l'APA102. Elle est autonome et mémorise l'état de ses 3 couleurs. Il suffit de lui envoyer l'ordre de changement de couleur et luminosité une seule fois.

Leur aspect est le même que celui des WS2812B mais elles ont 6 broches :

Elles existent également sous forme de bandeau.

Des librairies spécialisées existent également :

  • FastLED
  • Polulu 1PA102
  • etc.

1.5. L'afficheur 7 segments

On trouve des afficheurs à 7 segments de toutes tailles, entre 3.5mm de haut jusqu'à plus de 100mm, et de diverses couleurs également.

Il en existe deux types principaux :
  • anode commune
  • cathode commune

Dans le premier cas, les anodes des LEDs sont reliées entre elles.
Dans le deuxième cas, les cathodes des LEDs sont reliées entre elles.

Un afficheur peut comporter un ou plusieurs digits, jusqu'à six :
Pour piloter ce type d'afficheur, nous aurons besoin ou non d'un contrôleur.

Multiplexage
Afin de limiter le nombre de sorties de microcontrôleur à utiliser, nous utiliserons des afficheurs multiplexés :


Chaque afficheur est alimenté à tour de rôle suffisamment vite pour que la persistance rétinienne ne voie pas le défilement. Nous utiliserons une fréquence d'environ de 30Hz à 100Hz.

Câblage
Considérons le schéma suivant :
Si vous pilotez les segments à l'aide des broches de sorties d'un ARDUINO ou d'un décodeur 7 segments, vous devez insérer des résistances de limitation de courant.
La plupart des contrôleurs spécialisés vous permettront de vous passer de ces résistances.
Supposons que nous pilotions les segments à l'aide de 8 résistances connectées sur 8 sorties d'un ARDUINO et que les digits soient multiplexés également à l'aide de 4 sorties du même ARDUINO.
Chaque sortie de pilotage de segment devra supporter le courant d'un segment à la fois. Chaque sortie de pilotage de digit devra fournir au maximum 8 fois le courant d'un segment.
Une sortie peut délivrer 20mA sans que la tension ne chute dramatiquement.
Cela donnera donc 20mA / 8 = 2.5mA pour chaque segment.
La tension directe d'une LED rouge est de 1.8V, ce qui donne aux bornes de la résistance : 5V - 1.6V = 3.4V.
Chaque résistance aura comme valeur : 3.4V / 2.5mA = 1.36KΩ.

Le rendement lumineux des afficheurs est important, 2.5mA suffisent dans la majeure partie des cas. Au delà il faudra ajouter un transistor sur chaque anode ou cathode commune.

Pilotage direct

Il est possible de piloter un afficheur 7 segments directement à partir des sorties d'un ARDUINO :

Ce montage mobilise 12 broches de la carte. Cela peut être gênant. Mais il est possible d'utiliser quelques pins analogiques en lieu et place de pins digitales.

Les quatre afficheur sont multiplexés à grande vitesse, c'est à dire que chacun d'eux est alimenté à tour de rôle, et comme la rémanence de l’œil humain est importante, le clignotement est imperceptible.

Ce genre de montage est particulièrement intéressant dans le cas où l'on dispose de 12 broches libres, car il ne nécessite que huit résistances et aucun autre composant externe.
 
Il existe une excellente librairie :
https://github.com/sigvaldm/SevenSeg

Cette librairie vous soulagera d'un grosse partie du travail :
  • multiplexage
  • ajustement de la luminosité
  • gestion du point décimal
  • affichage de l'heure avec gestion de la colonne (HH:MM ou MM:SS)
  • affichage de caractères alphabétiques
  • rafraîchissement de l'afficheur sous interruption timer
Elle fonctionne avec des afficheurs à anode ou cathode commune. Le nombre de digits est simplement limité par le nombre de pins de votre carte (9 digits pour une UNO ou une NANO).
Un petit sketch :

#include <TimeLib.h>
#include <SevenSeg.h>

#define NDIGITS 4
SevenSeg disp(5, 3, 6, 9, 10, 4, 8);
const int digitPins[NDIGITS] = {A2, A1, A0, A3};

void setup() {
  disp.setDigitPins(NDIGITS, digitPins);
  disp.setCommonAnode();
  disp.setTimer(2);
  disp.startTimer();
  disp.setDPPin(7);
  disp.clearDisp();
  disp.setRefreshRate(50);
  disp.setDutyCycle(40);
}

void loop() {
  setTime(14, 33, 05, 7, 2, 2019);
  time_t t = now();
  disp.writeClock(hour(t), minute(t));
  delay(1000);
  disp.write(1359);
  for (int i = 0 ; i < 100 ; i++) {
    disp.setDutyCycle(i);
    delay(50);
  }
  for (int i = 100 ; i > 0 ; i--) {
    disp.setDutyCycle(i);
    delay(50);
  }
  disp.setDutyCycle(50);
  disp.write(1);
  delay(1000);
  disp.write(33);
  delay(1000);
  disp.write(212);
  delay(1000);
  disp.write(3456);
  delay(1000);
  disp.write(0.1);
  delay(1000);
  disp.write(0.1234);
  delay(1000);
  disp.write(34.56);
  delay(1000);
  disp.write("Done");
  delay(1000);
}

ISR(TIMER2_COMPA_vect) {
  disp.interruptAction();
}

Le CD4511

Le CD4511 permet de piloter les segments d'un afficheur à cathode commune :

Ce montage mobilise 10 broches de la carte, soit deux de moins que le montage précédent. Si l'on se passe de réglage de la luminosité on a besoin de 9 broches.

Il est possible de faire varier la luminosité en jouant sur le rapport cyclique de chaque digit à l'aide de la pin BL (blank) du CD4511.

Les quatre afficheur sont multiplexés. Chaque sortie de l'ARDUINO (D7 à D10) est capable de fournir 20mA, ce qui implique que chaque segment ne pourra recevoir que 20mA / 8 = 2.5mA. Si l'on a besoin de plus de courant on peut insérer un petit transistor NPN entre les sorties D7 à D10 et chaque cathode :

Par rapport à la solution précédente, très souple, une solution à base de CD4511 souffre de pas mal de lacunes :
  • pas d'affichage de nombres négatifs
  • pas de gestion du point décimal ni de la colonne
  • pas d'affichage de caractères alphabétiques
  • peu de librairies, ou des librairies pauvres en fonctionnalités
Aucune librairie ne gère le multiplexage. Certaines permettent de gérer un CD4511 par afficheur.

Il serait possible d'écrire une librairie pratiquement aussi puissante que celle utilisée dans le chapitre précédent, au prix de gros efforts.

Cela demande un travail conséquent. Autant opter pour 74HC595 ou un contrôleur spécialisé.

Le CD4511 avec un grand nombre d'afficheurs
Le 74LS138 et le 74HC154 sont des décodeurs 3 vers 8 lignes et 4 vers 16 lignes. Il permettent de piloter un plus grand nombre d'afficheurs sans requérir un grand nombre de sorties de l'ARDUINO :

Le 74LS138 et le 74HC154 n'ont pas une capacité en courant très élevée (quelques mA). Comme précédemment, si l'on a besoin de plus de courant on peut insérer un petit transistor NPN entre les sorties et chaque cathode :

Le 74HC47 ou 74LS47
Le 74HC47 permet de piloter des afficheurs à anode commune. Son utilisation est analogue à celle du CD4511.

1.6. Les contrôleurs spécialisé

Utiliser un contrôleur spécialisé comporte pas mal d'avantages :
  • il ne nécessite aucune résistance
  • il se charge à la place du processeur du multiplexage de l'afficheur
  • la luminosité est réglable.
  • le point décimal est géré
Le HT16K33

Le HT16K33 est un driver de LEDs pouvant piloter une matrice de 16x8 LEDs et un clavier matriciel à 13x3 touches. La luminosité est réglable.

Certains afficheurs du commerce en sont équipés :
La librairie à utiliser est celle-ci :
https://github.com/adafruit/Adafruit_LED_Backpack

Le HT1632C

Le HT1632C est un driver de LEDs pouvant piloter une matrice de 16x24 ou 8x32 LEDs. La luminosité est réglable.

Dans le commerce le choix est assez fourni :


Matrice 16x16
Matrice 8x32
Ajouter une légende

Il existe plusieurs librairies :
https://github.com/adafruit/HT1632
https://github.com/gauravmm/HT1632-for-Arduino

On peut rencontrer des problèmes de maping des LEDs suivant l'origine des panneaux de LEDs, en fonction du constructeur. Le premier point 0,0 n'est pas forcément situé au même endroit.
Il faut essayer différentes librairies.


Le MAX7219 ou MAX7221

Le MAX7219 ou le MAX7221 est capable de piloter 8 afficheurs 7 segments + DP ou 64 LEDs à cathode commune. La luminosité est réglable.

On trouve beaucoup d'afficheurs du commerce qui en sont équipés :



Les librairies à utiliser sont celles-ci :
https://github.com/wayoda/LedControl 
https://github.com/MajicDesigns/MD_Parola

Comme ces panneaux sont chaînables on peut rencontrer des problèmes de maping suivant l'origine, en fonction du constructeur. Le premier panneau n'est pas forcément situé au bon endroit, gauche ou droite. La librairie MD_Parola permet en général de s'en sortir car elle permet de contrôler différents modèles.


Le PCA9685

Le PCA9685 est un driver de LEDs I2C PWM 16 canaux.

Il dispose de fonctions avancées :
  • PWM 12 bits : fréquence variable de 24Hz à 1526Hz
  • luminosité des LED programmable
  • allumage / extinction des LED avec un temps programmable
  • etc.

Le TLC5947

Le TLC5947 est un driver de LEDs PWM 24 canaux permettent de réaliser des animations lumineuses.


Il dispose de fonctions avancées :
  • PWM 12 bits
  • courant dans les LED ajustable par une seule résistance
 
Le TM1637

Le TM1637 est capable de piloter 6 afficheurs 7 segments + DP à anode commune et un clavier matriciel à 16 touches.

Certains afficheurs du commerce en sont équipés :

Voici un exemple de schéma d'une réalisation personnelle :
Pourquoi réaliser un montage soi-même alors que l'on peut trouver des modules tout faits ? Cela peut être intéressant dans le cadre d'un intégration à une carte plus élaborée.

Le TM1637 est un circuit DIP20 ou SOP20.

Que vous utilisiez un afficheur du commerce ou le schéma ci-dessus, la librairie à utiliser est celle-ci :
https://github.com/avishorp/TM1637.git
Elle propose un exemple :
https://github.com/avishorp/TM1637/blob/master/examples/TM1637Test/TM1637Test.ino

Le TM1638

Le TM1638 est capable de piloter 8 afficheurs 10 segments à anode commune ou cathode commune et un clavier matriciel à 24 touches. La luminosité est réglable.

Certains afficheurs du commerce en sont équipés : 


La librairie à utiliser est celle-ci :

Le câblage de l'afficheur sur ces deux modules diffère. La librairie en tient compte.

Le module 8 touches doit être instancié de la manière suivante :

#include <TM1638.h>
// data pin 4, clock pin 5 and strobe pin 6
TM1638 module(4, 5, 6);

void setup() {
  module.setupDisplay(true, 1); // set active, luminosity = 1
  mode = 0;
}

Le module 16 touches doit être instancié différemment :

#include <TM1638.h>
#include <TM1638QYF.h>
// data pin 4, clock pin 5 and strobe pin 6
TM1638QYF module(4, 5, 6);

void setup() {
  module.setupDisplay(true, 1); // set active, luminosity = 1
  mode = 0;
}

Si vous alimentez le module par le 5V de l'ARDUINO, réglez la luminosité sur 1, car sinon l'afficheur consomme trop et peut empêcher le chargement de l'application. Sinon, il vous faut une alimentation externe.

A cette liste il faut ajouter les expanders d'I/O que l'on peut également utiliser pour piloter des leds. Ils n'offrirons cependant l'avantage d'un réglage de luminosité des LEDs, sauf s'ils gèrent le PWM, comme le SX1509 :

https://riton-duino.blogspot.com/2019/02/les-extensions-de-gpios-de-larduino.html
 

1.7. Les afficheurs de grande taille

Certains afficheurs de grande taille sont construits à l'aide de LEDs en série et parallèle, comme celui-ci :

FORYARD FYS-40011BUHR-21

Un décodeur classique ne pourra pas le piloter, sauf si l'on ajoute une électronique de puissance, car chaque segment requiert une tension d'environ 10V.

Un MIC5891 sera le bienvenu car il accepte une tension d'alimentation de 5V à 50V. Il est adapté au pilotage d'afficheurs à anode commune. Le MIC5841 permettra de piloter des afficheurs à cathode commune.

La tension directe d'un segment est de 10V pour 20mA. On pourra adopter une tension d'alimentation de 12V et une résistance par segment.

R = (12V - 10V) / 20mA = 100Ω

Comme avec le CD4511 on pourra multiplexer les afficheurs.

2. Le LCD 7 segments

Les afficheurs LCD  7 segments existent sous divers formats et ils peuvent être équipés ou non d'un contrôleur.

2.1. LCD sans contrôleur


Ce type d'afficheur possède un certain nombre de broches :
  • 4 digits : 40 broches
  • 6 digits : 50 broches
Ce type d'afficheur possède une broche commune (backplane) et autant de broches que de segments. Certains écrans possèdent plusieurs backplane.

La tension entre électrodes doit toujours avoir une valeur moyenne proche de 0 (inférieure à 50mV) pour éviter de détruire les cristaux liquides par électrolyse.

Les signaux appliqués au backplane et aux segments doivent donc être alternatifs, et doivent avoir une fréquence allant de 30Hz à 200Hz :


Le pilotage peut être effectué en utilisant les pins digitales d'un processeur, un expander de GPIOs ou un contrôleur spécialisé.
2.1.1 Piloter un LCD avec un contrôleur spécialisé

Le pilotage à l'aide d'un contrôleur spécialisé soulage le processeur de la tâche de génération des signaux alternatifs.

Il existe une grande variété de contrôleurs, dont voici les plus connus :

Contrôleur Bus Tension Consommation Segments Boîtier
HT1621 I2C 2.4V - 5.2V 150µA 32x4 LQFP44
HT1623 I2C 2.4V - 5.2V 150µA 48x4 LQFP100
HT1625 I2C 2.4V - 5.2V 150µA 64x4 LQFP100
PCF2112 I2C 2.25V - 6V 20µA 32 VSO40
PCF8562 I2C 1.8V - 5.5V 3.5µA 32 x 4 TSSOP48
PCF8566 I2C 2.25V - 6V 30µA 24 x 4 VSO40 DIP40
PCF8577 I2C 2.5V - 6V 50µA 32 VSO40 DIP40
PCF85134 I2C 1.8V - 5.5V 24µA 60 x 4 LQFP80

Le PCF8577 est obsolète, mais il est encore disponible en boîtier DIP ou VSO40 sur AliExpress. Les autres circuits sont disponibles en France en version CMS.

L'intégration de ce genre d'afficheur demande un travail conséquent :


Le schéma a été réalisé avec KICAD.

Pour récupérer le projet complet incluant le sketch, voir plus bas : 13. Téléchargement

Le PCF8577 en version DIP peut facilement être placé sous l'afficheur :


L'afficheur est un Varitronix VI-402 :


Le contraste est excellent même avec un angle de vision de 45°.
La consommation de ce petit module est de 120 µA.

2.1.2 Piloter un LCD avec un registre à décalage
Il est possible de piloter un LCD avec un registre à décalage, par exemple un ou plusieurs 74HC595 :


La pin 13 de l'ARDUINO est utilisée pour piloter le point commun de l'afficheur (backplane) en opposition de phase avec les segments, à une fréquence de 30 à 100Hz environ.

Sur ce schéma il suffit d'ajouter deux autres 74HC595 pour piloter les deux digits de gauche.
Le pilotage des segments est réalisé à l'aide d'une interruption timer à 50Hz, ce qui permet de garantir la régularité des signaux envoyés à l'afficheur.

Le schéma a été réalisé avec KICAD.

Pour récupérer le projet complet incluant le sketch, voir plus bas : 13. Téléchargement.


2.1.3 Piloter un LCD avec un expander
Il est aussi possible de piloter un LCD avec un expander, par exemple un ou plusieurs MCP23017 :

La pin 13 de l'ARDUINO est utilisée pour piloter le point commun de l'afficheur (backplane) en opposition de phase avec les segments, à une fréquence de 30 à 100Hz environ.

Sur ce schéma il suffit d'ajouter un second MCP23017 pour piloter les deux digits de gauche.

Le pilotage des segments ne peut être réalisé simplement à l'aide d'une interruption timer à cause de l'utilisation de l'I2C. La chose n'est certainement pas impossible à réaliser en ré-autorisant les interruptions, mais cela demande un peu de travail.
Le processeur devra donc générer ces signaux en continu et ne pas perdre trop de temps en traitements annexes.
La solution précédente à base de 74HC595 est préférable et plus rapide.

Le schéma a été réalisé avec KICAD.

Pour récupérer le projet complet incluant le sketch, voir plus bas : 13. Téléchargement.

2.1.4 Piloter un LCD avec un processeur spécialisé

Et pourquoi ne pas adopter un processeur capable de piloter le LCD ?

Il existe un grand nombre de processeurs 8 bits MICROCHIP :

Processeur Flash Ram Tension Consommation Segments Boîtier
ATMEGA169 16K 1K 1.8V - 6V 350μA 4 x 25 TQFP64
ATMEGA329 32K 1K 1.8V - 6V 350μA 4 x 25 TQFP64
ATMEGA649 64K 2K 1.8V - 6V 350μA 4 x 25 TQFP64
ATMEGA3290 32K 1K 1.8V - 6V 350μA 4 x 40 TQFP100
ATMEGA6490 64K 2K 1.8V - 6V 350μA 4 x 40 TQFP100

Les consommations sont données pour 1 MHz à 1.8V.
Ils peuvent fonctionner à 32kHz et 1.8V et consomment dans ce cas 40μA.
Ils consomment 100nA en sleep mode à 1.8V.

Il existe un BSP ARDUINO pour ces processeurs :
https://github.com/MCUdude/ButterflyCore/tree/master/avr

Et des processeurs 32 bits à base de Cortex M0 :

Processeur Flash Ram Tension Consommation Segments Boîtier
ATSAML22N16A 64K 8K 1.62V – 3.63V 50μA/MHz 4 x 44 TQFP100
ATSAML22N17A 128K 16K 1.62V – 3.63V 50μA/MHz 4 x 44 TQFP100
ATSAML22N18A 256K 32K 1.62V – 3.63V 50μA/MHz 4 x 44 TQFP100

Leur fréquence d'horloge peut aller jusqu'à 30MHz.
Ils consomment 3.5µA en sleep mode.

Il existe aussi des séries à base de Cortex M4 mais on sort du domaine amateur.

Des PICs existent aussi :

Processeur Flash Ram Tension Consommation Segments Boîtier
PIC16F19155 14K 1K 2.3V - 5.5V 32 μA/MHz 96 DIP28
PIC16F19156 28K 2K 2.3V - 5.5V 32 μA/MHz 96 DIP28
PIC16F19175 14K 1K 2.3V - 5.5V 32 μA/MHz 184 DIP40
PIC16F19176 28K 2K 2.3V - 5.5V 32 μA/MHz 184 DIP40
PIC16F19185 14K 1K 2.3V - 5.5V 32 μA/MHz 248 TQFP48
PIC16F19186 28K 2K 2.3V - 5.5V 32 μA/MHz 248 TQFP48
PIC16F19195 14K 1K 2.3V - 5.5V 32 μA/MHz 360 TQFP64
PIC16F19196 28K 2K 2.3V - 5.5V 32 μA/MHz 360 TQFP64
PIC16F19197 56K 4K 2.3V - 5.5V 32 μA/MHz 360 TQFP64

Attention: les options de multiplexage limitent le nombre de segments utilisables en fonction du nombre de backplanes de l'afficheur.
Reportez-vous au paragraphe MULTIPLEXING OPTIONS de la datasheet.

Les consommations sont données pour VCC = 1.8V.
Ils peuvent fonctionner à 32kHz et 1.8V et consomment dans ce cas 8μA.
Ils consomment 100nA en sleep mode à 1.8V.

La liste complète de ces processeurs MICROCHIP est ICI.

MICROCHIP fournit quelques notes d'application :
https://www.microchip.com/wwwcategory/taxonomysearch/#/TaxonomySearch/GetSearchResults/Display/Segmented%20LCD/Application

2.2. LCD avec contrôleur

Il existe heureusement des afficheurs que l'on peut piloter à travers une interface série. Et ils ne coûtent pas plus cher qu'un contrôleur seul.

HT1621

Celui-ci, acheté sur AliExpress a une taille de 2.4'. Il utilise un contrôleur HT1621. Il possède une LED de backlight qui permet d'éclairer le panneau.
Il consomme environ 300µA sous 3.3V, 600µA sous 5V et 4mA avec le backlight allumé.
On est loin des 20µA d'un PCF2112, mais la facilité a un coût.

Voici les informations concernant le câblage :

Avec un ARDUINO on utilise généralement cette librairie pour le piloter :
https://github.com/5N44P/ht1621-7-seg.git

Si vous cherchez à éteindre le backlight vous constaterez peut-être qu'il reste allumé en permanence. Voici l'astuce pour parvenir à l'éteindre :

Le point rouge représente un pont de soudure permettant d'allumer le backlight en permanence. Il faut l'éliminer avec de la tresse à dessouder.
Le point bleu représente un pont de soudure permettant d'allumer le backlight à l'aide de la pin LED+. Il faut l'ajouter.

Remarque : j'ai essayé ce LCD en 3.3V et 5V. Le contraste est meilleur en 5V.


En regardant l'écran bien face, le contraste est correct.
Plus on déplace l'angle de vision vers le haut, plus les segments éteints sont visibles. Avec un angle d'environ 20°, les segments paraissent tous actifs.
Plus on déplace l'angle de vision vers le bas, plus les digits deviennent gris.
L'angle de vision optimal est donc assez faible.

3. Le LCD alphanumérique

Ces écrans LCD sont alphanumériques. Les modèles les plus courants permettent d'afficher 2x16 ou 4x20 caractères.
Ils sont basés sur le très connu circuit HD44780.

En fonction de la ROM code du circuit, vous aurez ou non la possibilité d'afficher des caractères accentués. Sinon, il vous faudra ajouter ces caractères dans la RAM de l'afficheur.

On trouve aussi du 2x40 ou 4x40 caractères :
Il existe mêmes des modèles graphiques :
Il existe des cartes enfichables directement sur ARDUINO UNO :
Elles sont déjà équipées d'un potentiomètre de réglage de contraste et possèdent généralement 6 boutons.

3.1. Pilotage en parallèle

Généralement, on les pilote à l'aide de 6 sorties de l'ARDUINO, comme sur ce schéma :
Sur certains afficheurs, le rétro-éclairage est à alimenter par les pins 17 et 18.
Sur la pin 3 VO ou VEE il faut appliquer une tension à l'aide d'un potentiomètre. Ceci permet de régler le contraste. Sinon, l'afficheur restera désespérément vide.

La résistance du rétro-éclairage de 2.2KΩdu schéma est élevée. Diminuer sa valeur pour une luminosité plus élevée. Elle est même optionnelle.

Mise en œuvre
La première chose à faire est de souder une barrette de contacts mâles à 16 points sur l'afficheur. Ainsi vous pourrez facilement l'enficher sur une breadboard ou un connecteur de PCB :
Quelques erreurs communes conduisent souvent à l'échec :
  • on a déjà vu des néophytes poser l'afficheur sur la barrette, sans soudure, et s'étonner du mauvais fonctionnement.
  • la pin R/W doit être reliée à la masse.
  • ne pas oublier de le régler le potentiomètre de contraste.
  • ces afficheurs ont du mal à fonctionner en 3.3V. La tension nécessaire à l'obtention d'un contraste optimal est insuffisante.
  • ces afficheurs ne fonctionnent pas sans backlight, en tous cas vous ne verrez pas grand chose sur le LCD.
Avec un ARDUINO on utilise généralement cette librairie pour les piloter :
https://github.com/arduino-libraries/LiquidCrystal

Les raccordements du schéma ci-dessus sont effectués en respectant l'ordre des pins des exemples de cette librairie. Mais vous êtes libres de choisir d'autres pins de l'ARDUINO si vous modifiez le constructeur en conséquence :

// initialize the library with the numbers of the interface pins
// RS, E, D4, D5, D6 ,D7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Dans la fonction setup() il suffit d'appeler la méthode begin() avec le nombre de colonnes et de lignes :

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
}


La première chose à faire est bien entendu de charger un exemple de la librairie afin de valider le montage, et régler le contraste par la même occasion (Display.ino par exemple).

3.2. Pilotage en I2C

On peut adjoindre à ces afficheurs un module I2C pour les piloter en série, libérant ainsi 4 sorties digitales pour une autre utilisation :
Ces modules utilisent un circuit PCF8574.

Ce module doit être soudé sur l'afficheur à l'aide d'une barre de contacts mâles à 16 points. On peut également souder un connecteur femelle sur le dos de l'afficheur afin de pouvoir les désolidariser si besoin.

Ensuite reliez les quatre broches VCC, GND, SDA et SCL à l'ARDUINO.
Rappel : sur ARDUINO UNO, NANO ou MINI :
- SDA = A4
- SCL = A5
Sur ADRUINO MEGA :
- SDA = pin 20
- SCL = pin 21

Le potentiomètre de réglage du contraste est directement implanté sur le module. Ne pas oublier de le régler.

Il arrive souvent des déboires aux amateurs avec ce type de module, en particulier l'inversion des fils SDA et SCL du bus I2C.

Ces modules, en fonction de la configuration adoptée par le constructeur, peuvent avoir diverses adresses I2C. Les adresses 0x27 ou 0x3F sont souvent utilisées.
Le logiciel scanner I2C vous permettra de lever le doute et surtout de vérifier qu'il est bien visible sur le bus.

Certains modules vous permettent également de modifier l'adresse I2C en reliant des plots de soudure :
On utilise généralement cette librairie pour les piloter :
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

Avec cette librairie il est possible d'activer ou désactiver le backlight.

Ici encore la première chose à faire est de charger un exemple de la librairie afin de valider le montage, et aussi régler le contraste (HelloWorld.ino par exemple).

Certains modules I2C ont un câblage différent sur les sorties de l'afficheur.
Cette librairie vous donnera plus de liberté de configuration :
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
  • elle est capable de piloter des écrans équipés de circuits PCF8574 ou MCP23008.
  • elle est capable d'auto-détecter l'adresse I2C
Elle permet également de configurer les pins utilisées entre l'expander I2C et l'afficheur grâce à un vaste choix de constructeurs :

LiquidCrystal_I2C (uint8_t lcd_Addr);
// Constructor with backlight control
LiquidCrystal_I2C (uint8_t lcd_Addr, uint8_t backlighPin, t_backlighPol pol);
LiquidCrystal_I2C( uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs);
// Constructor with backlight control
LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
                     uint8_t backlighPin, t_backlighPol pol);
LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
                     uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7 );
// Constructor with backlight control
LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
                     uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
                     uint8_t backlighPin, t_backlighPol pol);



3.3. Incompatibilité des libriairies I2C

ATTENTION:
Les deux librairies Arduino-LiquidCrystal-I2C-library et new-liquidcrystal sont incompatibles car leur fichier LiquidCrystal_I2C.h porte le même nom.

Une erreur courante consiste à essayer les exemples de la librairie Arduino-LiquidCrystal-I2C-library et de ne pas parvenir à le compiler.

Par exemple (Arduino-LiquidCrystal-I2C-library) :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
    lcd.begin();
    lcd.print("Hello, world!");
}

void loop()
{
}


Le constructeur prend 3 paramètres adresse : colonnes, lignes
la méthode begin() ne prend pas de paramètres.

Le même exemple (new-liquidcrystal) :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27);


void setup()
{
    lcd.begin(16,2);

    lcd.print("Hello, world!");
}

void loop()
{
}


Le constructeur prend 1 paramètre : adresse
la méthode begin() prend 2 paramètres : colonnes, lignes

Conclusion : soit vous installez la librairie Arduino-LiquidCrystal-I2C-library soit vous installez new-liquidcrystal, mais pas les deux. Si vous n'avez pas d'afficheurs exotiques, installez plutôt Arduino-LiquidCrystal-I2C-library.


3.4. Utilisation

Sur un PCB, je vous conseille de prévoir quatre colonnettes pour fixer l'afficheur, car celui-ci est lourd. Le connecteur 16 points ne suffira pas à le maintenir.

Ces écran sont très utilisés par les amateurs, mais sont malgré tout dépassés par les modèles graphiques qui permettent d'afficher plus d'informations dans un encombrement réduit.
Par contre ils sont assez faciles à intégrer dans un boîtier, comme ici :
https://riton-duino.blogspot.com/2018/02/une-alimentation-symetrique-6-18v.html

4. Les petits afficheurs OLED

Ces écrans OLED de 0.91 et 0.96 pouces permettent cette fois-ci un affichage graphique sur 128x32 ou 128x64 points.
Certains permettent un affichage en couleurs, mais attention, souvent ils sont simplement bicolores : la partie haute est jaune, la partie basse est bleue.

Malgré leur petite taille ils permettent d'afficher autant d'informations qu'un LCD 2 ou 4 lignes, en choisissant une police de caractères adaptée.

Ils sont basés sur le circuit SSD1306.
On trouve des modèles fonctionnant en I2C, d'autres en SPI.

Ils fonctionnent en 3.3V et 5V. La consommation dépend du nombre de points affichés. Le 0.96 pouces 128x64 avec un affichage équivalent à celui de la photo ci-dessus devrait consommer aux alentours de 5mA à 6mA.

Avec un ARDUINO on utilise généralement cette librairie pour les piloter :
https://github.com/adafruit/Adafruit_SSD1306

La librairie contient quelques exemples. Vous choisirez celui qui correspond à votre écran : I2C, SPI, 128x32 ou 128x64.
Voici un petit sketch permettant de démarrer un écran OLED I2C:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 0

Adafruit_SSD1306 display(OLED_RESET);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
  char *text = "HELLO WORLD";
  static int count = 0;
  char countAsText[10];
  int16_t  x1, y1;
  uint16_t w, h;

  // efface la mémoire de l'écran
  display.clearDisplay();
  // police petite taille
  display.setTextSize(1);
  // indispensable, sinon l'écran reste noir 
  display.setTextColor(WHITE); 
  // récupère les coordonnées et la taille x y du texte
  display.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
  // déplace le curseur : texte centré, 1ère ligne (y  = 0)
  display.setCursor((display.width() - w) / 2, 0);
  // écrit dans la mémoire de l'écran
  display.print(text);
  // convertit l'entier en chaîne
  itoa(count, countAsText, 10);
  // récupère les coordonnées et la taille x y du texte
  display.getTextBounds(countAsText, 0, 0, &x1, &y1, &w, &h);
  // déplace le curseur : texte centré, 2ème ligne
  // (y = hauteur de police + 2 pixels d'interligne) 
  display.setCursor((display.width() - w) / 2, h+2);
  // écrit dans la mémoire de l'écran
  display.print(count++);
  // provoque l'affichage
  display.display();
  delay(1000);
}

La librairie AdaFruit occupe pas mal d'espace en mémoire RAM.

Cette autre librairie plus légère permet d'afficher uniquement du texte. Elle possède pas mal de polices de caractères :

https://github.com/greiman/SSD1306Ascii 

Il existe aussi des écrans OLED plus grands, 1.5 pouce 128x128 par exemple. Ils restent chers mais commencent à se démocratiser :

ecran-oled-ssd1351

5. Les écrans TFT série

Ces écrans existent dans différentes tailles entre 1.5 et 2.8 pouces, avec des résolutions allant de 128x128 à 320x240 points.
Ils possèdent souvent un lecteur SD-CARD.

Ils sont basés sur des circuits divers et variés :
- LPH9135 : 128x128
- ST7735R : 128x160 
- ST7789 : 240x240
- ILI9225 : 176x220
- ILI9341 : 240x320
Ils se pilotent en I2C ou SPI.

Ils sont souvent capables de fonctionner en 3.3V et 5V, étant souvent équipés de convertisseurs de niveaux.

Voici les librairies permettant de les utiliser :
- ILI9341 : https://github.com/adafruit/Adafruit_ILI9341

La liste n'est pas exhaustive bien sûr.

La grande majorité de ces écrans peuvent être pilotés grâce à la librairie UTFT, qui dispose d'une collection de drivers imposante.
Cette librairie a une occupation mémoire importante. En fonction de la taille de votre application vous serez probablement amené à vous orienter sur une ARDUINO MEGA.

Et bien entendu, commencez par un exemple simple de la librairie que vous aurez choisi. Cela vous permettra de valider vos branchements.


5.1. ST7735

Certains écrans SPI ST7735 sont sérigraphiés de manière étrange, comme s'il s'agissait d'écrans I2C, par exemple celui-ci acheté sur AliExpress :


C'est un écran 1.8" 128x160.

Il s'agit d'un écran équipé d'un chip ST7735, donc SPI, mais SPI 3 ou 4 lignes comme on peut le voir dans la datasheet du ST7735 :
  • CS
  • SDA
  • D/CX
  • SCL
La librairie Adafruit ST7735 gère cet écran sur 4 lignes.
La sérigraphie est à interpréter de la manière suivante (entre parenthèses les pins à raccorder sur une carte ARDUINO UNO, NANO ou MINI) :
  • VCC : 5V
  • GND
  • GND
  • NC
  • NC
  • NC
  • CLK : CLK (pin D13)
  • SDA : MOSI (pin D11)
  • RS : data command (au choix, par exemple D8)
  • RST : reset (au choix, par exemple D9)
  • CS : chip select (au choix, par exemple D10)
Sur celui-ci la sérigraphie fait encore plus penser à un écran I2C :


C'est un écran 1.44" 128x128.

Le raccordement est le suivant :
  • GND
  • VCC : 3.3V
  • SCL : CLK (pin D13)
  • SDA : MOSI (pin D11)
  • RES : reset (au choix, par exemple D9)
  • RST : data command (au choix, par exemple D8)
  • CS : chip select (au choix, par exemple D10)
  • BL : 3.3V
Pour démarrer, essayez un exemple de la librairie Adafruit.
Le constructeur de l'objet écran aura cette allure :

#define TFT_CS   10
#define TFT_RST  9
#define TFT_DC   8

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

5.2. ST7789

Ici aussi la sérigraphie fait penser à un écran I2C.

C'est un écran 1.3" 240x240.

Le raccordement est le suivant :
  • GND
  • VCC : 3.3V
  • SCL : CLK (pin D13)
  • SDA : MOSI (pin D11)
  • RES : reset (au choix, par exemple D9)
  • DC : data command (au choix, par exemple D8)
  • BLK : 3.3V
J'ai testé celui-ci acheté sur AliExpress :


Comme on peut le remarquer il ne possède pas de broche CS (chip select). La librairie Adafruit ST7735-ST7789 ne permet pas de le piloter (elle devrait normalement fonctionner avec un écran possédant une broche CS).

Avec la librairie Arduino-ST7789 par contre, aucun problème.

#define TFT_DC    8
#define TFT_RST   9


Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST); //for display without CS pin

Cet écran de 1.3 pouces est petit mais sa résolution de 240x240 est impressionnante.

5.3. ILI9341

J'ai testé celui-ci acheté sur AliExpress :
C'est un écran 2.8" équipé d'une dalle tactile.

Cet écran est capable de fonctionner en 3.3V c'est à dire qu'il est directement connectable sur une ESP8266, ESP32 ou ARDUINO PRO MINI 3.3V.
Pour le brancher sur un ARDUINO UNO ou NANO en 5V quelques résistances de 10KΩ suffisent (entre parenthèses les pins à raccorder sur une carte ARDUINO UNO, NANO ou MINI) :
  • VCC : 5V ou 3.3V
  • GND
  • CS : pin D10
  • RST : pin D8
  • DC : pin D9
  • MOSI : pin D11
  • SCK : pin D13
  • LED : 5V ou 3.3V
  • MISO : pin D12
Pour démarrer, essayez un exemple de la librairie Adafruit.
Le constructeur de l'objet écran aura cette allure :

#define TFT_DC 9
#define TFT_CS 10
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 8
#define TFT_MISO 12 
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);

Il est également possible de piloter cet écran avec la librairie UTOUCH :

#define TFT_DC 9
#define TFT_CS 10
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 8
UTFT myGLCD (ILI9341_S5P, TFT_MOSI, TFT_CLK, TFT_CS, TFT_RST, TFT_DC);


Avec ce genre d'écran on atteint la taille maximale pour un écran SPI. Le rafraîchissement prend un certain temps.

Pour la partie écran tactile je ne dispose pas d'informations sur le type de driver à installer. Je creuse ...

On trouve également des écrans 2.4" ou 2.8" break-out pour ARDUINO UNO ou MEGA2560 :
Il semblerait que la partie tactile de certains de ces écrans se gère à l'aide de pins analogiques.

6. Les écrans TFT de grande taille

Nous abordons ici une catégorie d'écrans dont la taille peut aller de 2.4 jusqu'à 7 pouces.
Et ils vous offrent une fonction sympathique : la dalle tactile !

Ils sont basés sur de nombreux circuits :
- ILI9325C : 240x320
- SSD1289 : 240x320
- SSD1963 : 800x480
Ils se pilotent grâce à une interface parallèle 8 ou 16 bits.

Ces écrans fonctionnent majoritairement sous 3.3V, mais on trouve des cartes adaptatrices dans le commerce (voir chapitre suivant).

L'interface la plus utilisée sur ces écrans est l'ITDB02, qui se présente sous la forme d'un connecteur 40 points.
On peut trouver aussi des shields directement enfichables sur ARDUINO UNO :
Ici encore la librairie UTFT sera capable de piloter un grand nombre de ces écrans.
On lui adjoindra la librairie UTOUCH pour la gestion de la dalle tactile.
Là encore, étant donné l'occupation mémoire importante de ces librairies, une ARDUINO MEGA sera probablement nécessaire.

La librairie contient de nombreux exemples adaptés à différentes tailles d'écran. Essayez celui qui correspond au vôtre (avant tout lire le chapitre plus bas "Les librairies UTFT et UTOUCH", car il faudra certainement choisir un driver).


6.1. Astuce

Comment récupérer les broches SPI d'un shield TFT ? Ces broches sont normalement utilisées par la SD.
En rallongeant les connecteurs comme ceci :


En utilisant ce type de connecteur :

7. L'interface ITDB02

Ce connecteur 40 points est présent sur une majorité d'écrans de grande taille.
C'est une interface standardisée, c'est à dire qu'il est possible de changer d'écran sur un projet en conservant la même connectique.
Ils équipent souvent des shields adaptables sur ARDUINO UNO et surtout MEGA ou DUE.
Ces cartes sont de simples adaptateurs de connectique avec convertisseurs de niveaux.
L'écran fonctionne en 3.3V et le shield convertit les niveaux de sortie 5V en 3.3V acceptable par l'écran.
La majorité sont équipés d'un régulateur 3.3V.
Certains sont équipés d'un jumper permettent de les alimenter en 3.3V ou 5V.
Dans le cas ou on les alimente en 3.3V, les convertisseurs de niveau sont inutiles mais fonctionnent quand même bien sûr.
Il existe des shields prévus pour l'ARDUINO DUE, sans convertisseurs de niveau.

Ce shield est un modèle intéressant :

Acheté ici : AliExpress

Il est décrit comme shield 2.8 et 3.2 pouces. Mais je pilote sans problème un 4.3 et un 7 pouces :

4.3 pouces

7 pouces

Avec UTFT (voir plus bas 8. Les librairies UTFT et UTOUCH) :

4.3 pouces :
UTFT        myGLCD(ITDB43,38,39,40,41);

7 pouces :
UTFT        myGLCD(CTE70,38,39,40,41);

Par contre ce n'est pas le cas avec celui-ci :
Je n'ai pas réussi à faire quoi que ce soit avec cet adaptateur. Il s'agit probablement d'un problème de brochage, mais sans doc que faire ?

Si quelqu'un a la solution je suis à l'écoute.

Comme l'interface ITDB02 est standardisée, il est possible d'utiliser ces shields avec un grand nombre d'écrans.
J'ai déjà utilisé CELUI-CI, vendu avec un écran 3.2" :
Et j'ai remplacé l'écran 3.2" par cet autre 4.3" :


Ce n'est ensuite qu'une question de code. Il suffit de changer de driver. Une simple modification du constructeur UTFT suffit (voir plus bas 8. Les librairies UTFT et UTOUCH) :

3.2" : SSD1289

UTFT myGLCD(SSD1289, 38, 39, 40, 41);

4.3" : SSD1963

UTFT myGLCD(SSD1963_480, 38, 39, 40, 41);

8. Les librairies UTFT et UTOUCH

Vous trouverez les manuels ici :
http://www.rinkydinkelectronics.com/library.php?id=51
http://www.rinkydinkelectronics.com/library.php?id=92

Vous trouverez également dans la librairie un fichier recensant les écrans supportés : UTFT_Supported_display_modules_&_controllers.pdf

Le choix du driver à utiliser se fait en passant l'identifiant du bon driver au constructeur de votre objet écran :

UTFT  myGLCD(SSD1963_480,38,39,40,41);

Dans le fichier UTFT.h de la librairie vous trouverez la liste des identifiants de drivers que vous allez pouvoir utiliser.
Ensuite pour valider ce choix vous pourrez essayer un des nombreux exemples fournis. N'oubliez pas de modifier le constructeur de l'objet UTFT de l'exemple afin de lui passer l'identifiant du bon driver. Même si la résolution est celle qui convient, le choix du driver dans l'exemple ne l'est pas forcément.
Si vous voyez un tas de points de couleur sur toute la surface de votre écran, cela veut dire que le driver n'est pas le bon.

Enfin, il vous restera à calibrer votre écran tactile à l'aide du logiciel fourni dans le répertoire examples/Arduino/UTouch_Calibration de la librairie UTOUCH.
Là encore vous devrez modifier ce logiciel afin d'utiliser le bon driver d'écran.

// SSD1963 & Arduino Mega
UTFT        myGLCD(ITDB43,38,39,40,41);   // Remember to change the model parameter to suit

                                                                           // your display module!
UTouch      myTouch(6,5,4,3,2);

Ensuite il suffit de compiler ce code et le téléverser dans l'ARDUINO.

Je vous conseille d'utiliser un stylet ou un crayon de papier pour effectuer votre calibration.
Le logiciel affiche successivement des petits carrés blancs avec une croix au centre. Pointez bien le centre de chaque croix avec le stylet.
Ensuite le logiciel affiche 3 valeurs que vous reporterez dans le fichier UTouchCD.h de la librairie UTOUCH.

Cette calibration est valable pour un écran donné, et malheureusement la librairie UTOUCH impose de modifier le fichier UTouchCD.h pour chaque écran.
Je vous conseille de placer un commentaire accompagnant chaque jeu de valeurs, et de commenter les valeurs non utilisées :

//#define CAL_X 0x00234F89UL
//#define CAL_Y 0x0066CEAFUL
//#define CAL_S 0x8031F1DFUL
// SSD1963  #1
#define CAL_X 0x03EB8043UL
#define CAL_Y 0x039580E4UL
#define CAL_S 0x801DF10FUL


Le commentaire SSD1963  #1 identifie un écran de type SSD1963 sur lequel je colle une étiquette #1.
Comme il faut modifier UTouchCD.h à chaque changement d'écran, il vous sera difficile de travailler sur plusieurs projets en même temps.
On peut éventuellement s'en sortie avec quelques  directives de compilation :

// retirer le commentaire devant l'identifiant de l'écran à utiliser
//#define SSD1289_1
#define SSD1963_1
#ifdef SSD1289_1
#define CAL_X 0x00234F89UL
#define CAL_Y 0x0066CEAFUL
#define CAL_S 0x8031F1DFUL

#endif

#ifdef SSD1963_1
#define CAL_X 0x03EB8043UL
#define CAL_Y 0x039580E4UL
#define CAL_S 0x801DF10FUL

#endif

8.1 Polices de caractères

Un grand nombre de polices de caractères existent pour la librairie UTFT :
Exemples : http://www.rinkydinkelectronics.com/r_fonts.php
Vous pouvez bien entendu les coder vous-même :
http://www.rinkydinkelectronics.com/h_utft_fonts_101.php

9. Afficheurs EPAPER

Ces afficheurs pourraient faire l'objet d'un long article à eux seuls. Il en existe une variété infinie jusqu'à des tailles de 800x600.

Ils sont alimentés en général en 3.3V et proposent une interface SPI.

Il faut faire attention lors de l'achat. Certains sont livrés brut avec un connecteur plat que vous aurez du mal à interfacer avec une carte microcotrôleur :
D'autres sont implantés sur un module plus facile à utiliser :


Ils peuvent également faire partie d'une offre à base d'ESP32 :


Il faut vérifier la disponibilité d'une librairie pour le contrôleur. Il est malheureusement impossible d'en fournir une liste tant le nombre de fabricants est important.

10. Afficheurs historiques

Nous allons terminer cet article en évoquant les afficheurs du passé, qui sont malgré tout toujours disponibles et pilotable à l'aide de nos microcontrôleurs actuels.
 

10.1. Le écrans et tubes fluorescents VFD

Ces écrans à tubes fluorescents ont une esthétique sans égale :


Ils sont alimentés en 5V et se pilotent aussi en 5V.
Celui-ci, le Futaba US162SD03CB possède même une librairie pour ARDUINO :
https://playground.arduino.cc/Main/FutabaUsVfd

On trouve aussi du 2x40 caractères :
Il existe aussi des modèles graphiques :
Et bien sûr certains afficionados ne jurent que par les tubes VFD :


Leur filament s'alimente en 1.5V ou 3V.
 
Vous trouverez ici un joli projet d'horloge à 6 tubes VFD utilisant un ATMEGA8515 (le code n'est pas publié) :
https://www.akafugu.jp/posts/products/vfd-modular-clock/

10.2. tubes NIXIE

Il est normal de terminer par les plus jolis, les tubes NIXIE :


Leur filament s'alimentent en haute tension, 170V.
 
Vous trouverez ici un projet d'horloge à 6 tubes NIXIE utilisant un ARDUINO PRO MINI et un récepteur DCF77 :

11. Quelques lien utiles

https://www.instructables.com/id/The-Arduino-TFT-LCD-Connection/
http://www.mathias-wilhelm.de/arduino/beispiele/lcd-graphic-displays/
https://www.itead.cc/blog/instruction-for-iteadstudio-tft-module
https://www.tubefr.com/l-arduino-tft-lcd-connexion.html

12. Conclusion

J'espère vous avoir aidé à mieux comprendre le monde des écrans LCD et TFT et vous avoir apporté suffisamment d'éléments pour vous inciter à essayer.
Les questions sont les bienvenues.

13. Téléchargement

Ce lien permet de récupérer les schéma et sketches des solutions de pilotage d'afficheurs 7 segments LCD : https://bitbucket.org/henri_bachetti/arduino-7segments-lcd

Cette page vous donne toutes les informations nécessaires :
https://riton-duino.blogspot.com/p/migration-sous-bitbucket.html


Cordialement
Henri

14. Mises à jour

30/10/2018 : 3. sketch OLED
03/01/2019 : 5.1. ST7735
04/01/2019 : 5.2. ILI9341
04/01/2019 : 8.1 Polices de caractères
30/01/2019 : 2. Le LCD 7 segments
03/02/2019 : 2.1.3 Piloter un LCD avec un expander
04/02/2019 : 2.1.2 Piloter un LCD avec un registre à décalage
06/02/2019 : 1. L'afficheur à LED
07/02/2019 : Ajout d'un sketch dans 1.1. L'afficheur 7 segments (Pilotage direct)
16/02/2019 : 2.1.4 Piloter un LCD avec un processeur spécialisé
01/03/2019 : modifications 3. Le LCD alphanumérique
                     10. Afficheurs historiques
03/07/2019 : Le PCA9685
06/11/2019 : 5.2. ST7789 
25/11/2019 : 9. Afficheurs EPAPER
26/03/2020 : Le HT1632C