Академический Документы
Профессиональный Документы
Культура Документы
discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/314675618
CITATIONS READS
0 2,013
1 author:
Nizar Chelly
Higher Institute of Technological Studies Sousse
7 PUBLICATIONS 1 CITATION
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Nizar Chelly on 11 March 2017.
FORMATION ARDUINO↔SIMULINK/ANDROID
2 Présentation de la maquette 6
5 L’interfacage Arduino↔Matlab/Simulink 11
5.1 L’environnement Matlab/Simulink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5.2 ArduinoIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5.2.1 Pré-chargement du programme dans la carte Arduino . . . . . . . . . . . . . . . . . . . . 12
5.2.2 Installation du package ArduinoIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.2.3 Exploitation de la bibliothèque ArduinoIO sous Simulink . . . . . . . . . . . . . . . . . . 12
5.2.4 Exploitation du package ArduinoIO sous Matlab . . . . . . . . . . . . . . . . . . . . . . . 13
5.3 Arduino Target . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
8 Modélisation du système 14
8.1 Présentation de l’étape d’identification avec Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . 14
8.2 Acquisition de la réponse indicielle du système . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
8.3 Détermination de la fonction de transfert G(z) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1
TABLE DES FIGURES TABLE DES FIGURES
2
Formation Arduino ↔ Simulink/Android Asservissement de vitesse d’un moteur à courant continu
CHELLY, Nizar
Ingénieur en Électrique et Automatique
chellynizar@gmail.com
+216 50 48 00 27
CHARED, Amine
Ingénieur en Informatique
amineaby@gmail.com
+216 50 02 33 70
– Microcontroller : ATmega328
– Operating Voltage : 5v
– Input Voltage (recommended) : 7-12 v
– Input Voltage (limits) : 6-20 v
– DC Current per I/O Pin : 40mA
– DC Current for 3.3V Pin :50mA
– Flash Memory :32 KB
– Clock Speed : 16MHz
– Pins assignments :
– Analog read(A0-A5)
– Analog write[PWM] (3,5,6,9,10,11)
– Digital read(2-19)
– Digital write(2-19)
i n t DEL = 5 ;
void setup ( )
{
pinMode (DEL, OUTPUT) ;On i n i t i a l i s e l a borne 5 de l ’ Arduino
( n o m m e "DEL" ) comme une s o r t i e .
}
void loop ( )
{
d i g i t a l W r i t e (DEL, HIGH) ;On met l a borne 5 au n i v e a u
l o g i q u e haut (+5V) : l a d i o d e s ’ allume .
d e l a y ( 1 0 0 0 ) ; On a t t e n d un d e l a i de 1000ms ( s o i t 1 s ) .
d i g i t a l W r i t e (DEL, LOW) ;On met l a borne 5 au n i v e a u l o g i q u e bas ( 0V)
l a d i o d e s ’ teint .
d e l a y ( 1 0 0 0 ) ; On a t t e n d un d e l a i de 1000ms ( s o i t 1 s ) .
}
Et ainsi de suite tant que le circuit est alimenté.
2 Présentation de la maquette
La maquette est constituée d’un capteur de position ”encodeur optique ” et un moteur à
courant continu DC MOTOR.Le capteur et le moteur sont installés dans une maquette en bois.
La figure suivante schématise la connexion de la carte Arduino UNO avec l’entrée et la sortie
du système (DC MOTOR + encodeur optique). La figure ci dessous montre une vue réelle de la
maquette utilisée.
Lorsqu’un moteur ou une lampe est alimenté par ce type de tension, tout se passe comme
si il était alimenté par une tension continue ajustable entre 0V (rapport cyclique= 0) et 5V
(rapport cyclique=255).Ces sorties doivent être initialisées comme des sorties digitales.
τo
Vout = Vs × ; avec : τc = 2ms (1)
τc
– Le transistor TIP122 : C’est un transistor Darlington NPN qui d’après la fiche technique
permet d’amplifier le courant jusqu’à 5A avec son gain d’amplification ”au minimum”
β = 1000
– La diode 1N4004 : Dans une charge inductive (bobines), le courant ne peut pas se stopper
instantanément. Cette diode joue le rôle d’une diode de roue libre qui permet au courant
de s’arrêter progressivement.
}
void loop ( )
{
i f ( Serial . available ()) {
cmd=( S e r i a l . read () −48)∗100+( S e r i a l . read () −48)∗10+( S e r i a l . read () −48)∗1 ;
// l e c t u r e des donnees a r r i v e e s
a n a l o g W r i t e ( 5 , cmd ) ;
// T r a n s f e r t de c e s donnees s u r l a pi n 6 pour g e n e r e r l e s i g n a l PWM
S e r i a l . p r i n t l n (cmd ) ;
}
delay (100) ;
// d e l a i de 100ms avant l a n o u v e l l e a c q u i s i t i o n
}
opaque (0 Volts) correspond à une période transparente (5 Volts) sur la paire adjacente. Deux
comparateurs reçoivent ces signaux et produisent les sorties finales pour les canaux A et B. Le
canal A est en quadrature de phase avec le canal B.
Il suffit pour cela d’observer les courbes ci-dessus, obtenues alors que le moteur tourne dans
le sens positif. On constate que :
– Lorsque la voie A passe au niveau haut, la voie B est au niveau bas
– Lorsque la voie A passe au niveau bas, la voie B est au niveau haut
Quand le moteur tourne dans le sens positif, lors d’une interruption sur la voie A, les niveaux
de A et B sont donc inversés.
Si le moteur tourne dans le sens négatif. On constate que :
– Lorsque la voie A passe au niveau haut, la voie B est au niveau haut.
– Lorsque la voie A passe au niveau bas, la voie B est au niveau bas.
Quand le moteur tourne dans le sens négatif, lors d’une interruption sur la voie A, les niveaux
de A et B sont ont le même niveau. Le code correspondant sur l’Arduino est détaillé dans le
paragraphe suivant.
i n t pinA = 2 ;
// Channel A c o n n e c t e s u r l ’ i n t e r r u p t i o n e x t e r n e numero 0 ( pin2 )
i n t pinB = 3 ;
// Channel B c o n n e c t e s u r pi n3
i n t i V a l u e = 0 ; // i n i t i a l i s a t i o n 0
void setup ( ) {
S e r i a l . begin (9600) ;
pinMode ( pinA , INPUT) ;
pinMode ( pinB , INPUT) ;
a t t a c h I n t e r r u p t ( 0 , e n c o d e r C l i c k , RISING ) ;
// r o u t i n e de s e r v i c e d ’ i n t e r r u p t i o n ( ou ISR ) .
}
void loop ( )
{
S e r i a l . p r i n t l n ( iValue ) ;
// l e c t u r e des i m p l u s i o n s s u r l e moniteur s e r i e
delay (10) ;
// p e r i o d e d ’ e c h a n t i l l o n a g e
v o i d e n c o d e r C l i c k ( ) / / l a f o n c t i o n a p p e l e e par l ’ i n t e r r u p t i o n e x t e r n e numero 0
{
// e n c o d e r must have turned one c l i c k b e c a u s e i n t e r r u p t 0 was t r i g g e r e d
// r e a d v a l u e from both e n c o d e r p i n s
i n t valA = d i g i t a l R e a d ( pinA ) ;
i n t valB = d i g i t a l R e a d ( pinB ) ;
5 L’interfacage Arduino↔Matlab/Simulink
5.1 L’environnement Matlab/Simulink
C’est un logiciel de calcul mathématique pour les ingénieurs et les scientifiques créé par
Mathworks.
5.2 ArduinoIO
Cette solution consiste à utiliser la carte arduino comme une interface d’entrées(Analog
Input)/sorties(Analog/Digital Output).Ce package permet de communiquer Matlab ou Simulink
avec la carte Arduino via un câble USB.
Elle consiste à pré-charger un programme dans la carte Arduino afin que celle-ci fonctionne
en serveur.
Ce programme consiste à "écouter" les requêtes envoyées via la liaison série (USB) et de répondre
à ces requêtes en renvoyant l’état d’une entrée ou en modifiant l’état d’une sortie. Ces mêmes
entrées/sortie sont vues dans matlab comme des entrées logiques ou analogiques (utilisation du
CAN) ou des sorties analogiques (mode PWM).
Les blocs nécessaires pour notre objectif d’asservissement sont les suivants :
– Encodeur Read : Pour configurer à partir de quel pin on va realiser l’aquistion des
signaux issue du capteur (channel A et channel B).
– Encodeur Reset : Pour configurer la période de la mise à zéro de l’encodeur.
– Arduino Analog Write : Pour configurer à partir de quel pin [3,5,6,9,10,11] on va envoyer
la commande en PWM vers l’actionneur.
Dans la suite, on utlisera les blocs Simulink offert par le package ArduinoIO Library.
8 Modélisation du système
Le but de cette partie est de déterminer la fonction de transfert échantillonnée de notre
système en boucle ouvert notée G(z).L’entrée du système est la tension u(z) en volts et la sortie
est la vitesse V (z) en (implusion/10ms).
3. Entrer le nom de la variable Input et la variable Output ainsi que temps de starting time et
sample time qu’on a utiliser lors de l’identification avec Simulink.Enfin cliquer sur Import.
5. Entrer le nombre de pôle et de zéro et cliquer sur Discrete-Time ensuite cliquer surEstimate.
6. Vous pouvez revenir à l’interface System Identification Tool et cliquer deux fois sur tf1
pour voir le résultat.
3. Une nouvelle fenêtre apparait dans laquelle vous allez sélectionner tf1 ensuite cliquer sur
import puis close.
4. Revenir à la fenêtre PID Tuner, vous pouvez choisir le type de régulateur à implémenter et
les objectifs de la commande en boucle fermé et voir la réponse de la sotie du système.
5. Cliquer sur la flèche de show parameter pour voir les paramétrés utilisés de votre régulateur
ainsi que les performances du système en boucle fermé.
L’appui deux fois sur le bloc PID(z) permet d’introduire les paramétrés Kp Ki et de configurer
le régulateur selon notre objectif de commande.
f l o a t ep , up , v , u , e , i n t e g r a l , cmd ;
float derive ;
i n t pinA = 2 ; // Encoder pi n A c o n n e c t s t o i n t e r r u p t 0 (D2)
i n t pinB = 3 ; // Encoder p i n B c o n n e c t s t o D4
i n t i V a l u e = 0 ; //A v a r i a b l e t h a t w i l l be i n c r e a s e d o r d e c r e a s e d
int consigne ;
void setup ( ) {
S e r i a l . begin (9600) ;
pinMode ( pinA , INPUT) ;
pinMode ( pinB , INPUT) ;
a t t a c h I n t e r r u p t ( 0 , e n c o d e r C l i c k , RISING ) ; / / r o u t i n e de s e r v i c e d ’ i n t e r r u p
}
void loop ( )
{
v=abs ( i V a l u e ) ;
e=50−v ;
d e l t a _ e r r e u r = ( e−ep ) / 0 . 0 1 ;
somme_erreur=somme_erreur+e ∗ 0 . 0 1 ;
cmd = kp∗ e + k i ∗ somme_erreur ;
a n a l o g W r i t e ( 5 , cmd ∗ ( 2 5 5 / 5 ) ) ;
S e r i a l . p r i n t l n ( e ) ; / / e n v o i e de l a donnee s u r l e p o r t s e r i e
// d e l a y ( 1 0 ) ; / / p e r i o d e d ’ e c h a n t i l l o n a g e
ep=e ;
i V a l u e =0 ;
delay (10) ;// periode d ’ echantillonage
}
v o i d e n c o d e r C l i c k ( ) / / l a f o n c t i o n a p p e l e par l ’ i n t e r r u p t i o n e x t e r n e num
{
// e n c o d e r must have turned one c l i c k b e c a u s e i n t e r r u p t 0 was t r i g g e r e d
// r ead v a l u e from both e n c o d e r p i n s
i n t valA = d i g i t a l R e a d ( pinA ) ;
i n t valB = d i g i t a l R e a d ( pinB ) ;
f l o a t ep , up , v , u , e , i n t e g r a l , cmd ;
float derive ;
i n t pinA = 2 ; // Encoder pi n A c o n n e c t s t o i n t e r r u p t 0 (D2)
i n t pinB = 3 ; // Encoder p i n B c o n n e c t s t o D4
i n t i V a l u e = 0 ; //A v a r i a b l e t h a t w i l l be i n c r e a s e d o r d e c r e a s e d
int consigne ;
void setup ( ) {
S e r i a l . begin (9600) ;
pinMode ( pinA , INPUT) ;
pinMode ( pinB , INPUT) ;
a t t a c h I n t e r r u p t ( 0 , e n c o d e r C l i c k , RISING ) ; \ \
// r o u t i n e de s e r v i c e d ’ i n t e r r u p t i o n ( ou ISR ) .
}
void loop ( )
{
v=abs ( i V a l u e ) ;
i f ( Serial . available ()) {
i V a l u e =0 ;
delay (10) ;
// p e r i o d e d ’ e c h a n t i l l o n a g e
}
void encoderClick ()\\
// l a f o n c t i o n a p p e l e e par l ’ i n t e r r u p t i o n e x t e r n e n 0
{
// e n c o d e r must have turned one c l i c k b e c a u s e i n t e r r u p t 0 was t r i g g e r e d
// r ead v a l u e from both e n c o d e r p i n s
i n t valA = d i g i t a l R e a d ( pinA ) ;
i n t valB = d i g i t a l R e a d ( pinB ) ;
i V a l u e++ ;
}
else{
// pinA j u s t changed and pinB had a l r e a d y done so .
// D i r e c t i o n must be cou nte r −c l o c k w i s e i f B changes b e f o r e A
iValue −− ;
}
}
Références
[1] http ://www.mathworks.com/
[2] http ://www.arduino.cc/
[3] PID Control : A brief introduction and guide, using Arduino.
[4] PID controller http ://en.wikipedia.org/w/index.php ?title=PID controller soldid=547984770.