formation:capteurs_et_pont_h

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
formation:capteurs_et_pont_h [13/10/2020 17:15] – [Capteurs ultrason] mderansartformation:capteurs_et_pont_h [13/10/2020 17:38] (Version actuelle) fjiang
Ligne 1: Ligne 1:
 +====== Capteurs et Pont en H ======
 +
 +===== I - Capteurs =====
 +{{:formation:capteur_ultrason_photo.png?nolink&200 |}}
 +
 +==== 1. Capteurs ultrason ====
 +Pour cela, on va se servir de la bibiothèque “NewPing”, qui se trouve sur : [[https://playground.arduino.cc/Code/NewPing/]]
 +
 +Installez-la et renseignez-vous sur les méthodes que propose cette bibliothèque.
 +
 +Maintenant, réalisez un circuit, avec une LED et un capteur ultrason qui, lorsque le capteur capte un mouvement, allume la LED pour 1 seconde.
 +
 +<hidden __Solution :__>
 +<code c++>
 +int pinTrigger1 = 7;
 +int pinEcho1 = 8;
 +int pinLed1 = 9;
 +float distance_max = 200;
 +boolean retour1 = 1;
 +NewPing sonar1(pinTrigger1, pinEcho1, distance_max);
 +
 +void setup() {
 +  pinMode(pinLed1, OUTPUT);
 +  Serial.begin(9600);
 +  delay(10);
 +}
 +
 +void loop() {
 +  retour1 = sonar1.ping();
 +
 +  if (retour1 !=0 and allume1 == 0) {
 +    digitalWrite(pinLed1, HIGH);
 +    allume1 = 1;
 +    delay(1000);
 +  }
 +  if (allume1 == 1 ) {
 +    digitalWrite(pinLed1, LOW);
 +    allume1 = 0;
 +    delay(1000);
 +  }
 +}
 +</code>
 +
 +{{ :formation:capteur_ultrason_soluce.png?nolink&600 |}}
 +</hidden>
 +
 +----
 +
 +La fonction delay() a un inconvénient majeur qui fait qu’elle est rarement utilisée en pratique : lors de son exécution, elle ordone à la carte de ne plus rien faire jusqu’à ce que le temps soit écoulé, et donc, on peut rater du mouvement, ou pire, si il y a deux capteurs, le système ne pourra fonctionner.
 +On utilise alors la fonction millis() qui renvoit le temps en millisecondes (fonctionne de manière similaire que la fonction time en python).
 +Essayez de modifier le programme précédent en utilisant la fonction millis().
 +
 +<hidden __Solution :__>
 +<code c++>
 +float t1 = 0;
 +int allume1 = 0;
 +int pinTrigger1 = 7;
 +int pinEcho1 = 8;
 +int pinLed1 = 9;
 +float distance_max = 200;
 +boolean retour1 = 1;
 +NewPing sonar1(pinTrigger1, pinEcho1, distance_max);
 +
 +void setup() {
 +  pinMode(pinLed1, OUTPUT);
 +  Serial.begin(9600);
 +  delay(10);
 +}
 +
 +void loop() {
 +  retour1 = sonar1.ping();
 +
 +  if (retour1 !=0 and allume1 == 0) {
 +    digitalWrite(pinLed1, HIGH);
 +    t1 = millis();
 +    allume1 = 1;
 +  }
 +  if (allume1 == 1 and millis()-t1>2000) {
 +    digitalWrite(pinLed1, LOW);
 +    allume1 = 0;
 +  }
 +}
 +</code>
 +</hidden>
 +
 +{{ :formation:capteur_infrarouge_photo.jpg?nolink&200|}}
 +==== 2. Capteurs infrarouge ====
 +Ici, nous n’avons pas besoin d’importer de librairie.
 +Adaptez le programme précédent pour un capteur infrarouge (bien sûr, recherchez les références du modèle sur Internet !).
 +
 +<hidden __Solution :__>
 +<code c++>
 +float t1 = 0;
 +int allume1 = 0;
 +int pinIR1 = 3;
 +int pinLed1 = 9;
 +boolean retour1 = 1;
 +
 +void setup() {
 +  pinMode(pinLed1, OUTPUT);
 +  pinMode(pinIR1, INPUT);
 +  Serial.begin(9600);
 +  delay(10);
 +}
 +
 +void loop() {
 +  retour1 = digitalRead(pinIR1);
 +  Serial.println(retour1);
 +
 +  if (retour1 !=0 and allume1 == 0) {
 +    digitalWrite(pinLed1, HIGH);
 +    t1 = millis();
 +    allume1 = 1;
 +  }
 +  if (allume1 == 1 and millis()-t1>2000) {
 +    digitalWrite(pinLed1, LOW);
 +    allume1 = 0;
 +  }
 +}
 +</code>
 +{{ :formation:capteur_infrarouge_soluce.png?nolink&600 |}}
 +</hidden>
 +
 +===== II - Ponts en H =====
 +{{:formation:pont_en_h_photo.jpg?nolink&200 |}}
 +
 +==== 1. Principe ====
 +{{ :formation:pont_en_h_schema.png?nolink&300|}}
 +Un pont en H permet de faire tourner un moteur dans le sens des aiguilles d'une montre ou dans le sens inverse des aiguilles d'une montre en inversant les tensions et courants.
 +
 +Pour cela, il faut fermer deux broches comme dans le schéma ci-contre.
 +
 +Si on fermait les broches A et C ( respectivement B et D ) ou A et B ( respectivement C et D), soit le moteur ne fonctionne pas, soit on crée un court-circuit.
 +
 +{{ :formation:pont_en_h_principe.png?nolink&300 |}}
 +==== 2. Partie Arduino ====
 +<WRAP group>
 +<WRAP half column>
 +=== Code de base ===
 +<code c++>
 +int enA = 2; // Pin pour prévenir qu'on branche un moteur
 +int in1 = 3; // Pin pour le sens du moteur
 +int in2 = 4;
 +
 +void setup() {
 +    pinMode(enA, OUTPUT);
 +    pinMode(in1, OUTPUT);
 +    pinMode(in2, OUTPUT);
 +    
 +    digitalWrite(enA, HIGH); // On prévient qu'on doit activer le moteur A
 +}
 +
 +void loop() {
 +    digitalWrite(in1, HIGH); // On fait tourner le moteur A
 +    digitalWrite(in2, LOW);
 +}
 +</code>
 +</WRAP>
 +
 +<WRAP half column>
 +=== Branchement ===
 +{{ :formation:pont_en_h_branchement.png?nolink&400 |}}
 +</WRAP>
 +</WRAP>
 +
 +==== 3. TP ====
 +On vous demande d'effectuer plusieurs taches :
 +
 +  - Faire tourner le moteur dans les deux sens.
 +  - Inverser le sens de rotation du moteur après un laps de temps.
 +  - Faire un montage qui permet d'effectuer le programme précédent mais en séparant les chaînes d'énergie et de contrôle.