Bonjour à tous !
Pour un projet artistique sur lequel je travaille, j'ai commencé à travailler avec des moteurs PAP nema 17 (0.59 nm) associés à des drivers TB6600 et des arduino uno, alimentés par des alims 12v 2A. Je n'en avais encore jamais utilisé. Je travaillais jusqu'à lors avec des moteurs DC et des motorshields mais aujourd'hui je souhaite apporté plus de précision à mes projets motorisés.
Le projet en question est le suivant :
Dans mon installation, il y a plusieurs ballons de baudruches attachés entre eux et recouvert d'un drap sur une surface de 2mx2m environ. Au plafond, j'ai fixé des moteur PAP nema 17 équipé de bobine de fil de nylon, et eux sont reliés à quatre points précis dans l'assemblage de ballons, passant à travers le drap.
Ce que je souhaite faire serait de "chorégraphier" chaque moteur pour qu'il fasse danser l'assemblage de ballon (comme une marionette) en faisant monter/descendre chaque points de fixation nylon/ballon à différentes hauteurs, jusqu'à 1m50 max.
J'ai donc commencé à chercher des codes simples qui conviendrais pour faire l'enchainement d'action suivant :
-pause de x temps
-rotation CW de y tours à z vitesse.
-pause de y temps
- rotation CCW de z tours a x vitesse.
-etc
J'ai trouver les deux suivant sur ce site qui semble convenir :
/* Example sketch to control a stepper motor with TB6600 stepper motor driver and Arduino without a library: number of revolutions, speed and direction. More info: https://www.makerguides.com */
// Define stepper motor connections and steps per revolution:
#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 1600
void setup() {
// Declare pins as output:
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
// Set the spinning direction clockwise:
digitalWrite(dirPin, HIGH);
// Spin the stepper motor 1 revolution slowly:
for (int i = 0; i < stepsPerRevolution; i++) {
// These four lines result in 1 step:
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
delay(1000);
// Set the spinning direction counterclockwise:
digitalWrite(dirPin, LOW);
// Spin the stepper motor 1 revolution quickly:
for (int i = 0; i < stepsPerRevolution; i++) {
// These four lines result in 1 step:
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
delay(1000);
// Set the spinning direction clockwise:
digitalWrite(dirPin, HIGH);
// Spin the stepper motor 5 revolutions fast:
for (int i = 0; i < 5 * stepsPerRevolution; i++) {
// These four lines result in 1 step:
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000);
// Set the spinning direction counterclockwise:
digitalWrite(dirPin, LOW);
// Spin the stepper motor 5 revolutions fast:
for (int i = 0; i < 5 * stepsPerRevolution; i++) {
// These four lines result in 1 step:
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
delay(1000);
}
Celui-ci me permet de faire ce que je veux il semblerait. Mais je ne comprend pas bien cette partie :
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
Pour moi les commandes HIGH et LOW signifiait Marche et Arret (ici pour 500 ms chacune).
Et quand je l'utilise le moteur tourne pendant 1000 ms.
Je ne comprend pas très bien.
et il y à le 2ème code :
// 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 2
#define stepPin 3
#define motorInterfaceType 1
// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
// Set the maximum speed and acceleration:
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
}
void loop() {
// Set the target position:
stepper.moveTo(8000);
// Run to target position with set speed and acceleration/deceleration:
stepper.runToPosition();
delay(1000);
// Move back to zero:
stepper.moveTo(0);
stepper.runToPosition();
delay(1000);
}
Celui-ci est encore mieux puisqu'il utilise la Accelsteppers Library et donc permet l'accélération et la décélération.
Toutefois quand je l'utilise, Le moteur opère des décalages très important dans les phases d'accélérations et de décélérations ce qui ne permet pas d'avoir des rotations de 200 pas parfaites.
Avez vous des informations ou des conseils concernant ce problème ?
Ou le cas échéant sauriez-vous comment je pourrais revoir le deuxième code pour enlever l'accélération/décélération et modifier à chaque rotation la vitesse, à la place ?
Merci de m'avoir lu