Différences
Ci-dessous, les différences entre deux révisions de la page.
| 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] – [Ponts en h] mderansart | formation:capteurs_et_pont_h [13/10/2020 17:38] (Version actuelle) – fjiang | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== Capteurs et Pont en H ====== | ||
| + | |||
| + | ===== I - Capteurs ===== | ||
| + | {{: | ||
| + | |||
| + | ==== 1. Capteurs ultrason ==== | ||
| + | Pour cela, on va se servir de la bibiothèque “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, | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(pinLed1, | ||
| + | Serial.begin(9600); | ||
| + | delay(10); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | retour1 = sonar1.ping(); | ||
| + | |||
| + | if (retour1 !=0 and allume1 == 0) { | ||
| + | digitalWrite(pinLed1, | ||
| + | allume1 = 1; | ||
| + | delay(1000); | ||
| + | } | ||
| + | if (allume1 == 1 ) { | ||
| + | digitalWrite(pinLed1, | ||
| + | allume1 = 0; | ||
| + | delay(1000); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | 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, | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(pinLed1, | ||
| + | Serial.begin(9600); | ||
| + | delay(10); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | retour1 = sonar1.ping(); | ||
| + | |||
| + | if (retour1 !=0 and allume1 == 0) { | ||
| + | digitalWrite(pinLed1, | ||
| + | t1 = millis(); | ||
| + | allume1 = 1; | ||
| + | } | ||
| + | if (allume1 == 1 and millis()-t1> | ||
| + | digitalWrite(pinLed1, | ||
| + | allume1 = 0; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | {{ : | ||
| + | ==== 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, | ||
| + | pinMode(pinIR1, | ||
| + | Serial.begin(9600); | ||
| + | delay(10); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | retour1 = digitalRead(pinIR1); | ||
| + | Serial.println(retour1); | ||
| + | |||
| + | if (retour1 !=0 and allume1 == 0) { | ||
| + | digitalWrite(pinLed1, | ||
| + | t1 = millis(); | ||
| + | allume1 = 1; | ||
| + | } | ||
| + | if (allume1 == 1 and millis()-t1> | ||
| + | digitalWrite(pinLed1, | ||
| + | allume1 = 0; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | ===== II - Ponts en H ===== | ||
| + | {{: | ||
| + | |||
| + | ==== 1. Principe ==== | ||
| + | {{ : | ||
| + | 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. | ||
| + | |||
| + | {{ : | ||
| + | ==== 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, | ||
| + | pinMode(in1, | ||
| + | pinMode(in2, | ||
| + | | ||
| + | digitalWrite(enA, | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | digitalWrite(in1, | ||
| + | digitalWrite(in2, | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP half column> | ||
| + | === Branchement === | ||
| + | {{ : | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== 3. TP ==== | ||
| + | On vous demande d' | ||
| + | |||
| + | - 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' | ||