Questo codice, che usa la libreria Stepper, a me funzionava. Trovato girando su internet, leggendo di molti che han problemi con sta schedina e stepper.
L'esempio regola la velocità in base a un potenziometro collegato ad analogico A0 (il valore 2037 NON è a caso, è voluto):
#include <Stepper.h>
const int stepsPerRevolution = 2037; // change this to fit the number of steps per revolution
Stepper myStepper(stepsPerRevolution, 8,10,11,9); // initialize the stepper library on pins 8 through 11:
int stepCount = 0; // number of steps the motor has taken
void setup() {} // nothing to do inside the setup
void loop() {
int sensorReading = analogRead(A0); // read the sensor value:
int motorSpeed = map(sensorReading, 0, 1023, 0, 100); // map it to a range from 0 to 100:
// set the motor speed:
if (motorSpeed > 0) {
myStepper.setSpeed(motorSpeed);
// step 1/100 of a revolution:
myStepper.step(stepsPerRevolution/100);
}
}
L'esempio che linka @pitusso è standard ed informa Stepper passando in ordine i pin 8, 9, 10, 11 come dovrebbe essere. Quella schedina ha bisogno di ordine diverso. Inoltre devi dire quanti passi ha lo stepper, l'esempio usa 100. Questo stepper stranamente ha bisogno di quel valore strano. Almeno così ho trovato girando su tutorial e prove fatte su siti in inglese.
Ti allego anche uno sketch che NON usa la libreria Stepper e che a me funziona per questa accoppiata.
nid69ita lo sketch che mi hai allega già lo conoscevo ma non mi permette di utilizzare un potenziometro...è solo una sequenza fissa che si ripete.
io devo riuscir a fare una cosa del genere:
#include <Stepper.h>
const int stepsPerRevolution = 2037; // change this to fit the number of steps per revolution
Stepper myStepper(stepsPerRevolution, 8,10,11,9); // initialize the stepper library on pins 8 through 11:
int stepCount = 0; // number of steps the motor has taken
void setup() {} // nothing to do inside the setup
void loop() {
int sensorReading = analogRead(A0); // read the sensor value:
int motorSpeed = map(sensorReading, 0, 1023, 0, 100); // map it to a range from 0 to 100:
// set the motor speed:
if (motorSpeed > 0) {
myStepper.setSpeed(motorSpeed);
// step 1/100 of a revolution:
myStepper.step(stepsPerRevolution/100);
}
}
ma il motore gira in modo molto strano e inoltre gira in modo continuo quando sposto il potenziometro nel senzo che quando giro il potenziometro, il motorino "gira" pero' anche se lascio il potenziometro in quella posizione, il motorino continua a girare (invece dovrebbe rimanere fermo in quella posizione)..non so se mi sono spiegato.
Devi fare un mix tra questo codice e quello linkato da @pitusso.
const int stepsPerRevolution = 2037; // change this to fit the number of steps per revolution
Stepper myStepper(stepsPerRevolution, 8,10,11,9); // initialize the stepper library on pins 8 through 11:
int previous = 0;
void setup()
{ myStepper.setSpeed(70);
}
void loop() {
int val = analogRead(A0); // read the sensor value:
stepper.step(val - previous);
previous = val; // remember the previous value of the sensor
}
#include <Stepper.h>
const int stepsPerRevolution = 2037; // change this to fit the number of steps per revolution
Stepper myStepper(stepsPerRevolution, 8,10,11,9); // initialize the stepper library on pins 8 through 11:
int previous = 0;
int stepCount = 0; // number of steps the motor has taken
void setup(){ myStepper.setSpeed(70);
} // nothing to do inside the setup
void loop() {
int sensorReading = analogRead(A0); // read the sensor value:
int motorSpeed = map(sensorReading, 0, 1023, 0, 100); // map it to a range from 0 to 100:
// set the motor speed:
if (motorSpeed > 0) {
myStepper.setSpeed(motorSpeed);
// step 1/100 of a revolution:
myStepper.step(stepsPerRevolution/100);
stepper.step(val - previous);
previous = val;
}
}
Scusa ma il potenziometro ha una escursione angolare limitata mentre lo stepper può ruotare anche in modo continuo.
Mi è parso di capire che vuoi usare uno stepper come un servo, giusto?
Allora devi ragionare come un servo.
Devi registrate la posizione angolare dello stepper e partendo da quella muoverla di x passi orari o antiorari fino a raggiungere la nuova posizione in base all'input dato dal potenziometro.
In pratica devi implementare la logica che comanda i servi, altrimenti continuerà a girare in modo continuo.
La cosa non è semplice.
Dovrai fare una cosa del genere
int sensorReading = analogRead(A0); // read the sensor value:
int Position = map(sensorReading, 0, 1023, 0, 100); // map it to a range from 0 to 100:
MoveStepper(Position);
All'interno della funzione MoveStepper dovrai calcolare la differenza tra Position e OldPosition (precedentemente registrata) e muovere lo stepper di x passi.
Inoltre, come fai a vedere dove il motore e', o quanto si e' mosso, senza un feedback ? ... mi sembra di capire che non ha un'encoder di nessun tipo, giusto ? ...
Devi meterci un'encoder, per sapere se si muove e di quanto ... il tipo di encoder dipendera' poi dalla precisione che ti serve, ovviamente ... potresti usare anche un potenziometro, ma allora dovresti mettere un finecorsa meccanico sul motore che gli impedisca di girare piu della corsa del potenziometro, altrimenti lo scassi ...
ho capito...cmq si devo fare in modo da farlo girare a 180° invece di 360°, il problema pero' non è l'hardware ma il software perchè non sono tanto bravo. forse mi conviene di comprare tutti servo xD
cmq vi spiego cosa volevo fare. volevo costruirmi un braccio robot utilizzando i stepper dato che avevo quelli...vabbè vorra dire che li utilizzero' per fare magari delle ruote dato che sono piu' adatti e comprero' dei servo molto piu' semplici per fare il braccio robot secondo voi vanno bene questi qui?
My personal opinion:
Risottolineo che quegli stepper cinesi sono deboli e molto scarsi. Per un braccio robotico non credo riesci a usarli. Meglio dei servi.
Perchè degli stepper buoni e non enormi dovresti spendere di più che per i servo.
Non sono un esperto di servo/stepper, però credo dipenda anche da cosa devi muovere, ovvero quanto sarà pesante ogni sezione del braccio?
Se devi solo muovere un webcam montata su un braccetto plastico a 2 gradi di libertà credo quei microservo vadano bene. Ma se devi fare un braccio più grande, dubito. Ricorda inoltre che stepper, motori, servi è sempre meglio alimentarli non direttamente da Arduino ma dargli una alimentazione separata (il gnd però va messo in comune con Arduino). Di solito i servo vanno bene tra i 6V e 7.2V
Okok ti ringrazio comunque avevo intenzione di fare una struttura in alluminio quindi credo che dovrei prendere un modello più "potente" che abbia almeno gli ingranaggi in metallo.