Forums LR PRESSE

Où il est question de trains, petits et grands

  • Advertisement

Arduino - pour les nuls et débutants ( progressons ensemble)

Toutes les discussions sur l'Arduino !

Modérateur: MOD

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Sam 30 Jan 2016, 17:21 
:siffle: hello
ça y est…j'ai trouvé une alim qui ne "bouge" pas. maintenant c'est OK le fonctionnement est le même via usb ou via l'alim….SUPER.

tests en cours pour réglages… car dur de gérer l'espace entre wagons par exemple sans affecter la réactivité du dispositif…. pour rappel les détections sont trés trés proches des barrières et donc ça doit fermer rapidos .. :ange:
jepi54
Papotier
 
Messages: 173
Inscrit le: Mer 13 Jan 2010, 14:40

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Sam 30 Jan 2016, 19:02 
SUPER !

Comme quoi, tout finit par venir à point à qui sait être persévérant. :wink:

Je suis content pour toi, depuis le temps que tu avais initié ce projet, ton obstination t'honore.

Reste la phase de réglage et de mise au point qui est souvent la plus longue, mais ce premier résultat doit t'encourager. Et puis, quand ça fonctionne, on peut commencer à jouer, ce qui est bien le but de notre hobby, non ?
Avatar de l’utilisateur
Arduino
Démonstratif
 
Messages: 1581
Inscrit le: Mer 25 Sep 2013, 17:14

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Sam 30 Jan 2016, 19:39 
:siffle: c'est vrai que voir le mouvement des barrieres est génial et rend les choses plus vraies…
dans ce hobby tout est super…inventer, construire, imaginer, faire tourner le matériel…montrer, discuter….
seule la partie électrique et électronique m'est difficile…mais je persévère comme tu dis…

RESULTATS des premiers tests…. la sensibilité des capteurs est énorme…et de temps en temps l'ultrason "raconte" n'importe quoi.. (dur à gérer les chiffres fantaisistes).
le principal souci est le suivant : la gestion des délais…
1/ soit le délai est trop court si le train roule lentement ou trés lentement, l'espace entre wagons dure trop longtemps et fait croire à l'absence de train
2/ en allongeant ce délai c'est mieux mais si le convoi roule vite…il n'y a plus le temps d'agir…
:oops:
jepi54
Papotier
 
Messages: 173
Inscrit le: Mer 13 Jan 2010, 14:40

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Jeu 04 Fév 2016, 12:45 
:moi: :moi:
je cherche comment gérer les délais… voir mon message ci-dessus…
d'autre part, j'ai soudainement des plantages hyperfréquents du logiciel…
jepi54
Papotier
 
Messages: 173
Inscrit le: Mer 13 Jan 2010, 14:40

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Jeu 04 Fév 2016, 12:47 
Code: Tout sélectionner
// PROGRAMME DETECTION TRAIN POUR GESTION DE DEUX PASSAGES A NIVEAU
//     DETECTION PAR IR ET ULTRASON - JANVIER 2016

const int LED_INDIC = 13; //temoin led sur arduino pour fermeture pn

// PN montagne
// capteur ultrason dans le tunnel
int trig = 2; // fil vert ultrasons TRIG
int echo = 3; // fil jaune ultrasons ECHO
long lecture_echo;
long detecteurBM; // distance sur l'ultrason
// capteur IR
const int IRDAM = 6; //2nd detecteur DIR fil jaune - renvoie 0 si passage train - sinon renvoie 1
const int fermeM = 4 ; // presence train - fermeture - branchement sur ARDUINO 4
const int ouvreM = 5 ; // pas de train - ouverture- branchement sur ARDUINO 5 vers ULN2803
byte detecteurAM; // detection ou pas
byte CM; // variable d'etat de 0 (ouverture) a 6
char PNM; //variable postion pn  Ouvert-Ferme

// PN ville
const int IRDAV = 8; // detection DIR renvoie 0 si passage train sortie tunnel - sinon renvoie 1
const int IRDBV = 9; //2nd detecteur DIR  idem ecole
const int fermeV = 10 ; // presence train - fermeture - branchement sur ARDUINO 10
const int ouvreV = 11 ; // pas de train - ouverture- branchement sur ARDUINO 11 vers ULN2803
byte detecteurAV; // detection ou pas
byte detecteurBV; // idem sur second IR
byte CV; // variable d'etat de 0(ouverture) a 6
char PNV; //variable position pn  Ouvert-Ferme

//initialisations
void setup()
{
  Serial.begin(9600);
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
  digitalWrite(LED_INDIC, LOW); // led eteinte
  pinMode(LED_INDIC, OUTPUT);
 
  pinMode(IRDAM, INPUT); //entree detecteur IR
  pinMode (ouvreM, OUTPUT);//en sortie pour commander aiguille
  pinMode (fermeM, OUTPUT);//idem
  digitalWrite(fermeM,LOW);  //pas d'alim au demarrage
  digitalWrite(ouvreM,LOW);  //idem
  detecteurAM = 1; // detection a non 
  CM = 0; // variable d'etat PN Montagne
 
  pinMode(IRDAV, INPUT); //entree detecteur IR
  pinMode(IRDBV, INPUT); //idem second detecteur
  pinMode (ouvreV, OUTPUT);//en sortie pour commander aiguille
  pinMode (fermeV, OUTPUT);//idem
  digitalWrite(fermeV,LOW);  //pas d'alim au demarrage
  digitalWrite(ouvreV,LOW);  //idem
  detecteurAV = 1; // detection non 
  detecteurBV = 1; // idem
  CV = 0; // variable d'etat PN Ville

/*  Serial.print("debut CM : ");  Serial.println(CM);  Serial.print("debut CV : ");
  Serial.println(CV);
*/
}


//***************************************************************************
// gestion pns MONTAGNE
//***************************************************************************
void PNMONTAGNE()
{
     Serial.print("CM : ");
    Serial.println(CM);

if (CM == 0)
// ouverture si C = 0 -fermeture dans tous les autres cas
       {
/*         Serial.println("projet ouverture du passage a niveauM"); Serial.print("detecteurAM = ");
           Serial.println(detecteurAM); Serial.print("detecteurBM = "); Serial.println(detecteurBM);
*/         
           if (PNM != 'O')
           {
             digitalWrite(ouvreM,HIGH); //impulsion ouverture
             delay(300);            //duree 200ms
             digitalWrite(ouvreM,LOW);  //fin impulsion 
             PNM = 'O'; //modif variable de position
             digitalWrite(LED_INDIC, LOW); //eteindre led temoin
  //           digitalWrite(ouvreM,HIGH); //impulsion ouverture
    //         delay(200);            //duree 200ms
      //       digitalWrite(ouvreM,LOW);  //fin impulsion 
           }
  //        else
    //       {
      //       Serial.println("deja ouvertM");
        //   }
      }
else
       {
           if (PNM != 'F')
           {
//             Serial.println("fermeture du passage a niveauM");
             digitalWrite(fermeM,HIGH); //impulsion fermeture
             delay(200);            //duree 200ms
             digitalWrite(fermeM,LOW);  //fin impulsion
             PNM = 'F'; //modif variable de position
             digitalWrite(LED_INDIC, HIGH); //allumer led temoin
           }
  //         else
    //       {
      //       Serial.println("deja fermeM");
        //   }
       }
}

//***************************************************************************
// gestion pns VILLE
//***************************************************************************
void PNVILLE()
{
     Serial.print("CV : ");
    Serial.println(CV);
if (CV == 0)
// ouverture si C = 0 -fermeture dans tous les autres cas
       {
           if (PNV != 'O')
           {
             digitalWrite(ouvreV,HIGH); //impulsion ouverture
             delay(200);            //duree 200ms
             digitalWrite(ouvreV,LOW);  //fin impulsion
             digitalWrite(ouvreV,HIGH); //impulsion ouverture
             delay(200);            //duree 200ms
             digitalWrite(ouvreV,LOW);  //fin impulsion   
             PNV = 'O'; //modif variable de position
             digitalWrite(LED_INDIC, LOW); //eteindre led temoin
           }
//          else
   //        {
     //        Serial.println("deja ouvertV");
       //    }
       }
else
       {
           if (PNV != 'F')
           {
//             Serial.println("fermeture du passage a niveauV");
             digitalWrite(fermeV,HIGH); //impulsion fermeture
             delay(150);            //duree 200ms
             digitalWrite(fermeV,LOW);  //fin impulsion 
             digitalWrite(fermeV,HIGH); //impulsion fermeture
             delay(150);            //duree 200ms
             digitalWrite(fermeV,LOW);  //fin impulsion 
           
             PNV = 'F'; //modif variable de position
             digitalWrite(LED_INDIC, HIGH); //allumer led temoin
           }
    //       else
    //       {
    //         Serial.println("deja fermeV");
     //      }
       }
}

//***************************************************************************
// PROGRAMME PRINCIPAL _ GESTION DES DETECTEURS
//***************************************************************************

void loop()
{
Serial.println("");
Serial.println("BOUCLE");

PNMONTAGNE();
PNVILLE();

//lecture detecteurs MONTAGNE
// ultrason
digitalWrite(trig, HIGH);
delayMicroseconds(1);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
detecteurBM = lecture_echo / 58; // calcul distance en cm
Serial.print("ultrason : ");
Serial.println(detecteurBM);
if(detecteurBM > 0 && detecteurBM < 7)          // objet tr√®s proche -7cm
    {
//verification train proche
  //     digitalWrite(trig, HIGH);
    //   delayMicroseconds(3);
     //  digitalWrite(trig, LOW);
    //   lecture_echo = pulseIn(echo, HIGH);
    //   detecteurBM = lecture_echo / 58; // calcul distance en cm
     //  Serial.print("ultrason controle: ");
     //  Serial.println(detecteurBM);
    //   if(detecteurBM > 0 && detecteurBM < 7)          // objet tr√®s proche -7cm
     //    {
         switch (CM)
         {
           case 0: 
             CM = 1;
           break;
           case 2:
             CM = 4;
           break;
           case 3:
             CM = 5;
           break;     
         }
//            Serial.println(CM);
         PNMONTAGNE();
       //  }
    }
else
    {
// verification qu'il n'y a pas de train (espace entre wagon...)
// relecture detecteur
    delay(400);
    digitalWrite(trig, HIGH);
    delayMicroseconds(1);
    digitalWrite(trig, LOW);
    lecture_echo = pulseIn(echo, HIGH);
    detecteurBM = lecture_echo / 58;   // calcul distance en cm de l'echo
    Serial.print("ultrason controle: ");
    Serial.println(detecteurBM);

      if(detecteurBM > 0 && detecteurBM > 7)    // confirmation absence d'objet tr√®s proche
      { 
        switch (CM)
         {
           case 1:
             CM = 3;
           break;
           case 4:
             CM = 6;
           break;
           case 5:
             CM = 0;
           break;
         }
      }
    else if(detecteurBM > 0 && detecteurBM < 7)
            {
              switch (CM)
               {
                 case 0: 
                   CM = 1;
                 break;
                 case 2:
                   CM = 4;
                 break;
                 case 3:
                   CM = 5;
                 break;     
               }
              PNMONTAGNE(); 
            }
    }
 
//PNMONTAGNE();

//IR
detecteurAM = digitalRead(IRDAM);
Serial.print("detecteur irm : ");
Serial.println(detecteurAM);

if (detecteurAM == 0) //detection train du cote A
    {
      switch (CM)
       {
         case 0: 
           CM = 2;     
         break;
         case 1:
           CM = 4;
         break;
         case 3:
           CM = 6;
         break; 
       }
      PNMONTAGNE();
    }
else
    {
// verification qu'il n'y a pas de train (espace entre wagon...)
// relecture detecteur
      delay(500);
      detecteurAM = digitalRead(IRDAM);
      if (detecteurAM != 0)     
      {
        switch (CM)
         {
           case 2:
             CM = 3;
           break;
           case 4:
             CM = 5;
           break;
           case 6:
             CM = 0;
           break;
         }
      }
    }
//PNMONTAGNE();
Serial.println("sortie pnmontagne");
Serial.print("CM : ");
Serial.println(CM);
Serial.print("CV : ");
Serial.println(CV);

   
//***************************************************************************
// VILLE
//***************************************************************************
     
//lecture detecteurs
detecteurAV = digitalRead(IRDAV);
detecteurBV = digitalRead(IRDBV);
   Serial.print("detecteur irAV : ");
   Serial.println(detecteurAV);
    Serial.print("detecteur irBV : ");
   Serial.println(detecteurBV);

if (detecteurBV == 0) //detection train du cote B
    {
       switch (CV)
       {
         case 0: 
           CV = 1;
         break;       
         case 2:
           CV = 4;
         break;
         case 3:
           CV = 5;
         break;
       }
//       Serial.println(CV);
       PNVILLE();
    }
else
    {
// verification qu'il n'y a pas de train (espace entre wagon...)
// relecture detecteur
      delay(300);
      detecteurBV = digitalRead(IRDBV);
      if (detecteurBV == 1)   // confirmation absence train   
        switch (CV)
         {
           case 1:
             CV = 3;
           break;
           case 4:
             CV = 6;
           break;
           case 5:
             CV = 0;
           break;
         } 
    }

//PNVILLE();

if (detecteurAV == 0) //detection train du cote A
    {
      switch (CV)
       {
         case 0: 
           CV = 2;     
         break;
         case 1:
           CV = 4;
         break;
         case 3:
           CV = 6;
         break; 
       }
      PNVILLE();
    }
else
    {
// verification qu'il n'y a pas de train (espace entre wagon...)
// relecture detecteur
      delay(300);
      detecteurAV = digitalRead(IRDAV);
      if (detecteurAV == 1)   //confirmation absence train   
      switch (CV)
       {
         case 2:
           CV = 3;
         break;
         case 4:
           CV = 5;
         break;
         case 6:
           CV = 0;
         break;
       }
    }

//PNVILLE();
Serial.println("sortie pnville");
Serial.print("CV : ");
Serial.println(CV);
Serial.print("CM : ");
Serial.println(CM);

}
jepi54
Papotier
 
Messages: 173
Inscrit le: Mer 13 Jan 2010, 14:40

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Jeu 04 Fév 2016, 14:58 
jepi54 a écrit:1/ soit le délai est trop court si le train roule lentement ou trés lentement, l'espace entre wagons dure trop longtemps et fait croire à l'absence de train
Il faut essayer de mettre le détecteur non pas perpendiculaire à la voie mais légèrement en biais pour que le faisceau IR ou ultrasonore ne puisse pas passer entre 2 wagons. Mais ce n'est pas toujours facile à faire.

jepi54 a écrit:...d'autre part, j'ai soudainement des plantages hyperfréquents du logiciel…
Parles tu de l'IDE Arduino ou de ton programme ?

Dans le code que tu as mis, il semble y avoir la gestion des 2 PNs avec 4 détecteurs (1 ultrasons et 3 IR). Peut-être faudrait il valider individuellement le bon fonctionnement de chaque PN avant de se confronter aux éventuels problèmes que la gestion simultanée des 2 PNs dans le même programme pourraient engendrer ?
Alain17
Loquace
 
Messages: 1237
Inscrit le: Ven 21 Juil 2006, 16:36
Localisation: Entre Cognac, Ré et Oléron

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Jeu 04 Fév 2016, 16:00 
Alain17 a écrit:
jepi54 a écrit:1/ soit le délai est trop court si le train roule lentement ou trés lentement, l'espace entre wagons dure trop longtemps et fait croire à l'absence de train
Il faut essayer de mettre le détecteur non pas perpendiculaire à la voie mais légèrement en biais pour que le faisceau IR ou ultrasonore ne puisse pas passer entre 2 wagons. Mais ce n'est pas toujours facile à faire.

jepi54 a écrit:...d'autre part, j'ai soudainement des plantages hyperfréquents du logiciel…
Parles tu de l'IDE Arduino ou de ton programme ?

Dans le code que tu as mis, il semble y avoir la gestion des 2 PNs avec 4 détecteurs (1 ultrasons et 3 IR). Peut-être faudrait il valider individuellement le bon fonctionnement de chaque PN avant de se confronter aux éventuels problèmes que la gestion simultanée des 2 PNs dans le même programme pourraient engendrer ?


1/ je ne peux pas mettre en biais…le détecteur possède sur le même circuit les deux diodes émission et réception…si je mets en biais le faisceau ne revient jamais…j'ai d'ailleurs un problème avec les arrondis sur le matériel…

2/ je parle de l'appui arduino sur le portable (tu as vu qu'il y a des print…pour que j'essaie de 'suivre' le programme… mais j'ai vu qu'il y a un traceur sur la dernière version d'arduino…cela sert il à "debugger" ?

3/ le fonctionnement des 4 détecteurs et des 2 pns a été testé hors circuit…ça marche… mais ne tenait pas compte de la vitesse de déplacement..Ni de l'espace entre wagons…(qui oblige à mettre les temporisations avant fermeture…qui allongent considérablement le temps de déroulement….) :gne:
jepi54
Papotier
 
Messages: 173
Inscrit le: Mer 13 Jan 2010, 14:40

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Sam 13 Fév 2016, 09:28 
Bonjour,
Merci d'avoir ouvert ce fil que je découvre.
Mon projet est de pouvoir piloter des moteurs pas a pas, un ou deux moteurs à courant continu, une 50 aine de led, mais surtout de pouvoir envoyer a un ordinateur des séquences de saisies clavier.
J'ai étudié les différentes cartes Arduino disponibles et je sèche quant au choix final : Leonardo, Mega adk, Due, autres ?
Le nbr d'E/s doit être important,
Le 3.3v de la carte Due est-il un handicap?
Les shield sont ils compatibles avec toutes les cartes arduino ?
Les librairies et sketch sont ils compatibles d'un modèle a l'autre ?
Etant newbee, pas expert en programmation C, qui peut me conseiller ?
Merci d'avance

BB22210
BB22210
Disert
 
Messages: 460
Inscrit le: Dim 20 Jan 2008, 01:03
Localisation: Isère
Âge: 51
Echelle pratiquée: HO

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Dim 14 Fév 2016, 03:46 
Les shields ne sont pas forcément compatibles avec toutes les cartes Arduino ; bien lire la doc et surtout vérifier en quelle tension ils travaillent. Par exemple, un shield pour carte Uno travaillera en 5 V, ce qui ne va pas pour la carte Due qui est en 3,3. Ce voltage n'est pas un problème mais il faut prendre des précautions pour adapter les signaux (voir à ce sujet le cours "Démarrer en électronique programmable").

Je pense que les sketchs sont compatibles d'un modèle à l'autre, mais pas forcément les libraries ; cela dépend de qui les a écrites et quand. Les principales libraries ne devraient pas poser de problèmes.

Si le nombre d'E/S est important, privilégier un Mega qui travaille en 5 V (compatibilité de shields).

Je ne suis pas expert en C, j'ai débuté pour Arduino avec le livre de Christian Tavernier, puis d'autres. J'essaie de transmettre mes maigres connaissances au travers de mon cours "Démarrer en électronique programmable". Voilà, c'est tout ce que je peux te dire et tu trouveras sur le site http://www.locoduino.org plein d'articles pour tous les niveaux; Bon amusement. :wink:
Avatar de l’utilisateur
Arduino
Démonstratif
 
Messages: 1581
Inscrit le: Mer 25 Sep 2013, 17:14

Re: Arduino - pour les nuls et débutants ( progressons ensem

Publié: Lun 14 Mars 2016, 22:27 
["jepi54"]"1/ soit le délai est trop court si le train roule lentement ou trés lentement, l'espace entre wagons dure trop longtemps et fait croire à l'absence de train[ soit le train va trop vite...le PN n'a pas le temps de bouger....


:moi: :moi:
me revoilà.... je me suis dém... tout seul...puisque personne n'a fait de proposition ici.... ET J'AI TROUVE....(j'ai ajouté des compteurs de non-détection pour attendre avant d'ouvrir le pn)
ça marche... :mrgreen: :gne:
jepi54
Papotier
 
Messages: 173
Inscrit le: Mer 13 Jan 2010, 14:40

Précédent

Retour vers Arduino

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité