Voir les contributions

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.


Messages - hinano70

Pages: 1 [2]
16
Merci pour les conseils, j'ai tenu compte des remarques.
Voici le montage joint
J'ai effectivement mis des tests un peu partout :
Serial.println(intensite); pour tester la valeur envoyée sur la sortie 10 PWM de la Led, ça augmente 0>250, puis ça diminue 250>0..., le timing est correct.
Serial.println(angle); pour vérifier la valeur envoyée aux servomoteurs, les barrières se ferment et s'ouvrent.
Tout est normal

Le problème c'est que la Led ne s'allume que si la valeur envoyée est 255 !!! (ce qui n'est pas atteint dans le programme puisque ça va de 0 à 250 par pas de 10, mais que je produis dans mes tests). Alors que le programme clignotement fonctionne très bien tout seul !!!

Est-ce un problème de typage incorrect avec des octets qui viennent en écraser d'autres ?

Je remets le code plus clair :

#include <Servo.h>
/* PN double voie A et B
détection par capteur IR de l'arrivée : detect1 passe de 1 à 0
et du passage du dernier wagon : detect2 passe de 0 à 1 avec delai de micro-coupure
*/
Servo servoPNA; // servo voie A
Servo servoPNB; // servo voie B
boolean detect1A,detect1B;  //détection des capteurs en entrée du PN (0 si train)
boolean  olddetect1A,olddetect1B;  //dernière détection prise en compte
boolean detect2A,detect2B=1;   // en sortie du PN
boolean  olddetect2A,olddetect2B=1;
boolean  lastdetect2A,lastdetect2B=1;  //dernière détection lue, pas forcément prise en compte (micro coupure due aux inter-wagons)
boolean readingPNA,readingPNB;
unsigned long lastPNATime,lastPNBTime;   // derniere fois que les detecteurs ont changes
unsigned long PNDelay = 500; // durée maxi des micro-coupures
int avertissement = 2000; // durée avant fermeture
byte phase = 0;  // phase de clignotement (4 phases : croissance-max-decroissance-nulle)
unsigned long fading = 5;  // durée initiale entre 2 éclairages
byte intensite = 0;  //intensite de l'éclairement
unsigned long LedTime = millis();       // timer pour le clignotement
unsigned long PNTime = millis();        // timer pour les moteurs d'aiguillage
boolean  ferme=false,fermeA=false,fermeB=false;
byte angle=140;   // angle initial barrières ouvertes

void setup()
{
servoPNA.attach(5);// servo A
servoPNB.attach(6);// servo B
//Serial.begin(9600);
pinMode(2,INPUT); // détecteur entrée PN voie A
pinMode(3,INPUT); // détecteur sortie PN voie A
pinMode(7,INPUT); // détecteur entrée PN voie B
pinMode(8,INPUT); // détecteur sortie PN voie B
pinMode(10, OUTPUT); // 2 Leds clignotantes
pinMode(11, OUTPUT); // 2 Leds clignotantes
servoPNA.write(140); // barrière A ouverte
servoPNB.write(140); // barrière B ouverte

analogWrite(10,0);// 2 Leds coté A éteintes
analogWrite(11,0);// 2 Leds coté B éteintes
}
void loop()
{

detect1A = digitalRead(2); //reading=0 si train
if ((olddetect1A==1 && detect1A==0) && fermeA==0) {fermeA=1;
                                                  if (fermeB==0) {PNTime = millis()+avertissement;
                                                  LedTime = millis();} }  // ferme voie A
olddetect1A = detect1A;

readingPNA = digitalRead(3); //reading=0 si train
if (readingPNA != lastdetect2A) {lastPNATime = millis();}  //déclenchement chrono
if ((millis() - lastPNATime) > PNDelay) {// si le delai est atteint, le changement est valide sinon le changement est ignore (parasite ou inter-wagon)
                                        if (readingPNA != detect2A) {detect2A = readingPNA;} // changement valide                                                       
                                        }

lastdetect2A = readingPNA;
if (olddetect2A==0 && detect2A==1) {fermeA=0; lastPNATime = millis();}  // ouvre voie A
olddetect2A=detect2A;


detect1B=digitalRead(7);
if ((olddetect1B==1 && detect1B==0) && fermeB==0) {fermeB=1;
                                                  if (fermeA==0) {PNTime = millis()+avertissement;
                                                  LedTime = millis();} }  // ferme voie B
olddetect1B=detect1B;

readingPNB = digitalRead(8); //reading=0 si train
if (readingPNB != lastdetect2B) {lastPNBTime = millis();}  //déclenchement chrono
if ((millis() - lastPNBTime) > PNDelay) {// si le delai est atteint, le changement est valide sinon le changement est ignore (parasite ou inter-wagon)
                                        if (readingPNB != detect2B) {detect2B = readingPNB;} // changement valide                                                       
                                        }

lastdetect2B=readingPNB;
if (olddetect2B==0 && detect2B==1) {fermeB=0; lastPNBTime = millis();}  // ouvre voie B
olddetect2B=detect2B;

ferme = (fermeA || fermeB);
if ((ferme==1) || (angle<140)) { clignote();}
else {Serial.println("ouvert");
      analogWrite(10,0);
      analogWrite(11,0);
      phase = 0;
      intensite=0;
      fading = 5;}

if ((ferme==1) && (angle>50)) {fermePN();}

if ((ferme==0) && (angle<140)) {ouvrePN();}

//Serial.println(angle);
}


void clignote()
{

//Serial.println(intensite);
if ( millis() > LedTime + fading)     // vitesse de clignotement
   {
   LedTime = millis();   // reinit le timer
 

   switch (phase) {
           case 0 :       // croit
              intensite += 10;
              if (intensite == 250) {phase = 1; fading = 200;}
              break;
           case 1 :      // allume
              phase = 2; fading=5;
              break;
           case 2 :      // decroit
              intensite -= 10;
              if (intensite == 0) {phase = 3; fading = 200;} break;
           case 3 :      // eteint
              phase = 0;
              fading = 5;
              break;
                }
   analogWrite(10,intensite);
   }
}

void ouvrePN()
{
if ((millis() - PNTime) > 20) {PNTime = millis();
                               angle+=1;
                               servoPNA.write(angle);
                               servoPNB.write(angle); }
}

void fermePN()
{
if (millis() > (20+PNTime)) {PNTime = millis();
                             angle-=1;
                             servoPNA.write(angle);
                             servoPNB.write(angle);  }
}

17
Désolé, je découvre ....

18
Bonjour
Ceci est mon 1er message, j'espère ne pas me tromper de lieu pour ma demande !
Sur les bons conseils de Locoduino, j'ai réalisé une commande de passage à niveau (capteurs IR pour la détection, SG90 pour les barrières, LEDs pour les feux clignotants). Tout fonctionne correctement pour les leds en tout ou rien (0 et 255 dans analogWrite)
Je me suis inspiré de l'article "La PWM : Qu’est-ce que c’est ?" pour faire un clignotement progressif. Débutant, j'ai adapté le programme au mien. Seul, il fonctionne très bien :

byte cycle = 0;  // cycles de clignotement
long fading = 5;  //rapidité du clignotement
byte intensite = 0;  //intensité lumineuse
long LedTime = millis();   // timer pour le clignotement

void setup() {
pinMode(10, OUTPUT);  //sortie Led
}

void loop() {
clignote();
}

void clignote()
{
if ( millis() > LedTime + fading)     // vitesse de clignotement
   {
   LedTime = millis();   // reinit le timer
 

   switch (cycle) {
           case 0 :       // croit
              intensite += 10;
              if (intensite == 250) {cycle = 1; fading=200;}
              break;
           case 1 :      // allumé
              cycle = 2; fading=5;
              break;
           case 2 :      // décroit
              intensite -= 10;
              if (intensite == 0) {cycle = 3; fading=200;} break;
           case 3 :      // éteint
              cycle = 0;
              fading=5;
              break;
                }
analogWrite(10,intensite);
   }
}


Si j'intègre cet ensemble dans mon programme (ci-dessous), la Led ne s'éclaire pas. Elle ne le fait que si l'intensite est à 255 ! (254 ne fonctionne pas !!!)
Je tourne en rond, donc si qq'un peut m'aider. Merci. Je suis sur Nano.

#include <Servo.h>
/* define a header file. Special attention here, you can call the servo function directly from Arduino's software menu  bar Sketch>Importlibrary>Servo, or input
#include <Servo.h>. Make sure there is a space between #include and  <Servo.h>. Otherwise, it will cause compile error.*/
Servo servoPNA; // servo voie A
Servo servoPNB; // servo voie B
boolean detect1A,detect1B;
boolean  olddetect1A,olddetect1B;
boolean detect2A,detect2B=1;
boolean  olddetect2A,olddetect2B=1;
boolean  lastdetect2A,lastdetect2B=1;
boolean readingPNA,readingPNB;
long lastPNATime,lastPNBTime;   // derniere fois que le detecteur a change
long PNDelay = 500; // durée maxi des micro-coupures
int avertissement = 2000; // durée avant fermeture
byte cycle = 0;  // cycles de clignotement
long fading = 10;
byte intensite = 0;
long LedTime = millis();                   // timer pour le clignotement
long PNTime = millis();                    // timer pour les moteurs d'aiguillage
boolean  ferme=0,fermeA=0,fermeB=0;
byte angleA=140;

void setup()
{
servoPNA.attach(5);// servo A
servoPNB.attach(6);// servo A
//Serial.begin(9600);
pinMode(2,INPUT); //entrée A
pinMode(3,INPUT); //sortie A
pinMode(7,INPUT); //entrée B
pinMode(8,INPUT); //sortie B
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
servoPNA.write(140);
servoPNB.write(140);

analogWrite(10,0);// Led A
analogWrite(11,0);// Led B
}
void loop()
{

detect1A=digitalRead(2); //reading=0 si train
if ((olddetect1A==1 && detect1A==0) && fermeA==0) {fermeA=1; if (fermeB==0) {PNTime = millis()+avertissement; LedTime = millis();} }  // ferme voie A
olddetect1A=detect1A;

readingPNA = digitalRead(3); //reading=0 si train
if (readingPNA != lastdetect2A) {lastPNATime = millis();}  //déclenchement chrono
if ((millis() - lastPNATime) > PNDelay) {// si le delai est atteint, le changement est valide sinon le changement est ignore (parasite ou inter-wagon)
                                        if (readingPNA != detect2A) {detect2A = readingPNA;} // changement valide                                                       
                                        }

lastdetect2A=readingPNA;
if (olddetect2A==0 && detect2A==1) {fermeA=0; lastPNATime = millis();}  // ouvre voie A
olddetect2A=detect2A;


detect1B=digitalRead(7);
if ((olddetect1B==1 && detect1B==0) && fermeB==0) {fermeB=1; if (fermeA==0) {PNTime = millis()+avertissement; LedTime = millis();} }  // ferme voie B
olddetect1B=detect1B;

readingPNB = digitalRead(8); //reading=0 si train
if (readingPNB != lastdetect2B) {lastPNBTime = millis();}  //déclenchement chrono
if ((millis() - lastPNBTime) > PNDelay) {// si le delai est atteint, le changement est valide sinon le changement est ignore (parasite ou inter-wagon)
                                        if (readingPNB != detect2B) {detect2B = readingPNB;} // changement valide                                                       
                                        }

lastdetect2B=readingPNB;
if (olddetect2B==0 && detect2B==1) {fermeB=0; lastPNBTime = millis();}  // ouvre voie B
olddetect2B=detect2B;

ferme = (fermeA || fermeB);

if ((ferme==1) || (angleA<140)) { clignote();}
else {Serial.println("ouvert");analogWrite(10,0); analogWrite(11,0);cycle = 0; intensite=0; fading = 5;}


if ((ferme==1) && (angleA>50)) {fermePN();}

if ((ferme==0) && (angleA<140)) {ouvrePN();}

//Serial.println(angleA);
}


void clignote()
{

//Serial.println(intensite);
if ( millis() > LedTime + fading)     // vitesse de clignotement
   {
   LedTime = millis();   // reinit le timer
 

   switch (cycle) {
           case 0 :       // croit
              intensite += 10;
              if (intensite == 250) {cycle = 1; fading = 200;}
              break;
           case 1 :      // allume
              cycle = 2; fading=5;
              break;
           case 2 :      // decroit
              intensite -= 10;
              if (intensite == 0) {cycle = 3; fading = 200;} break;
           case 3 :      // eteint
              cycle = 0;
              fading = 5;
              break;
                }
   analogWrite(10,intensite);
   }
}

void ouvrePN()
{
             if ((millis() - PNTime) > 20) {PNTime = millis(); angleA+=1; servoPNA.write(angleA); servoPNB.write(angleA); }
}

void fermePN()
{
             if (millis() > (20+PNTime)) {PNTime = millis(); angleA-=1; servoPNA.write(angleA); servoPNB.write(angleA);  }
}

Pages: 1 [2]