Cours Arduino
Cours Arduino
Cours Arduino
Autre exemple:
Le système de contrôle des gouvernes de l'Airbus A320 est un
système embarqué dont les exigences sont :
le système doit traduire en ordres de déflection des gouvernes les
ordres de pilotage venant du pilote ou de pilote automatique
(facteur de charge)
Le système doit maintenir l'avion dans son domaine de vol quelles
que soient les commandes du pilote ou du pilote automatique
Compte tenu de la dynamique de l'avion, les ailerons et la
gouverne de direction doivent être asservis à une période
minimale de 10ms
la gouverne de profondeur doit être asservie à une période
minimale de 30ms
La perte de contrôle de la profondeur est catastrophique (taux de
panne de 10-9)
La perte de contrôle des spoilers, des ailerons, de la direction et de
la profondeur ne doit pas être causée par une panne unique
SYSTEMES EMBARQUES
SYSTEMES EMBARQUES
Architecture générale:
La carte Arduino
AREF
13
PB5/SCK
12
PB4/MISO
RESET 11
~PB3/MOSI/OC2A
10
~ PB2/SS/OC1B
9
~ PB1/OC1A
8
PB0/ICP1/CLKO
ATMEGA328P-PU
1121
DIGITAL (~PWM)
7
ANALOG IN
PD7/AIN1
6
A0 ~ PD6/AIN0
PC0/ADC0 5
A1 ~ PD5/T1
PC1/ADC1 4
A2 PD4/T0/XCK
PC2/ADC2 3
A3 ~ PD3/INT1
PC3/ADC3 2
A4 PD2/INT0
PC4/ADC4/SDA 1
A5 TX PD1/TXD
PC5/ADC5/SCL 0
RX PD0/RXD
D1
ARDUINO UNO R3 LED-YELLOW
Rappels: clignotement leds-Arduino
Rappels: clignotement leds-Arduino
Relier une led à la pin 13 et un bouton poussoir à la pin 7
Lorsque la pin reliée au bouton poussoir =1 la led est allumée dans le cas
contraire elle s’éteint.
int led = 13;
int bp = 7;
int val = 0;
void setup()
{
pinMode(led, OUTPUT); pinMode(bp, INPUT);
}
void loop() { val = digitalRead(bp); //lire etat du BP
if (val == HIGH) { digitalWrite (led, HIGH); }
else { digitalWrite(led, LOW);
}
}
Rappels: clignotement leds-Arduino
int led1 = 6; int led2 = 7; int led3 = 8;
void setup() {
pinMode(led1, OUTPUT); pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}
void loop() {
digitalWrite(6, 1);
digitalWrite(7, 1); digitalWrite(8, 1); delay(1000);
delay(1000); }
//********************chenillard******************
int k; int i;
void setup()
{ for(i=0;i<=12;i++)pinMode(i, OUTPUT);}
void loop()
{
// Extinction de toutes les LED au départ du programme
for ( k = 0 ; k <= 12 ; k++) { digitalWrite (k, LOW) ;
// Boucle pour faire flasher les LED
for ( k= 0 ; k <= 12 ; k++)
{ digitalWrite (k, HIGH) ;
delay (100) ;
digitalWrite (k, LOW) ;
delay (100) ;
}
}
LCD-ARDUINO
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int i,un,dis;
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello");
}
LCD-ARDUINO
LCD-ARDUINO
void loop() {
int i;
// set the cursor to column 4, line 1 (note: line 1 is the second row)
lcd.setCursor(2, 1);
for( i=0; i<=25;i++)
{
un=i%10; dis= i/10;
lcd.print(dis); lcd.print(un);delay(200);
lcd.setCursor(2, 1);}
}
LCD-ARDUINO
ADC-LCD-ARDUINO
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() { lcd.begin(16, 2);
lcd.print(“voltage”); }
void loop() {
int valADC = analogRead(A0); // read the input on analog pin 0
// Convert the analog reading (which goes from 0 - 1023)
float voltage = valADC * (512.0 / 1023.0);
lcd.setCursor (4, 1); // set the cursor to column 4, line 1
lcd.print(voltage); } // print out the value you read:
Gestion d’un afficheur 7 segments
Gestion d’un afficheur 7 segments
char
code7seg[]={0X3F,0X06,0x5B,0x4F,0x66,0x6D,0x7D,0X07,0x7F,0x6F};
char k;
void setup()
{
DDRD=0xFF; PORTD=0;
}
void loop()
{
for(k=0;k<=9;k++)
{PORTD=code7seg[k];delay(800);
}
}
ADC-7seg-ARDUINO
ADC-7seg-ARDUINO
char code7seg[]={0X3F,0X06,0x5B,0x4F,0x66,0x6D,
0x7D,0X07,0x7F,0x6F};
void setup()
{
DDRD=0xFF; PORTD=0;
}
void loop()
{
int value = analogRead(A2);
value = value * (9.0 / 1023.0); //le .0 est obligatoire
PORTD=code7seg[value];
}
Communication série
/* Hello World! This is the Hello World! for Arduino.
* It shows how to send data to the computer
*/
void setup()
{
Serial.begin(9600);// set up Serial library at 9600 bps
Serial.println("Hello world!");
}
void loop()
{
// do nothing!
}
Communication série
Communication série
Communication série
}
void loop()
{ PORTB=i;}
void segm()
{
i++; Serial.println(i); delay(200); if(i==9)i=0;
}
void segm1()
{
i--;Serial.println(i);delay(200); if(i==-9)i=0;
}
La modulation de largeur d’impulsions (ou PWM ou
Pulse With Modulation)
La Modulation de largeur d'Impulsions (MLI, PWM en anglais) est une
succession de différents états logiques, (0 et 1), de différentes durées, à
intervalles réguliers.
Dans le cas de l'Arduino il s'agit de succession de 0/5V, qui permet, en
modifiant la durée de chacun de ces états, de faire que tout se passe comme si
on avait une source de tension continue.
Si l'on fait une MLI avec 20% d'états hauts, on aura 20% de 5V et 80% de 0V :
on aura l'impression d'avoir 1V. La technique PWM est donc une technique
pour obtenir des effets d'allure analogique avec des broches numériques.
pinMode(led_pin, OUTPUT);
}
void loop() {
{ int valeur=map(pourcent,0,100,0,255);
analogWrite(pinMoteur,valeur);
delay (2000) ; // attente de 2 secondes
}
}
Le driver L298n
int rightspeed = 150;
int leftspeed = 150;
void setup() {
Speed control using PWM
void loop() {
// Forward
digitalWrite( MOTOR1_FORWARD_PIN , HIGH );
digitalWrite( MOTOR1_BACKWARD_PIN , LOW ); delay(2000);
//stop
digitalWrite( MOTOR1_FORWARD_PIN , LOW );
digitalWrite( MOTOR1_BACKWARD_PIN , LOW ); delay(2000);
// BACKWARD
digitalWrite( MOTOR1_FORWARD_PIN , LOW );
digitalWrite( MOTOR1_BACKWARD_PIN , HIGH ); delay(2000);
//stop
digitalWrite( MOTOR1_FORWARD_PIN , LOW );
digitalWrite( MOTOR1_BACKWARD_PIN , LOW );
delay(2000);
}
int enb=6;
int MOTOR1_FORWARD_PIN=4;
int MOTOR1_BACKWARD_PIN=5;
void setup() {
pinMode( enb , OUTPUT);
pinMode( MOTOR1_FORWARD_PIN , OUTPUT);
pinMode( MOTOR1_BACKWARD_PIN , OUTPUT);
}
void loop() {
// Forward
analogWrite(enb,70);
digitalWrite( MOTOR1_FORWARD_PIN , HIGH );
digitalWrite( MOTOR1_BACKWARD_PIN , LOW );
delay(2000);
//stop
analogWrite(enb,70);
digitalWrite( MOTOR1_FORWARD_PIN , LOW );
digitalWrite( MOTOR1_BACKWARD_PIN , LOW );
delay(2000);
// BACKWARD
analogWrite(enb,70);
digitalWrite( MOTOR1_FORWARD_PIN , LOW );
digitalWrite( MOTOR1_BACKWARD_PIN , HIGH );
delay(2000);
//stop
analogWrite(enb,70);
digitalWrite( MOTOR1_FORWARD_PIN , LOW );
digitalWrite( MOTOR1_BACKWARD_PIN , LOW );
delay(2000);
}
Le bus I2C (d'Inter-Integrated Circuit)
Le bus I2C permet de faire communiquer entre eux des
composants électroniques très divers grâce à seulement trois fils :
Un signal de donnée ( SDA ), un signal d’horloge ( SCL ), et un
signal de référence électrique ( Masse ).
Les données sont transmises en série à 100Kbits/s en mode
standard 400Kbits/s en mode rapide et jusqu’à 3,2 Mb/s en mode
très rapide,
chaque périphérique sur le bus I2C est adressable, avec une
adresse unique pour chaque périphérique du bus.
Crée par Philips dans les années 80, pour permettre de relier
facilement à un microprocesseur divers circuits intégrés.
Il y a des milliers de composants qui utilisent une interface I2C, et les cartes de la
famille Arduino peuvent toutes les contrôler. Les applications sont multiples :
horloges temps réel, potentiomètres numériques, capteurs de température,
boussoles numériques, mémoires, contrôleurs d'afficheur LCD,
accéléromètres…... Vous pouvez connecter plusieurs composants adressables sur
un même bus à tout moment (jusqu'à 112 périphériques I 2C adressables sur un
même bus en théorie).
transmission synchrone. Pas besoin de spécifier une vitesse de transfert
comme pour la liaison RS232. Ici, le périphérique maître (master) génère le
signal d'horloge qui synchronise et cadence les échanges ;
la relation entre les périphériques du bus est de type maître-esclave
(master/slave). Le maître est à l'initiative de la transmission et s'adresse à
un esclave (ou tous les esclaves)
La distance maximale maître-esclave pour un bus I2C est d'environ 1 mètre
et dépend de plusieurs facteurs comme la capacité électrique du bus ou le
débit de transmission.
La prise de contrôle du bus
La communication sur le bus est orchestrée de la manière suivante :
Le maître envoie sur le bus l'adresse du composant avec qui il
souhaite communiquer ; chacun des esclaves ayant une adresse
fixe codée sur 7 bits.
L'esclave qui reconnaît son adresse répond à son tour par un signal
de confirmation(ACK : acknowledge)puis le maître continue la
procédure de communication...(écriture/lecture).
La transmission d'un octet
Prise de contrôle du bus :
Le bus doit être au repos avant la prise de contrôle : SDA=1 et SCL=1.
Pour transmettre des données, il faut surveiller :
La condition de départ(START) : SDA passe à 0 et SCL reste à 1.
La condition d’arrêt(STOP) : SDA passe à 1 et SCL reste à 1.
Le maître transmet le bit de poids fort D7 sur SDA.
Il valide la donnée en appliquant un niveau 1 sur SCL
Lorsque SCL retombe à 0, il poursuit avec D6, et ainsi de suite jusqu’à ce que l’octet soit
transmis.
Il envoie le bit ACK à 1 en scrutant l’état de SDA.
Envoie des données selon le protocole I2C
La transmission commence par une condition START (SCL est à l'état HIGH,
SDA bascule à l'état LOW). S'ensuivent les 7 bits de l'adresse du composant
(Slave Address), puis un bit R/W qui vaut ici 0 pour indiquer une opération
d'écriture sur la ligne SDA. Le composant adressé ou esclave doit envoyer un
bit d'acquittement (ACK pour Acknowledgement en abaissant la ligne SDA
pour acquitter de la bonne réception).
Chaque octet de donnée écrit sur la ligne par le maître doit être acquitté par
l'esclave. La transmission s'arrête en finissant par une condition STOP
(tandis SCL est à l'état HIGH, SDA bascule à l'état HIGH).
lecture des données
Si le bit R/W transmis en même temps que l'adresse est à 1, cela signifie que le maître
veut lire des données issues de l'esclave. C'est toujours le maître qui va générer le signal
d'horloge SCL.
La transmission commence par une condition START (SCL est à l'état HIGH, SDA bascule à
l'état LOW). S'ensuivent 7 bits de l'adresse du composant (Slave Address), puis un bit R/W
qui vaut ici 1 pour indiquer une opération de lecture sur la ligne SDA. Le composant
adressé doit envoyer un bit d'acquittement (ACK pour Acknowledgement, l’ esclave doit
abaisser la ligne SDA pour acquitter de la bonne réception). Chaque octet de donnée
retourné sur la ligne par l'esclave doit être acquitté par le maître. La transmission s'arrête
en finissant par la condition STOP.
L'Arduino Uno possède une liaison I2C (SDA : broche analogique A4 et SCL :
broche analogique A5) et une bibliothèque Wire() permet de gérer les
échanges d'informations entre la carte Arduino et les circuits I2C connectés.
Cette bibliothèque est installée de base dans l'IDE Arduino. Les principales
fonctions de cette bibliothèque sont :
Wire.begin() : initialise la communication sur le bus.
Wire.beginTransmission(adresse) : le maître débute un échange
d'informations avec l'esclave dont l'adresse est spécifiée.
Wire.endTransmission() : arrête l'échange d'informations entre le maître et
l'esclave.
Wire.write(octet) : envoi d'un octet sur le bus.
Wire.requestFrom(adresse, nb_octets) : le maître demande à l'esclave dont
l'adresse est spécifiée de lui transmettre un nombre d'octets.
Wire.read() :le maître lit des données en provenance d'un esclave.
Wire.available() : renvoie le nombre d'octets présents sur le bus I2C.
Application:
HORLOGE TEMPS REEL DS1307
Application:
HORLOGE TEMPS REEL DS1307
€ 0,49 2021
Application:
HORLOGE TEMPS REEL DS1307
Application:
HORLOGE TEMPS REEL PCF8583
Puis on l'initialisera avec Wire.begin()
Application:
Communication en I2C entre une carte Arduino et un capteur de température
DS1621.
Mesure de température (-55 °C à +125 °C par incrément de 0,5 °C), conversion de la
température en mot de 16 bits en moins d'une seconde.
Configuration possible en thermostat (configuration des seuils de température
haut et bas non volatile).
Version en boîtier 8 broches.
La carte Arduino sera dans la situation du maître et le composant connecté au bus
I2C sera en situation d'esclave. De l'Arduino, on peut « écrire » sur la ligne pour
envoyer des données vers un composant, ou « lire » la ligne pour récupérer les
données retournées par celui-ci.
Pour communiquer en suivant le protocole I2C, on inclura une bibliothèque Arduino
dans les croquis, ici nommée Wire, #include <Wire.h> Puis on l'initialisera avec
Wire.begin() à l’interieur de void setup(),
On rappelle que l'adresse d'un composant I2C est codée avec sept bits (A0 à A6). Les bits
de poids faible A0, A1 et A2 peuvent être configurés matériellement, par exemple en
reliant les trois broches A0, A1 et A2 à la référence électrique GND comme sur le schéma
du montage ci-dessus, on les met au niveau logique bas, A0 = A1 = A2 =0. Les bits A3 à
A6 sont fixés par le fabricant du DS1621, ici A3=1, A4=0, A5=0 et A6=1.
Ce qui donne pour l'adresse du composant : 100 1000 = 48Hex