Débutant conseil pour ce code

Bonjour à tous,

je me ballade sur les groupes et forum arduino depuis un petit moment, j’ai suivis des cours open classroom je commence a comprendre les bases, mais je n’ai pas encore les connaissances pour arriver au projet final.

je vous explique ce que je veux au final. faire tourner un moteur pas à pas à 1 tour/min (ça j’y arrive)
mais pour pouvoir peaufiner je souhaite rajouter 4 boutons, 1 pour démarrer, 1 pour augmenter doucement la vitesse, 1 pour retour arrière très rapide (a fond) et 1 pour arrêter le moteur je me suis cassé les dents sur programme pendant 2 jours, j’ai donc revu ma copie à la baisse et repartir sur 1 seul bouton pour le moment, j’y suis depuis hier et je n’avance que très peu, je souhaite vous montrer mon code et montages pour que vous m’aiguillez un peu svp. merci.

ici le moteur tourne bien à la vitesse souhaité de base, le bouton est censé faire tourné le moteur à l’envers quand je l’actionne, mais je ne parvient pas a faire changer l’état du bouton à 1, il reste à 0. une petite idée ? est ce mon montage ? est ce le code ? je penche plus sur le code mais bon …
tout vos conseils seront les bienvenus svp :grin:

le code :

#include <Stepper.h>
int Bouton = 2;
int nbreDePas = 64;


Stepper moteur(nbreDePas, 3, 4, 5, 6);
int steps = 100;

void setup()
{
  Serial.begin(9600);
  pinMode (Bouton, OUTPUT); // indique bouton sortit info
  moteur.setSpeed(32);

}

void loop() {

 Bouton = digitalRead(2);
  Serial.println(Bouton);
  int Bouton = digitalRead(Bouton); // cherche infos sur valeur du bouton
  if ( Bouton == 1 ) //
  {

    moteur.step(steps * -1);

  }
  else if (Bouton == 0 ) {

  }
  moteur.step(steps);
}

hello
tu a declaré Bouton en sortie alors qu'il doit etre en INPUT ou INPUT_PULLUP

edit:
tu te mélanges les crayons avec Bouton:
tu declares que Bouton = 2 ; donc ton Bouton Poussoir est raccordé à D2
que tu déclares en sortie dans le set up ( voir plus haut)

ensuite dans la loop tu mets Bouton = digitalRead(2); donc Bouton = 0 probablement .
puis tu envoies Bouton sur le moniteur
et ti redéclares une variable INT Bouton à laquelle tu affectes la lecture de digitalRead(Bouton);
là ça devient mystérieux. comme tu crées INT Bouton, elle vaut 0 puis tu lui affectes la lecture d'elle meme. donc tu lis la pinoche D0 qui est RX ou TX de la liaison série avec le moniteur.

en résumé:
une variable déclarée en tete du code à une portée globale et est donc vue par tout le code
une variable déclarée dans le code de la loop ou d'une fonction, à une portée locale
on ne prends pas deux fois le meme nom pour déclarer deux variables. et on choisit des noms qui nous parlent ( c'est plus facile ensuite pour suivre le code)
et pour finir, lorsque tu déclares la pinoche D2 comme étant cablé à ton Bouton poussoir, c'est donc un cablage fixe et D2 sera toujours affecteé à cette tache. c'est donc une constante que tu peux déclarer :
const Byte Bouton_poussoir=2;
ou
#define Bouton_poussoir 2

ensuite, pour lire le Bouton_poussoir, tu déclres une variable : Byte etat_Bouton_poussoir = 0;

et pour lire le Bouton_poussoir: etat_Bouton_poussoir=Bouton poussoir;

Et il y a confusion entre la variable Bouton qui déclare le numéro de la broche sur laquelle est connecté le bouton et la variable Bouton qui va mémoriser l'état du bouton.
Une bonne pratique:

const int pin_bouton=2; // broche sur laquelle on connecte le bouton
unsigned char etat_bouton; // memorise l'etat de la broche bouton

@fdufnews
désolé, je viens de faire un edit de mon post sans avoir vérifié si quelqu’un avait posté après moi

merci à tous les deux !

est ce que j’ai bien compris en faisant ainsi ?
avec ce code j’ai enfin un changement d’état je passe de 1 normal à 0 quand j’appuie (j’avoue que je m’attendais a l’inverse mais au moins je peut lire maintenant le changement !
maintenant je n’ai toujours pas d’effet au changement, rien de different entre 1 et 0, je retourne voir les differents tuto que j’ai sous la main si je vois un indice !
si vous avez des pistes là dessus je suis preneur aussi ^^
merci en tout cas j’avance un peu enfin apres quelques jours de point mort ! :stuck_out_tongue:
ça fait plaisir et ça motive ! :wink:

#include <Stepper.h>
const int Bouton_poussoir=2; // broche sur laquelle on connecte le bouton // broche sur laquelle on connecte le bouton
unsigned char etat_Bouton_poussoir; // memorise l'etat de la broche bouton
int nbreDePas = 64;


Stepper moteur(nbreDePas, 3, 4, 5, 6);
int steps = 100;

void setup()
{
  Serial.begin(9600);
  pinMode (Bouton_poussoir, INPUT); // indique bouton sortit info
  moteur.setSpeed(32);

}

void loop() {

 etat_Bouton_poussoir = digitalRead(Bouton_poussoir);
  Serial.println(etat_Bouton_poussoir);
  
  if ( etat_Bouton_poussoir == 0 ) //
  {

    moteur.step(steps * -2);

  }
  else if (etat_Bouton_poussoir  == 1 ) {

  }
  moteur.step(steps);
}

Bonjour, je suis sur la bonne piste ? des conseils pour ce nouveau code ?
merci :slight_smile:

Tu devrais déclarer ton bouton en INPUT_PULLUP ce qui te permet de le connecter entre l'entrée D2 et le GND. Dans ce cas, pas besoin de résistance et un appui t'envoie effectivement 0.

Je ne connais pas la bibliothèque stepper mais es tu sûr qu'on puisse envoyer une valeur négative ?

Pour comprendre comment fonctionne (ou pas) ton code, place des Serial.print() dans les 2 blocs du if.

Bonjour Aquilae

Aquilae:
maintenant je n’ai toujours pas d’effet au changement, rien de different entre 1 et 0,

#include <Stepper.h>

const int Bouton_poussoir=2; // broche sur laquelle on connecte le bouton // broche sur laquelle on connecte le bouton
unsigned char etat_Bouton_poussoir; // memorise l’etat de la broche bouton
int nbreDePas = 64;

Stepper moteur(nbreDePas, 3, 4, 5, 6);
int steps = 100;

void setup()
{
 Serial.begin(9600);
 pinMode (Bouton_poussoir, INPUT); // indique bouton sortit info
 moteur.setSpeed(32);

}

void loop() {

etat_Bouton_poussoir = digitalRead(Bouton_poussoir);
 Serial.println(etat_Bouton_poussoir);
 
 if ( etat_Bouton_poussoir == 0 ) //
 {

moteur.step(steps * -2);

}
 else if (etat_Bouton_poussoir  == 1 ) {

}
 moteur.step(steps);
}

Il n’y a rien dans la branche else ??

 else if (etat_Bouton_poussoir  == 1 ) {

  }

Cordialement,
bidouilleelec

C'est bizarre, une de ses réponses a disparu ainsi que la ou les lignes du bloc else.

regarde cette loop et testes la

void loop() 
{
 etat_Bouton_poussoir = digitalRead(Bouton_poussoir);
  Serial.println(etat_Bouton_poussoir);
  if ( etat_Bouton_poussoir == 0 ) //
  {
    moteur.step(steps * -2);
  }
  else // inutile car implicite if (etat_Bouton_poussoir  == 1 ) 
  {
   moteur.step(steps);
  }
}

Bonsoir à tous !

je n'ai pas pu y regarder depuis vos derniers messages, je m'y suis remis cette aprème !

j'avoue que là je ne comprend plus rien je commence a croire que j'ai un soucis de carte et/ou de moteur, n'arrivant a rien (je n'ai pas encore teste le dernier message de dfgh) j'ai décidé de repartir de zéro et recommencer les tuto les plus basique voir là ou je m'étais égaré, allumer une led avec un bouton ok !
faire tourner le moteur bêtement et changer sa vitesse ok !

demander au moteur de tourner dans un sens 10 sec et dans l'autre 10 sec et bien là il tourne dans le sens horaire mais jamais dans le sens inverse et j'ai essayé au moins 7 codes trouvé sur le net sur des sites de tuto basiques ...(j'ai bien vérifier les branchements des pins et dans l'ordre du code ! :wink: )

donc là ce n'est pas moi qui merde dans le code ... j'ose espérer qu'ils ne sont pas tous faux ...
quoique je préférerais plutôt qu'il y ai un problème technique ! :stuck_out_tongue:

j'avoue que là je sais plus quoi faire ...

est ce que' l'un d'entre vous pourrez soit écrire soit reprendre un code sur un tuto le tester vérifier qu'il fonctionne, me le montrer et que je teste si ça merde encore c'est que j'ai un pépin mécanique ou électronique ...

merci de votre patience !

Aquilae

quelqu’un peu me tester ça svp ?

je viens de le recup sur le net, mon moteur ne tourne toujours que dans un sens …
alors qu’il est censé inverser …

merci

EDIT : je pose le code sur le post plutôt qu’en lien effectivement …

#include <Stepper.h>
 
// pour un moteur de 200 pas par tour et brancher sur les broches 2, 3, 4, 5
Stepper moteur(200, 2, 3, 4, 5);
 
void setup()
{
    moteur.setSpeed(30); // 30 tours par minute
    // (rappel : ici le moteur fait 200 pas par tour,
    // on fera donc 6000 pas par minute)
}
 
void loop()
{
    moteur.step(1000);
    delay(1000);
    moteur.step(-1000);
    delay(2000);
}

Tu aurais du commencer par lire les messages épinglés en haut du forum français : ils disent entre autres de préciser le matériel. Quel est ton Arduino ? Quelle est la référence de ton moteur ? Peux-tu en poster une photo ? Poste ton code ente balises CODE (le bouton </>), ça évitera d’aller le chercher ailleurs… Enfin précise tes branchements.

Là, on pourra peut-être t’aider…
Bonne soirée !

bonsoir, j'ai bien lu les messages en haut du forum, les photos que j'ai mise au début on voit la carte et le driver moteur et les branchements, donc les photos je les ai postés.

je l'admet je n'ai pas mis la référence du moteur, qui est le 28byj-48 du kit de base.

mes codes dans les diverses post ou il y en avait était avec la balise code donc j'avoue que je ne comprend pas ce message ?

il n'y a que le dernier message ou j'ai fait comme a l'habitude d'un autre site ou il est demandé de mettre le code sur ce site mea culpa...

il aurait peut être été judicieux de lire mes post depuis le début pour voire que je respecte quasi a 100% les exigences du forum a pars 2 étourderies.

si après les débutants motivées qui font des essais sans relâches, des tests, des corrections pour avancer sont traité ainsi sur ce forum alors je vous prie de m'excuser et j'essaierai de trouver un autre forum plus accueillant pour les gens motivés.

merci a ceux qui ont tenté de m'aider bonne continuation.

Bonjour Aquilae

Aquilae:
je viens de le recup sur le net, mon moteur ne tourne toujours que dans un sens …
alors qu’il est censé inverser …

EDIT : je pose le code sur le post plutôt qu’en lien effectivement …

#include <Stepper.h>

// pour un moteur de 200 pas par tour et brancher sur les broches 2, 3, 4, 5
Stepper moteur(200, 2, 3, 4, 5);

C’est une bonne idée de repartir sur un exemple le plus simple possible (sans bouton).

Avez vous noté que dans ce nouvel exemple le branchement de l’ ULN2003 (que vous ne citez pas) est différent de celui de votre premier montage ?

Ce serait mieux de communiquer les liens des tutoriaux que vous utilisez.

Il faut TOUT dire!

Pour votre montage initial , d’après ce je crois deviner sur la photo, il faut déclarer la pin 2 en INPUT PULLUP.

Cordialement,
bidouillelec

Bonjour Aquilae

Aquilae:
quelqu’un peu me tester ça svp ?

Oui, et il y a plusieurs points qui font que cela ne peut pas bien marcher avec un 28BYJ

La principale, le câblage entre l’Arduino et le driver, il faut croiser la paire du milieu
Stepper moteur(MoteurpasParTour, 2, 4, 3, 5);

La vitesse, mettre 10

Le nombre de pas par tour mettre 2048, ne pas oublier c’est un moteur avec réducteur.

Et ça donne ça:

#include <Stepper.h>

#define MoteurpasParTour 2048

// pour un moteur 28BYJ = 2048 pas par tour, brancher sur les broches 2, 4, 3, 5
Stepper moteur(MoteurpasParTour, 2, 4, 3, 5);

void setup()
{
	moteur.setSpeed(10); 
}

void loop()
{
	moteur.step(MoteurpasParTour/2);
	delay(1000);
	moteur.step(-MoteurpasParTour/2);
	delay(1000);
}

Bonne bricole
Cordialement
jpbbricole

Bonjour jpbbricole

jpbbricole:
Bonjour AquilaeOui, et il y a plusieurs points qui font que cela ne peut pas bien marcher avec un 28BYJ

La principale, le câblage entre l’Arduino et le driver, il faut croiser la paire du milieu
Stepper moteur(MoteurpasParTour, 2, 4, 3, 5);

Je n’ai pas trouvé de doc vraiment clair sur le câblage.

Auriez vous des liens ?

Cordialement,
bidouilleelec

Bonjour bidouilleelec

bidouilleelec:
Je n'ai pas trouvé de doc vraiment clair sur le câblage.
Auriez vous des liens ?

Non pas vraiment, mais les symptômes (arythmie) me disaient "bobines croisées", j'ai trouvé un exemple, je ne sais plus où qui fonctionnait impeccable et j'ai joué au jeu des 7 différences avec l'exemple de @Aquilae, ça a pris un certain temps!!!
Et ça fonctionne, pas très cartésien....

Cordialement
jpbbricole

jpbbricole:
Et ça fonctionne, pas très cartésien…

Cordialement
jpbbricole

Merci.
Oui : il y en a qui croisent et d’autres pas ???

Cordialement,
bidouilleelec