Discussions Générales > Présentez vous !

Bonjour a tous

(1/2) > >>

sebastien:
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.  ;) ;)

--- Code: ---//-------------------------------------------------------------------  -------------------------------------------------------------------
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();     
    }
 
}
//-------------------------------------------------------------------  -------------------------------------------------------------------
--- Fin du code ---

Dominique:
Bonjour et Bienvenue,

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

À bientôt
Dominique

CATPLUS:
Bonjour

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

Jean-Luc:
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 ?

sebastien:
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

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique