Bonjour djsava
Voilà un début de solution, cela traite uniquement du moteur 1 et de ses 2 boutons.
Ca utilise la bibliothèque OneButton, j'ai développé ça sur un UNO, à toi d'adapter les ports à ta machine.
Cette version ne fait qu'afficher les divers états du système dans le moniteur, à 115200.
Les 2 boutons sont définis ici:
const int btnMot1UpPin = 6;
const int btnMot1DownpPin = 7;
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));
}
Prochaine étape, si la formule te convient, l'intégration du temps, avec les millis().
Question: est ce qu'une pression d'un bouton peut interrompre l'action en cours ou l'on attend la fin de cette action?
PS: Je vais me "caler" sur ce tuto pour le câblage du L298.
A+
Cordialement
jpbbricole