Ho due motori passo-passo 28BYJ-48 solo che non riesco a trovare nel datasheet il valore che mi indica lo spostamento in gradi dell' albero motore per ciascun passo, non è che qualcuno sa a quanto corrisponde questo valore?
Grazie in anticipo per le risposte.
Cercando 28BYJ-48
1° link google --> http://robocraft.ru/files/datasheet/28BYJ-48.pdf --> Stride Angle 5.625° /64
2° link google --> http://www.raspberrypi-spy.co.uk/wp-content/uploads/2012/07/Stepper-Motor-28BJY-48-Datasheet.pdf --> Step Angle 5.625°/64
Grazie della risposta!
Per non aprire un altro topic continuo a scrivere in questo: Adesso che so quanti gradi e quanti giri fa il motore vorrei scrivere un programma che mi restituisca in real-time sul monitor seriale la posizione in gradi dell' albero motore: come dovrei fare?
Non puoi conoscere la posizione assoluta del motore, ti servirebbe un encorder per quello, puoi al massimo sapere la posizione relativa.
Basta che ogni volta che ordini al motore di fare un passo avanti o indietro aggiungi o sottrai su un'altra variabile una quantità pari al passo angolare.
Ti crei una variabile globale float, ad esempio angolo.
La incrementi ogni volta che fai un passo (+1 o -1) del valore dello step angle.
Quindi quando fai
myStepper.step(passo);
aggiungi
angolo += 5.625*passo;
if (angolo>360) angolo -= 360;
if (angolo<0) angolo += 360;
Cosi?
#include <Stepper.h>
const int stepsPerRevolution = 64;
float angolo;
int passo = 64;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
void setup() {
myStepper.setSpeed(60);
Serial.begin(9600);
}
void loop() {
myStepper.step(passo);
angolo += 5.625*passo;
if (angolo>360) { angolo -= 360;}
if (angolo<0){ angolo += 360;}
Serial.println(angolo);
}
ma il serial monitor mi restituisce sempre 360.00.
Dove sbaglio? E poi la velocità impostata (60 rpm) va bene per quel motore?
Ovvio che ti dia 360.
Stai usando uno stepper come motorino per macchinette da corsa.
![]()
Devi dargli pochi passi alla volta. Anche uno solo.
Non 64. ![]()
Credo di aver corretto bene:
[code#include <Stepper.h>
const int stepsPerRevolution = 64;
float angolo;
int passo = 0;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
void setup() {
myStepper.setSpeed(60);
Serial.begin(9600);
}
void loop() {
passo = passo + 1;
myStepper.step(passo);
angolo += 5.625*passo;
if (angolo>360) { angolo -= 360;}
if (angolo<0){ angolo += 360;}
Serial.println(angolo);
}]
il serial monitor mi restituisce valori diversi ma alcuni superano 360 e poi il motore dopo aver compiuto una rotazione completa dovrebbe rieseguire il giro nell' altro verso.
Prova così
#include <Stepper.h>
const int stepsPerRevolution = 64;
float angolo;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
void setup() {
myStepper.setSpeed(60);
Serial.begin(9600);
}
void loop() {
for( int x=0; x<stepsPerRevolution; x++) ruota(1);
for( int x=0; x<stepsPerRevolution; x++) ruota(-1);
delay(3000);
}
void ruota(int passo){
myStepper.step(passo);
angolo += 5.625 * passo;
if (angolo>360) angolo -= 360;
if (angolo<0) angolo += 360;
Serial.println(angolo);
}
Niente da fare anche col codice che mi hai dato tu: gira per qualche grado, poi si ferma e ricomincia a girare e cosi via.
Ho provato con questo codice ma gira in un solo verso:
#include <Stepper.h>
const int stepsPerRevolution = 64;
int i = 0;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
void setup() {
myStepper.setSpeed(60);
Serial.begin(9600);
}
void loop() {
while( i < 64) {
i = i++;
myStepper.step(i);
}
i = i--;
myStepper.step(i);
}
La logica del programma sarebbe: gira il motore in senso orario fino a 360° (64 step) quando arrivi a 360° gira il motore in senso antiorario per un altro giro completo e riesegui tutto finché non si spegne. In quel codice che ho scritto non riesco proprio a capire dove sta l' errore.
Dove sbaglio?
Prova a mettere un delay nel ciclo: inizia con 5 o 10 millisecondi.
Esempio:
for( int x=0; x<stepsPerRevolution; x++) {
ruota(1);
delay(5);
}
Così funziona ma gita solo in un verso
#include <Stepper.h>
const int stepsPerRevolution = 64;
float angolo;
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
void setup() {
myStepper.setSpeed(60);
Serial.begin(9600);
}
void loop() {
for( int x=0; x<stepsPerRevolution; x++) {
ruota(1);
delay(10);
}
for( int x=0; x<stepsPerRevolution; x++) {
ruota(-1);
delay(10);
}
}
void ruota(int passo){
myStepper.step(passo);
angolo += 5.625 * passo;
if (angolo>360) angolo -= 360;
if (angolo<0) angolo += 360;
Serial.println(angolo);
}
Strano.
Con ruota(-1) dovrebbe cambiare verso.
Ho provato anche lo sketch di esmpio per far ruotare il motore in senso opposto:
/*
Stepper Motor Control - one revolution
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
The motor should revolve one revolution in one direction, then
one revolution in the other direction.
Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe
*/
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60);
// initialize the serial port:
Serial.begin(9600);
}
void loop() {
// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
}
E neanche funziona: comincio a pensare o che il motore non funziona o che il driver non sia buono.
Devo provare con qualche altro motore...
Controlla i collegamenti.
Scheda 14 o 33
--> http://forum.arduino.cc/index.php/topic,146152.0.html (Download)
Ho un driver: 4tronix Arduino
Acquistato da questo sito. I collegamenti driver-Arduino li ho gia controllati credo che sia una limitazione meccanica del motore.
Ma col codice di esempio del sito funziona?
--> 4tronix Arduino
Si. Non avevo provato prima gira nei due sensi. Allora perche con il codice che scrivo io non funziona?
Devi controllare qui
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
forse è errata la sequenza dei numeri.
No, No, altrimenti non funzionerebbe neanche con lo sketch del sito.