Oumnad 1
Prise En main ARDUINO A. Oumnad 2
De quoi s'agit-il ?
Arduino est une petite carte de prototypage dotée d'un microcontrôleur ATMEGA et une interface
USB-Série qui permet de connecter l'Arduino à un port USB du PC pour téléverser les programmes
dans l'ATMEGA. La carte possède des connecteurs permettant d'accéder facilement aux E/S du
Microcontrôleur
Limitation de courant
• Le courant max sur une sortie Arduino ne doit pas dépasser 40 mA
• Le courant max que toutes les sorties réunies peuvent fournir ne doit pas dépasser 200mA
• Le courant max que toutes les sorties réunies peuvent recevoir ne doit pas dépasser 400mA
Logiciel
Pour programme l'Arduino, on dispose d'un environnement de développement intégré (IDE) constitué
essentiellement de:
• Un éditeur de texte qui permet au programmeur de saisir son programme,
• Un compilateur C adapté au microcontrôleur ATMEGA. Le compilateur permet de traduire le code
source écrit en C en programme exécutable constitué d'une suite de codes machine
compréhensibles par le microcontrôleur ATMEGA. Le C utilisé est compatible avec le C standard,
mais on dispose en plus de librairies permettant d'interagir avec les E/S de l'ATMEGA,
• Une fois le programme compilé, l'IDE permet de d'envoyer (téléverser) le programme exécutable
dans la mémoire programme de l'ATMEGA afin d'y être exécuté.
Personnaliser L'IDE
• La première fois qu'on Lance l'IDE, il faut faire une
petite configuration qui consiste à:
• Choisir la carte Arduino sur laquelle on travaille: outils
→ type de carte → sélectionner votre carte dans la liste
• Choisir un dossier pour les programmes que vous allez
écrire: (chez Arduino, un programme = un croquis)
o Utilisez l'explorateur windows pour créer un dossier
de votre choix
o Dans l'IDE Arduino: fichier → pré fé rences →
Sélectionnez votre dossier dans le cadre
Emplacement du carnet de croquis → OK
Premier Programme
On va faire un petit programme qui fait clignoter une LED branchée sur une sortie numérique. Sur la
plupart des carte Arduino, il ya une LED jaune
déjà branchée sur l'E/S 13
13 330Ω
Arduino
• Sauvegarder le programme dans votre dossier en prenant soin de lui donner un nom
significatif. Remarquer que l'IDE crée un dossier et place le programme dedans. C'est une bonne
chose car cela évite que les programmes se mélangent.
Analyse du programme:
• Le programme est constituée de deux fonctions: setup() et loop(). Ces deux fonctions sont
obligatoires même si on ne met rien dedans,
Dans la fonction setup() on met les instructions qui doivent être exécutées une seule fois. En
général, on y trouve la configuration des E/S, l'initialisation des variables …Dans notre exemple on
trouve la ligne de code pinMode(13, OUTPUT); c'est un appel de la fonction pinMode() qui se trouve
dans la librairie Arduino pour configurer l'E/S 13 en sortie
Dans la fonction loop(), on place les tâches qui doivent se répéter indéfinitivement. Dans notre
exemple, on doit allumer et éteindre la LED en permanence:
• On appelle la fonction digitalWrite() qui force la sortie 13 au niveau HIGH pour allumer la LED
• On appelle la fonction delay() pour attendre ½ seconde afin que notre œil aie le temps de voir la LED
allumée
• On appelle de nouveau la fonction digitalWrite() mais cette fois pour forcer la sortie 13 au niveau LOW
pour éteindre la LED
• On appelle la fonction delay() pour attendre ½ seconde afin que notre œil aie le temps de voir la LED
éteinte
• On recommence
Variante:
//déclaration des variables globales
int LED_PIN = 13;
// fonction de configuration
void setup() {
pinMode(LED_PIN, OUTPUT); // configurer la broche 13 en sortie
}
Pour qu'une variable soie connue de toutes les fonctions, elle doit être déclarée en dehors des
fonctions ( globale)
Prise En main ARDUINO A. Oumnad 5
?
13
12
11
10
9
8
7
6
5
4
3
2
1
0
PD4/T0/XCK
AREF
PB0/ICP1/CLKO
PD7/AIN1
~ PD6/AIN0
PD5/T1
~ PD3/INT1
PD2/INT0
TX PD1/TXD
RX PD0/RXD
PB4/MISO
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
Pour utiliser les programmes avec ISIS, il faut les DIGITAL (~PWM)
compiler juste pour créer un programme .hex qui sera
implanté dans le Arduino sous ISIS. Pour ça: ATMEGA328P-PU
1121
ANALOG IN
Exercice:
PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
RESET
// fonction de configuration
void setup() {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
int p;
void setup(){
for(p = 0; p < 8; p++){
pinMode(p, OUTPUT);
}
}
void loop(){
for(p = 0; p < 8; p++){
digitalWrite(p, HIGH);
delay(300);
digitalWrite(p , LOW);
}
}
Exemple du chenillard
void setup() {
DDRD = 0xFF; //PORTD sortie
PORTD = B00000001; allumer la LED de droite
}
void loop() {
PORTD = PORTD << 1 ; // décaler à gauche d'une position
if (PORTD == 0)PORTD = B00000001; //quand le 1 sort du coté gauche, on le réinjecte du coté droit
delay(200);
}
Les avantages de cette façon de programmer sont multiples. On économise la RAM car on utilise
moins variables. On optimise le temps d'exécution en évitant les boucles et les appels de fonctions…
Prise En main ARDUINO A. Oumnad 8
B1
uC Rebonds
B2 mécaniques
1 à 30
Ces composants ne sont pas toujours faciles à utiliser à cause des rebonds.
7
6
5
4
3
2
1
0
/*
PB5/SCK
PD4/T0/XCK
AREF
PB0/ICP1/CLKO
TX PD1/TXD
RX PD0/RXD
PD7/AIN1
~ PD6/AIN0
~ PD5/T1
~ PD3/INT1
PD2/INT0
~PB3/MOSI/OC2A
~PB2/SS/OC1B
~ PB1/OC1A
PB4/MISO
void loop() {
if( digitalRead(8) == LOW){
PORTD <<= 1; // décaler à gauche
if(PORTD == 0)PORTD = 1; // assure la rotation
delay(20); // anti rebond
while( digitalRead(8) == LOW);
delay(20); // anti rebond
}
}
Prise En main ARDUINO A. Oumnad 9
?
?
?
?
?
?
?
?
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
PB5/SCK
PD4/T0/XCK
PB0/ICP1/CLKO
AREF
TX PD1/TXD
RX PD0/RXD
PD7/AIN1
~ PD6/AIN0
~ PD5/T1
~ PD3/INT1
PD2/INT0
~PB3/MOSI/OC2A
~PB2/SS/OC1B
~ PB1/OC1A
PB4/MISO
B1
1 décalage à
droite www.TheEngineeringProjects.com
B2 attendre ↑
0 ATMEGA328P-PU
1121
1 ON
décalage à
PC4/ADC4/SDA
PC5/ADC5/SCL
ANALOG IN
gauche
PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
RESET
attendre ↑
GND
VCC
Reset BTN
A0
A1
A2
A3
A4
A5
void setup() {
pinMode(8, INPUT);
pinMode(9, INPUT);
DDRD = 0xFF; //PORTD sortie
PORTD = B00001000; //on allume une seule LED
}
void loop() {
if(digitalRead(8) == LOW){
PORTD = PORTD >> 1 | PORTD << 7; // décaler à droite
delay(20); // anti rebond
while( digitalRead(8) == LOW); // attendre que B1 repasse à 1
}
if(digitalRead(9) == LOW){
PORTD = PORTD << 1 | PORTD >> 7; // décaler à gauche
delay(20); // anti rebond
while( digitalRead(9) == LOW); // attendre que B2 repasse à 1
}
}
Exercice:
Ecrire le programme qui surveille 3 boutons B1, B2, B3 branchés sur les broches 8, 9, 10.
B1 → PORTD = 00001111
B2 → PORTD = 11110000
B3 → PORTD clignote 5 fois (0.5s/0.5s)
Essayer le programme sur ISIS
Prise En main ARDUINO A. Oumnad 10
VDD
VEE
VSS
RW
RS
D7
D6
D5
D4
D3
D2
D1
D0
E
14
13
12
11
10
9
8
7
6
5
4
3
2
1
• Les informations sont envoyées sous forme d'octets. L'interprétation dépend de l'entrée RS:
RS = 0 → L'octet envoyé sera interpré té comme une commande
RS = 1 → L'octet envoyé est le code ASCII d'un caractère qui sera affiché
L'octet peut être envoyé en un seul coup (mode 8 bits) ou moitié-moitié (mode 4 bits). Quelque soit le
mode, l'envoi d'un octet ou d'un demi octet est toujours validé par une impulsion ⎍ sur l'entrée E
L'IDE Arduino intègre la bibliothèque liquid crystal qui permet d'utiliser ces afficheurs sans en
connaitre le fonctionnement interne.
Exemple:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
VDD
VSS
VEE
RW
RS
D0
D1
D2
D3
D4
D5
D6
D7
E
4
5
6
7
8
9
10
11
12
13
14
lcd.print(2016);
lcd.setCursor(0, 1);
lcd.print("La creme de l'EMI");
13
12
11
10
9
8
7
6
5
4
3
2
1
0
}
B0/ICP1/CLKO
PB5/SCK
PD4/T0/XCK
TX PD1/TXD
RX PD0/RXD
AREF
B3/MOSI/OC2A
PB2/SS/OC1B
~ PB1/OC1A
PD7/AIN1
~ PD6/AIN0
PD5/T1
~ PD3/INT1
PD2/INT0
PB4/MISO
void loop() {}
~
Exercice:
Ecrire un programme qui affiche un nombre en décimal et en binaire sur la même ligne
Prise En main ARDUINO A. Oumnad 11
5V 102
3
v ADC N
0 0
V
Exemple:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int N;
float v;
void setup() {
VDD
VSS
VEE
RW
RS
D0
D1
D2
D3
D4
D5
D6
D7
lcd.begin(20, 2);
E
LM032L
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void loop() {
N = analogRead(5); RV1
v = N * 5.0 / 1023.0 ;
13
12
11
10
9
8
7
6
5
4
3
2
1
0
lcd.clear();
54%
lcd.print("N=");
PB5/SCK
PD4/T0/XCK
PB0/ICP1/CLKO
AREF
TX PD1/TXD
RX PD0/RXD
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
PD7/AIN1
~ PD6/AIN0
PD5/T1
~ PD3/INT1
PD2/INT0
PB4/MISO
lcd.print(N);
lcd.print(" --> ");
lcd.print(v); 1k
lcd.print(" Volts");
~
delay(200);
} DIGITAL (~PWM)
Remarques: ATMEGA328P-PU
précédent, ANALOG IN
• l'appel de la fonction delay() est
PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
RESET
Exercice:
Programme qui mesure les quatre entrées analogiques (0 à 3) et affiche les résultats en volts sur
l'afficheur LCD
Prise En main ARDUINO A. Oumnad 12
Communication Série
L'Arduino UNO possède un module de communication série (UART) qui permet de se connecter à tout
autre équipement équipé d'un module de communication série
Autre équipement
Tx
Rx
GND
• La communication est bidirectionnelle (full duplex) La réception (RX) se fait sur le broche 0 et la
transmission (TX) se fait sur la broche 1
• Les niveaux de tension sont compatibles TTL (0V / 5V). Pour se connecter à un port série standard
RS232, il faut utiliser un adaptateur de niveaux. Le standard RS232 utilise les niveaux de tension
+12V / -12V avec des niveaux logiques inversés (0→ +12V, 1→ -12V) . Le circuit Max232 permet de
réaliser cette adaptation
5V
16
1
+
+
2
3 Max232
4 6
+
+
5 1
10 7 2 6
Rx
TTL 9 8 RS232 3
Tx
11 14
5 9
12 13 GND
15
Prise En main ARDUINO A. Oumnad 13
• La vitesse de communication doit être la même des deux cotés. Les vitesses de communication
standard sont 300, 600, 1200, 2400, 4800, 9600, 19200, 28800, 38400, 57600, or 115200 baud
• L'UART de l'Arduino dispose d'un buffer de réception de 64 octets
La librairie serial propose des fonctions pour utiliser le port série. Les fonctions les plus importantes
sont:
• Serial.begin(speed); Initialise le port série et définit la vitesse de communication
• Serial.write(data); Transmet un octet, une chaine ou les octets d'un tableau de type char[] ou byte[]
• serial.write('A'); transmet le caractère A (octet 65)
• serial.write(66); transmet l'octet 66 = caractère B
• serial.write("Bonjour"); transmet la chaine Bonjour (octet par octet)
• serial.write(856); le nombre 856 est tronqué à un octet puis transmis
byte b[] = {0x11, 0x22, 0x33, 0x44, 0x55}; Serial.write(b,3); transmit 3 octets du tableau b
• Serial.print(data,[base]); Sert surtout à transmettre des nombres en tant que chaine. On peut aussi s'en servir pour transmettre des
caractères et des chaines
Serial.print(2048); Transmet le nombre 2048 comme la chaine "2048"
Serial.Print(235.4567); Transmet le nombre réel 235.4567 en tant que chaine en arrondissant à 2 chiffres décimaux "235.46"
Serial.print(240,BIN); Convertit le nombre 240 en binaire et le transmet en tant que chaine "11110000"
• Serial.println(data); Identique à Serial.print() mais transmet en plus un retour ligne (CR LF)=(13 10)
• n= Serial.available(); retourne le nombre d'octets disponible dans le buffer de réception
• b=Serial.read(); Lit un octet du buffer de réception. Retourne -1 (255) si le buffer de réception est vide. Le receveur b peut être de type
byte, char ou int
• n=Serial.readBytes(buffer, length); Lit un ensemble d'octets sur le port série et les place dans la variable buffer
o buffer: nom de la variable qui reçoit les données. Type char[] ou byte[]
o length: nombre d'octets à lire (int)
o cette fonction retourne le nombre n d'octets effectivement lus qui peut être inférieur à length en cas de timeout
• n=Serial.readBytesUntil(terminator, buffer, length); lit un ensemble d'octets et les place dans la variable buffer.
La réception s'arrête quand on reçoit l'octet terminator ou après la réception de length octets ou après un timeout. La fonction retourne le
nombre n d'octets effectivement lus
• S = Serial.readStringUntil(car); lit les caractères qui arrivent et les place dans la chaine S (type string). S'arrête à la réception du
caractère car ou après un Timeout
• Serial.end(); Désactive l'USART. Les broches 0 et 1 peuvent de nouveau être utilisées comme des E/S normales
• Serial.setTimeout(tms); Définit la durée de timeout en lecture. Par défaut le time out est fixé à 1000 ms = 1s
En résumé
• Transmettre un caractère
Serial.write('A');
Arduino UNO, MEGA… ne supporte pas les réels de type double, ils sont représentés comme des float. Seul le Arduino DUE est capable de coder
les réel double correctement sur 8 octets
Exercice:
Programme pour tester la fonction serial.write:
transmettre le caractère 'A'
transmettre le caractère 'B' en utilisant son code ASCII
transmettre la chaine "CDE"
transmettre le nombre 6543 (> 255) pour vérifier la troncature
transmettre (correctement) le nombre entier (int) 6543
transmettre (correctement) le nombre entier (long) 1234567890
transmettre l'octet bas du nombre entier (int) 6543
transmettre l'octet haut du nombre entier (int) 6543
transmettre 3 octets d'un tableau de bytes
transmettre 4 octets d'un tableau de char
transmettre le nombre réel (float) 123.456
transmettre un réel (double) 123.456
Ce programme peut être testé sur ISIS à l'aide de VIRTUAL TERMINAL . Pour vérifier la transmission
des nombres, il faut passer en mode affichage HEX
Nombre réel Simple précision, 32 bits =4 octets Double précision, 64 bits = 8 octets
125.456 42F6E979 (hex) 405EDD2F1A9FBE77 (Hex)
Prise En main ARDUINO A. Oumnad 15
Vch
Vcc
char
Rb
Arduino
Vcc
Rb < βRch
Vch
Prise En main ARDUINO A. Oumnad 16
Vre
Vcc
Rb
Arduino
Vcc
Rb < βRrel
Vrel
Vre
Vcc
220
Rel
Rb
Arduino
Vcc Lam
Rb < βRrel
Vrel
Le transistor joue le rôle d'interrupteur pour alimenter ou non la bobine du relai. Ainsi le courant qui
alimente la bobine n'est pas fourni directement par la sortie de l'Arduino mais il vient de
l'alimentation du relai Vrel. Cette dernière peut être différente de celle de l'Arduino dans le cas où le
relai nécessite une alimentation > 5V
La résistance Rb doit être calculée pour que le transistor soit saturé quand la sortie de l'Arduino est au
niveau haut.
Exemple:
Rrel = 43Ω, β=250, Vrel = 5V, Vcc = 5V
Rb doit être inférieure à 250 × 43 Ω = 10.7 k, On prend Rb=8.2k
Quand la sortie de l'Arduino est au niveau haut, elle fournit un courant Is =(5 – 0.7)/8.2k = 0.5 mA
Ce courant sature le transistor qui devient un circuit fermé. La bobine est alors traversée par un
courant Ic = 5V / 43Ω = 116mA qui vient directement de l'alimentation Vrel. Le courant dans la bobine
crée un champ magnétique suffisant pour faire coller le relai, la charge est alors alimenter par le
secteur 220V
Prise En main ARDUINO A. Oumnad 18
analogWrite(pin, rs);
pin : numéro de la broche PWM
rs : entier compris entre 0 et 255 qui définit le rapport cyclique
Après un appel de la fonction analogWrite(), le signal PWM reste actif sur la sortie PWM jusqu'à ce
qu'on le modifie avec un autre appel de analogWrite(). Pour l'arrêter on peut appeler la fonction
digitalWrite() ou digitalRead() sur la broche considérée.
//TCCR0B = TCCR0B & B11111000 | B00000001; // set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz
//TCCR0B = TCCR0B & B11111000 | B00000010; // set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz
TCCR0B = TCCR0B & B11111000 | B00000011; // set timer 0 divisor to 64 for PWM frequency of 976.56 Hz (The DEFAULT)
//TCCR0B = TCCR0B & B11111000 | B00000100; // set timer 0 divisor to 256 for PWM frequency of 244.14 Hz
//TCCR0B = TCCR0B & B11111000 | B00000101; // set timer 0 divisor to 1024 for PWM frequency of 61.04 Hz
//TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000010; // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR1B = TCCR1B & B11111000 | B00000011; // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)
//TCCR1B = TCCR1B & B11111000 | B00000100; // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000101; // set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz
//TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000010; // set timer 2 divisor to 8 for PWM frequency of 3921.16 Hz
//TCCR2B = TCCR2B & B11111000 | B00000011; // set timer 2 divisor to 32 for PWM frequency of 980.39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100; // set timer 2 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)
//TCCR2B = TCCR2B & B11111000 | B00000101; // set timer 2 divisor to 128 for PWM frequency of 245.10 Hz
//TCCR2B = TCCR2B & B11111000 | B00000110; // set timer 2 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000111; // set timer 2 divisor to 1024 for PWM frequency of 30.64 Hz
//For Arduino Mega1280, Mega2560, MegaADK, Spider or any other board using ATmega1280 or ATmega2560**
//TCCR0B = TCCR0B & B11111000 | B00000001; // set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz
//TCCR0B = TCCR0B & B11111000 | B00000010; // set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz
TCCR0B = TCCR0B & B11111000 | B00000011; <// set timer 0 divisor to 64 for PWM frequency of 976.56 Hz (Default)
//TCCR0B = TCCR0B & B11111000 | B00000100; // set timer 0 divisor to 256 for PWM frequency of 244.14 Hz
//TCCR0B = TCCR0B & B11111000 | B00000101; // set timer 0 divisor to 1024 for PWM frequency of 61.04 Hz
//TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000010; // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR1B = TCCR1B & B11111000 | B00000011; // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR1B = TCCR1B & B11111000 | B00000100; // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000101; // set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz
Prise En main ARDUINO A. Oumnad 19
//TCCR2B = TCCR2B & B11111000 | B00000001; // set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000010; // set timer 2 divisor to 8 for PWM frequency of 3921.16 Hz
//TCCR2B = TCCR2B & B11111000 | B00000011; // set timer 2 divisor to 32 for PWM frequency of 980.39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100; // set timer 2 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR2B = TCCR2B & B11111000 | B00000101; // set timer 2 divisor to 128 for PWM frequency of 245.10 Hz
//TCCR2B = TCCR2B & B11111000 | B00000110; // set timer 2 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000111; // set timer 2 divisor to 1024 for PWM frequency of 30.64 Hz
//TCCR3B = TCCR3B & B11111000 | B00000001; // set timer 3 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR3B = TCCR3B & B11111000 | B00000010; // set timer 3 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR3B = TCCR3B & B11111000 | B00000011; // set timer 3 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR3B = TCCR3B & B11111000 | B00000100; // set timer 3 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR3B = TCCR3B & B11111000 | B00000101; // set timer 3 divisor to 1024 for PWM frequency of 30.64 Hz
//TCCR4B = TCCR4B & B11111000 | B00000001; // set timer 4 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR4B = TCCR4B & B11111000 | B00000010; // set timer 4 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR4B = TCCR4B & B11111000 | B00000011; // set timer 4 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR4B = TCCR4B & B11111000 | B00000100; // set timer 4 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR4B = TCCR4B & B11111000 | B00000101; // set timer 4 divisor to 1024 for PWM frequency of 30.64 Hz
//---------------------------------------------- Set PWM frequency for D44, D45 & D46 ------------------------
//TCCR5B = TCCR5B & B11111000 | B00000001; // set timer 5 divisor to 1 for PWM frequency of 31372.55 Hz
//TCCR5B = TCCR5B & B11111000 | B00000010; // set timer 5 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR5B = TCCR5B & B11111000 | B00000011; // set timer 5 divisor to 64 for PWM frequency of 490.20 Hz
//TCCR5B = TCCR5B & B11111000 | B00000100; // set timer 5 divisor to 256 for PWM frequency of 122.55 Hz
//TCCR5B = TCCR5B & B11111000 | B00000101; // set timer 5 divisor to 1024 for PWM frequency of 30.64 Hz
Prise En main ARDUINO A. Oumnad 20
A KA KC C
B KB KD D
A B C D Moteur
0 0 0 0 Roue libre
1 0 0 1 gauche
0 1 1 0 droite
1 1 x x interdit
x x 1 1 interdit
1 0 1 0 frein
0 1 0 1 frein
1 0 0 PWM Gauche variable
0 PWM 1 0 Droite variable
On peut concevoir des ponts en H avec des transistors bipolaires ou des transistors MOS. Plusieurs
configurations des transistors son disponibles. J'ai une préférence pour le schéma ci-dessous:
V
RA RC
A 1 2 QC 6 5 C
1k QA 1k
7406 Vm 7406
Vm
RB RD
1k 1k
B 3 4 QB QD 8 9 D
7407 7407
Le L298 contient deux ponts en H avec trois entrées de commande pour chaque pont. Chaque pont
utilise quatre transistors NPN
Pour faire varier la vitesse du moteur, on fixe In1 et In2 pour définir le sens de rotation et on applique
un signal PWM sur l'entrée ENA
Prise En main ARDUINO A. Oumnad 22
Vcc Vm
VALUE=5 VALUE=12
C2 C1
100nF 100nF
1 9 4
5
IN1 VCC VS
7 2
0 10
IN2
IN3
OUT1
+88.8
12 3
IN4 OUT2
6 L298
1 11
ENA
ENB OUT3
13
1 14
SENSA OUT4
15
SENSB GND
Exercice
Hardware: On contrôle un moteur CC à l'aide du circuit L298.
Sortie Arduino Entrée L298
2 In1
3 In2
9(PWM) ENA
Chaque fois qu'on passe d'une bobine à la suivante, le moteur tourne d'un seul pas. Pour un moteur 4
pas, l'angle d'un pas est 90°. Pour un moteur 100 pas, l'angle d'un pas fait 3.6°. Pour un moteur 400
pas, l'angle minimum est 0.9°
Position D C B A
1 0 0 0 1
3 0 0 1 0
5 0 1 0 0
7 1 0 0 0
Prise En main ARDUINO A. Oumnad 24
exercice
Hardware:
On contrôle un moteur 100 pas à l'aide de circuit ULN2003
Software:
Programme qui fait tourner le moteur doucement (1 tours / 10secontes)
exercice
Hardware:
On contrôle un moteur 100 pas à l'aide de circuit ULN2003
Software:
Programme qui écoute le port série. S'il reçoit
• G moteur gauche,, 1 pas/seconde
• D Moteur droite,, 1 pas/seconde
• S Arrêt
• L Roue libre
• + Accélérer
• - Ralentir
Prise En main ARDUINO A. Oumnad 25
Références
• n = analogRead(pin);
• Permet de lire une entrée analogique
• pin: numéro de l'Entrée analogique
• n: entier (int) compris entre 0 et 1023
Les temporisations
• delay(Nms);
• Temporisation: le processeur attend Nms millisecondes avant de continuer le programme
• ddd
•
afficheur LCD
• LiquidCrystal objet_lcd(RS, E, d4, d5, d6, d7)
• Crée un objet pour commander l'afficheur LCD en mode 4 bits. La pate WR de l'afficheur doit être reliée à la masse
• RS: Numéro de la sortie qui commande la pate RS du LCD
• E: Numéro de la sortie qui commande la pate E du LCD
• D4: Numéro de la sortie qui commande la pate D4 du LCD
• D5: Numéro de la sortie qui commande la pate D5 du LCD
• D6: Numéro de la sortie qui commande la pate D6 du LCD
• D7: Numéro de la sortie qui commande la pate D7 du LCD
•
• Exemple: LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
• lcd.begin(Nc, Nl)
Initialise l'afficheur LCD
Nc: Nombre de caractères par ligne
Nl: Nombre de ligne de l'afficheur
• lcd.clear()
Efface l'afficheur et ramène le curseur au début de la première ligne
• lcd.setCursor(col, lgn)
Place le curseur à la position (col, lgn), les deux paramètres commencent par 0
Prise En main ARDUINO A. Oumnad 26
• lcd.print(donnée,[base])
Affiche une chaine ou un nombre
Exemples:
lcd.print("Hello world"); // affiche la chaine Hello World
lcd.print(1024); // Affiche le nombre 1024
lcd.print(85, BIN); // affiche le nombre 85 en binaire --> 1010101
lcd.print(255, HEX); // affiche le nombre 255 en hexadécimal --> FF
• lcd.write(caractère)
Affiche un caractère
Exemples:
lcd.write('X'); // affiche le caractère X
lcd.print(65); // Affiche le caractère A