Capteurs et actionneurs

Généralités

Autour de nous de nombreux systèmes réagissent à des informations captées par des actions précises

Exemples:

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

Un peu d'électricité ...

Lire la page suivante pour avoir les bases de l'électricité utiles pour les montages que nous ferons avec la carte Arduino

Faire clignoter une LED

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

Exercice

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

  1. 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

  2. Coder
  3. Exécuter

Un capteur numérique : le bouton poussoir

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);
  }
}

Exercice

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

  1. Faire le circuit:

  2. Coder
  3. Exécuter

Un capteur analogique : une photorésistance

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);
}

Exercice

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 ......;
        }
    
    

Un actionneur analogique : un buzzer

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

Un capteur analogique: Un capteur de distances à ultrasons

Voici sur une page d'un des constructeurs des informations sur le fonctionnement du capteur

  1. 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

  2. Pour simplifier on prendra la vitesse du son égale à 340 m/s vérifier que cela fait 29 microsecondes par cm

  3. Voici le circuit

  4. 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); 
    }
    
    

    Exercice

    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

Utilisation de bibliothèques :Un servo moteur

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 la documentation

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);
  }
}


Exercice

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)

Une autre bibliothèque : Un clavier

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);
  }
}

Exercice

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