LOCODUINO

Discussions Générales => Présentez vous ! => Discussion démarrée par: sebastien le mars 24, 2020, 09:59:03 pm

Titre: Bonjour a tous
Posté par: sebastien le mars 24, 2020, 09:59:03 pm
je suis tombé par hasard sur votre forum.  il m'arrive fréquemment de faire de la programmation Arduino pour gérer des trains.  Mon père est un amis son passionné.  ils m'ont demandé de crée un programme pour gérer  x servo programmer avec x bouton et x scénario.
le programme a l'air de fonctionner avec deux servo parce que j'en ai que deux et plusieurs scénario et quand il l'a piqué sur leur gare ça ne fonctionne pas correctement.  je vous laisse le programme en PJ  je n'ai pas utiliser la librairie servo  pour pouvoir les faire fonctionner tous en même temps.  merci d'avance pour le coup de main.  de plus ça peut intéresser quelqu'un et c'est gratuit.  ;) ;)
//-------------------------------------------------------------------  -------------------------------------------------------------------
int       Aiguillage                                    =  0;
int       Senario                                       =  0;
//-------------------------------------------------------------------  -------------------------------------------------------------------
const int PinInBouton   []                              = {8, 9, 10, 11};               // declaration constante de broche
const int PinOutServo   []                              = {2, 3};                       // declaration constante de broche
const int PinOutLed     []                              = {22, 23, 4, 5};               // declaration constante de broche
//-------------------------------------------------------------------  -------------------------------------------------------------------
const int NbrSenario                                    = (sizeof (PinInBouton) / sizeof (PinInBouton[0]));         // le Nbr. de Senario = Nbr. de Bouton
const int NbrAiguillage                                 = (sizeof (PinOutServo) / sizeof (PinOutServo[0]));
int       SenarioActif  [NbrSenario] [NbrAiguillage]    = { 0 };                                                   
boolean   EtatOutLed    [NbrSenario]                    = { LOW };
const int SenarioInitial                                = 0;                                                        // Senario a activé aprés demarrage 0 pour le premier
//-------------------------------------------------------------------  -------------------------------------------------------------------
const int ProgSenario   [NbrSenario] [NbrAiguillage]    = { {1, 2},
                                                            {2, 1},
                                                            {0, 1},
                                                            {0, 2} };                    // 1 pour Voie A - 2 pour Voie B - 0 pour Rien faire
//-------------------------------------------------------------------  -------------------------------------------------------------------
int       AngleVoieA    [NbrAiguillage]                 = {105, 105};                    // La valeur de l'angle est entre 0° et 179°
int       AngleVoieB    [NbrAiguillage]                 = {65, 65};                      // La valeur de l'angle est entre 0° et 179°
int       AngleActuel   [NbrAiguillage]                 = {90, 90};
//-------------------------------------------------------------------  -------------------------------------------------------------------                                 
int           TempsClignotementLed                      = 150;
unsigned long MillisClignotementLed [NbrSenario]        = { millis() };
int           TempsAiguillage                           = 50;
unsigned long MillisAiguillage      [NbrAiguillage]     = { millis() };
//-------------------------------------------------------------------  -------------------------------------------------------------------
void setup()
{
  Serial.begin(115200);
  for (Aiguillage = 0 ; Aiguillage < NbrAiguillage ; Aiguillage++)                        // On initialise les servo
    {
      pinMode(PinOutServo [Aiguillage], OUTPUT);                                          // met la broche en sortie
    }
  for (Senario = 0 ; Senario < NbrSenario ; Senario++)
    {
    pinMode(PinOutLed [Senario], OUTPUT);
    pinMode(PinInBouton [Senario], INPUT_PULLUP);
    digitalWrite(PinOutLed [Senario], EtatOutLed [Senario]); 
    MillisAiguillage [Senario] = millis(); 
    }
  for (int I = 0 ; I < NbrAiguillage ; I++)
    {
      SenarioActif [SenarioInitial] [I] = 1;
    }

  Serial.print("Nbr Aiguillage : ");
  Serial.print(NbrAiguillage);
  Serial.print(" Nbr Senario : ");
  Serial.println(NbrSenario);

    for (Senario = 0 ; Senario < NbrSenario ; Senario++)
    {
      for (Aiguillage = 0 ; Aiguillage < NbrAiguillage ; Aiguillage++)
        {
          Serial.print(" S ");
          Serial.print(Senario);
          Serial.print(" A ");
          Serial.print(Aiguillage);
          Serial.print(" SenarioActif ");
          Serial.print(SenarioActif[Senario][Aiguillage]);
          Serial.print(" ProgSenario ");
          Serial.print(ProgSenario[Senario][Aiguillage]);
         
        }
      Serial.println();
    }

 Serial.println(" Debut ");
}
//-------------------------------------------------------------------  -------------------------------------------------------------------
void loop()
{
  for (Senario = 0 ; Senario < NbrSenario ; Senario++)
    {
      for (Aiguillage = 0 ; Aiguillage < NbrAiguillage ; Aiguillage++)
        {
        ClignotementLed ();
        SenarioMouvementServo ();
        ActionBouton ();
        }
    }
}
//-------------------------------------------------------------------  -------------------------------------------------------------------
void ClignotementLed ()
{   
  if (SenarioActif [Senario] [Aiguillage] == 1 and (millis() - MillisClignotementLed [Senario] >= TempsClignotementLed))
    {
      digitalWrite(PinOutLed [Senario] , !digitalRead(PinOutLed [Senario]));
      MillisClignotementLed [Senario] = millis();     
    }
}
//-------------------------------------------------------------------  -------------------------------------------------------------------
void ActionBouton ()
{
  if (digitalRead(PinInBouton [Senario]) == HIGH)
    {
    for (int I = 0 ; I < NbrAiguillage ; I++)
      {
        SenarioActif [Senario] [I] = 1;
      }
    if (Senario&1)
      {
      for (int I = 0 ; I < NbrAiguillage ; I++)
        {
        SenarioActif [(Senario - 1)] [I] = 0;
        }
      digitalWrite(PinOutLed [(Senario - 1)] , LOW);
      }
    else
      {
      for (int I = 0 ; I < NbrAiguillage ; I++)
        {
        SenarioActif [(Senario + 1)] [I] = 0;
        }
      digitalWrite(PinOutLed [(Senario + 1)] , LOW);
      }       
    }
}
//-------------------------------------------------------------------  -------------------------------------------------------------------
void SenarioMouvementServo ()
{
  if (SenarioActif[Senario][Aiguillage] == 1 and ProgSenario[Senario][Aiguillage] != 0 and (millis() - MillisAiguillage[Aiguillage] >= TempsAiguillage))
    {
      Serial.print(" S ");
      Serial.print(Senario);
      Serial.print(" A ");
      Serial.print(Aiguillage);
      Serial.print(" = ");
      Serial.print(ProgSenario[Senario][Aiguillage]);
      if (ProgSenario[Senario][Aiguillage] == 1 and AngleActuel[Aiguillage] < AngleVoieA[Aiguillage])
        {
          Serial.print(" + ");
          AngleActuel[Aiguillage] = AngleActuel[Aiguillage]+1;
          digitalWrite(PinOutServo[Aiguillage], HIGH);               //active le servomoteur
          delayMicroseconds(((AngleActuel[Aiguillage]*10) + 600));  //pause en microseconde
          digitalWrite(PinOutServo[Aiguillage], LOW);              //désactive le servomoteur           
        }
      else
        {
          Serial.print(" /+ ");
        }
      if (ProgSenario[Senario][Aiguillage] == 2 and AngleActuel[Aiguillage] > AngleVoieB[Aiguillage])
        {
          Serial.print(" - ");
          AngleActuel[Aiguillage] = AngleActuel[Aiguillage]-1;
          digitalWrite(PinOutServo[Aiguillage], HIGH);               //active le servomoteur
          delayMicroseconds(((AngleActuel[Aiguillage]*10) + 600));  //pause en microseconde
          digitalWrite(PinOutServo[Aiguillage], LOW);              //désactive le servomoteur             
        }
      else
        {
          Serial.print(" /- ");
        }
      if ((ProgSenario[Senario] [Aiguillage] == 1 and AngleActuel[Aiguillage] == AngleVoieA[Aiguillage]) or (ProgSenario[Senario] [Aiguillage] == 2 and AngleActuel[Aiguillage] == AngleVoieB[Aiguillage]))
        {
          Serial.println(" ° ");
          for (int I = 0 ; I < NbrAiguillage ; I++)
            {
              SenarioActif [Senario] [I] = 0;
            }
          digitalWrite(PinOutLed [Senario] , HIGH);   
        }
      else
        {
          Serial.print(" /° ");     
        }
      MillisAiguillage [Aiguillage] = millis();     
    }
 
}
//-------------------------------------------------------------------  -------------------------------------------------------------------
Titre: Re : Bonjour a tous
Posté par: Dominique le mars 25, 2020, 09:00:01 pm
Bonjour et Bienvenue,

Je vous conseille de lire et d’appliquer l’article :
 http://www.locoduino.org/spip.php?article25 (http://www.locoduino.org/spip.php?article25)

À bientôt
Dominique
Titre: Re : Bonjour a tous
Posté par: CATPLUS le mars 26, 2020, 05:31:42 am
Bonjour

Tout ce qui se trouve  sur ce forum est à la disposition de chacun.

Titre: Re : Bonjour a tous
Posté par: Jean-Luc le mars 26, 2020, 07:48:50 am
Bonjour,

Quelle est la justification pour bricoler à la main les PWM des servos plutôt que d’utiliser la bibliothèque adéquate ?

Comment sont alimlentés les servos ?
Titre: Re : Bonjour a tous
Posté par: sebastien le mars 26, 2020, 08:40:14 am
Merci pour votre accueille, Pourquoi je n’utilise pas la bibliothèque, pouvoir les faire fonctionner tous en même temps. Pour l'alimentation ces une alimentation stabiliser 5V
Titre: Re : Re : Bonjour a tous
Posté par: Jean-Luc le mars 26, 2020, 08:43:12 am
Pourquoi je n’utilise pas la bibliothèque, pouvoir les faire fonctionner tous en même temps.

Je ne vois toujours pas ...

Quelle caractéristique de la bibliothèque Servo empêche qu'ils « fonctionnent tous en même temps » ?

Citer
Pour l'alimentation ces une alimentation stabiliser 5V

Quelle puissance ?
Titre: Re : Bonjour a tous
Posté par: sebastien le mars 26, 2020, 08:59:33 am
Alimentation de labo intensité 10A tension 0-60V. Avec La libraire l'utilisation de millis() pour simuler du multitâche. Pour faire bouger tous les servos en mème temps été catastrophique (mouvement été aléatoire).
Titre: Re : Bonjour a tous
Posté par: Jean-Luc le mars 26, 2020, 09:24:29 am
J'ai fait des tas de mouvement « en même temps » avec cette bibliothèque sans la moindre catastrophe.

https://youtu.be/bMmDTduT-N8?t=106
Titre: Re : Bonjour a tous
Posté par: Tony04 le mars 26, 2020, 01:36:40 pm
Bonjour Sébastien,

pour utiliser plusieurs servos avec la librairie servo, as-tu essayé les instructions suivantes:

Dans les déclarations
#include <Servo.h>

Servo myservo1;  // on déclare un premier servo
Servo myservo2;  // on déclare un second servo
Servo myservo3;  // on déclare un troisième servo

Et dans le setup
  myservo1.attach(2);  // pin 2 pour le premier servo
  myservo2.attach(3);  // pin 3 pour le second
  myservo3.attach(4);  // pin 4 pour le troisième

Dans le loop il te reste à faire ceci
    myservo1.write(angle);  // où angle sera une valeur de 0 à 180
    myservo2.write(angle); 
    myservo3.write(angle);

Si tu as fais comme cela je ne vois pas pourquoi cela ne fonctionne pas chez toi.

Cordialement
Antoine

Titre: Re : Bonjour a tous
Posté par: sebastien le mars 30, 2020, 12:15:13 am
j'ai trouvé mon erreur mes boucles For ont l'a même variable i. Merci à vous.