1
Présentez vous ! / Re : bonjour je m appel pierre j ai bientôt 60 ans
« le: janvier 04, 2023, 10:36:07 am »
pour lre moment je n est pas tous le nécessaire pour faire le montage je vearis vendredi si j ai le temps d aller le chercher
Le forum LOCODUINO est consacré aux discussions ayant trait à l'utilisation de l'Arduino dans les automatismes et les animations pour le train miniature. Nous avons eu récemment quelques inscriptions de personnes ayant des projets plus généraux mais surtout inapplicables au train miniature. Si votre projet ou vos questions ne concernent pas le modélisme ferroviaire, ne vous inscrivez pas, vous perdriez votre temps et nous aussi.
Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.
Bonjour et bienvenue sur notre site.
Au delà de la formation justement conseillée par michel, vous pouvez aussi vous inspirer de l'article de Jean-Luc https://www.locoduino.org/ecrire/?exec=article&id_article=25 qui ressemble beaucoup à votre besoin et y applique un 'pattern' de programmation, c'est à dire une façon de faire qui a fait ses preuves : la machine à états.
// C++ code
//
#include <Servo.h>
// Déclaration de constantes et variables
const int Detect1 = A0; // Détection 1 branchée sur l'entée A0
const int Detect2 = A1; // Détection 2 branchée sur l'entée A1
const int Detect3 = A2; // Détection 3 branchée sur l'entée A2
const int Detect4 = A4; // Détection 4 branchée sur l'entée A4
const int feu_droit = 13; // Première paire de feux
const int feu_gauche = 12; // Deuxième paire de feux
const int pulse_dfplayer = 11; // pour sonnerie
const int barriere1 = 8; // Fil signal servo1
const int barriere2 = 9; // Fil signal Servo2
int tempo_fermeture = 4000; // temps clignotement avant fermeture barrières
int tempo_barrieres_13_24 = 1000; // temps entre les barrières 1-3 et 2-4
int tempo_led = 500; // tempo cligno
int angle_fermeture = 0; // angle servo position fermée
int angle_ouverture = 80; // angle servo position ouverte
int vitesse_barriere = 70; // temps entre 2 degrés
int inhibition = 10000; // Pendant cette durée le PN ne peut pas se redéclencher
int angle_barriere;
Servo servo1;
Servo servo2;
unsigned long compteur_temps;
boolean etat_feux = false; // Variable 0 si leds éteintes et 1 si allumées
int valeur_Detect1 = 1023; // Détecteur 1 ( + de 512 pas de détection. - de 512 détection.)
int valeur_Detect2 = 1023; // Détecteur 2
int valeur_Detect3 = 1023;// Détecteur 3
int valeur_Detect4 = 1023;// Détecteur 4
int premiere_detection = 0; // 1 si détecteur1 en premier, 2 si détecteur2 en premier.
boolean detection1 = false; // 0 si pas de détection. 1 si train détecté.
int deuxieme_detection = 0; // 1 si détecteur3 en premier, 2 si détecteur4 en premier.
boolean detection2 = false; // 0 si pas de détection. 1 si train détecté.
boolean barriere_ouverte; // 1 si barrières ouvertes.
void setup() {
pinMode(feu_droit,OUTPUT);
pinMode(feu_gauche,OUTPUT);
pinMode(pulse_dfplayer,OUTPUT);
digitalWrite(pulse_dfplayer,HIGH);
servo1.attach(barriere1,500,2500);
servo2.attach(barriere2,500,2500);
servo1.write(angle_ouverture); //ouverture au début
servo2.write(angle_ouverture);
barriere_ouverte = true;
}
void loop(){
valeur_Detect1 = analogRead(Detect1); // pour detctecion voie 1 entrre
valeur_Detect2 = analogRead(Detect2); // pour detctecion voie 1 sortie
valeur_Detect3 = analogRead(Detect3); // pour detctecion voie 2 entre
valeur_Detect4 = analogRead(Detect4); // pour detctecion voie2 sortie
if (detection1 == 1 && premiere_detection == 0) {
if (valeur_Detect1 > 512 && valeur_Detect2 > 512) {
digitalWrite(feu_droit,LOW);
digitalWrite(feu_gauche,LOW);
if (detection2 == 1 && deuxieme_detection == 0) {
if (valeur_Detect3 > 512 && valeur_Detect4 > 512) {
digitalWrite(feu_droit,LOW);
digitalWrite(feu_gauche,LOW);
for (int angle_barriere=angle_fermeture; angle_barriere<=angle_ouverture; angle_barriere+=1){ //OUVERTURE BARRIERES
servo1.write(angle_barriere);
servo2.write(angle_barriere);
}
// Temporisation entre les groupes 1-3 et 2-4
for (int tempo = 0; tempo <= tempo_barrieres_13_24; tempo +=1){ // Temporisation avant fermeture
Fonction_feux(); // Appel de la fonction qui gère les feux
delay(1);
}
//for (int angle_barriere=angle_fermeture; angle_barriere<=angle_ouverture; angle_barriere+=1){ //OUVERTURE BARRIERES
//servo2.write(angle_barriere);
//servo4.write(angle_barriere);
//delay(vitesse_barriere);
barriere_ouverte = true;
detection1 = 0;
detection2 = 0;
//digitalWrite(feu_droit,LOW);
//digitalWrite(feu_gauche,LOW);
delay(inhibition);
}
}
// Permet de savoir quel détecteur est passé à l'état bas en premier
if (detection1 == false) {
// détection d'un train voie 1
if (valeur_Detect1 < 512 || valeur_Detect2 < 512) {
detection1 = true;
// détection d'un train voie 2
if (detection2 == false) {
if (valeur_Detect1 < 512 || valeur_Detect2 < 512) {
detection2 = true;
digitalWrite(pulse_dfplayer,LOW);
delay(100);
digitalWrite(pulse_dfplayer,HIGH);
// Mise en mémoire du détecteur.
if (valeur_Detect1 < 512) {
premiere_detection = 1;
} else {
premiere_detection = 2;
}
if (valeur_Detect2 < 512) {
deuxieme_detection = 1;
} else {
deuxieme_detection = 2;
}
}
}}}
// Un train est détecté.
else {
Fonction_feux(); // Appel de la fonction qui gère les feux
if (barriere_ouverte == true) {
for (int tempo = 0; tempo <= tempo_fermeture; tempo +=1){ // Temporisation avant fermeture
Fonction_feux(); // Appel de la fonction qui gère les feux
delay(1);
}
// Premier groupe servo 1 et 3
for (int angle_barriere=angle_ouverture; angle_barriere>=angle_fermeture; angle_barriere-=1){ //FERMETURE BARRIERES
servo1.write(angle_barriere);
Fonction_feux(); // Appel de la fonction qui gère les feux
delay(vitesse_barriere); // Vitesse angle barrière
}
// Temporisation entre les groupes 1-3 et 2-4
for (int tempo = 0; tempo <= tempo_barrieres_13_24; tempo +=1){ // Temporisation avant fermeture
Fonction_feux(); // Appel de la fonction qui gère les feux
delay(1);
}
// Deuxième groupe servo 2 et 4
for (int angle_barriere=angle_ouverture; angle_barriere>=angle_fermeture; angle_barriere-=1){ //FERMETURE BARRIERES
servo2.write(angle_barriere);
Fonction_feux(); // Appel de la fonction qui gère les feux
delay(vitesse_barriere); // Vitesse angle barrière
}
barriere_ouverte = false;
}
if (premiere_detection == 1) {
if (valeur_Detect2 < 512) {
premiere_detection = 0;;
}
}
if (premiere_detection == 2) { // Si non c'est que c'est le 2eme capteur
if (valeur_Detect1 < 512) {
premiere_detection = 0;
}
}
}
if (deuxieme_detection == 1) {
if (valeur_Detect4 < 512) {
deuxieme_detection = 0;;
}
}
if (deuxieme_detection == 2) { // Si non c'est que c'est le 2eme capteur
if (valeur_Detect3 < 512) {
deuxieme_detection = 0;
delay(50);
}
}}}}
void Fonction_feux() {
if (millis() > compteur_temps + tempo_led) {
compteur_temps = millis();
if (etat_feux == false) {
etat_feux = true;
digitalWrite(feu_droit,HIGH);
digitalWrite(feu_gauche,HIGH);
} else {
etat_feux = false;
digitalWrite(feu_droit,LOW);
digitalWrite(feu_gauche,LOW);
}
}
}