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.

@Wikipedia

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 :

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.

// ————————————–
// 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

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
}

Powered by WPBetterCodeHighlighting

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

//***************************************
//* *
//* Initiation à Arduino par l’exemple *
//* *
//* Par Stievenart Freddy ON6FS *
//* Version 1.0 – 07/03/2019 *
//* *
//***************************************
//* *
//* Exercice 4 *
//* Exploitation LCD I2C *
//* *
//***************************************

#include // Inclure la librairie I2C
#include // 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);
}
}

Powered by WPBetterCodeHighlighting

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
Ajout Librairie Arduino

Merci librairie, cette fois ça marche !

//***************************************
//* *
//* Initiation à Arduino par l’exemple *
//* *
//* Par Stievenart Freddy ON6FS *
//* Version 1.0 – 24/12/2018 *
//* *
//***************************************
//* *
//* Exercice 5 *
//* I2C + affichage LCD *
//* Voir Scanner I2C *
//* *
//***************************************

#include // Inclure la librairie I2C
#include // 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
}

Powered by WPBetterCodeHighlighting

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