Autour de nous de nombreux systèmes réagissent à des informations captées par des actions précises
Exemples:
Un radar de recul dans une voiture émet un son de plus en plus strident (action) lorsque la distance entre l'arrière du véhicule et l'obstacle devient de plus en plus petite
La distance est calculée à partir du temps mis par une onde pour faire l'aller retour entre le radar et l'obstacle (information captée)
On dit que le radar est un capteur. Le buzzer qui émet le son est l'actionneur
Le lien entre les actions et les réactions nécéssite de la programmation d'où la présence d'un microcontrôleur
On souhaite cependant pouvoir faire évoluer le programme faisant le lien entre les entrées,les informations captées et les actions d'où l'intérêt des microcontrôleurs à mémoire flash
Qu'est ce qu'un microcontrôleur ?
C'est une machine de Von Neumann permettant de faire de l'Informatique embarquée (encombrement réduit et consommation réduite) et dans le cas du microcontrôleur Arduino de coût très réduit une vingtaine d'euros!
On peut faire évoluer le programme stocké dans la mémoire vive grâce à une liaison USB avec un autre ordinateur sur lequel se trouve un IDE Arduino
Lire la page suivante pour avoir les bases de l'électricité utiles pour les montages que nous ferons avec la carte Arduino
La led est un actionneur, destiné à montrer l'arrivée d'un évènement
La led est polarisée, elle a une patte + (la patte la + longue, sur le simulateur la patte \), l'anode et une patte négative, la cathode (la patte la - longue)
Voici un premier circuit
Puis le code associé
const int ledVerte = 13;
void setup()
{
//la led Verte est une sortie
pinMode(ledVerte, OUTPUT);
}
void loop()
{
//la led Verte est allumée durant 3 secondes
digitalWrite(ledVerte,HIGH);
delay(3000);
//la led Verte est éteinte durant 1 seconde
digitalWrite(ledVerte,LOW);
delay(1000);
}
A l'exécution la led clignote bien mais un message vous avertit que le courant qui traverse la led a une intensité de 52,3 mA ce qui est au delà de l'intensité maximale qui est de 20 mA
Il est nécessaire de protéger la led par une résistance
Pour trouver la valeur de la résistance $R$ sachant que la tension délivrée par la carte Arduino est de 5 V et que la tension aux bornes de la led doit être autour de 2 V, on applique la loi d'Ohm:
$5 = R\times 0,02 + 2$Que vaut R ?
Monter le circuit suivant avec la valeur de R trouvée
Faire un feu tricolore rouge-orange-vert
En boucle, le feu rouge est allumé durant 5 secondes, puis lorsqu'il s'éteint le feu orange est allumé durant 2 secondes, puis lorsque le feu orange s'éteint le feu vert est allumé durant 3 secondes puis ce dernier s'éteint et on continue
Faire le circuit:
Relier le "sol" de la carte Arduino à la ligne - de la plaque de prototypage, puis la sortie - de chaque système led +resistance à la ligne - de la plaque de prototypage
Le bouton poussoir est un capteur numérique dans le sens où il a deux états possibles, 0 ou 1, comme un interrupteur
0 lorsqu'il est ouvert, 1 lorsqu'il est fermé
Les bords 1a et 1b sont connectés entre eux, ainsi que les bords 2a et 2b
Si on appuie sur le bouton, les bords 1 et 2 sont connectés
Réaliser le circuit suivant
Entrer le code suivant
const int bouton = 2;
int etatBouton = 0;
void setup()
{
pinMode(bouton, INPUT);
Serial.begin(9600);
}
void loop()
{
etatBouton = digitalRead(bouton);
Serial.println(etatBouton);
}
Ouvrir le moniteur série et vous allez observer que si vous ne faites rien 0 est affiché dans le moniteur,et dès que vous appuyez sur le bouton 1 est affiché
Réaliser le circuit suivant: on ajoute une led Rouge de telle sorte que si on appuie sur le bouton, la led s'allume et elle s'éteint sinon
Le code correspondant est
const int bouton = 2;
const int ledRouge = 8;
int etatBouton = 0;
void setup()
{
//actionneur
pinMode(ledRouge,OUTPUT);
//capteur
pinMode(bouton, INPUT);
}
void loop()
{
etatBouton = digitalRead(bouton);
if(etatBouton == HIGH){
digitalWrite(ledRouge,HIGH);
}
else{
digitalWrite(ledRouge,LOW);
}
}
Faire un feu tricolore rouge-orange-vert avec un feu piétons
Si un piéton n'appuie pas sur le bouton, le feu est constamment vert pour les voitures et constamment rouge pour les piétons
Dès qu'un piéton appuie sur le bouton poussoir le feu passe à l'orange pour les voitures durant 3 secondes, puis rouge pour les voitures et vert pour les piétons durant 5 secondes, puis la situation revient à la normale
Faire le circuit:
Une photorésistance est sensible à la luminosité ambiante
Réaliser le circuit suivant
Le code correspondant est
const int photoResistance = A0;
int luminosite = 0;
void setup()
{
pinMode(photoResistance, INPUT);
Serial.begin(9600);
}
void loop()
{
luminosite = analogRead(photoResistance);
Serial.println(luminosite);
}
Puis lancer la simulation en ouvrant le moniteur Série
Ensuite faire varier la luminosité
Quelle est l'intervalle de variations de la luminosité ?
On veut convertir cette variation de luminosité en variation de lumière en ajoutant une led cette fois ci comme actionneur analogique
Sur certaines sorties digitales de la carte Arduino il y a un tilde ~, sigifiant que cette sortie peut être utilisée comme une sortie analogique
Le code correspondant est
const int photoResistance = A0;
const int ledVerte = 9;
int luminositeIn ;
int luminositeOut;
void setup()
{
pinMode(photoResistance, INPUT);
pinMode(ledVerte,OUTPUT);
}
void loop()
{
luminositeIn = analogRead(photoResistance);
luminositeOut = map(luminositeIn,0,1023,0,255);
analogWrite(ledVerte,luminositeOut);
}
La fonction map convertit luminositeIn compris entre 0 et 1023 en une valeur val comprise entre 0 et 255 et ceci proportionnellement
Définir en C une fonction convert(x,a,b,c,d)
int convert(int x,int a,int b,int c,int d){
return ......;
}
On veut convertir la variation de luminosité en un son
On va utiliser comme actionneur analogique un buzzer
Faire le circuit suivant
const int photoResistance = A0;
const int buzzer = 9;
int luminositeIn ;
int sonOut;
void setup()
{
pinMode(photoResistance, INPUT);
pinMode(buzzer,OUTPUT);
}
void loop()
{
luminositeIn = analogRead(photoResistance);
sonOut = map(luminositeIn,0,1023,50,30000);
tone(buzzer,sonOut);
}
C'est le principe du Thérémine
Voici sur une page d'un des constructeurs des informations sur le fonctionnement du capteur
Définir une fonction en C vitesseSon(temp) qui retourne la vitesse du son en fonction de la température temp en degrés Celsius
Voir ici ->vitesse du son
Pour simplifier on prendra la vitesse du son égale à 340 m/s vérifier que cela fait 29 microsecondes par cm
Voici le circuit
Voici le code
const int pingPin = 7;
long duree;
long distance;
long microsecondsToCentimeters(long microseconds){
return microseconds/29/2;
}
void setup(){
Serial.begin(9600);
}
void loop()
{
//émission LOW-HIGH-LOW start
pinMode(pingPin,OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
//réception
pinMode(pingPin, INPUT);
duree = pulseIn(pingPin, HIGH);
distance = microsecondsToCentimeters(duree);
Serial.println(distance);
delay(100);
}
Faire un radar de recul de telle sorte qu'un son est émis seulement si l'obstacle est à moins de 1 mètre
De plus l'intensité du son est inversement proportionnelle à la distance de l'obstacle
On va s'intéresser aux servo moteurs à positionnement angulaire qui permet par exemple de faire tourner précisément les roues avant d'une voiture télécommandé ou faire tourner une barrière de parking
Voici un exemple d'utilisation d'un servo moteur : passage à niveaux
Il existe une bibliothèque Servo.h qu'il faut importer
Voici le circuit
Voici le code
#include Servo.h
Servo moteur;
//postion initiale 0 degrés
int position = 0;
void setup(){
//le moteur est relié au pin 9
//
moteur.attach(9,200,2500);
moteur.write(position);
}
void loop(){
//on lève la barrière à 90° en avançant pas à pas
for(position = 0;position < 91;position +=1){
moteur.write(position);
delay(20);
}
//on baisse la barrière
for(position = 90;position >= 0;position -=1){
moteur.write(position);
delay(20);
}
}
Lorsqu'on veut sortir du parking du lycée, il suffit de s'avancer avec sa voiture à proximité de la barrière, pour que celle-ci s'ouvre
Proposer votre solution pour simuler cette situation
Proposer votre solution pour simuler un passage à niveaux (comme celui dans la vidéo ci-dessus)
Voici le circuit
Voici le code
Si on appuie sur une touche, le caractère sur la touche apparaît sur le moniteur série
#include Keypad.h
const byte LIG = 4;
const byte COL = 4;
char touche;
char touches[LIG][COL] = {
{'1','2','3','A'},
{'4', '5', '6','B'},
{'7', '8', '9', 'C'},
{'*','0','#','D'}};
byte ligPins[LIG] = {5,4,3,2};
byte colPins[COL] = {9,8,7,6};
Keypad keypad = Keypad(makeKeymap(touches),ligPins,colPins,LIG,COL);
void setup(){
Serial.begin(9600);
}
void loop(){
touche = keypad.getKey();
if(touche != NO_KEY){
Serial.println(touche);
}
}
Lorsqu'on veut entrer dans le parking du lycée, il faut entrer un mot de passe de 4 caractères pour ouvrir la barrière du parking
Proposer votre solution pour simuler cette situation