Parlons Arduino > Trucs & astuces
Comptage des essieux
bobyAndCo:
Je découvre une chose intéressante en lisant le code posté par Bruno. Dans ce code, on voit qu’il y a un comptage des essieux en entrée de zone et un autre comptage en sortie. Cela nécessite par contre deux doubles capteurs soit quatre en tout.
Il n’est donc pas nécessaire de connaitre à l’avance le nombre d’essieux du convoi. Le système détecte simplement si le nombre d’essieux en sortie est égal ou non avec le nombre calculé en entrée.
En cas de différence, le système envoie une alerte.
C’est assez astucieux !
Christophe
Brunotoutsimple:
--- Citation de: bobyAndCo le mai 14, 2024, 07:53:38 pm ---Je découvre une chose intéressante en lisant le code posté par Bruno. Dans ce code, on voit qu’il y a un comptage des essieux en entrée de zone et un autre comptage en sortie. Cela nécessite par contre deux doubles capteurs soit quatre en tout.
Il n’est donc pas nécessaire de connaitre à l’avance le nombre d’essieux du convoi. Le système détecte simplement si le nombre d’essieux en sortie est égal ou non avec le nombre calculé en entrée.
En cas de différence, le système envoie une alerte.
C’est assez astucieux !
Christophe
--- Fin de citation ---
Bonjour
Non il faut juste un capteur de chaque extrémité d'un canton.
je suis entrain de dessiner cela.
bobyAndCo:
Il y a en effet un capteur à chaque extrémité mais chaque capteur à bien deux leds comme on peut le voir sur la photo ou sur le schéma.
C'est aussi visible dans le code :
--- Code: ---// Initialisation des variables
int a=0; // Etat du premier capteur
int b=0; // État du deuxième capteur
int c=0; // État du troisième capteur
int d=0; // État du quatrième capteur
--- Fin du code ---
Brunotoutsimple:
--- Citation de: bobyAndCo le mai 15, 2024, 09:56:10 am ---Il y a en effet un capteur à chaque extrémité mais chaque capteur à bien deux leds comme on peut le voir sur la photo ou sur le schéma.
C'est aussi visible dans le code :
--- Code: ---// Initialisation des variables
int a=0; // Etat du premier capteur
int b=0; // État du deuxième capteur
int c=0; // État du troisième capteur
int d=0; // État du quatrième capteur
--- Fin du code ---
--- Fin de citation ---
Vu comme cela exactement. J'aurai dû ecrire comme ceci:
--- Code: ---// Initialisation des variables
int a=0; // Etat de la Led 1 du premier capteur
int b=0; // Etat de la Led 2 du premier capteur
int c=0; // Etat de la Led 1 du Second capteur
int d=0; // Etat de la Led 2 du Second capteur
--- Fin du code ---
Voici le schéma du Capteur ainsi que le calcul de la résistance R1.
Après, il peut être fait autrement, je suis pas électronicien. Exemple donné pour un ESP32 mais vous pouvez mettre un autre microprocesseur type ATtiny414 ou autre
Brunotoutsimple:
Bonjour à vous
Voici un autre programme pour faire fonctionner ce montage avec écran LCD pour vérifier le fonctionnement. Je n'ai pas le matériel pour le faire.
--- Code: ---#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Initialisation de l'afficheur LCD - 20 chiffres 4 lignes
int Impulse; // Impulsions au point de lecture
int Axles; // sont des essieux / 4 ou des aimants
// Définir les broches pour les entrées analogiques
const int analogl = A0;
const int analog2 = A1;
const int analog3 = A2;
const int analog4 = A3;
int counter1 = 0; // Compteur1 des valeurs incrémentales
int lastEncoded1 = 0; // Dernière valeur encodée
int counter2 = 0; // Compteur2 pour les valeurs incrémentales
int lastEncoded2 = 0; // Dernière valeur encodée
// Barrières photoélectriques de 1-4
int LS1;
int LS2;
int LS3;
int LS4;
void setup() {
Wire.begin(); // Initialise le bus I2C
lcd.init(); // Initialise l'écran LCD
lcd.backlight();
Serial.begin(9600); // Démarre la communication série
pinMode(7, OUTPUT); // La LED s'allume lorsqu'elle est occupée
pinMode(8, OUTPUT); // La LED s'allume lorsqu'elle est libre
}
void loop() {
updateEncoder();
// Lire la valeur entre 0 et 1023 sur l'entrée analogique A0
// si plus petit à 20 => alors LS1 actif
int Value1 = analogRead(analog1);
if (Value1 < 20) LS1 = 1;
else LS1 = 0;
// Lire la valeur entre 0 et 1023 sur l'entrée analogique A1
// si plus petit à 20 => alors LS2 actif
int Value2 = analogRead(analog2);
if (Value2 < 20) LS2 = 1;
else LS2 = 0;
// Lire la valeur entre 0 et 1023 sur l'entrée analogique A2
// si plus petit à 20 => alors LS3 actif
int Value3 = analogRead(analog3);
if (Value3 < 20) LS3 = 1;
else LS3 = 0;
// Lire la valeur entre 0 et 1023 sur l'entrée analogique A3
// si plus petit à 20 => alors LS4 actif
int Value4 = analogRead(analog4);
if (Value4 < 20) LS4 = 1;
else LS4 = 0;
if (Impulse != 0) {
digitalWrite(7, LOW);
} else {
digitalWrite(7, HIGH);
}
if (Impulse == 0) {
digitalWrite(8, LOW);
} else {
digitalWrite(8, HIGH);
}
Impulse = counter1 - counter2; // Différence entre les Impulsions des capteurs
Axles = Impulse / 4; // Essieux ou magnette
lcd.setCursor(0, 0);
lcd.print("A0");
lcd.print(" ");
lcd.print("Al");
lcd.print(" ");
lcd.print("A2");
lcd.print(" ");
lcd.print("A3");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(Value1);
lcd.print(" ");
lcd.print(Value2);
lcd.print(" ");
lcd.print(Value3);
lcd.print(" ");
lcd.print(Value4);
lcd.setCursor(0, 2);
lcd.print("Impulse ");
lcd.print(Impulse);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("Axles ");
lcd.print(Axles);
lcd.print(" ");
Serial.println(Impulse); // Affiche la lecture actuelle du compteur
Serial.println(Axles); // Affiche les essieux actuels
}
void updateEncoder() // Mise à jour du compteur
{
int encoded1 = (LS1 << 1) | LS2; // Encode les deux signaux en une seule valeur << est l'opérateur de décalage de bit gauche
int encoded2 = (LS3 << 1) | LS4;
int sum1 = (lastEncoded1 << 2) | encoded1; // Somme 1 de la valeur codée actuelle
int sum2 = (lastEncoded2 << 2) | encoded2; // Somme 1 de la valeur codée actuelle
if (sum1 == 0b1101 || sum1 == 0b0100 || sum1 == 0b0010 || sum1 == 0b1011) counter1++; // Compter
if (sum1 == 0b1110 || sum1 == 0b0111 || sum1 == 0b0001 || sum1 == 0b1000) counter1--; // Décompter
if (sum2 == 0b1101 || sum2 == 0b0100 || sum2 == 0b0010 || sum2 == 0b1011) counter2++; // Compter
if (sum2 == 0b1110 || sum2 == 0b0111 || sum2 == 0b0001 || sum2 == 0b1000) counter2--; // Décompter
lastEncoded1 = encoded1; // Sauvegarde la valeur codée 1 actuelle
lastEncoded2 = encoded2: // Sauvegarde la valeur codée 2 actuelle
}
/*
En mode comptage, les lignes responsables de l'affichage et de la sortie série doivent être verrouillées avec //.
Ils sont supprimés à des fins de tests.
*/
--- Fin du code ---
Navigation
[*] Page précédente
Utiliser la version classique