LOCODUINO
Parlons Arduino => Débuter => Discussion démarrée par: papytrain le septembre 27, 2019, 05:32:40 pm
-
Bonjour à tous
J'ai le projet de construire un pont tournant piloté par un arduino. Ce pont n'aura qu'une entrée sortie, donc il faudrait qu'il tourne de 180° à chaque appui sur un bouton poussoir.
Le matériel à ma disposition
1 carte Arduino
1 moteur nem17, bipolaire 200 pas
1 driver tb6600
Le soucis est que je suis complètement largué avec la programmation Arduino, malgré la lecture et relecture sur les moteurs pas à pas.
Voici le câblage que j'ai réalisé d'après un schéma trouvé sur le web
@+
-
Bonsoir,
avez-vous testé le code de la page où vous avez trouvé votre schéma ?
https://wiki.dfrobot.com/TB6600_Stepper_Motor_Driver_SKU__DRI0043
7, 6, 5 sont les n° des broches de l'Arduino comme il apparait sur le schéma.
le fil rouge est au +5V.
Si votre moteur est bien un 200 pas, il correspond au programme avec un angle de 1,8° / pas.
Ce code fait faire alternativement 32 tours dans un sens puis 32 dans l'autre sens.
En modifiant le nombre de pas dans chaque sens à 100, comme ci-dessous, il fera des 1/2 tours :
Il vous reste à mettre un bouton entre GND et la pin 4 en INPUT_PULLUP, à tester sa valeur et alternativement sur chaque appui à lancer le forward et le backward.
Pensez à choisir votre alimentation pour la tension du moteur.
int PUL=7; //define Pulse pin
int DIR=6; //define Direction pin
int ENA=5; //define Enable Pin
void setup() {
pinMode (PUL, OUTPUT);
pinMode (DIR, OUTPUT);
pinMode (ENA, OUTPUT);
}
void loop() {
for (int i=0; i<100; i++) //Forward 100 steps
{
digitalWrite(DIR,LOW);
digitalWrite(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(50);
digitalWrite(PUL,LOW);
delayMicroseconds(50);
}
for (int i=0; i<100; i++) //Backward 100 steps
{
digitalWrite(DIR,HIGH);
digitalWrite(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(50);
digitalWrite(PUL,LOW);
delayMicroseconds(50);
}
}
-
Bonsoir
Merci pour votre réponse.
Dans un premier temps j'ai fait un essai avec le programme donné sur votre lien. C'est ok, il tourne un certain nombre de tours dans un sens et idem dans l'autre sens. Je n'ai pas compté mais il fait plusieurs tours.
J'ai refait avec les valeurs que vous m'avez donné, il fait de même mais avec une vitesse lente. J'aurais voulu qu'il s'arrête à un demi-tour. Par contre pour la vitesse ce serait bon pour mon pont tournant.
Je pense qu'il faut ajouter du code..
@+
-
Curieux que le nombre de pas (6400) change la vitesse ...
Testez ceci (sans garantie), la commande est en mettant la broche 4 au GND
int PUL=7; //define Pulse pin
int DIR=6; //define Direction pin
int ENA=5; //define Enable Pin
int RUN=4; //define appui Pin
int appui=0; // sur le bouton
int sens=0; // sens 0, 1
void setup() {
pinMode (PUL, OUTPUT);
pinMode (DIR, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (RUN, INPUT_PULLUP);
}
void loop() {
appui = digitalRead (RUN);
if (appui == 0) {
if (sens == 0) {
aller();
}
else {
retour();
}
}
}
void aller(){
for (int i=0; i<100; i++) //Forward 100 steps
{
digitalWrite(DIR,LOW);
digitalWrite(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(50);
digitalWrite(PUL,LOW);
delayMicroseconds(50);
}
sens = 1;
}
void retour(){
for (int i=0; i<100; i++) //Backward 100 steps
{
digitalWrite(DIR,HIGH);
digitalWrite(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(50);
digitalWrite(PUL,LOW);
delayMicroseconds(50);
}
sens = 0;
}
-
Vu votre réponse, une chose m'interpelle et j'aurais dû le signaler au 1er post, désolé.
Il y a 6 inters dip sur le driver avec un tableau pour la configuration. Je pense que le résultat obtenu d'après votre 1er codage vient de là.
Voir les photos jointes
@+
-
Le sens du ON (flèche) me semble inversé, vérifiez sur la notice, 200 pas par tour est standard.
Ce qui voudrait dire que le courant du driver est réglé sur 2,8A. Vérifiez sur votre moteur si cela convient.
Avez vous adapté la tension à votre moteur ?
Mon premier code est, sauf erreur, exactement celui de l'exemple, sauf le nombre de pas décrit par le moteur : 100 au lieu de 6400 soit 1/2 tour au lieu de 32 tours.
Je ne vois pas ce qui aurait pu changer la vitesse avec l'exemple.
Le deuxième est la copie du 1er mais complété par un bouton qui lance une 1/2 rotation en sens inverse à chaque appui.
Ce code n'est bien sur pas testé.
-
Le moteur a un courant de 1,7 A en nominal
Pour le régler à 200 pas, il faut que je mette s1 s2 sur on et s3 sur off si j'ai bien compris d'après le tableau?
-
S1 s2 sur on et s3 sur off SI le ON sur le switch n'est pas inversé par rapport au montage lui-même. Il y a une notice ?
Et le site dit : Up: OFF; Down: "ON" = haut : OFF; bas : ON, or la flèche pour ON est en bas !
Si le site dit vrai, il faut mettre S4 haut, S5 haut, S6 bas et garder S1 S2 et S3
Et surtout si avec 100 pas, le moteur fait un demi-tour avec S1 S2 et S3 comme sur la photo.
Pour diminuer la vitesse de rotation, il suffit d'ajouter un delay entre chaque pas.
-
Désolé, j'abandonne. Tout ça est trop compliqué pour moi. J'ai essayé de toutes les façons, ça ne marche pas. Je pense que tout vient de ce driver
@+
-
Après réflexion, je pense que je n'ai pas le bon matériel. J'ai acheté ça sans réfléchir...D'ailleurs j'ai tout renvoyé à Amazon.
D'où ma question:
Que me conseillez-vous comme moteur pas à pas et quel driver faut'il? ( Références )
@+
-
L'article est fait pour vous :
http://locoduino.org/spip.php?article196#forum4022
-
Merci, super!
J'ai passé commande
@+
-
Hello
Impeccable, ça marche super avec le code indiqué sur la doc.
Maintenant que faut'il modifier pour un pas de 180° à chaque impulsion sur un bouton poussoir?
@+
-
J'ai l'impression d'avoir joint un code à un précédent message pour cela.
-
Le code sue vous m'aviez donné correspondait au driver microstep et les branchements sont différents par rapport au code sur l'article de Locoduino
-
Version 28BYJ-48 et bouton sur D4.
-
J'ai laissé tombé le programme Locoduino pour le moment.
J'ai chargé le code qui est sur la doc livrée avec le moteur et le driver
#include <HCSR04.h>
#include <Stepper.h>
const int stepsPerRevolution=200;
//for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
int stepCount=0; // number of steps the motor has taken
void setup(){
// nothing to do inside the setup
}
void loop() {
// read the sensor value:
int sensorReading=analogRead(A0);
// map it to a range from 0 to 100:
int motorspeed = map(sensorReading, 0, 1023, 0, 100);
// set the motor speed:
if (motorSpeed > 0){
myStepper.setSpeed(motorSpeed);
// step 1/100 of a revolution:
myStepper.step(stepsPerRevolution / 100;
}
}
J'ai un message d'erreur sur cette ligne
if (motorSpeed > 0){
"motorSpeed"was not declared in this scope
-
Bonjour papytrain,
une variable est sensible à la casse, il faut donc garder les minuscules et majuscules à leur place.
on déclare motorspeed en minuscule puis plus loin on utilise motorSpeed avec un S majuscule ce qui n'est plus la même variable.
Cordialement
Antoine
-
Et il manque la parenthèse ) :
myStepper.step(stepsPerRevolution / 100;
myStepper.step(stepsPerRevolution / 100);
Et apparemment, le nombre de pas/tour du code (200) ne correspond pas au nombre de pas/tour du moteur de l'article (4096).
Est-ce bien le même ?
-
Merci à vous, c'est sympa.
Maintenant j'ai 2 programmes, super!
Je ferai les essais dans quelques jours car je dois m'absenter.
@+
-
Avec un moteur 200 pas par tour, pour une plaque tournante de 300 mm de diamètre, soit environ un mètre de circonférence, chaque pas correspond à 1000 mm / 200 = 5 mm, c'est pas génial comme positionnement. Avec 4096 pas, on est a ~ 0,25 mm, c'est beaucoup mieux.
-
En effet. Ma plaque tournante aura un diamètre de 190mm.
Cette plaque se situera sur le niveau + 1 de mon réseau. J'ai déjà une plaque sur le réseau principale qui est une Roco. Je ne voulais pas réinvestir dans une 2ième plaque, vu le prix.
Cette mini plaque du niveau 1 sera faite en impression 3d.
-
Je n'ai pas pu attendre, le programme Locoduino est au top. Encore merci!
Pour l'autre petit programme je le testerai plus tard
@+
-
Bonjour à tous
Je reviens sur ce sujet, car des soucis. Mon niveau 1 est prêt et après essai d'une loco ce n'est pas le top.
Le pont ne réagit pas pareil à vide qu'avec une loco. Je rappelle la procédure, un appui sur un bouton poussoir et rotation de 180° dans un sens. Un second appui et 180° dans l'autre sens.
Quelle modif faut'il faire dans le programme afin de supprimer l'automatisme de 180° et de faire la rotation manuellement lors de l'appui sur le bouton poussoir.
Le programme est stepper1 ( voir plus haut des messages ) et c'était Msport qui me l'a concocté.
En vous remerciant.
Papy
-
Version 2 : deux boutons : bouton sur 4, un sens, bouton sur 5, sens inverse. Par impulsion. Compile mais non testé.
-
Est-ce que ce serait possible de faire qu'avec 1 bouton ( que je n'aie pas à tout démonter en me couchant sous le réseau ) Peu importe du sens.
@+
-
Le deuxième bouton n'est pas indispensable ...
-
Bonjour
Merci
C'est ok. ;)