C'est ce tableau qui contient le temps de fonctionnement et la vitesse du moteur, je te passerai, en fin de soirée, une version intermédiaire qui as les temps de fonctionnement fonctionnels.
Oui, CHATGPT, est bluffant.
A+
jpbbricole
C'est ce tableau qui contient le temps de fonctionnement et la vitesse du moteur, je te passerai, en fin de soirée, une version intermédiaire qui as les temps de fonctionnement fonctionnels.
Oui, CHATGPT, est bluffant.
A+
jpbbricole
Bonsoir
Voici une version avec temporisations afin de mieux comprendre le tableau mot1TimeSpeed[]
.
C'est aussi uniquement visuel ne concerne que le moteur 1.
Il y a des informations dans le moniteur:
Commande moteurs LEGO
Bouton moteur 1 monter A
Etat passe de Stop a Monter A
Vitesse : 100
Temps : 5000
Etat passe de Monter A a Stop
Bouton moteur 1 Monter B
Etat passe de Stop a Monter B
Vitesse : 255
Temps : 3000
Etat passe de Monter B a Stop
Bouton moteur 1 descendre A
Etat passe de Stop a Descendre A
Vitesse : 200
Temps : 7000
Etat passe de Descendre A a Stop
Le programme:
/*
Name: AF_djsava_MoteurLego.ino
Created: 01.06.2024
Author: jpbbricole/djsava
https://forum.arduino.cc/t/projet-lego-via-controleur/1264682
https://www.sugarbug.fr/index.php/tutos-lego/piloter-vos-moteurs-lego-avec-un-arduino-1
*/
#include <OneButton.h> // https://github.com/mathertel/OneButton
//------------------------------------- Boutons
const int btnMot1UpPin = 6;
const int btnMot1DownpPin = 7;
// Les boutons sont initialisés à true, actifs à LOW donc câblés, d'un côté à GND
OneButton btnMot1Up(btnMot1UpPin, true); // https://github.com/mathertel/OneButton#initialize-a-button-to-gnd
OneButton btnMot1Down(btnMot1DownpPin, true);
//------------------------------------- Moteur 1
const String mot1EtatLabel[] = {"Stop", "Monter A", "Monter B", "Descendre A", "Descendre B"};
enum mot1EtatIndex {mot1EtatStop, mot1EtatUpA, mot1EtatUpB, mot1EtatDownA, mot1EtatDownB};
int mot1EtatEnCours = mot1EtatStop; // Moteur à l'arrêt
struct mot1TimeSpeedDef // Définition des paramètres temps et vitesse du moteur 1, suivant l'état
{
const unsigned long Time; // Temps de fonctionnement
const int speed; // Vitesse du moteur (0-255)
};
mot1TimeSpeedDef mot1TimeSpeed[] = // Temps et vitesse du moteur 1 en fonction de l'état du moteur
{
// mot1EtatStop mot1EtatUpClick mot1EtatUpClickL mot1EtatDownClick mot1EtatDownClickL
{0, 0}, {5000, 100}, {3000, 255}, {7000, 200}, {5000, 200}
};
unsigned long mot1RunTempo; // Temps de fonctionnement
unsigned long mot1RunMillis; // Temps de fonctionnement, chrono
void setup()
{
Serial.begin(115200);
btnMot1Up.attachClick(btnMot1UpClick);
btnMot1Up.attachDuringLongPress(btnMot1UpClickLong);
btnMot1Up.setLongPressIntervalMs(1000); // 1 seconde pour click long
btnMot1Down.attachClick(btnMot1DownClick);
btnMot1Down.attachDuringLongPress(btnMot1DownClickLong);
btnMot1Down.setLongPressIntervalMs(1000); // 1 seconde pour click long
Serial.println(F("Commande moteurs LEGO"));
}
void loop()
{
btnMot1Up.tick();
btnMot1Down.tick();
if (mot1RunMillis != 0 && (millis() - mot1RunMillis >= mot1RunTempo)) // Si fin cycle
{
mot1Start(mot1EtatStop); // Arrêter le moteur
}
}
//------------------------------------- Bouton moteur 1 UP
void btnMot1UpClick() // Que faire quand le bouton du moteur 1 a été cliqué
{
Serial.println(F("\nBouton moteur 1 monter A"));
mot1EtatChange(mot1EtatUpA);
mot1Start(mot1EtatUpA);
mot1AfficheParametres(mot1EtatEnCours);
}
void btnMot1UpClickLong() // Que faire quand le bouton du moteur 1 a été pressé 1 seconde
{
Serial.println(F("\nBouton moteur 1 Monter B"));
mot1EtatChange(mot1EtatUpB);
mot1Start(mot1EtatUpB);
mot1AfficheParametres(mot1EtatEnCours);
}
//------------------------------------- Bouton moteur 1 Down
void btnMot1DownClick() // Que faire quand le bouton du moteur 1 a été cliqué
{
Serial.println(F("\nBouton moteur 1 descendre A"));
mot1EtatChange(mot1EtatDownA);
mot1Start(mot1EtatDownA);
mot1AfficheParametres(mot1EtatEnCours);
}
void btnMot1DownClickLong() // Que faire quand le bouton du moteur 1 a été pressé 1 seconde
{
Serial.println(F("\nBouton moteur 1 Descendre B"));
mot1EtatChange(mot1EtatDownB);
mot1Start(mot1EtatDownB);
mot1AfficheParametres(mot1EtatEnCours);
}
//------------------------------------- Moteur 1
void mot1Start(int etat)
{
if (etat != mot1EtatStop)
{
mot1RunTempo = mot1TimeSpeed[etat].Time;
mot1RunMillis = millis(); // Démarrage du chrono
}
else
{
mot1RunMillis = 0;
mot1EtatChange(mot1EtatStop);
}
}
void mot1EtatChange(int EtatNew) //
{
Serial.print("Etat passe de " + mot1EtatLabel[mot1EtatEnCours]);
mot1EtatEnCours = EtatNew; // Enregistrement du nouvel etat
Serial.println(" a " + mot1EtatLabel[mot1EtatEnCours]);
}
void mot1AfficheParametres(int motEtat)
{
Serial.println("\tVitesse : " +String(mot1TimeSpeed[motEtat].speed));
Serial.println("\tTemps : " + String(mot1TimeSpeed[motEtat].Time));
}
Demain, las version complète avec L298, 2 moteurs et accélérations pour le moteur 2.
Bonne nuit.
jpbbricole
Bonjour djsava
Voila la version avec 2 moteurs opérationnels, ces 2 moteurs sont complétement indépendants.
Dans cette version, les boutons, par moteur, sont prioritaires, c'est à dire que s'il y a une fonction en cours sur ce moteur, la pression d'un bouton annule la fonction en cours. Ca peut facilement être changé.
Pour le moteur 2, la progressivité se règle avec la variable mot2AccelTempo
, je te laisse découvrir le reste et poser les bonnes questions
Le schéma se trouve dans le brochage du programme, tout les boutons et commutateur(s) sont câblés, d'un côté à GND, technique du PULLUP.
Amuses toi bien
Le programme:
/*
Name: AF_djsava_MoteurLegoL298Mot2.ino
Created: 02.06.2024 12:12:36
Author: jpbbricole/djsava
https://forum.arduino.cc/t/projet-lego-via-controleur/1264682
https://www.sugarbug.fr/index.php/tutos-lego/piloter-vos-moteurs-lego-avec-un-arduino-1
03.06.2024 Première version à 2 moteurs #23
*/
#include <OneButton.h> // https://github.com/mathertel/OneButton
#include <L298N.h> // https://github.com/AndreaLombardo/L298N
//------------------------------------- Boutons
const int btnMot1UpPin = 6;
const int btnMot1DownpPin = 7;
const int btnMot2StartPin = 4;
const int btnMot2StopPin = 5;
const int mot2SwAvArrPin = 3; // Switch d'inversion de sens
const int mot2SwAvEtatOn = LOW; // Etat quand actif
// Les boutons sont initialisés à true, actifs à LOW donc câblés, d'un côté à GND
OneButton btnMot1Up(btnMot1UpPin, true); // https://github.com/mathertel/OneButton#initialize-a-button-to-gnd
OneButton btnMot1Down(btnMot1DownpPin, true);
OneButton btnMot2Start(btnMot2StartPin, true);
OneButton btnMot2Stop(btnMot2StopPin, true);
//------------------------------------- LED
const int mot2LedAvPin = A1; // LED marche avant
const int mot2LedArPin = A2; // LED marche arrière
const int mot2LedEtatOn = HIGH; // Etat pour allumer la LED
//------------------------------------- Moteur 1
const String mot1EtatLabel[] = {"Stop", "Monter A", "Monter B", "Descendre A", "Descendre B"};
enum mot1EtatIndex {mot1EtatStop, mot1EtatUpA, mot1EtatUpB, mot1EtatDownA, mot1EtatDownB};
int mot1EtatEnCours = mot1EtatStop; // Moteur à l'arrêt
struct mot1TimeSpeedDef // Définition des paramètres temps et vitesse du moteur 1, suivant l'état
{
const unsigned long Time; // Temps de fonctionnement
const int speed; // Vitesse du moteur (0-255)
};
mot1TimeSpeedDef mot1TimeSpeed[] = // Temps et vitesse du moteur 1 en fonction de l'état du moteur
{
// mot1EtatStop mot1EtatUpClick mot1EtatUpClickL mot1EtatDownClick mot1EtatDownClickL
{0, 0}, {5000, 100}, {3000, 255}, {7000, 200}, {5000, 80}
};
const int mot1DrvEna = 11; // Signal ENA du L298
const int mot1DrvIn1 = 12; // Signal IN1 du L298
const int mot1DrvIn2 = 13; // Signal IN2 du L298
L298N mot1(mot1DrvEna, mot1DrvIn1, mot1DrvIn2);
unsigned long mot1RunTempo; // Temps de fonctionnement
unsigned long mot1RunMillis; // Temps de fonctionnement, chrono
//------------------------------------- Moteur 2
const int mot2DrvEnb = 9; // Signal ENB du L298
const int mot2DrvIn4 = 8; // Signal IN1 du L298
const int mot2DrvIn3 = 10; // Signal IN2 du L298
L298N mot2(mot2DrvEnb, mot2DrvIn4, mot2DrvIn3);
const String mot2EtatLabel[] = {"Stop", "En marche", "En arret"};
enum mot2EtatIndex {mot2EtatStop, mot2EtatEnMarche, mot2EtatEnArret};
int mot2EtatEnCours = mot2EtatStop; // Moteur à l'arrêt
const int mot2SpeedPotPin = A0; // Réglage de la vitesse
int mot2Speed = 0; // Vitesse actuelle
const int mot2SpeedMinimum = 40;
boolean mot2MarcheAvant = true; // Sens de marche
const unsigned long mot2AccelTempo = 125; // Accélération scan toutes les xxx millisecondes
unsigned long mot2AccelMillis = millis(); // Accélération scan toutes les xxx millisecondes, chrono
void setup()
{
Serial.begin(115200);
//--------------------------------- Boutons moteur 1
btnMot1Up.attachClick(btnMot1UpClick);
btnMot1Up.attachDuringLongPress(btnMot1UpClickLong);
btnMot1Up.setLongPressIntervalMs(1000); // 1 seconde pour click long
btnMot1Down.attachClick(btnMot1DownClick);
btnMot1Down.attachDuringLongPress(btnMot1DownClickLong);
btnMot1Down.setLongPressIntervalMs(1000); // 1 seconde pour click long
//--------------------------------- Boutons moteur 2
btnMot2Start.attachClick(btnMot2StartClick);
btnMot2Stop.attachClick(btnMot2StopClick);
pinMode(mot2LedAvPin, OUTPUT);
digitalWrite(mot2LedAvPin, !mot2LedEtatOn); // Eteindre la LED
pinMode(mot2LedArPin, OUTPUT);
digitalWrite(mot2LedArPin, !mot2LedEtatOn); // Eteindre la LED
pinMode(mot2SwAvArrPin, INPUT_PULLUP); // Interrupteur Av/Arr, d'un côté à GND
Serial.println(F("Commande moteurs LEGO"));
}
void loop()
{
btnMot1Up.tick();
btnMot1Down.tick();
btnMot2Start.tick();
btnMot2Stop.tick();
//Serial.println(analogRead(mot2SpeedPotPin));
// Temporisation de fonctionnement du moteur 1
if (mot1RunMillis != 0 && (millis() - mot1RunMillis >= mot1RunTempo)) // Si fin cycle
{
mot1EtatChange(mot1EtatStop); // Arrêter le moteur
}
mot2SensDeMarche();
if (mot2EtatEnCours == mot2EtatEnMarche) // Moteur 2 en accélération
{
int speedPot = map(analogRead(mot2SpeedPotPin), 0, 1023, 0, 255);
if (millis() - mot2AccelMillis >= mot2AccelTempo) // Si moment d'accélérer
{
if (mot2Speed < speedPot) // Si doit accélérer
{
mot2Speed ++;
}
if (speedPot < mot2Speed) // Si le pot a été baissé
{
mot2Speed = speedPot;
}
mot2Marche();
mot2AccelMillis = millis(); // Redémarrage du chrono
}
}
if (mot2EtatEnCours == mot2EtatEnArret) // Moteur 2 en décélération
{
if (millis() - mot2AccelMillis >= mot2AccelTempo) // Si moment de décélérer
{
if (mot2Speed > mot2SpeedMinimum) // Si doit encore ralentir
{
mot2Speed --;
mot2Marche();
}
else
{
mot2Speed = 0;
mot2Marche();
}
mot2AccelMillis = millis(); // Redémarrage du chrono
}
}
}
//------------------------------------- Bouton moteur 1 UP
void btnMot1UpClick() // Que faire quand le bouton du moteur 1 a été cliqué
{
Serial.println(F("\nBouton moteur 1 monter A"));
mot1EtatChange(mot1EtatUpA);
}
void btnMot1UpClickLong() // Que faire quand le bouton du moteur 1 a été pressé 1 seconde
{
Serial.println(F("\nBouton moteur 1 Monter B"));
mot1EtatChange(mot1EtatUpB);
}
//------------------------------------- Bouton moteur 1 Down
void btnMot1DownClick() // Que faire quand le bouton du moteur 1 a été cliqué
{
Serial.println(F("\nBouton moteur 1 descendre A"));
mot1EtatChange(mot1EtatDownA);
}
void btnMot1DownClickLong() // Que faire quand le bouton du moteur 1 a été pressé 1 seconde
{
Serial.println(F("\nBouton moteur 1 Descendre B"));
mot1EtatChange(mot1EtatDownB);
}
//------------------------------------- Moteur 1
void mot1Start(int etat)
{
if (etat != mot1EtatStop)
{
mot1.setSpeed(mot1TimeSpeed[etat].speed);
if (etat == mot1EtatUpA || etat == mot1EtatUpB)
{
mot1.forward();
}
else
{
mot1.backward();
}
mot1RunTempo = mot1TimeSpeed[etat].Time;
mot1RunMillis = millis(); // Démarrage du chrono
}
else
{
mot1RunMillis = 0;
mot1.stop();
}
}
void mot1EtatChange(int EtatNew) //
{
Serial.print("Mot 1 Etat passe de " + mot1EtatLabel[mot1EtatEnCours]);
Serial.println(" a " + mot1EtatLabel[EtatNew]);
mot1EtatEnCours = EtatNew; // Enregistrement du nouvel etat
mot1AfficheParametres(mot1EtatEnCours);
mot1Start(mot1EtatEnCours);
}
void mot1AfficheParametres(int motEtat)
{
Serial.println("\tVitesse : " +String(mot1TimeSpeed[motEtat].speed));
Serial.println("\tTemps : " + String(mot1TimeSpeed[motEtat].Time));
}
//------------------------------------- Moteur 2
void mot2Marche()
{
mot2.setSpeed(mot2Speed);
if (mot2Speed != 0)
{
if (mot2MarcheAvant)
{
mot2.forward();
}
else
{
mot2.backward();
}
}
else
{
mot2.stop();
mot2EtatChange(mot2EtatStop);
}
}
void mot2SensDeMarche()
{
if (digitalRead(mot2SwAvArrPin) == mot2SwAvEtatOn) // Si switch en position avant
{
digitalWrite(mot2LedAvPin, mot2LedEtatOn); // Allumer la LED avant
digitalWrite(mot2LedArPin, !mot2LedEtatOn); // Eteindre la LED arrière
mot2MarcheAvant = true;
}
else
{
digitalWrite(mot2LedAvPin, !mot2LedEtatOn); // Eteindre la LED avant
digitalWrite(mot2LedArPin, mot2LedEtatOn); // Allumer la LED arrière
mot2MarcheAvant = false;
}
}
void btnMot2StartClick() // Que faire quand le bouton start du moteur 2 a été cliqué
{
Serial.println(F("\nBouton moteur 2 En marche"));
mot2Speed = mot2SpeedMinimum;
mot2EtatChange(mot2EtatEnMarche);
}
void btnMot2StopClick() // Que faire quand le bouton stop du moteur 2 a été cliqué
{
Serial.println(F("\nBouton moteur 2 En arret"));
mot2EtatChange(mot2EtatEnArret);
}
void mot2EtatChange(int EtatNew) //
{
Serial.print("Mot2 Etat passe de " + mot2EtatLabel[mot2EtatEnCours]);
Serial.println(" a " + mot2EtatLabel[EtatNew]);
mot2EtatEnCours = EtatNew; // Enregistrement du nouvel etat
}
Le montage du développement:
Bonne et belle journée à toi!
jpbbricole
Salut jpb
Un grand merci à toi, j'ai hâte de tester tout ça cet aprem et je te dis ce qu'il en est dans la soirée.
J'aurais aimé te montrer le rendu en vidéo mais le manège est démonté.
Peut être je testerais sur un autre qui ne répond pas aux mêmes configurations mais le principal c'est le rendu
Merci encore bonne journée à toi
Bon alors j'ai un souci, mon ESP32 ne répond à rien, il n'arrive pas à communiquer avec le PC alors que j'ai installé iBeacon hier sur un autre nickel.
Je pense que certains ESP32 ont le problème du boot que j'ai vu ici
Voici mon ESP32 - WROOM-32D
Voici le code que j'ai adapté à celui-ci. La compilation se fait bien sans erreur cependant mon IDE me sort : Failed to connect to ESP32: No serial data received.
/*
Name: AF_djsava_MoteurLegoL298Mot2.ino
Created: 02.06.2024 12:12:36
Author: jpbbricole/djsava
https://forum.arduino.cc/t/projet-lego-via-controleur/1264682
https://www.sugarbug.fr/index.php/tutos-lego/piloter-vos-moteurs-lego-avec-un-arduino-1
03.06.2024 Première version à 2 moteurs #23
*/
#include <OneButton.h> // https://github.com/mathertel/OneButton
#include <L298N.h> // https://github.com/AndreaLombardo/L298N
//------------------------------------- Boutons
const int btnMot1UpPin = 14;
const int btnMot1DownpPin = 27;
const int btnMot2StartPin = 4;
const int btnMot2StopPin = 5;
const int mot2SwAvArrPin = 15; // Switch d'inversion de sens
const int mot2SwAvEtatOn = LOW; // Etat quand actif
// Les boutons sont initialisés à true, actifs à LOW donc câblés, d'un côté à GND
OneButton btnMot1Up(btnMot1UpPin, true); // https://github.com/mathertel/OneButton#initialize-a-button-to-gnd
OneButton btnMot1Down(btnMot1DownpPin, true);
OneButton btnMot2Start(btnMot2StartPin, true);
OneButton btnMot2Stop(btnMot2StopPin, true);
//------------------------------------- LED
const int mot2LedAvPin = 34; // LED marche avant
const int mot2LedArPin = 32; // LED marche arrière
const int mot2LedEtatOn = HIGH; // Etat pour allumer la LED
//------------------------------------- Moteur 1
const String mot1EtatLabel[] = {"Stop", "Monter A", "Monter B", "Descendre A", "Descendre B"};
enum mot1EtatIndex {mot1EtatStop, mot1EtatUpA, mot1EtatUpB, mot1EtatDownA, mot1EtatDownB};
int mot1EtatEnCours = mot1EtatStop; // Moteur à l'arrêt
struct mot1TimeSpeedDef // Définition des paramètres temps et vitesse du moteur 1, suivant l'état
{
const unsigned long Time; // Temps de fonctionnement
const int speed; // Vitesse du moteur (0-255)
};
mot1TimeSpeedDef mot1TimeSpeed[] = // Temps et vitesse du moteur 1 en fonction de l'état du moteur
{
// mot1EtatStop mot1EtatUpClick mot1EtatUpClickL mot1EtatDownClick mot1EtatDownClickL
{0, 0}, {5000, 100}, {3000, 255}, {7000, 200}, {5000, 80}
};
const int mot1DrvEna = 19; // Signal ENA du L298
const int mot1DrvIn1 = 12; // Signal IN1 du L298
const int mot1DrvIn2 = 13; // Signal IN2 du L298
L298N mot1(mot1DrvEna, mot1DrvIn1, mot1DrvIn2);
unsigned long mot1RunTempo; // Temps de fonctionnement
unsigned long mot1RunMillis; // Temps de fonctionnement, chrono
//------------------------------------- Moteur 2
const int mot2DrvEna = 18; // Signal ENA du L298
const int mot2DrvIn4 = 26; // Signal IN1 du L298
const int mot2DrvIn3 = 25; // Signal IN2 du L298
L298N mot2(mot2DrvEna, mot2DrvIn4, mot2DrvIn3);
const String mot2EtatLabel[] = {"Stop", "En marche", "En arret"};
enum mot2EtatIndex {mot2EtatStop, mot2EtatEnMarche, mot2EtatEnArret};
int mot2EtatEnCours = mot2EtatStop; // Moteur à l'arrêt
const int mot2SpeedPotPin = 36; // Réglage de la vitesse
int mot2Speed = 0; // Vitesse actuelle
const int mot2SpeedMinimum = 40;
boolean mot2MarcheAvant = true; // Sens de marche
const unsigned long mot2AccelTempo = 125; // Accélération scan toutes les xxx millisecondes
unsigned long mot2AccelMillis = millis(); // Accélération scan toutes les xxx millisecondes, chrono
void setup()
{
Serial.begin(115200);
//--------------------------------- Boutons moteur 1
btnMot1Up.attachClick(btnMot1UpClick);
btnMot1Up.attachDuringLongPress(btnMot1UpClickLong);
btnMot1Up.setLongPressIntervalMs(1000); // 1 seconde pour click long
btnMot1Down.attachClick(btnMot1DownClick);
btnMot1Down.attachDuringLongPress(btnMot1DownClickLong);
btnMot1Down.setLongPressIntervalMs(1000); // 1 seconde pour click long
//--------------------------------- Boutons moteur 2
btnMot2Start.attachClick(btnMot2StartClick);
btnMot2Stop.attachClick(btnMot2StopClick);
pinMode(mot2LedAvPin, OUTPUT);
digitalWrite(mot2LedAvPin, !mot2LedEtatOn); // Eteindre la LED
pinMode(mot2LedArPin, OUTPUT);
digitalWrite(mot2LedArPin, !mot2LedEtatOn); // Eteindre la LED
pinMode(mot2SwAvArrPin, INPUT_PULLUP); // Interrupteur Av/Arr, d'un côté à GND
Serial.println(F("Commande moteurs LEGO"));
}
void loop()
{
btnMot1Up.tick();
btnMot1Down.tick();
btnMot2Start.tick();
btnMot2Stop.tick();
//Serial.println(analogRead(mot2SpeedPotPin));
// Temporisation de fonctionnement du moteur 1
if (mot1RunMillis != 0 && (millis() - mot1RunMillis >= mot1RunTempo)) // Si fin cycle
{
mot1EtatChange(mot1EtatStop); // Arrêter le moteur
}
mot2SensDeMarche();
if (mot2EtatEnCours == mot2EtatEnMarche) // Moteur 2 en accélération
{
int speedPot = map(analogRead(mot2SpeedPotPin), 0, 1023, 0, 255);
if (millis() - mot2AccelMillis >= mot2AccelTempo) // Si moment d'accélérer
{
if (mot2Speed < speedPot) // Si doit accélérer
{
mot2Speed ++;
}
if (speedPot < mot2Speed) // Si le pot a été baissé
{
mot2Speed = speedPot;
}
mot2Marche();
mot2AccelMillis = millis(); // Redémarrage du chrono
}
}
if (mot2EtatEnCours == mot2EtatEnArret) // Moteur 2 en décélération
{
if (millis() - mot2AccelMillis >= mot2AccelTempo) // Si moment de décélérer
{
if (mot2Speed > mot2SpeedMinimum) // Si doit encore ralentir
{
mot2Speed --;
mot2Marche();
}
else
{
mot2Speed = 0;
mot2Marche();
}
mot2AccelMillis = millis(); // Redémarrage du chrono
}
}
}
//------------------------------------- Bouton moteur 1 UP
void btnMot1UpClick() // Que faire quand le bouton du moteur 1 a été cliqué
{
Serial.println(F("\nBouton moteur 1 monter A"));
mot1EtatChange(mot1EtatUpA);
}
void btnMot1UpClickLong() // Que faire quand le bouton du moteur 1 a été pressé 1 seconde
{
Serial.println(F("\nBouton moteur 1 Monter B"));
mot1EtatChange(mot1EtatUpB);
}
//------------------------------------- Bouton moteur 1 Down
void btnMot1DownClick() // Que faire quand le bouton du moteur 1 a été cliqué
{
Serial.println(F("\nBouton moteur 1 descendre A"));
mot1EtatChange(mot1EtatDownA);
}
void btnMot1DownClickLong() // Que faire quand le bouton du moteur 1 a été pressé 1 seconde
{
Serial.println(F("\nBouton moteur 1 Descendre B"));
mot1EtatChange(mot1EtatDownB);
}
//------------------------------------- Moteur 1
void mot1Start(int etat)
{
if (etat != mot1EtatStop)
{
mot1.setSpeed(mot1TimeSpeed[etat].speed);
if (etat == mot1EtatUpA || etat == mot1EtatUpB)
{
mot1.forward();
}
else
{
mot1.backward();
}
mot1RunTempo = mot1TimeSpeed[etat].Time;
mot1RunMillis = millis(); // Démarrage du chrono
}
else
{
mot1RunMillis = 0;
mot1.stop();
}
}
void mot1EtatChange(int EtatNew) //
{
Serial.print("Mot 1 Etat passe de " + mot1EtatLabel[mot1EtatEnCours]);
Serial.println(" a " + mot1EtatLabel[EtatNew]);
mot1EtatEnCours = EtatNew; // Enregistrement du nouvel etat
mot1AfficheParametres(mot1EtatEnCours);
mot1Start(mot1EtatEnCours);
}
void mot1AfficheParametres(int motEtat)
{
Serial.println("\tVitesse : " +String(mot1TimeSpeed[motEtat].speed));
Serial.println("\tTemps : " + String(mot1TimeSpeed[motEtat].Time));
}
//------------------------------------- Moteur 2
void mot2Marche()
{
mot2.setSpeed(mot2Speed);
if (mot2Speed != 0)
{
if (mot2MarcheAvant)
{
mot2.forward();
}
else
{
mot2.backward();
}
}
else
{
mot2.stop();
mot2EtatChange(mot2EtatStop);
}
}
void mot2SensDeMarche()
{
if (digitalRead(mot2SwAvArrPin) == mot2SwAvEtatOn) // Si switch en position avant
{
digitalWrite(mot2LedAvPin, mot2LedEtatOn); // Allumer la LED avant
digitalWrite(mot2LedArPin, !mot2LedEtatOn); // Eteindre la LED arrière
mot2MarcheAvant = true;
}
else
{
digitalWrite(mot2LedAvPin, !mot2LedEtatOn); // Eteindre la LED avant
digitalWrite(mot2LedArPin, mot2LedEtatOn); // Allumer la LED arrière
mot2MarcheAvant = false;
}
}
void btnMot2StartClick() // Que faire quand le bouton start du moteur 2 a été cliqué
{
Serial.println(F("\nBouton moteur 2 En marche"));
mot2Speed = mot2SpeedMinimum;
mot2EtatChange(mot2EtatEnMarche);
}
void btnMot2StopClick() // Que faire quand le bouton stop du moteur 2 a été cliqué
{
Serial.println(F("\nBouton moteur 2 En arret"));
mot2EtatChange(mot2EtatEnArret);
}
void mot2EtatChange(int EtatNew) //
{
Serial.print("Mot2 Etat passe de " + mot2EtatLabel[mot2EtatEnCours]);
Serial.println(" a " + mot2EtatLabel[EtatNew]);
mot2EtatEnCours = EtatNew; // Enregistrement du nouvel etat
}
J'ai commandé des condensateurs, demain je vais essayer avec une autre carte voir même reprendre ton code avec une nano.
Je reviens vers toi, tout fonctionne correctement avec le Nano par contre il y avait une erreur dans ton code à ce niveau :
const int mot2DrvEna = 9; // Signal ENA du L298
const int mot2DrvIn4 = 8; // Signal IN1 du L298
const int mot2DrvIn3 = 10; // Signal IN2 du L298
L298N mot2(mot2DrvEna, mot2DrvIn4, mot2DrvIn3);
J'ai remplacé par mot2DrvEnb et j'ai bien compris que c'était pas bon pour le EnB.
Par contre j'ai quelques soucis avec le potentiomètre il ne semble ne pas fonctionner.
Un oubli de ma part, en effet
const int mot2DrvEnb = 9; // Signal ENB du L298
et
L298N mot2(mot2DrvEnb, mot2DrvIn4, mot2DrvIn3);
As tu bien renseigné cette variable qui est le port de connexion du potentiomètre:
mot2SpeedPotPin
Sur un Nano, en général A0.
A+
Cordialement
jpbbricole
Salut jpb
Je suis bien sur A4 comme dans le code, ça marchait au début, j'ai un fil qui s'est barré et ça marche plus.. Mon potentiomètre est en télémecanique Z1, Z2, et 3.
Je vais refaire tous les branchements et voir ce que ça donne. En tous cas le ChatGPT m'a bien aidé à modifier le code pour interdire la mise en marche du moteur 1 si le moteur 2 tourne. Quand tout fonctionnera comme je veux je mettrais le code final.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.