LOCODUINO
Discussions Générales => Présentez vous ! => Discussion démarrée 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();
}
}
//------------------------------------------------------------------- -------------------------------------------------------------------
-
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
-
Bonjour
Tout ce qui se trouve sur ce forum est à la disposition de chacun.
-
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 ?
-
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
-
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 » ?
Pour l'alimentation ces une alimentation stabiliser 5V
Quelle puissance ?
-
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).
-
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
-
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
-
j'ai trouvé mon erreur mes boucles For ont l'a même variable i. Merci à vous.