Académique Documents
Professionnel Documents
Culture Documents
UE EEA4 V4
• Objectifs du cours:
– Maitriser les fondamentaux d’un système embarqué: architecture des
ordinateurs, périphériques entrées/sorties, programmation et
communication
– Apprendre en faisant
2
Présentation de l’UE
• Une UE à l’interface de divers domaines:
Automatique Informatique
Systèmes
Embarqués
Electronique Communication
Traitement
du signal
3
Présentation de l’UE
• Contenu de l’UE:
– Introduction aux systèmes embarqués
– Programmation d’un mini-jeu
– Utilisation de capteurs/actionneurs
– Gestion du temps et des périphériques externes
– Communication série et Bluetooth
– Projet
4
Présentation de l’UE
• Quelques applications:
– Objets connectés (sport, santé, etc.)
– Transport (automobile, aéronautique, ferroviaire)
– Robotique
– Domotique
5
Plan du cours 1/4
1. Introduction 10
– Systèmes embarqués
– Arduino
2. Le langage Arduino 20
– Variables
– Conditions
– Boucles
– Fonctions
3. Le Mastermind 40
6
Plan du cours 2/4
4. Les sorties numérique/analogique 43
– La led clignotante
– La led en PWM
5. Le temps 52
– Millis()
– Timer
6. Les entrées numérique/analogique 56
– Le bouton et la résistance de tirage
– L’anti-rebond
– Le potentiomètre
– Mesure de température: le LM35
7
Plan du cours 3/4
7. Les interruptions 70
– Le bouton
– Le codeur
8. La puissance 78
– Le transistor bipolaire
– Le relais
9. Les extensions 86
– Le servo moteur
– Le bus I2C: PCF8574A
8
Plan du cours 4/4
10. Le Bluetooth 97
11. Projet 101
– Centrale Domotique
9
Chapitre 1. Introduction
10
1. Introduction
• C’est quoi un système embarqué ?
– Exemples de systèmes
– Point communs ?
• Architecture d’un système embarqué
• Capteurs et actionneurs
– Et la programmation alors ?
• Compilé ou interprété ?
• Quel langage ?
11
1. Introduction
• Architecture d’un système embarqué
Mémoire Mémoire
Communication
vive morte
Systèmes
IHM
auxiliaires
12
1. Introduction
• Capteurs et actionneurs
13
1. Introduction
• Et la programmation ?
– Langage interprété
Traduit par un interpréteur en langage machine au fur et à mesure
- Python
- Java
- HTTP, PHP, etc…
– Langage compilé
Traduit en langage machine avant exécution
- C
- C++
- C#
Le programme en langage machine est alors transféré en mémoire
14
1. Introduction
• C’est quoi un Arduino ?
– Du matériel
– Des extensions
– Un émulateur
– Un environnement de programmation
– Un langage
15
1. Introduction
• Les cartes Arduino et extensions (shield)
16
1. Introduction
• Arduino Uno
14 E/S numériques (broches 0 à 13)
Les numéros précédées d’un ‘~’ peuvent être utilisées en PWM
18
1. Introduction
• L’environnement de programmation Arduino (Sketch ou croquis)
20
2. Le langage Arduino
• Structure d’un programme Arduino
• Le moniteur série
• Les variables et opérations
• Les conditions
• Les boucles
• Les fonctions
21
2. Le langage Arduino
• Structure d’un programme Arduino
– Langage C++ (presque)
– setup(): exécuté une fois au début
• Configuration des E/S
• De la communication
• Des éventuels modules externes
• etc…
– loop(): répétée ensuite à l’infini
• Votre programme
22
2. Le langage Arduino
• Exemple: led qui clignote
– Remarque: une instruction se fini toujours par un « ; »
23
2. Le langage Arduino
• Exemple: led qui clignote. A vous de jouer !
– Lancer le logiciel Arduino
– Ouvrir l’exemple: fichier/exemples/01.basics/blink
– Brancher la carte sur l’USB
– Choisir sa carte: outils/type de carte
– Choix du port USB: outils/Port
– Compilation et transfert: téléverser
24
2. Le langage Arduino
• Moniteur série:
– Permet de saisir des données à l’Arduino ou en recevoir
– Utilise le port USB (liaison série de l’Arduino, Rx/Tx)
– Initialisé dans setup(): Serial.begin(9600);
– Pour afficher une variable: Serial.print(variable);
– Idem avec saut de ligne: Serial.println(variable);
– Pour lire une variable: Serial.read();
– Idem pour une chaine de caractère: Serial.readStringUntil(‘\n’);
25
2. Le langage Arduino
• Moniteur série: exemple à tester
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println("Quel est votre prenom?");
while(Serial.available()==0)
{
}
String prenom=Serial.readStringUntil('\n');
Serial.print("Bonjour ");
Serial.println(prenom);
}
26
2. Le langage Arduino
• Les variables
– Une variable permet de donner un nom à une valeur stockée
– Doit être obligatoirement déclarée !
– Type de variable:
• bool: bouléen stocké sur 1 bit
• byte: octet stocké sur 8 bits
• char: caractère (entre apostrophes ‘ ‘)
• String: - chaine de caractères (entre guillemets « »)
• (unsigned) int: entier signé (ou non) stocké sur 16 bits
• long: deux fois plus qu’un int
• (unsigned) float: flottant signé (ou non) stocké sur 32 bits
• double: deux fois plus qu’un float
– Exemples: long vitesseLumiere=299792458;
– Pas d’espaces ni de caractères spéciaux
27
2. Le langage Arduino
• Les variables locales vs globales
– Une variable locale n’est connu que du sous programme où elle est
déclarée
– Une variable globale est connu partout
– Dans l’exemple, LED est une variable ……globale
– Les variables locales sont à préférer:
• Economie de mémoire car elles sont détruites
après exécution du sous-programme
• Nom pouvant être réutiliser dans plusieurs
sous-programmes ou fonctions
• Si la donnée est fréquemment utilisée:
• Variable globale
28
2. Le langage Arduino
• Opération sur les variables
– Déclaration et affectation: int toto=1;
– Affectation seule: toto=1;
– Addition: toto=1+1;
– Soustraction: int y=4-toto;
– Multiplication: long z=y*10;
– Division: long div=z/3; arrondie à l’inférieur
– Modulo: long reste=z%3; reste de la division
29
2. Le langage Arduino
• Opération sur les variables (suite)
– Incrémentation: toto++;
– Décrémentation: toto--;
– Bascule: toto=!toto;
• Opération booléenne
– Et: &
– Ou: |
– Non: !
30
2. Le langage Arduino
• Les conditions
– Si… if( 1er condition à tester ))
{
//Instructions à exécuter
}
– …Sinon si… else if( 2eme condition à tester ))
{
//Instructions à exécuter
}
– …Sinon else
{
//Instructions à exécuter
}
31
2. Le langage Arduino
• Multiplicité des conditions
– Et: &&
– Ou: ||
– Non: !
• Comparaison de variables
– Égalité: ==
– Inférieur – inférieur ou égal: < <=
– Supérieur – supérieur ou égal: > >=
– Différent: !=
32
2. Le langage Arduino
• Les conditions – Exercice 2.1
1. Créer un programme qui demande l'âge de l’utilisateur
– En fonction de l'âge, le programme répondra avec « Majeur » ou
« Mineur »
– Remarque: chainedecaractere.toInt(); permet de convertir une chaine
de caractère en nombre entier
2. Désormais le programme demandera également si l’utilisateur
dispose en plus d’un véhicule
– En fonction des deux réponses, le programme dira si l’utilisateur peut
conduire
33
2. Le langage Arduino
• Les conditions: cas de l’aiguillage
switch(toto) //selon la valeur de toto…
{
case 0 : //si toto vaut 0
//instructions à exécuter
break; //indique la fin du cas 0
34
2. Le langage Arduino
• Les boucles
– Tant que…faire while(conditions à tester)
{
//Instructions à exécuter
}
– Faire…tant que do
{
//Instructions à exécuter
}
while(conditions à tester);
float moyenne=somme/nb_note;
36
2. Le langage Arduino
• Les boucles – Exercice 2.2
1. Créer un programme qui demande à l’utilisateur de donner un chiffre
entre 1 et 10
– La question est répétée tant que le nombre donné ne correspond pas
– On ne doit pas sortir de la boucle dans ce cas
Question: boucle faire…tant que ou tant que…faire ?
37
2. Le langage Arduino
• Les fonctions
– Permettent de ne pas réécrire un code utilisé de multiples fois
Type nomDeLaFonction(types et noms des variables en entrée)
{
//Instructions à exécuter
return une_variable; //du même type que la fonction
}
– Types de fonction:
• void: ne renvoie rien et donc l’instruction « return » est inutile
est appelé: sous-programme
• int: renvoie un entier, return doit donc envoyer un entier
• Etc…
– setup() et loop() sont des fonctions particulières pour Arduino
elles sont obligatoires
38
2. Le langage Arduino
• Exemple: encore la moyenne
– Remarque: la fonction crée une copie de monNbNote nommée nbNote !
float calculMoyenne(float notes[],int nbNote)
{
float somme=0;
for(int compteur=0; compteur<nbNote; compteur++)
{
somme=somme+notes[compteur];
}
float moyenne=somme/nbNote;
return moyenne;
}
void loop()
{
float mesNotes[]={12,15,13};
int monNbNote=3;
Serial.println(calculMoyenne(mesNotes,monNbNote));
39
}
Chapitre 3. Le Mastermind
40
3. Le Mastermind
• Règles du jeu:
– La machine tire aléatoirement 4 pions de couleurs parmi 6
– Le joueur doit trouver la bonne combinaison
– A chaque tour, le joueur propose une combinaison
– La machine donne le nombre de bien placés et mal placés
– Le joueur dispose de 8 tours seulement !
41
3. Le Mastermind
• Tableau à 1 dimension: ex de la moyenne
– Déclaration int nb_note=3;
float notes[]={12,15,13};
– Initialisation float somme=0;
– Lecture d’un élément for(int compteur=0; compteur<nb_note; compteur++)
– Ecriture ? {
somme=somme+notes[compteur];
• notes[indice]=14; }
– Indice commence à 0 float moyenne=somme/nb_note;
• Première « case » mémoire
– Déclaration alternative:
• type nom_tab[taille_tableau];
42
Chapitre 4. Les sorties numériques/analogiques
43
4. Les sorties numériques/analogiques
• Le breadboard:
– Permet de connecter des composants électroniques
– 4 lignes d’alimentations indépendantes (rouge: Vcc, noire: Gnd)
– Des colonnes indépendantes, séparées en leurs milieux
44
4. Les sorties numériques/analogiques
• Le breadboard: exemple de la LED connectée en pin 12
– Une led est un composant polarisé
– Le courant la traverse de l’anode vers la cathode
– A besoin d’une résistance pour limiter le courant (20mA max)
46
4. Les sorties numériques/analogiques
• Le breadboard: exemple de la LED
– La Led est déclarée en pin 12
– La pin 12 est déclarée en sortie
47
4. Les sorties numériques/analogiques
• Les sorties numériques – Exercice 4.1
1) Tester l’exemple de la LED, puis modifier la durée de clignotement
2) Câbler une deuxième LED et la faire clignoter deux fois plus vite
3) Faire clignoter cette deuxième LED trois fois plus vite que la première ?
48
4. Les sorties numériques/analogiques
• Aparté: calcul de la résistance de la led
– Loi des mailles: 𝑉𝑠 = 𝑅. 𝐼 + 𝑉𝑙𝑒𝑑
𝑉𝑠−𝑉𝑙𝑒𝑑 5−1,2
Donc R = 𝐼
= 20.10−3
0,5V
2,5V
4,5V
50
4. Les sorties numériques/analogiques
• Les sorties Pulse Width Modulation – Exercice 4.2
1) Allumer une LED avec 3 niveaux d’intensités (0-127-255)
51
Chapitre 5. Le temps
52
5. Le temps
• La fonction delay()est dite bloquante.
On ne peut rien faire pendant l’attente.
• On préfèrera utiliser la fonction millis():
– L’Arduino possède un timer, sorte de chronomètre
– millis() donne le temps (en milliseconde) depuis que l’Arduino a
démarré
– Compte jusque 50 jours ! Variable temps à stocker dans un long
if((millis()-temps)> 1000)
{
//Instructions à exécuter
temps = millis(); //on stocke la nouvelle heure
}
53
5. Le temps
• Millis() – Exercice 5.1
1) Câbler une LED, la faire clignoter avec Millis()
2) Câbler une deuxième LED et la faire clignoter trois fois plus vite avec
Millis()
54
5. Le temps
• L’Arduino possède en réalité plusieurs timers
Exemple:
– Bibliothèque TimerOne pour l’Arduino UNO #include <TimerOne.h>
• À installer depuis le gestionnaire de bibliothèque
void setup()
(ctrl+shift+I)
{
• Croquis/inclure une bibliothèque/TimerOne Timer1.initialize(1000000);
Timer1.attachInterrupt(nom_fonction);
• #include <TimerOne.h> apparait en début de code
void nom_fonction()
{
• Exercice 5.2: Faire clignoter une LED avec TimerONE //Instructions à exécuter
}
55
Chapitre 6. Les entrées numérique/analogique
56
6. Les entrées numérique/analogique
• Entrées numériques: exemple du bouton
– 3 possibilités de montage
57
6. Les entrées numérique/analogique
• Bouton en pullup (tirage à Vcc)
– Le niveau logique est « haut » (Vcc) en absence
d’appui sur le bouton
– A l’appui, la masse (gnd) est imposée,
et le niveau logique devient « bas »
int button_pullup = 4;
void setup() {
pinMode(button_pullup,INPUT);
}
void loop() {
bool reading=digitalRead(button_pullup);
delay(100);
}
58
6. Les entrées numérique/analogique
• Bouton en pulldown (tirage à la masse)
– Le niveau logique est « bas » (gnd) en absence
d’appui sur le bouton
– A l’appui, la tension Vcc est imposée,
et le niveau logique devient « haut »
int button_pulldown = 7;
void setup() {
pinMode(button_pulldown,INPUT);
}
void loop() {
bool reading=digitalRead(button_pulldown);
delay(100);
}
59
6. Les entrées numérique/analogique
• Bouton en pullup logiciel
– Même fonctionnement que le montage pullup
– Utilisation d’une résistance de pullup interne à l’Arduino
int button = 8;
void setup() {
pinMode(button,INPUT_PULLUP);
}
void loop() {
bool reading=digitalRead(button);
delay(100);
}
60
6. Les entrées numérique/analogique
• Entrée numérique – Exercice 6.1
1) Câbler une LED, et un bouton (montage de votre choix)
a) L’appuie allume la LED
b) Le relâchement l’éteint
61
6. Les entrées numérique/analogique
• Entrée numérique – Exercice 6.2
1) Modifier le programme de l’exercice 6.1 afin que le 1er bouton
active le clignotement et un second bouton l’arrête (nul besoin
de rester appuyé) -> besoin d’une variable supplémentaire
62
6. Les entrées numérique/analogique
• Les fronts représentent le passage d’un niveau logique à un
autre, on distingue:
– Le front montant (passage du niveau bas au niveau haut)
– Le front descendant (passage du niveau haut au niveau bas)
• Ils se « détectent » lorsque le niveau a changé entre l’instant t et
l’instant précédent
t-1 t
63
6. Les entrées numérique/analogique
• Les fronts – Exemple:
int button=8;
bool prec_reading = 1;
void setup()
{
pinMode(button,INPUT_PULLUP);
}
t-1 t
void loop()
{
bool reading=digitalRead(button);
if(reading==0 && prec_reading == 1)
{
//instruction à exécuter
}
prec_reading=reading;
}
65
6. Les entrées numérique/analogique
• L’effet de rebond et l’anti-rebond
int button=8;
bool prec_reading = 1;
long lastDebounceTime=0;
int debounce=50;
void setup()
{
pinMode(button,INPUT_PULLUP);
}
void loop()
{
bool reading=digitalRead(button);
if(reading==0 && prec_reading == 1)
{
if(millis()-lastDebounceTime >debounce)
{
Exercice 6.4:
//instruction à exécuter Puis-ce que du rebond apparait, gérer la
lastDebounceTime=millis();
}
gestion du front avec un anti-rebond
}
prec_reading=reading;
} 66
6. Les entrées numérique/analogique
• Entrée analogique
– L’Arduino possède 6 entrées analogiques (A0 à A5)
– La tension (comprise entre 0 et 5V) est convertie par un
Convertisseur Analogique Numérique (CAN) sur 10 bits
– Exemple:
int Value = analogRead(A0);
void loop() {
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.0 / 1023.0); //conversion
Serial.println(voltage);
}
69
Chapitre 7. Les interruptions
70
7. Les interruptions
• Dans l’exemple du bouton, on scrute régulièrement son état
• Par exemple, si loop() exécute un long programme, l’appui ne
sera pas détecté…
• On utilise alors une interruption matérielle:
– Permet de détecter un événement
– Et d’exécuter une fonction dès la détection
– Le programme principal est suspendu pendant l’exécution…
– …puis reprend là où il s’est arrêté
71
7. Les interruptions
• Configuration d’une interruption:
– Dans le setup()
attachInterrupt(interruption,fonction,mode);
– Où interruption est le numéro de l’interruption:
0 (événement sur la pin 2) ou 1 (pour la pin 3) pour l’Arduino UNO
void setup() {
pinMode(button, INPUT_PULLUP);
attachInterrupt(0,Reagir,FALLING); //pour un bouton en pin 2
}
void loop() {}
Void Reagir() {
if ((millis() - lastDebounceTime) > debounce) {
//instructions à executer
lastDebounceTime=millis();
}
}
73
7. Les interruptions
• Interruptions – Exercice 7.1
1) Utiliser une interruption pour changer une variable « cligno » de
type bool. Si cligno==1, alors une led clignotera depuis le loop.
(avec millis() )
74
7. Les interruptions
• Exemple du codeur incrémental:
– Dispose de deux canaux: A et B
– Les signaux évoluent lors de la rotation
– Si A apparait avant B: sens horaire
– Sinon: sens trigonométrique
75
7. Les interruptions
• Exemple: codeur incrémental sans la quadrature
int codA= 2;
int codB= 3;
int compteur=0;
void setup() {
pinMode(codA, INPUT_PULLUP);
pinMode(codB, INPUT_PULLUP);
attachInterrupt(0,comtA,CHANGE);
}
void loop() {}
void comtA() {
if(digitalRead(codA)!=digitalRead(codB)){
compteur++;
}
else{
compteur--;
}
} 76
7. Les interruptions
• Interruptions – Exercice 7.2
1) Tester l’exemple en le modifiant pour faire apparaitre la valeur du
compteur dans le moniteur série
77
Chapitre 8. La puissance
78
8. La puissance
• Un Arduino n’est capable de fournir qu’une tension maximale
de 5V et un courant de 40 mA pour une unique entrée.
82
8. La puissance
• Le relais
– Permet une vraie séparation des circuits.
– Composé d’une bobine (la commande)
– Et d’une lamelle (Interrupteur)
83
8. La puissance
• Exemple de montage
– Besoin de puissance pour alimenter la bobine du relais
– Utilisation d’un transistor !
– Cette référence permet d’alimenter jusque:
• 1A à 24 V en continue
• 0,5 A en alternatif (125 V)
B1
B2
85
Chapitre 9. Les extensions
86
9. Les extensions
• Afin d’augmenter les capacités de l’Arduino et de simplifier le
développement de tâches complexes:
– Utilisation de bibliothèques et extensions
• Une bibliothèque est une collection de routine permettant
d’exécuter des tâches courantes
• TimerOne.h est une bibliothèque pour gérer le temps
• Ajout d’une bibliothèque:
87
9. Les extensions
• Exemple: le servomoteur
– C’est un composant intégrant:
• Un moteur avec des engrenages
• Un potentiomètre pour la mesure d’angle
• Une carte électronique pour le contrôle
#include <Servo.h> //on ajoute la bibliothèque
void setup() {
myservo.attach(2); //…connecté en pin 2
}
void loop() {
myservo.write(50); //on impose un déplacement
delay(1000); //vers la position 50
} 88
9. Les extensions
• L’Arduino dispose d’un bus I2C lui permettant de
communiquer avec des périphériques
– Chaque périphérique possède une adresse
– Le bus utilise les pins SDA (Data) et SCL (Clock)
– Remarque: Les signaux sont présents en A4 (SDA) et A5 (SCL)
• Exemple de trame:
SDA
SCL
void setup() {
Wire.begin();
}
void loop() {
Wire.beginTransmission(PCF8574_ADDR);
Wire.write(0b01011111);
Wire.endTransmission();
delay(500);
}
– Quelles leds s’allument ? Les leds 7 et 5
– Pour écrire sur une seule led à la fois: nécessité d’utiliser des masques!
91
9. Les extensions
• Le bus I2C: exemple du PCF8574A avec un masque
– Masques d’écriture
– Donc:
• écrire un 1 en P2 (masque en « ou »): c = c | 0b00000100
• écrire un 0 en P2 (masque en « et »): c = c & 0b11111011
92
9. Les extensions
• Le PCF8574A– Exercice 9.1
1) Faire le montage du PCF8574A à l’adresse 0x38, puis écrire sur les
8 bits afin de faire clignoter une led connectée en P4
2) Ajouter une led en P3, faire clignoter les deux leds à des vitesses
différentes (obligation d’utiliser deux masques)
93
9. Les extensions
• Le bus I2C: exemple du PCF8574A en lecture
– Remarque: les entrées sont par défaut en pullup
#include <Wire.h>
#define PCF8574_ADDR 0x38
byte c=0;
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
Wire.requestFrom(PCF8574_ADDR, 1); //demande d’un octet…
while (Wire.available()) {
c = Wire.read(); //…stocké dans c
Serial.println(c,BIN);
}
delay(500);
} 94
9. Les extensions
• Le bus I2C: lecture avec un masque
– Lorsque l’on lit sur le PCF8574A, c’est avec un octet complet
– Si on ne souhaite lire qu’une partie indépendamment du reste:
-> Utilisation d’un masque !
– Exemple d’un masque de lecture pour P2:
c = Wire.read();
c =c & 0b00000100;
if (c == 0)
{
Serial.println("P2=LOW");
}
else
{
Serial.println("P2=HIGH");
}
95
9. Les extensions
• Le PCF8574A– Exercice 9.2
1) Faire le montage du PCF8574A à l’adresse 0x3D, lire l’état de
2 boutons connectés en P1 et P2 et les afficher sur le moniteur série
96
Chapitre 10. Le Bluetooth
97
10. Le Bluetooth
• Le Bluetooth Low Energy est une norme de
communication bidirectionnelle sans-fil
– Présent nativement sur l’Arduino 101
– Nécessite un composant (HM-10 par exemple)
pour les autres Arduino
• Il permet de créer une liaison série sans fils
• Application:
– Serial Bluetooth Terminal (Android)
– BLE Terminal HM-10 (iOS)
98
10. Le Bluetooth
• Exemple simple:
#include <SoftwareSerial.h>
SoftwareSerial blue(2, 3);
void setup()
{
// Ouvre la voie série avec l'ordinateur
Serial.begin(9600);
101
11. Projet
• Centrale domotique
– Nous souhaitons développer une maquette qui simule la
centrale domotique d’une maison
– Celle-ci comportera obligatoirement:
• Un détecteur de présence (PIR)
• Un écran LCD i2c 16x2 caractères muni de 4 boutons
• Un clavier matriciel
• Un PCF8574A (pour la gestion des E/S supplémentaires)
– Les fonctionnalités souhaitées sont:
• Gestion de l’éclairage (2 interrupteurs / 2 lampes)
• Gestion du chauffage (affichage température + consigne)
• Gestion de l’alarme (activation / désactivation par mot de passe)
102
11. Projet
• Module PIR (détection de présence)
– En cas de détection de présence, envoie d’un signal haut pendant une
durée définie par un trimmer de réglage
int PIR_sensor=2;
– Nécessite une alimentation int sensorValue=0;
void setup() {
pinMode(PIR_sensor,INPUT);
Serial.begin(9600);
}
void loop() {
sensorValue = digitalRead(PIR_sensor);
if(sensorValue==1)
{
Serial.println("mouvement détecté");
}
} 103
11. Projet
• Ecran LCD 16x2 caractères
– Installation de la bibliothèque dédiée
• Croquis/Inclure une bibliothèque/Ajouter la bibliothèque .ZIP
• La bibliothèque LCD16x2 vous est fourni
• Fonctionne avec le bus I2C, nécessite la bibliothèque Wire
– Exemple fourni: affichage et boutons
• Fichier/Exemples/LCD16x2/buttons_and_lcd
• Utilisation d’un masque pour les boutons
104
11. Projet
• Clavier matriciel
– Permet avec 4 lignes et 4 colonnes (8 pins), d’obtenir
16 entrées
– Remarque: ne permet pas le multitouche
#include <Keypad.h> void setup() {
Serial.begin(9600);
char Keys[4][4] = { }
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'}, void loop() {
{'7', '8', '9', 'C'}, char touche = clavier.getKey();
{'*', '0', '#', 'D'} if (touche)
}; {
Serial.println(touche);
byte rowPins[4] = {9, 8, 7, 6}; }
byte colPins[4] = {5, 4, 3, 2}; }
106
11. Projet
• LED RGB (Red Green Blue) à cathode commune
– Se comporte comme 3 Leds qui partage leurs cathodes
– Une résistance sur la cathode est toujours requise
– Remarque: ici la patte longue se connecte à la masse
107
Fin du diaporama
108