Pages: [1]   Go Down
Author Topic: Stepper + Motor ShieldR3, come regolare velocità e steps?  (Read 999 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// 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?

Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 28
Posts: 2031
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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:
// 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, ?, ?);
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-confuse), ecco perchè non mi tornavano i conti su passi e velocità...
Meglio che mi prenda un passo passo "normale"... grazie comunque a tutti!
Logged

Pages: [1]   Go Up
Jump to: