Initiation Arduino (3ème séance)
Le vendredi 22 mars 2019
Sept participants étaient présent à cette soirée (André, Daniel, Jean-Claude, Jean-Pierre, Michel, Olivier et Pascal)
Le protocole de communication I²C
I²C signifiant : Inter-Integrated Circuit.
Ce protocole de communication fut élaboré par Philips, durant le début des années 80’s.
Ce sketch va vous permettre d’identifier l’adresse du composant I²C (ou plusieurs)
Le bus I²C est constitué de fils :
- SDA (Serial Data Line) : ligne data’s bidirectionnelle.
- SCL (Serial Clock Line) : ligne des clocks de synchronisation bidirectionnelle.
Généralement viennent s’ajouter 2 autres fils : Le GND (ou masse) et le +5V.
La figure ci-dessous vous montre comment est organisé le bus I²C.
Chaque terminaux possède une adresse sur 7 bits, ce qui permet jusqu’à 128 dispositifs sur un bus I²C.
Pour ceux qui souhaiteront approfondir le protocole I²C, voici 2 liens :
- https://fr.wikipedia.org/wiki/I2C
- https://www.les-electroniciens.com/sites/default/files/cours/cours_i2c.pdf
Scanner son bus I²C
Une fois chargé, vous pouvez le sauvegarder sous le nom « i2c_scanner ».
C’est un sketch que vous utiliserez avec des interfaces I²C.
Il vous permettra de détecter les adresses utilisées par les périphériques I²C connecté à votre Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
// -------------------------------------- // i2c_scanner // // Version 1 //Ce programme (ou le code de ce type) //peut être trouvé sur de nombreux site. //Par exemple, sur le forum d'Arduino.cc. //L'auteur original n'est pas connu. //La version 2, Juni 2012, en utilisant Arduino 1.0.1 //Adapté pour être aussi simple que possible par l'utilisateur d'Arduino.cc KRODAL //La version 3, le 26 février 2013 //V3 par louarnold //La version 4, le 3 mars 2013, en utilisant Arduino 1.0.3 //par l'utilisateur d'Arduino.cc KRODAL. //Les changements par louarnold enlevés. //Le balayage des adresses a changé de 0... 127 à 1... 119, //selon le scanner i2c de Nick Gammon //http://www.gammon.com.au/forum/?id=10896 //La version 5, le 28 mars 2013 //Comme la version 4, mais le scan d'adresse va maintenant jusqu'à 127. //Un détecteur semble utiliser l'adresse 120. //La version 6, le 27 novembre 2015. //Ajout d'un délai pour la carte Leonardo sur la communication sérielle. // // //Ce sketch évalue les adresses standard sur 7 bits //Les dispositifs ayant plus de 7 bits d'adresse ne pourraient pas être scanné correctement. // #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan } |
Affichage sur l’écran LCD I²C
L’installation d’un écran LCD sans l’interface I²C nécessite un câblage constitué de 8 fils, dont 6 utilisant des entrées/sorties.
Ce qui allait sérieusement hypothéquer le nombre d’entrées/sorties, d’où le choix d’utiliser un interface I²C associé à notre écran LCD et qui n’exploite que 2 entrées/sorties sur l’Arduino :
- SDA branché sur A4
- SCL branché sur A5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
//*************************************** //* * //* Initiation à Arduino par l'exemple * //* * //* Par Stievenart Freddy ON6FS * //* Version 1.0 - 07/03/2019 * //* * //*************************************** //* * //* Exercice 4 * //* Exploitation LCD I2C * //* * //*************************************** #include <Wire.h> // Inclure la librairie I2C #include <LiquidCrystal_I2C.h> // Inclure la librairie pour écran LCD en I2C LiquidCrystal_I2C lcd(0x27,20,4); // Initiation de l'objet "lcd" // Détails des paramètres : // - adresse 0x27 ou 0x3F est a changer en fonction de votre écran LCD // - Nombre de caractères par ligne de votre écran LCD // - Nombre de lignes de votre écran LCD // Les 2 types les plus courrant sont 2 lignes de 16 caractères et // 4 lignes de 20 caractères //*************************************** //* * //* Zone de Setup * //* * //*************************************** void setup() { lcd.init(); // initialize the lcd lcd.init(); // Print a message to the LCD. lcd.backlight(); //On allume le fond d'écran lcd.setCursor(0,0); //Première ligne lcd.print("Bienvenue a F5KEE"); lcd.setCursor(0,1); //Deuxième ligne lcd.print("Initiation Arduino"); lcd.setCursor(0,2); //Troisième ligne lcd.print("Exercice sur LCD I2C"); lcd.setCursor(5,3); //Quatrième ligne lcd.print("73's Freddy"); } //*************************************** //* * //* Zone de Loop * //* * //*************************************** void loop() { // Table de multiplication par 2 for (int i = 0; i <= 10; i++) { int y = 0; y = i % 4; // Modulo 4 if ( y == 0 ) // Chaque fois que l'on a affiché 4 lignes, on attend 2 sec // + effacement écran { delay(2000); // Attente de 2 sec lcd.clear(); // Vidange de l'écran } lcd.setCursor(0,y); lcd.print(i); lcd.print(" x 2 = "); lcd.print(i * 2); delay(500); } } |
Et bien oui, ça ne marche pas !
Vous avez besoin d’une librairie : LiquidCrystal_I2C-1.1.2.zip
Une fois téléchargé cette librairie vous devrez l’installer dans l’IDE.
ATTENTION : La librairie devra rester en .zip !!!!
Pour ce faire voici le cheminement
Merci librairie, cette fois ça marche !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
//*************************************** //* * //* Initiation à Arduino par l'exemple * //* * //* Par Stievenart Freddy ON6FS * //* Version 1.0 - 24/12/2018 * //* * //*************************************** //* * //* Exercice 5 * //* I2C + affichage LCD * //* Voir Scanner I2C * //* * //*************************************** #include <Wire.h> // Inclure la librairie I2C #include <LiquidCrystal_I2C.h> // Inclure la librairie pour écran LCD en I2C LiquidCrystal_I2C lcd(0x27,20,4); // Initiation de l'objet "lcd" // Détails des paramètres : // - adresse 0x27 ou 0x3F est a changer en fonction de votre écran LCD // - Nombre de caractères par ligne de votre écran LCD // - Nombre de lignes de votre écran LCD // Les 2 types les plus courrant sont 2 lignes de 16 caractères et // 4 lignes de 20 caractères //*************************************** //* * //* Zone de Setup * //* * //*************************************** void setup() { lcd.init(); // Initialisation du LCD lcd.backlight(); // Démarrage de l'éclairage du LCD lcd.print("CQ CQ de F5KEE F5KEE"); // Impression d'un message sur votre écran LCD delay(5000); lcd.clear(); // Effacement de l'écran LCD lcd.setCursor(0, 0); // Position du curseur (position sur la ligne, sur la nième ligne) lcd.print("Radio-Club F5KEE"); delay(4000); lcd.setCursor(3,1); // Position du curseur (position sur la ligne [2], sur la nième ligne [1]) lcd.print("Bienvenue"); delay(4000); } //*************************************** //* * //* Zone de Loop * //* * //*************************************** void loop() { // Calcul de puissance de 0 à 50 A pour une tension de 3 V // boucle incrémentant la variable i de 0 à 50, de 1 en 1 for (int i=0; i <= 50; i++) { lcd.clear(); // Effacement de l'écran LCD lcd.setCursor(0, 0); // Position du curseur (position sur la ligne, sur la nième ligne) lcd.print("Calcul puissance"); lcd.setCursor(0, 1); // Position du curseur (position sur la ligne, sur la nième ligne) lcd.print(i); lcd.print(" A x 3 V = "); lcd.print(3*i); lcd.print(" W"); delay(2000); // pause de 2000ms } // fin de la boucle for } |
Ce qu’il faut retenir
- Le bus I²C comporte 3 liaisons (Masse ou GND, SDA les data et SCL les clocks de synchronisation) + une ligne d’alimentation 5 V
- Le bus I²C utilise 7 bits d’adressage, ce qui permet 128 adresses dont celle de l’Arduino
- Le sketch « i2c_scanner » scanne votre bus I²C vous renseignera sur le nombre de dispositifs et de leur adresse
- Dès que l’on utilise un bus I²C nous devrons inclure la bibliothèque « Wire » dans le sketch. La commande qui permet d’appeler cette librairie est « #include <Wire.h> ». Cet appel se trouvant en haut du sketch avant le « setup() », c’est d’ailleurs l’emplacement de tous les appels de librairie. La librairie « Wire » est installée par défaut sur l’IDE. Par conséquent pas d’ajout de librairie.
- Pour utiliser un écran LCD I²C, nous avons besoin d’une nouvelle librairie : « LiquidCrystal_I2C », qu’il faudra ajouter à notre collection dans l’éditeur IDE
- Les quelques nouvelles commandes liée à la librairie « LiquidCrystal_I2C » :
- LiquidCrystal_I2C lcd(0x27,20,4) : Initiation de l’objet « lcd » avec pour paramètres l’adresse I²C, le nombre de caractères sur une ligne et le nombre de lignes /li>
- lcd.init() : initiation de l’écran LCD
- lcd.backlight() : allumage du retro éclairage
- lcd.clear() : effacement du contenu de l’écran LCD
- lcd.setCursor(3,1) : positionnement du curseur, dans l’exemple 4ème position sur la 2ème ligne.
Le premier chiffre étant la position sur la ligne et le second la ligne.
N’oublier pas que le O est la première position !!! - lcd.print(« Texte ») : Vous imprimerez à partir de la position du curseur la chaîne de caractère entre les guillemets
- lcd.print(variable) : Vous imprimerez à partir de la position du curseur le contenu de la variable
- Vous souhaitez relancer votre sketch, vous disposer d’un bouton reset sur votre Arduino, il suffit de le presser