Bonjour,
Je suis débutant dans le monde de l'Arduino. Je souhaite créer un funiculair. Pour cela, je possède un moteur pas à pas nema 17, un contrôleur TB6600 et un arduino UNO.
J'ai récupéré un bout de code pour m'aider à comprendre. Mais bien évidement je n'obtiens pas ce que je souhaite. Le moteur ne tourne pas. Que ce soit dans un sens ou dans l'autre.
L'idée:
Mon funiculaire monte.
En arrivant en haut, il appuie sur un fin de course. Le moteur doit s'arreter puis partir en sens inverse au bout de 5 secondes.
Arrivé en bas, il appuie de nouveau sur un autre fin de course, puis attends 5 secondes pour remonter.
Détail de mes branchements:
VCC+ et GND = alimentation TB6600 externe en 12v
A+ = fil rouge du nema 17
A- = fil bleu du nema 17
B+ = fil vert du nema 17
B- = fil noir du nema 17
Pul+ = borne 4 arduino
Pul- = GND (côté power) arduino
Dir+ = borne 3 arduino
Dir- = GND (même borne que la Pul-)
Ena+ = borne 5 arduino
Ena- = GND (même borne que la Pul-)
Fin de course (fdcd) = borne 6 arduino
Fin de course (fdca) = borne 7 arduino
Les bornes "-" des fdcd et fdca sont branchées ensensemble sur la GND côté digital de l'arduino.
Voici mon code actuel:
/* Example sketch to control a stepper motor with TB6600 stepper motor driver, AccelStepper library and Arduino: acceleration and deceleration. More info: https://www.makerguides.com */
// Include the AccelStepper library:
#include "AccelStepper.h"
// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 3
#define stepPin 4
#define motorInterfaceType 1
const int rot = 3600 ; // nombre de tour
//*********** fin de course ************************
const int fdcd = 6; // fdcd = fin de course depart broche 6
const int fdca = 7; // fdca = fin de course arrive broche 7
// *************************************************
// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
// Définissez la vitesse et l'accélération maximales:
stepper.setMaxSpeed(2000);
stepper.setAcceleration(800);
pinMode (fdcd, INPUT_PULLUP);
pinMode (fdca, INPUT_PULLUP);
}
void loop() {
while(!digitalRead(fdcd)) // si bouton enfonce le moteur demarre sens horaire
// Set the target position:
stepper.moveTo(-41000);
// Run to target position with set speed and acceleration/deceleration:
stepper.runToPosition();
delay(1000);
//**********************************************
while(!digitalRead(fdca)) // si bouton enfonce le moteur demarre le sens anti horaire
// Revient à zéro:
stepper.moveTo(0);
stepper.runToPosition();
delay(1000);
}
Il faut ajouter quelques print dans ton code pour comprendre ce qui se passe (ou pas).
Typiquement, un Serial.print("On monte") après le 1er whille te permettrait de voir si tu as bien passé à travers le while. Un Serial.print("On descend") après le second te permettrait de voir si tu continues bien.
Je pense que le problème pourrait venir de tes while.
Les entrées sont déclarées en INPUT_PULLUP ce qui sous-entend que les fins de course sont entre l'entrée et GND donc tu dois lire un LOW lorsque le fin de course est actif.
Si le fin de course est actif tu ne sors jamais du while(!digitalRead(fdca))
Bonjour et merci pour votre réponse.
Cependant, je débute complètement et j'essaie de comprendre comment ça fonctionne. A quoi sert Ena+ ? Que dois-je ajouter comme code ? Merci beaucoup pour votre aide.
As-tu essayé un programme basique pour faire tourner ton moteur ?
Quand je dis programme basique, c'est le moteur et rien de connecté dessus.
Tant que cette phase n'est pas validée inutile d'aller plus loin.
Important :
Nema est une norme dimensionnelle des USA.
Nema 17 ne fait que donner les dimensions de la platine de fication du moteur qui est un carré de 1,7 pouce de côté.
Nema 17 ne renseigne en rien sur les caractéristiques du moteur.
Il faut la référence exacte qui est sur la plaque du moteur.
J'ai effectué la modif que vous m'avez suggéré. Merci à vous.
Le moteur tourne si j'appuie sur le fdcd quelques secondes (environ 3 secondes et s'arrete en faisant un bruit sonore continue).
Mon but étant qu'il se mette en route dans un sens jusqu'a venir appuyer sur un des fins de course (par exemple fdca), puis repartir dans l'autre sens au bout de 5 secondes.
Voici mon code modifié.
/* Example sketch to control a stepper motor with TB6600 stepper motor driver, AccelStepper library and Arduino: acceleration and deceleration. More info: https://www.makerguides.com */
// Include the AccelStepper library:
#include "AccelStepper.h"
// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 3
#define stepPin 4
#define enaPin 5
#define motorInterfaceType 1
const int rot = 3600 ; // nombre de tour
//*********** fin de course ************************
const int fdcd = 6; // fdcd = fin de course depart broche 6
const int fdca = 7; // fdca = fin de course arrive broche 7
// *************************************************
// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
digitalWrite(enaPin, HIGH);
// Définissez la vitesse et l'accélération maximales:
stepper.setMaxSpeed(2000);
stepper.setAcceleration(800);
pinMode (fdcd, INPUT_PULLUP);
pinMode (fdca, INPUT_PULLUP);
}
void loop() {
while(!digitalRead(fdcd)) // si bouton enfonce le moteur demarre sens horaire
// Set the target position:
stepper.moveTo(-41000);
// Run to target position with set speed and acceleration/deceleration:
stepper.runToPosition();
delay(1000);
//**********************************************
while(!digitalRead(fdca)) // si bouton enfonce le moteur demarre le sens anti horaire
// Revient à zéro:
stepper.moveTo(0);
stepper.runToPosition();
delay(1000);
}
Hello
Une photo du côté droit du tb6600
Nous devons voir les petits switchs blancs.
S'ils sont sur off ou on.
Et une photo du dessus pour que nous puissions bien lire le tableau de positionnement des switchs.
J'ai refait un code en m'aidant de l'intelligence artificielle (ça m'a bien aidé). Le moteur tourne jusqu'a ce que j'appuie sur le bouton 1. Par contre je n'arrive pas à l'arreter en appuyant sur le bouton 2.
// Broches pour le contrôle du moteur pas à pas avec le driver TB6600
#define dirPin 3 // Broche de direction
#define stepPin 4 // Broche de pas (step)
#define button1Pin 6 // Bouton poussoir n°1
#define button2Pin 9 // Bouton poussoir n°2
void setup() {
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
}
void loop() {
// Si le bouton poussoir n°1 est relâché, le moteur tourne dans le sens horaire
if (digitalRead(button1Pin) == HIGH) {
digitalWrite(dirPin, HIGH); // Sens horaire
digitalWrite(stepPin, HIGH);
delayMicroseconds(500); // Ajustez cette valeur pour contrôler la vitesse du moteur
digitalWrite(stepPin, LOW);
delayMicroseconds(500); // Ajustez cette valeur pour contrôler la vitesse du moteur
}
// Si le bouton poussoir n°2 est appuyé, le moteur s'arrête
if (digitalRead(button2Pin) == LOW) {
digitalWrite(dirPin, LOW); // Arrêt
digitalWrite(stepPin, LOW);
}
}
Il y a plus "intilligent" à faire, tu étais parti avec la bibliothèque AccelStepper, ça, c'est intelligent
Avec ce code, ton moteur tourne, oui, mais tu ira difficilement plus loin avec ce type de code.
Je regarde ce qu'il y a à améliorer dans ton premier code.
Change le test sur le bp1. Remplace le HIGH par LOW
Compile,televerse
Tu constateras que le moteur ne tournera que si tu appuies sur un bp
edit, je constate que jpb est avec toi, je vous laisse👍
Ok, j'apprends donc je suis excusable
Merci en tous cas pour ton aide
Je vais suivre ton conseil et regarder également ce que je peux tester sur mon 1er code.