Ajout d'arrêt de moteurs pas à pas à la deuxième pression d'un bouton poussoir

Bonsoir
Sur un montage comprenant 4 boutons poussoir et deux moteurs pas à pas avec chacun leurs drivers, j'aimerai que le premier bouton fasse faire un pas au premier moteurs à chaque pression, que le deuxième fasse faire un pas aux deuxième moteur, que le troisième fasse faire tourner en même temps les deux moteurs à l'infini dans le sens positif à la première pression et les arrête à la deuxième pression, et que le quatrième bouton fasse la même chose que le troisième mais en faisant tourner les moteurs dans le sens négatif à la première pression.

#include "MTulnStepper.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTbutton.h" // Voir http://arduino.dansetrad.fr/MTobjects

int goutte=500;
int pinBoutonTreize=13;
int pinBoutonQuatre=4;
int pinBoutonTrois=3;
int pinBoutonDeux=2;

const byte pinPotRouge = A1;
const byte pinPotBleu  = A2;

const int minPotRouge = 0;
const int maxPotRouge = 1023;

const int minPotBleu = 0;
const int maxPotBleu = 1023;

// Le moteur mpap1
MTulnStepper mpap1(pin_A1 9, pin_B1 10, pin_A2 11, pin_B2 6, PAS_ENTIERS, 4000 micro_secondes_par_pas);
// Le moteur mpap2
MTulnStepper mpap2(pin_A1 7, pin_B1 8, pin_A2 12, pin_B2 5, PAS_ENTIERS, 4000 micro_secondes_par_pas);


int ratio(int nb1, int nb2) {
  if ((nb1 == 0) && (nb2 == 0)) return 0;
  return (100.0 * nb1) / (nb1 + nb2);
}

void avance(void)
{
  mpap1.move(500);
}
void avance2(void){
  mpap2.move(500);
}

void marcheMpap1(void)
{
  mpap1.move(CONTINUE);
  mpap2.move(CONTINUE);
}

void arretMpap1(void){
  mpap1.stop();
  mpap2.stop();
}

void marcheMpap2(void)
{
  mpap1.move(-CONTINUE);
  mpap2.move(-CONTINUE);
}

void arretMpap2(void){
  mpap1.stop();
  mpap2.stop();
}

MTbutton Bouton(pinBoutonTreize, avance);
MTbutton Bouton2(pinBoutonQuatre, avance2);
MTbutton Bouton3(pinBoutonTrois, marcheMpap1, arretMpap1);
MTbutton Bouton4(pinBoutonDeux, marcheMpap2, arretMpap2);



void setup(){
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(pinBoutonTreize, INPUT);
}

void loop(){
  int bleu = constrain(map(analogRead(pinPotBleu), minPotBleu, maxPotBleu, 0, 100), 0, 100);
  int rouge = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge, 0, 100), 0, 100);
  Serial.print("Rouge: "); Serial.print(ratio(bleu, rouge));  Serial.print("%\t");
  Serial.print("Bleu: ");  Serial.print(ratio(rouge, bleu)); Serial.println("%");
  delay(500);
}

Tout est presque bon: Le soucis est qu'après avoir essayé plusieurs fois de faire avancer les moteurs de 0 pas à la deuxième pression, ces derniers continuent de s'arrêter que lorsque l'on reste appuyé sur le bouton. Comment modifier le programme de sorte à amener les moteurs à s'arrêter lorsque l'on appuie une deuxième fois sur le bouton qui les à fait se mettre en mouvement ?

Cordialement

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Les boutons type MTbutton sont des boutons type sonnette.Un appui appelle une fonction, un relâchement appelle une autre fonction.
Pour les boutons 3 et 4 si on veut deux actions différentes parce qu'il y a deux appuis, c'est plus simple de prendre des boutons MTcheckButton. Ceux-ci deviennent actif (on se fiche qu'ils soit actifs) au premier appui et appellent une fonction, et au deuxième appuis, comme ils se désactivent ils appellent une deuxième fonction. Ici c'est le fait qu'une fois sur deux on appelle la première fonction, et une fois sur deux la deuxième.

Il faut rajouter l'include:
#include "MTcheckButton.h" // Voir http://arduino.dansetrad.fr/MTobjects
et miodifier les lignes:

MTbutton Bouton3(pinBoutonTrois, marcheMpap1, arretMpap1);
MTbutton Bouton4(pinBoutonDeux, marcheMpap2, arretMpap2);

en:

MTcheckButton Bouton3(pinBoutonTrois, marcheMpap1, arretMpap1);
MTcheckButton Bouton4(pinBoutonDeux, marcheMpap2, arretMpap2);

Je regarde le reste après mon repas.

Doc non corrigée des MTbutton.pdf (93.2 KB)
Doc non corrigée des MTcheckButton.pdf (95.6 KB)
Doc non corrigée des MTulnStepper.pdf (107.2 KB)

  • Sur le schéma, le 5V et le GNG ne vont pas sur la plaquette. Les boutons et les potentiomètres sont dessinés non alimentés. C'est un oubli sinon les boutons et les potentiomètres ne fonctionneraient pas.

  • si on câble les boutons entre GND et une entrée, il n'y a pas besoin de résistance, une pullup est mise automatiquement à l'initialisation du bouton. A condition de ne pas mettre
    pinMode(pinBoutonTreize, INPUT);
    qui enlève le pullup (cette instruction venant après la mise en place du bouton)
    L'avantage de la pullup interne est que cela diminue le câblage.

Bonjour
Merci; Il est vrai que j'avais omis d'ajouter l'alimentation sur mon schéma comme ceci:

Lorsque j'ai ajouté l'"include" et modifié les deux lignes des boutons 3 et 4 sans rien changer au montage, les moteurs ont fonctionnés au départ comme voulu puis ont cessés de tourner.

#include "MTulnStepper.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTbutton.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTcheckButton.h" // Voir http://arduino.dansetrad.fr/MTobjects

int goutte=500;
int pinBoutonTreize=13;
int pinBoutonQuatre=4;
int pinBoutonTrois=3;
int pinBoutonDeux=2;

const byte pinPotRouge = A1;
const byte pinPotBleu  = A2;

const int minPotRouge = 0;
const int maxPotRouge = 1023;

const int minPotBleu = 0;
const int maxPotBleu = 1023;

// Le moteur mpap1
MTulnStepper mpap1(pin_A1 9, pin_B1 10, pin_A2 11, pin_B2 6, PAS_ENTIERS, 4000 micro_secondes_par_pas);
// Le moteur mpap2
MTulnStepper mpap2(pin_A1 7, pin_B1 8, pin_A2 12, pin_B2 5, PAS_ENTIERS, 4000 micro_secondes_par_pas);


int ratio(int nb1, int nb2) {
  if ((nb1 == 0) && (nb2 == 0)) return 0;
  return (100.0 * nb1) / (nb1 + nb2);
}

void avance(void)
{
  mpap1.move(500);
}
void avance2(void){
  mpap2.move(500);
}

void marcheMpap1(void)
{
  mpap1.move(CONTINUE);
  mpap2.move(CONTINUE);
}

void arretMpap1(void){
  mpap1.stop();
  mpap2.stop();
}

void marcheMpap2(void)
{
  mpap1.move(-CONTINUE);
  mpap2.move(-CONTINUE);
}

void arretMpap2(void){
  mpap1.stop();
  mpap2.stop();
}

MTbutton Bouton(pinBoutonTreize, avance);
MTbutton Bouton2(pinBoutonQuatre, avance2);
MTcheckButton Bouton3(pinBoutonTrois, marcheMpap1, arretMpap1);
MTcheckButton Bouton4(pinBoutonDeux, marcheMpap2, arretMpap2);



void setup(){
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(pinBoutonTreize, INPUT);
}

void loop(){
  int bleu = constrain(map(analogRead(pinPotBleu), minPotBleu, maxPotBleu, 0, 100), 0, 100);
  int rouge = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge, 0, 100), 0, 100);
  Serial.print("Rouge: "); Serial.print(ratio(bleu, rouge));  Serial.print("%\t");
  Serial.print("Bleu: ");  Serial.print(ratio(rouge, bleu)); Serial.println("%");
  delay(500);
}

J'ai alors modifié le câblage au niveau des boutons comme ceci:


Alors les moteurs se mettent tantôt à tourner d'un pas, tantôt à ignorer les pressions sur le boutons. Toujours avec le même câblage et en enlevant la ligne:

pinMode(pinBoutonTreize, INPUT);

Cette fois un des deux moteurs se met à tourner à l'infini sans qu'on ne lui demande rien et l'autre attend un appui d'un des deux boutons pour tourner que d'un seul pas.
J'essai d'ajouter la ligne suivante pour activer la résistance interne:

pinMode(pinBoutonTreize, INPUT_PULLUP);

Mais les moteurs ont un comportement étrange sur les deux boutons 3 et 4: Ils mettent du temps avant d'écouter le deuxième appui, ils changent de sens de rotation, l'arduino s'éteint parfois, la led TX de l'arduino se met à clignoter, etc.

#include "MTulnStepper.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTbutton.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTcheckButton.h" // Voir http://arduino.dansetrad.fr/MTobjects

int goutte=500;
int pinBoutonTreize=13;
int pinBoutonQuatre=4;
int pinBoutonTrois=3;
int pinBoutonDeux=2;

const byte pinPotRouge = A1;
const byte pinPotBleu  = A2;

const int minPotRouge = 0;
const int maxPotRouge = 1023;

const int minPotBleu = 0;
const int maxPotBleu = 1023;

// Le moteur mpap1
MTulnStepper mpap1(pin_A1 9, pin_B1 10, pin_A2 11, pin_B2 6, PAS_ENTIERS, 4000 micro_secondes_par_pas);
// Le moteur mpap2
MTulnStepper mpap2(pin_A1 7, pin_B1 8, pin_A2 12, pin_B2 5, PAS_ENTIERS, 4000 micro_secondes_par_pas);


int ratio(int nb1, int nb2) {
  if ((nb1 == 0) && (nb2 == 0)) return 0;
  return (100.0 * nb1) / (nb1 + nb2);
}

void avance(void)
{
  mpap1.move(500);
}
void avance2(void){
  mpap2.move(500);
}

void marcheMpap1(void)
{
  mpap1.move(CONTINUE);
  mpap2.move(CONTINUE);
}

void arretMpap1(void){
  mpap1.stop();
  mpap2.stop();
}

void marcheMpap2(void)
{
  mpap1.move(-CONTINUE);
  mpap2.move(-CONTINUE);
}

void arretMpap2(void){
  mpap1.stop();
  mpap2.stop();
}

MTbutton Bouton(pinBoutonTreize, avance);
MTbutton Bouton2(pinBoutonQuatre, avance2);
MTcheckButton Bouton3(pinBoutonTrois, marcheMpap1, arretMpap1);
MTcheckButton Bouton4(pinBoutonDeux, marcheMpap2, arretMpap2);



void setup(){
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(pinBoutonTreize, INPUT_PULLUP);
}

void loop(){
  int bleu = constrain(map(analogRead(pinPotBleu), minPotBleu, maxPotBleu, 0, 100), 0, 100);
  int rouge = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge, 0, 100), 0, 100);
  Serial.print("Rouge: "); Serial.print(ratio(bleu, rouge));  Serial.print("%\t");
  Serial.print("Bleu: ");  Serial.print(ratio(rouge, bleu)); Serial.println("%");
  delay(500);
}

Ensuite j'ai essayé un autre programme en ajoutant la ligne pour activer la résistance interne au cas ou ce ne serait pas fait avec la bibliothèque:

pinMode(pinBoutonTrois, INPUT_PULLUP);

Mais seuls les bouton 2 et 4 fonctionnent à peu près correctement

#include "MTulnStepper.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTbutton.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTcheckButton.h" // Voir http://arduino.dansetrad.fr/MTobjects

int goutte=500;
int pinBoutonTreize=13;
int pinBoutonQuatre=4;
int pinBoutonTrois=3;
int pinBoutonDeux=2;

const byte pinPotRouge = A1;
const byte pinPotBleu  = A2;

const int minPotRouge = 0;
const int maxPotRouge = 1023;

const int minPotBleu = 0;
const int maxPotBleu = 1023;

// Le moteur mpap1
MTulnStepper mpap1(pin_A1 9, pin_B1 10, pin_A2 11, pin_B2 6, PAS_ENTIERS, 4000 micro_secondes_par_pas);
// Le moteur mpap2
MTulnStepper mpap2(pin_A1 7, pin_B1 8, pin_A2 12, pin_B2 5, PAS_ENTIERS, 4000 micro_secondes_par_pas);


int ratio(int nb1, int nb2) {
  if ((nb1 == 0) && (nb2 == 0)) return 0;
  return (100.0 * nb1) / (nb1 + nb2);
}

void avance(void)
{
  mpap1.move(500);
}
void avance2(void){
  mpap2.move(500);
}

void marcheMpap1(void)
{
  mpap1.move(CONTINUE);
  mpap2.move(CONTINUE);
}

void arretMpap1(void){
  mpap1.stop();
  mpap2.stop();
}

void marcheMpap2(void)
{
  mpap1.move(-CONTINUE);
  mpap2.move(-CONTINUE);
}

void arretMpap2(void){
  mpap1.stop();
  mpap2.stop();
}

MTbutton Bouton(pinBoutonTreize, avance);
MTbutton Bouton2(pinBoutonQuatre, avance2);
MTcheckButton Bouton3(pinBoutonTrois, marcheMpap1, arretMpap1);
MTcheckButton Bouton4(pinBoutonDeux, marcheMpap2, arretMpap2);



void setup(){
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(pinBoutonTreize, INPUT_PULLUP);
  pinMode(pinBoutonTrois, INPUT_PULLUP);
}

void loop(){
  int bleu = constrain(map(analogRead(pinPotBleu), minPotBleu, maxPotBleu, 0, 100), 0, 100);
  int rouge = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge, 0, 100), 0, 100);
  Serial.print("Rouge: "); Serial.print(ratio(bleu, rouge));  Serial.print("%\t");
  Serial.print("Bleu: ");  Serial.print(ratio(rouge, bleu)); Serial.println("%");
  delay(500);
}

Qu'ai je fait d'incorrect ? Merci d'avance

Cordialement

Maintenant que j'ai le schéma complet des boutons, il m'a saute aux yeux s'ils ne sont pas câbles correctement. Quand on appuie dessus ils font un court-circuit car ies boutons 3 et 4 sont entre 5V et Gnd.

La bibliothèque met les Pullup. Les bouton (tous) doivent être mis entre Gnd et une entrée. Pas de résistance, pas de 5V
Les poussoirs ont en plus 4 bornes deux à deux reliées. On garanti que cela fonctionne si on prend les bornes en diagonale. Si on prends deux bornes du même côté, il faut absolument vérifier que c'est le fond côté. Sur plaquette d'essais, prendre systématiquement les bornes en diagonale. En réalisation, on se méfie, mais on peut profiter des bornes reliées pour faire des straps gratuits

J'ai supprimé les lignes:

  pinMode(pinBoutonTreize, INPUT_PULLUP);
  pinMode(pinBoutonTrois, INPUT_PULLUP);

puis j'ai relié les entrées aux grounds. Je me suis souvenu que le courant ne circule pas au bord du milieu de la platine alors j'ai au cas ou, relié ses deux moitiés avec des fils et les moteurs fonctionnent presque comme voulu. Après un moment les boutons 3 et/ou 4 cessent de fonctionner correctement

#include "MTulnStepper.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTbutton.h" // Voir http://arduino.dansetrad.fr/MTobjects
#include "MTcheckButton.h" // Voir http://arduino.dansetrad.fr/MTobjects

int goutte=500;
int pinBoutonTreize=13;
int pinBoutonQuatre=4;
int pinBoutonTrois=3;
int pinBoutonDeux=2;

const byte pinPotRouge = A1;
const byte pinPotBleu  = A2;

const int minPotRouge = 0;
const int maxPotRouge = 1023;

const int minPotBleu = 0;
const int maxPotBleu = 1023;

// Le moteur mpap1
MTulnStepper mpap1(pin_A1 9, pin_B1 10, pin_A2 11, pin_B2 6, PAS_ENTIERS, 4000 micro_secondes_par_pas);
// Le moteur mpap2
MTulnStepper mpap2(pin_A1 7, pin_B1 8, pin_A2 12, pin_B2 5, PAS_ENTIERS, 4000 micro_secondes_par_pas);


int ratio(int nb1, int nb2) {
  if ((nb1 == 0) && (nb2 == 0)) return 0;
  return (100.0 * nb1) / (nb1 + nb2);
}

void avance(void)
{
  mpap1.move(500);
}
void avance2(void){
  mpap2.move(500);
}

void marcheMpap1(void)
{
  mpap1.move(CONTINUE);
  mpap2.move(CONTINUE);
}

void arretMpap1(void){
  mpap1.stop();
  mpap2.stop();
}

void marcheMpap2(void)
{
  mpap1.move(-CONTINUE);
  mpap2.move(-CONTINUE);
}

void arretMpap2(void){
  mpap1.stop();
  mpap2.stop();
}

MTbutton Bouton(pinBoutonTreize, avance);
MTbutton Bouton2(pinBoutonQuatre, avance2);
MTcheckButton Bouton3(pinBoutonTrois, marcheMpap1, arretMpap1);
MTcheckButton Bouton4(pinBoutonDeux, marcheMpap2, arretMpap2);



void setup(){
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop(){
  int bleu = constrain(map(analogRead(pinPotBleu), minPotBleu, maxPotBleu, 0, 100), 0, 100);
  int rouge = constrain(map(analogRead(pinPotRouge), minPotRouge, maxPotRouge, 0, 100), 0, 100);
  Serial.print("Rouge: "); Serial.print(ratio(bleu, rouge));  Serial.print("%\t");
  Serial.print("Bleu: ");  Serial.print(ratio(rouge, bleu)); Serial.println("%");
  delay(500);
}

Y a t il quelque chose que j'aurai mal compris ?

Le programme et le câblage semblent bons.

Il y a le presque que je ne comprends pas. C'est bon ou pas? Presque correspond à non.

Si cela fonctionne un moment puis s'arrête, la première cause c'est l'alimentation. Arduino ne serait pas alimenté en 12V par hasard?
Si tu alimentés les pas à pas avec une alim sous dimensionnée, au début cela fonctionne, puis l'alim ou le régulateur chauffe et ne peut plus délivrer le courant. Et on a un plantage.
Comment est alimenté l'ensemble?
Un pas a pas c'est 200mA. Il faut que l'alim puise donner au moins les 450mA. Alimenté par exemple via le connecteur USB avec un chargeur de portable

Bonsoir
Au temps pour moi: j'ai omis de précisé dans mon schéma ou vont les fils d'alimentation des drivers. L'arduino est alimenté en via son câble branché à un PC et les drivers sont également relié au 5V et au ground de l'arduino comme ceci:

J'ai dit presque car le montage et le code fonctionnent correctement au départ. Puis après avoir appuyé un certain nombre de fois sur les boutons 3 et 4, les moteurs finissent par ignorer les pressions sur les boutons. Parfois après s'être mis en marche les moteurs refusent de s'arrêter après un second appui sur le bouton qui les a mis en marche. Je craignait que ces modèles de drivers surchauffent avec 12 V alimenter par un chargeur. Dois je donc alimenter mon montage comme ceci avec un chargeur à la place du boitier noir ?

Cordialement

Il existe deux familles se 38BYJ48: ceux qui sont des 5V et ceux qui sont des 12V . Alimenté un moteur avec la tension prévue le fait déjà chauffer pas mal. Si ce sont des moteurs 5V les alimenter en 12V les fera griller. Si ce sont des 12V, les alimenter en 5V fera qu'ils ne chauffer ont quasiment pas, mais cela diminue le couple par2,4.
Le driver ULN2003 fonctionne dans les deux cas. Les moteurs 12V consommant moins de courant, l'ULN chauffe moins avec les moteurs 12V qu'avec les moteurs 5V. Il n'y a pas de soucis pour eux.

Les moteurs peuvent tirer 200mA chacune si ce sont des 5V, ce qui fait 400mA cela peut faire trop pour le PC. C'est pour cela que je conseille de voir avec un chargeur de téléphone.

Autre possibilité, ne mettre q'un moteur par exemple en débranchant le +5V d'un ULN. Celà tire moins de courant

Bonjour
Merci pour tout. Ca ira pour le moment puis j'y reviendrai plus tard en cas de caprices du système. J'aimerai ajouter des moteurs plus performants à mon système en plus des 28byj-48 sur une arduino méga. Cela signifie t il que l'on peut piloter un moteur pas à pas de type nema 17 avec un ULN2003 comme ceci ?

cela me paraît étrange puisque le nema 17 possède 4 fils et que le driver ULN2003 en exige 5

Cordialement

Un nema 17, c'est comme une voiture de tourisme,
Celà ne veut pas dire grand chose. Il y a des diesel des électriques, des essences. Pour les nema17, il y a des 4 fils, des 5 fils, des 6 fils... Et parmi les 4 fils, certains sont faits pour être alimentés en tension, d'autres en courant.

Le plus usuel serait le 17HS4401 qui est conçu pour une alim en courant et qui demande un driver différent, par exempe un A4988, un TB6600...

Il faut voir le nom du moteur.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.