Stepper + Motor ShieldR3, come regolare velocità e steps?

un saluto a tutti, sto facendo le prime prove con lo shield su citato (e arduino uno) ed uno stepper recuperato… dato il seguente sketch:

// Include the Stepper Library
#include <Stepper.h>

// Map our pins to constants to make things easier to keep track of
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;

// The amount of steps for a full revolution of your motor.
// 360 / stepAngle
const int STEPS = 300;

// Initialize the Stepper class
Stepper myStepper(STEPS, dirA, dirB);

void setup() {
  // Set the RPM of the motor
  myStepper.setSpeed(20);

  // Turn on pulse width modulation
  pinMode(pwmA, OUTPUT);
  digitalWrite(pwmA, HIGH);
  pinMode(pwmB, OUTPUT);
  digitalWrite(pwmB, HIGH);

  // Turn off the brakes
  pinMode(brakeA, OUTPUT);
  digitalWrite(brakeA, LOW);
  pinMode(brakeB, OUTPUT);
  digitalWrite(brakeB, LOW);

  // Log some shit
  Serial.begin(9600);
}

void loop() {
  // Move the motor X amount of steps
  myStepper.step(STEPS);
  Serial.println(STEPS);
  // Pause
  delay(2000);

  // Move the motor X amount of steps the other way
  myStepper.step(-STEPS);
  Serial.println(-STEPS);
  // Pause
  delay(2000);
}

ed uno stepper (4 fili) con queste caratteristiche:
Step Angle: 3,75°/7,5°
Voltage 12VDC
Ratio: 1:131,876

non riesco a capire come modificare i valori di STEPS e setSpeed in modo da variare velocità e angolo di rotazione… per intenderci se ad esempio volessi fargli fare una rotazione di 180° cosa dovrei inserire? e per fargli eseguire una rotazione continua?
Seguendo il codice mi sembra di comprendere che facendo 360/step angle dovrei ottenere il numero di steps necessari per una rotazione completa quindi 360/3,75 = 96 steps però impostando tali valori (e qualsiasi altro valore a dirla tutta) mi esegue una rotazione di solo una decina di gradi… forse c’entra qualcosa quel Ratio 1:131,876??

PS: alimento il tutto con un 12V e mi sembra che il fondo del motore si scaldi parecchio, è normale?

ciao sto usando arduino da qualche settima,affascinante ma difficile. Uno dei miei primi esperimenti e stato un motore passo passo (stampante HP)
Ho usato un driver lm297dne alimentato 5 volt.

int motorPin1 = 10;
int motorPin2 = 11;
int motorPin3 = 12;
int motorPin4 = 13;
int delayTime = 20; // velocita motore ( piu aumenti questo valore piu gira piano)
int pulsante;
int ciclo=40; // step motore ( 4 fasi X n° ciclo)
void setup() {
pinMode(7,INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
}
void loop(){
pulsante=digitalRead(7);
if (pulsante==HIGH)
{
for (int i=1; i <= ciclo; i++)
{
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(delayTime);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
}
}
}

spero di possa servire ciao

Con "Stepper myStepper(STEPS, dirA, dirB);" inizializzi l' oggetto myStepper e gli dici quanti passi per 360 gradi ha il motore e su quali pin é collegato http://arduino.cc/en/Reference/StepperConstructor

Con "myStepper.setSpeed(20);" definisi la velocitá in giri al minuto http://arduino.cc/en/Reference/StepperSetSpeed

Con "myStepper.step(STEPS);" decidi quanti passi fa il motore. Questa funzione blocca Arduino come anche delay() http://arduino.cc/en/Reference/StepperStep

Ciao Uwe

grazie per la risposta, in effetti così riesco a fargli fare la rotazione che mi interessa anche se la velocità mi lascia ancora perplesso... ad esempio impostando:

Stepper myStepper(48, dirA, dirB); (passi per rotazione ottenuti da 360/7,5) myStepper.step(6000); (passi da fare, a spanne sono una rotazione completa) myStepper.setSpeed(100); (velocità di rotazione, giri al minuto?)

mi fa un giro completo in circa 75 secondi... e non mi tornano i conti :astonished:

Una rotazione completa sono 48 passi e non 6000. Eccetto se hai impostato sul L298 half steps allora una rotazione sono 96 passi. Come mai dai solo 2 Pin alla funzione di definizione oggetto (dirA, dirB)? Ciao Uwe

hai perfettamente ragione, ed è una delle cose che mi lasciano perplesso... se io calcolo i passi per la rotazione completa come 360 / Step Angle da quanto scritto sull'etichetta ottengo 360/3,75 = 96 oppure 360/7,5 = 48 (perchè poi due valori? boh...) Però per fargli fare una rotazione devo mettere un valore di almeno 6000

Per quanto riguarda l'istanza oggetto ho visto anche io che accetta 4 pin, però lo sketch che ho trovato in rete ne usa solo due e così ho lasciato... poi definisce pure due pin come brake e non ne ho capito il motivo (visto che comunque funziona pure senza) ma non ho ancora approfondito la questione...

Per quanto riguarda l'istanza oggetto ho visto anche io che accetta 4 pin, però lo sketch che ho trovato in rete ne usa solo due e così ho lasciato... poi definisce pure due pin come brake e non ne ho capito il motivo (visto che comunque funziona pure senza) ma non ho ancora approfondito la questione...

Ciao, se vuoi usare un motore a 4 fili devi collegarli tutti e 4 altrimenti non va come dovrebbe :grin:

http://www.ladyada.net/make/mshield/use.html segui questa guida a me funziona benissimo :)

@Madwriter: quella guida è per lo shield di ladyada, io ho il motorshield arduino…

@tonid: se intendi che devo collegare tutti e quattro i cavi ok, a meno che non ci sia una sequenza ben definita da seguire i cavi sono tutti e 4 a posto…

@uwefed: come dovrei inizializzare l’oggetto con quattro pin? dato questo sketch:

// Include the Stepper Library
#include <Stepper.h>

// Map our pins to constants to make things easier to keep track of
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;

// The amount of steps for a full revolution of your motor 360 / stepAngle
const int STEPS = 48;
const int PASSI = 6000;

// Initialize the Stepper class
Stepper myStepper(STEPS, dirA, dirB);

void setup() {
  // Set the RPM of the motor
  myStepper.setSpeed(100);

  // Turn on pulse width modulation
  pinMode(pwmA, OUTPUT);
  digitalWrite(pwmA, HIGH);
  pinMode(pwmB, OUTPUT);
  digitalWrite(pwmB, HIGH);

  // Turn off the brakes
  pinMode(brakeA, OUTPUT);
  digitalWrite(brakeA, LOW);
  pinMode(brakeB, OUTPUT);
  digitalWrite(brakeB, LOW);

  // Log some shit
  Serial.begin(9600);
}

void loop() {
  // Move the motor X amount of steps
  myStepper.step(PASSI);
  Serial.println(PASSI);
  // Pause
  delay(2000);
}

quali dovrebbero essere le altre due componenti? Stepper myStepper(STEPS, dirA, dirB, ?, ?);

Stai mescolando il pilotaggio di 2 motori DC con il pilotaggio di un motore passo passo. http://arduino.cc/en/Main/ArduinoMotorShieldR3 e http://arduino.cc/en/uploads/Main/arduino_MotorShield_Rev3-schematic.pdf Questo shield é fatto principalmente per pilotare dei motori DC

Per poter pilotare un motor Passo Passo devi mettere sia PWMA e PWMB a HIGH e anche BRAKEA che BRAKEB a HIGH. allora doverebbe essere giusto anche usare solo 2 pin Stepper myStepper(48, dirA, dirB);

Ciao Uwe

riprendo il thread in quanto ho "scoperto" che l'accrocchio maledetto è un passo passo accoppiato ad un motoriduttore con riduzione 1:131876 (col senno di poi è evidente :~), ecco perchè non mi tornavano i conti su passi e velocità... Meglio che mi prenda un passo passo "normale"... grazie comunque a tutti!