Messages récents

Pages: [1] 2 3 ... 10
1
Trucs & astuces / Re : Comptage des essieux
« Dernier message par Brunotoutsimple le Aujourd'hui à 01:07:17 pm »
Bonjour Christophe

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.

#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.
*/

Je te dirais que la dernière parti du code qui suis, j'ai compris le principe, mais la programmation, je suis perdu:
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
}

/*
2
Trucs & astuces / Re : Re : Comptage des essieux
« Dernier message par Brunotoutsimple le Aujourd'hui à 11:11:46 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 :


// 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

Vu comme cela exactement. J'aurai dû ecrire comme ceci:
// 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
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
3
Trucs & astuces / Re : Comptage des essieux
« Dernier message par bobyAndCo le Aujourd'hui à 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 :


// 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

4
Trucs & astuces / Re : Re : Comptage des essieux
« Dernier message par Brunotoutsimple le Aujourd'hui à 09:42:42 am »
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

Bonjour
 Non il faut juste un capteur de chaque extrémité d'un canton.
je suis entrain de dessiner cela.

5
Trucs & astuces / Re : Comptage des essieux
« Dernier message par 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
6
Vos projets / Re : Re : RailCom: Générateur de CutOut avec booster
« Dernier message par Brunotoutsimple le mai 14, 2024, 03:54:52 pm »
Bonjour Bruno

Ce qui est décrit est une option. Elle semble valable mais n'est pas dans l'esprit du moment. ( au moins sur la version en cours)
Par ailleurs cela impose d avoir une parfaite inter synchro entre les éléments, impose d avoir la gestion du reverse localement.

In fine la souplesse acquise est à mettre en balance avec le cout.

Toutefois les modules conçus ici et utilisés sont parfaitement réutilisables sur un design socle diffèrent.

Ltr

Bonjour Laurent

Etant complètement novice, je vous fais entièrement confiance.
7
Vos projets / Re : RailCom: Générateur de CutOut avec booster
« Dernier message par laurentr le mai 14, 2024, 03:40:37 pm »
Bonjour Bruno

Ce qui est décrit est une option. Elle semble valable mais n'est pas dans l'esprit du moment. ( au moins sur la version en cours)
Par ailleurs cela impose d avoir une parfaite inter synchro entre les éléments, impose d avoir la gestion du reverse localement.

In fine la souplesse acquise est à mettre en balance avec le cout.

Toutefois les modules conçus ici et utilisés sont parfaitement réutilisables sur un design socle diffèrent.

Ltr
8
Trucs & astuces / Re : Comptage des essieux
« Dernier message par Brunotoutsimple le mai 14, 2024, 02:24:42 am »
Bonjour à vous tous.
Je suis entrain de récupère les textes, les images, les schémas.
Donc voici déjà le code:
/*
Ce code concerne un compteur d'essieux ferroviaire miniature. Il y a quatre capteurs qui surveillent l'état des axes.
Chaque capteur lit une valeur analogique et vérifie si cette valeur est supérieure à 1000. Si oui, l'état du capteur est mis à 1, sinon à 0.
Lorsque l'état d'un capteur change, il est vérifié si le nouvel état correspond à celui du capteur suivant.
Si oui, le compteur de l'axe correspondant est décrémenté, sinon il est incrémenté.
La différence entre les compteurs des axes est calculée et si cette différence est nulle, la broche de sortie est réglée sur HIGH, sinon sur LOW.
Cela pourrait par exemple être utilisé pour envoyer un signal lorsque tous les axes d'un modèle ferroviaire ont dépassé le capteur.
*/

#include <Arduino.h>

// Voici le code commenté :

// 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
int z1=0; // Compteur pour le premier axe
int z2=0; // Compteur pour le deuxième axe
int D1=0; // Différence entre le nombre d'essieux
int lastAl=1; // État précédent du premier capteur
int lastB1=1; // État précédent du second capteur
int lastC1=1; // État précédent du troisième capteur
int lastD1=1; // État précédent du quatrième capteur
int output=5; // Broche de sortie

void setup()
{
    // Définition des broches en entrée
    pinMode(36, INPUT); // premier capteur
    pinMode(39, INPUT); // deuxième capteur
    pinMode(34, INPUT); // troisième capteur
    pinMode(35, INPUT); // quatrième capteur

    // Définition des broches en sortie
    pinMode(5, OUTPUT); // Broche de sortie
}

void loop()
{
    // Lire les valeurs des capteurs
    int w1=analogRead(36); // Valeur du premier capteur
    int w2=analogRead(39); // Valeur du second capteur
    int w3=analogRead(34); // Valeur du troisième capteur
    int w4=analogRead(35); // Valeur du quatrième capteur
}

// Vérifie si la valeur du capteur est supérieure à 1 000 et définissez l'état en conséquence.
a=(w1<1000) ?0:1;
b=(w2<1000) ?0:1;
c=(w3<1000) ?0:1;
d=(w4<1000) ?0:1;

// Vérification si l'état du premier capteur a changé
if(a != lastA1)
    {
        if(a == b)
            {
                z1--; // Si l'état est égal à celui du deuxième capteur, décrémente le compteur
            }
        else
            {
                z1++; // Autrement, incrémentez le compteur
            }
        lastA1=a; // Mise à jour de l'état précédent
    }
lastB1=b: // Mise à jour de l'état précédent

// Vérifiez si l'état du troisième capteur a changé
if(c != lastC1)
    {
        if (c == d)
            {
                z2--; // Si l'état est égal à celui du quatrième capteur, décrémenter le compteur
            }
        else
            {
                z2++; // Ansonsten inkrementiere den Zähler
            }
        lastC1=c; // Mise à jour de l'état précédent
    }

lastD1=d; // Mise à jour de l'état précédent

D1=z1-z2; // Calcul la différence entre les compteurs d'axes

// Vérifie si la différence est nulle
if((D1) == 0)
    {
        digitalWrite(5,HIGH); // Si oui, réglez la broche de sortie sur HIGH
    }
else
    {
        digitalWrite(5,LOW); // Sinon, réglez la broche de sortie sur LOW
    }

Cordialement
Bruno
9
Trucs & astuces / Re : Comptage des essieux
« Dernier message par Dominique le mai 13, 2024, 05:55:58 pm »
Il y a un bout de schéma dans sa vidéo mais c’est pas commode d’en tirer quelque chose.

Je ne comprends pas cette mode des tutos video qui pèsent beaucoup plus lourd en Mo qu’un article Locoduino bien plus instructif 😬
Bientôt sur TikTok ? 🤮
10
Trucs & astuces / Re : Comptage des essieux
« Dernier message par CATPLUS le mai 13, 2024, 05:28:52 pm »
Bonjour

Effectivement j'ai cherché un montage complet, hélas rien, uniquement l'émetteur & le receveur, c'est le montage qu'il a fabriqué.

Il me semble que l'un d'entre vous avait suggéré le comptage des roues en cas de perte ou de décrochage.
Cela peut être intéressant comme le souligne Dominique.

La chose que je trouve  impressionnante c'est la rapidité de l'ESP32 à traiter le calcul surtout à la vitesse ou train roule (dans d'autre vidéo le test est réalisé avec un Nano et cela fonctionne)

Christophe tu as raison rien ne peut remplacer la détection par consommation de courant.

Je continu à jeter un œil, il me semble qu'il faut creuser.






Pages: [1] 2 3 ... 10