Projet Lego via Contrôleur

Bonjour à tous,

Comme indiqué dans ma présentation, j'ai un projet de commandes Lego via Arduino ESP32 ou autre si conseillé + un module L298N.

Mon but est de commander des moteurs Lego pour des maquettes à l'aide d'un pupitre de commandes.

Je précise également que j'entre dans le L298N avec 9V en 2A, je me servirais donc d'alimenter l'Arduino avec la sortie 5V du L298N en utilisant le jumper.
Les moteurs Lego font 9V. J'ai également à l'intérieur un ESP8266 pour contrôler les lumières via WLED et un bouton supplémentaire, le noir sur la photo (déjà programmé)

J'ai besoin de 2 configurations,

  • Une avec un moteur contrôlé par 2 boutons :
    Simple appui bt1 = Montée du moteur 1 pendant un temps et une vitesse définie
    Appui long bt1 = Montée du moteur 1 en manuel à une vitesse définie
    Simple appui bt21 = Descente du moteur 1 pendant un temps et une vitesse définie
    Appui long bt2 = Descente du moteur 1 en manuel à une vitesse définie

  • L'autre moteur contrôlé par 2 boutons + 1 potentiomètre + 1 inter marche AV/AR et allumage d'une led en fonction du sens de rotation (rouge et verte).
    Simple appui bt3 = Départ du moteur 2 dans le sens sélectionné de la led 1 ou 2.
    Accélérer progressivement avant d'atteindre la vitesse du potentiomètre.
    Simple appui bt4 = Arrêt du moteur 2. Décélérer progressivement avant l'arrêt complet du moteur.
    Led1 (rouge) : Allume la led lorsque l'interrupteur est en position Gauche. Marche Arrière.
    Led2 (verte) : Allume la led lorsque l'interrupteur est en position Droite. Marche Avant.
    Interrupteur Bt5 (2NO) : Gauche : Marche Arrière, allume la Led 1 - Droite : Marche Avant, allume la Led 2
    Potentiomètre Bt6 : Régule la vitesse du moteur 2

J'espère que j'ai été assez clair dans ma demande, à vous de me dire combien ça me coûterait une petite ligne de code comme ceci. Je vous joins une petite photo du projet.

Si on fait affaire j'ai plein d'autres configurations en tête même plus simples genre un appui court = ça démarre, un appui long on accélère, pareil pour s'arrêter, etc..

Personnellement j'y connais pas grand chose dans le langage C, moi je serais plus html et php :wink:

Merci pour vos retours

Je ne suis pas sûre que tu trouves ton bonheur, c'est un forum d'amateur.
Le forum est plutôt orienter à l'aide entre amateur à la conception d'un projet, pas vraiment au service de conception.

Il y a un sujet dans la partie anglaise qui est dédié à cela.

c'est le Jobs and Paid Consultancy forum mais il faut poster en anglais et avoir un cahier des charges plus précis

Merci pour vos réponses, je vais orienter ma demande sur le forum Anglais dans ce cas. J'ai le cahier des charges en .doc

J'ai trouvé quelques tutos pour commander les moteurs mais ça reste quand même vague, si ça peut aider, le principe de fonctionnement est sur ce lien et le fonctionnement du L298N ici, maintenant pour l'adapter à mon projet c'est déjà plus compliqué.
J'arrive déjà pas à configurer 2 boutons à la place de son bouton sensitif. :wink:

@pandaroux007 a posté un petit tuto sur la bibliothèque OneButton

Cette bibliothèque gère pour vous des choses comme appui simple, appui long, double click...

sinon lisez aussi les tutos d'eskimon. c'est une bonne intro générale, vous y verrez les boutons mais aussi Le mouvement grâce aux moteurs - les tutos d'eskimon.

C'est étonnant la plus part du temps, c'est au contraire, car appliqué à un fonctionnement précis.
Par contre il faut mettre les pieds dans le monde Arduino et passer un peu de temps à le découvrir.
L'utilisation théorique est plutôt "simple", le composant implémente un pont en H, qui permet en gros à partir de 2 entrés numérique (EN1 et EN2 pour le moteur A ) de gérer le sens et la vitesse de rotation de ton moteur.
Tu trouveras un nombre incalculable d'articles à ce sujet, un exemple parmi d'autre.

Si tu as le désir de rentrer dans le monde Arduino, tu trouveras ici beaucoup d'aide.
Mais cela réclame forcément un peu de travail et du temps de ta part.

Effectivement c'est une mine d'or.. Merci beaucoup.

Merci c'est justement le tuto que j'ai mis plus haut.
Je vais m'intéresser sur le comportement des boutons car en vrai j'ai compris son code mais j'arrive pas encore à assimiler tout.. Dans son tuto il allume les moteurs quand il appuie sur le bouton. J'ai compris le comportement delay mais c'est pour lui dire un appui tu le démarres un autre appui tu l'arrêtes.

Même les espèces de programmes qui te font les codes j'arrive à rien.. ça s'emboite pas :rofl: :rofl:
if push button1 else 1 moteur tourne, if push button2 else marche avant elsif marche arriere
ce serait plus simple :rofl: :rofl:

comme le php, c'est un peu le même son de cloche

Essayez de nous expliquer ce que doit faire votre programme en détail en français

Bah tout est expliqué plus haut, jusqu'à preuve du contraire c'est français ce que je dis...
Bon apparemment ma femme comprend pas non plus ce que j'ai écris :rofl: :rofl: :rofl:

Le moteur 1 sert à faire monter et descendre le plancher du manège. Comme j'ai pas de capteurs de fin de course, je souhaiterais qu'il se déclenche pendant un temps donné pour pas casser les engrenages quand ça force dessus.
Le moteur 2 gère la partie manège (bras qui tourne ou plateau)

Je reformule :
Suivant le boitier que je vous ai mis en photo, bt1 = flèche en haut, bt2 = flèche en bas, etc...

Moteur 1 :

  • Simple appui sur bt1 = Le moteur 1 tourne dans un sens pendant x secondes à 4 volts au lieu de 9 (petite vitesse)

  • Appui long sur bt1 = Le moteur 1 tourne dans un sens en manuel (là on a pas besoin de lui expliquer qu'il doit tourner pendant x secondes mais on veut garder la petite vitesse)

  • Simple appui sur bt2 = Le moteur 1 tourne dans l'autre sens pendant x secondes à la même vitesse indiquée précédemment.

  • Appui long sur btn2 = Descente du moteur 1 en manuel

Moteur 2 :

  • Simple appui sur btn3 (poussoir vert) = Lance le moteur 2 progressivement dans le sens sélectionné par le btn5 jusqu'à la vitesse du potentiomètre.
    (en gros là encore ce que je souhaite, c'est que le moteur ne se lance pas à fond (si le potar est en vitesse max) dès qu'on appuie sur le btn3 de départ)

  • Simple appui sur le btn4 (poussoir rouge) = Arrête le moteur 2 progressivement (Décélération ou arrêt en roue libre)

  • Interrupteur télémécanique : btn5 = Marche Avant / Marche Arrière (si vous préférez mettre un poussoir à la place ça me va aussi)

  • Potentiomètre btn6 : Régule la vitesse du moteur 2

  • Led1 allumée (rouge) : Marche Arrière.

  • Led2 allumée (verte) : Marche Avant.

Pour simplifier la chose, on peut également rajouter un potentiomètre pour régler la vitesse du moteur 1.

Bon j'espère que je suis clair cette fois :upside_down_face:

Pour programmer les EnA et EnB ça j'ai compris. C'est pour le reste que j'arrive à rien..
Dans les grandes lignes ce tuto explique vraiment bien le processus de base mais pour informer l'arduino ce que je veux faire moi, c'est plus la même limonade.

Bonjour djsava

Oui, pour moi, c'est clair, ton projet m'intéresse, je vais faire un montage pour t'expliquer au mieux, si tu est d'accord :wink:

A+
Cordialement
jpbbricole

Salut jpb
avec grand plaisir.. j'ai vu que tu as pas mal aidé de nombreux membres sur le forum. C'est très gentil de ta part de te poser sur mon projet.

:wink:

pour l'appui long vous voulez dire que tant qu'on tient appuyé ça tourne, c'est ça ?

exactement, comme dans la vidéo du tuto sur les moteurs lego

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

waou merci beaucoup :wink:
je vais tester tout ça ce soir si je peux ou demain dans la journée.

Bonne question ! Dans la vraie vie quand ça arrive on met un coup d'arrêt d'urgence mais là pour le moteur 1 ça n'a pas d'importance si on considère que c'est que pour le plancher..

Sur d'autres maquettes on peut utiliser le même fonctionnement pour les vérins du centre par exemple, dans ce cas là oui c'est important que si le moteur 2 tourne, on ne puisse pas activer le moteur 1 sinon accident.

Bonjour djsava

Quel est le résultat du test?

Est ce que la façon de faire te convient?

J'ai presque terminé la version à 2 moteurs avec accélération et décélération du moteur 2.
Dès que c'est bon, je te l'envoie.

A+
Cordialement
jpbbricole

Salut jpb
Je viens seulement de réussir à communiquer avec mes ESP32.
Je ne savais pas qu'il fallait appuyer sur Boot le temps de la connexion et j'arrivais pas à trouver le bon mode pour un BLE iBeacon afin de percer des trous dans mon mur.

Je vais maintenant me poser sur le projet Lego, je te dis ça dans la soirée.

Est-ce qu'il faut que je renseigne les ports du L298N ?

// Connexion des pins au module Moteur L298N
// moteur gauche (out1-out2)
int enA = 13;
int in1 = 12;
int in2 = 11;
// moteur droite (out3-out4)
int enB = 10;
int in3 = 8;
int in4 = 9;


void setup()
{
  // paramétrage des pins en sortie (OUTPUT)
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enA, OUTPUT);
  analogWrite(enA, 255);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(enB, OUTPUT);
  analogWrite(enB, 255);

}

Parce que là sur le code c'est que pour les boutons ?

Bonjour djsava
Non, cette première version est uniquement "visuelle", elle ne commande rien du tout, il y a uniquement des indications dans le moniteur, à 115200. et ça ne concerne que le moteur 1.
C'est uniquement pour une présentation, voir si ça convient.
Demain, je te passe une version complète avec les 2 moteurs. C'est développé sur un UNO.
A toi d'adapter sur ESP32.

Bonne soirée
Cordialement
jpbbricole

Oui ça me convient tout à fait et quand tu parlais de chatGPT je suis extrêmement bluffé :wink:
Il vient de me créer un programme 2 moteurs 4 boutons avec presque la même chose.

Par contre où est-ce que je règle le temps de montée et descente ?
je comprends pas trop le

// mot1EtatStop   mot1EtatUpClick   mot1EtatUpClickL   mot1EtatDownClick   mot1EtatDownClickL 
	{0, 0},         {2200, 100},       {1000, 255},        {500, 200},         {1200, 200}