Go Down

Topic: Stepper + Motor ShieldR3, come regolare velocità e steps? (Read 1 time) previous topic - next topic

AndreaFra

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:
Code: [Select]
// 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?


veroda

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

uwefed

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

AndreaFra

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  :smiley-eek:

uwefed

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

AndreaFra

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...

tonid

Quote
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 :smiley-mr-green:

Madwriter

http://www.ladyada.net/make/mshield/use.html
segui questa guida a me funziona benissimo  :)
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

AndreaFra

@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:
Code: [Select]
// 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, ?, ?);

uwefed

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

AndreaFra

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!

Go Up