Comptage d’entrée-sortie d’un bâtiment
Revision for “Comptage d’entrée-sortie d’un bâtiment” created on 11 octobre 2016 à 14 h 47 min
Titre | Comptage d'entrée-sortie d'un bâtiment |
---|---|
Contenu | <!DOCTYPE html>
<html>
Ici nous utiliserons une carte Arduino ainsi qu'un émetteur-récepteur ultrason pour compter les entrées et les sorties d'un bâtiment afin de connaitre le nombres de personnes à l’intérieur.
<body>
<h2>Utilisation du capteur de distance à ultrasons <strong>HC-SR04</strong></h2>
<img src="http://makersk.cluster030.hosting.ovh.net/wp-content/uploads/2016/09/F90JYNWH7UR7RCS.MEDIUM1.jpg" alt="image du capteur à ultrasons HC-SR04">
Grâce à <a href="http://makersk.cluster030.hosting.ovh.net/wp-content/uploads/2016/09/HCSR041.pdf">ce document</a> nous savons comment le brancher et commander une mesure :
<ul>
<li>Alimentation du module en 5V sur la broche Vcc</li>
<li>Envoi d'une impulsion de 5V de 10µs afin de demander un "mesure" sur la broche Trig</li>
<li>Lecture d'un temps HAUT (5v) qui est proportionnel à la moyenne de 8 mesures sur la broche Echo</li>
<li>Connectez bien sur à la masse la broche GND</li>
</ul>
Nous receverons donc en retour un signal HAUT proportionnel au temps qu'a mis le capteur à recevoir le signal qu'il à émis et qui lui est revenu en ricochant sur un obstacle.
Afin de connaitre la durée de ce signal HAUT reçu par l'Arduino nous utiliserons la fonction <a href="https://www.arduino.cc/en/Reference/pulseIn">pulseIn</a>.
Afin de savoir à quelle distance était cet ostacle il faut diviser le temps fournit par la fonction pulseIn() par 58.
Voici donc le code de base pour tester le fonctionnement du capteur.
[toggle title="cliquez pour derouler le code de base"]
[code lang="arduino"]
/* Télémètre ultrason HC-SR04
* Essais World of GZ - www.worldofgz.com
*/
#define TRIG 22
#define ECHO 23
//Variables utilisées
long retourEcho;
long distance;
void setup () {
//On définie les entrées/Sorties
pinMode(TRIG, OUTPUT);
digitalWrite(TRIG, LOW);
pinMode(ECHO, INPUT);
//Lancement de la liaison série
Serial.begin(115200);
Serial.println("Liaison série en ligne");
}
void loop() {
//On lance notre impulsion de 10µs
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
//Mesure de la longueur de la pulse
retourEcho = pulseIn(ECHO, HIGH);
//Calcul de la distance
distance = retourEcho / 58;
//Affichage de la distance dans le moniteur série
Serial.print("Distance cm : ");
Serial.println(distance);
delay(1000);
}
[/code]
Attention, si vous utiliser ce code ainsi sur une Arduino Uno il ne fonctionnera pas ! Je vous laisse trouver pourquoi...
[/toggle]
<h2>Utilisation de l'émetteur-récepteur radio <strong>nRF24L01+</strong></h2>
<img src="http://makersk.cluster030.hosting.ovh.net/wp-content/uploads/2016/09/519-VsWyIPL._SY300_1.jpg" alt="image de la radio nRF24L01+">
On va utiliser la bibliothèque NRF24 de TMRh20 disponible <a href="https://github.com/TMRh20/RF24.git">ici</a>.
Le module nRF24L01+ utilise le protocole de communication SPI, il a donc un branchement particulier que la documentation de la bibliothèque décrit en bas de <a href="http://tmrh20.github.io/RF24/index.html">cette page</a>.
Voici le schéma de branchement (les broches CS et CE du module peuvent être connectées ailleurs sur l'Arduino à condition de l'indiquer dans le code...) :
<img src="http://makersk.cluster030.hosting.ovh.net/wp-content/uploads/2016/09/nrf24_Uno_bb.png" alt="Image de connexion du module nRF24L01+ à l'Arduino" />
Ce code permet simplement de voir si la communication entre deux Arduino fonctionne.
En connectant le pin 4 au GND on informe l'Arduino qu'il s'agit du récepteur, sinon il s'agit de l’émetteur
[toggle title="cliquez pour dérouler le code de communication entre deux Arduino"]
[code lang="arduino"]
/*
Sene
Code pour nRF24L01+ radios
Connectez le pin 4 au gnd pour passer en recepteur, laisser libre pour etre en emetteur
Sources : https://github.com/maniacbug/RF24.git & https://github.com/TMRh20/RF24.git
Mise à jour : Oct 2016 by Paolo
*/
#include <SPI.h>
#include "RF24.h"
/* Configuration du Hardware : connectez nRF24L01 radio sur le bus SPI et sur les pins 7 & 8 */
RF24 radio(7, 8);
/*********************************************************************************************/
byte addresses[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node", "7Node"};
char donnees;
char anciennesDonnees;
char c;
bool allumage = 0;
bool role = 0;
const int pinLed = 2;
const int pinRole = 4;
void setup() {
pinMode(pinRole, INPUT);
pinMode(pinLed, OUTPUT);
digitalWrite(pinRole, HIGH);
digitalWrite(pinLed, allumage);
if (digitalRead(pinRole)) {
role = 0;
}
else {
role = 1;
}
delay(20);
Serial.begin(115200);
if (role) Serial.println("radio reception");
else Serial.println("radio emission");
radio.begin();
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_250KBPS);
if (role) {
radio.openWritingPipe(addresses[0]);
radio.openReadingPipe(1, addresses[1]);
radio.openReadingPipe(2, addresses[2]);
radio.openReadingPipe(3, addresses[3]);
radio.openReadingPipe(4, addresses[4]);
radio.openReadingPipe(5, addresses[5]);
radio.openReadingPipe(6, addresses[6]);
radio.startListening();
}
else {
radio.openWritingPipe(addresses[1]);
radio.openReadingPipe(1, addresses[0]);
radio.stopListening();
}
}
void loop() {
if (role) {
while (radio.available()) {
anciennesDonnees = donnees;
radio.read( &donnees, sizeof(donnees) );
Serial.print("anciennes donnees : ");
Serial.print(anciennesDonnees);
Serial.print(" / donnees : ");
Serial.print(donnees);
if (anciennesDonnees != donnees) {
allumage = 1 - allumage;
digitalWrite(pinLed, allumage);
}
Serial.print(" / allumage : ");
Serial.println(allumage);
}
}
else {
while (Serial.available()) {
char c = Serial.read();
Serial.read();
radio.stopListening();
Serial.print(F("J envoie : "));
Serial.println(c);
if (!radio.write( &c, sizeof(c) )) {
Serial.println(F("echec"));
}
else
Serial.println("reussit");
delay(1000);
}
}
}
[/code]
[/toggle]
</body>
|
Extrait |