Projet Lego via Contrôleur

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

1 Like

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

1 Like

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

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

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

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 :wink:
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.