Collegare Step Motor Driver ad Arduino

Buongiorno a tutti,
devo pilotare degli StepperMotor bipolari, per farlo ho acquistato questo Driver TB65603A Single Axis Stepper Motor Driver Board (HCMODU0022) - forum.hobbycomponents.com su questa pagine è spiegato anche come connetterlo con tutti i vari blocchi.
L'unica cosa che non capisco è come inviargli i dati correttamente (è la prima volta che utilizzo gli step motor).
Andando sul sito di Arduino ho trovato la libreria "Stepper Library" ma da quanto ho capito devo specificare i pin del motore collegato ad arduino direttamente. Io ho necessità di fornire :

  • Step
    -Direction
  • Enable.
    Da quanto posso immaginare gli Step sarebbero un alternanza di segnali Alti e Bassi tipo Clock , Direction sarebbe un segnale che quando attivo (ad esempio) mi porta a girare in senso orario l'asse del motore e quando basso invece lo fa girare nel verso opposto, l'enable dovrebbe selezionare il particolare motore.

Vorrei chiedervi se con questa libreria è possibile ottenere questi tre segnali o se devo creare un codice tutto mio per far lavorare i drivers.
Ringrazio chiunque voglia aiutarmi.

..bella questa scheda con TOSHIBA a bordo.
[OT]
Son nate anche schede di controllo reprap basate su questo driver, più economico e in grado di pilotare motori con maggiore assorbimento (ma un poco più lento) rispetto ai pololu con A4988
[/OT]
Io come libreria per stepper ho ultimamente utilizzato la AccelStepper, che permette di gestire anche accellerazioni.
Puoi guardare poi qui per l'utilizzo della libreria:
http://www.pjrc.com/teensy/td_libs_AccelStepper.html

Considera che anche se negli esempio si utilizza un Pololu, i piedini DIR, STEP e ENABLE hanno la medesima funzione.
ATTENZIONE che rispetto ai Pololu, il pin Enable funziona inversamente.

Nel tuo caso devi usare la libreria AccelStepper (AccelStepper: AccelStepper library for Arduino) --> http://www.airspayce.com/mikem/arduino/AccelStepper/AccelStepper-1.37.zip
La colleghi come indicato qui

Istanziando la classe con

#define STEP 3
#define DIRECTION 4
#define ENABLE 5
AccelStepper stepper(AccelStepper::DRIVER, STEP, DIRECTION);

poi nel setup() metti

stepper.setEnablePin(ENABLE);

Dovrebbe funzionare.... dovrebbe... :sweat_smile:

Grazie per la risposta!
@pittuso : la scheda la volevo costruire da me simile a questa, ma poi su ebay l'ho trovata a poco piu' di 8 euro dalla cina e l'ho comprata gia fatta.

@PaoloP:
Da quanto ho capito dalla documentazione nell'inizializzazione devo indicare AccelStepper::DRIVER perchè sto utilizzando un Driver e di conseguenza specifico i pin per lo Step e la direzione.
Una volta inizializzato vado ad abilitare lo step con stepper.setEnablePin(ENABLE).
Ma come faccio a muoverlo? la mia intenzione sarebbe quella di ricevere un dato dal PC e muovere di 1 step in una direzione il motore. Posso utilizzare void stepper.move(1)? e se voglio farlo andare nel verso opposto? basta scrivere stepper.move(-1)?

Si.
Altrimenti imposti .moveTo e lo azioni con .run
Se vuoi regolare la velocità la imposti con .setSpeed e lo muovi con .runSpeed
Poi ci sono tantissimo altri comandi con relativi esempi: tutti i metodi della classe li trovi qui --> AccelStepper: AccelStepper Class Reference

Ho scritto questo per iniziare :

#include <AccelStepper.h>
#define STEP 3
#define DIRECTION 4
#define ENABLE 5
AccelStepper stepper(AccelStepper::DRIVER, STEP,DIRECTION);
int incomingByte;
void setup(){
  Serial.begin(9600);
  stepper.setEnablePin(ENABLE);
}

void loop(){
 if(Serial.available()> 0){
   incomingByte = Serial.read();
   Serial.print("Ricevuto: ");
   Serial.println(incomingByte);
   
 }
 if(incomingByte == 49){
     stepper.move(1);
     Serial.println("Destra");
 }
 if(incomingByte == 50){
     stepper.move(-1);
     Serial.println("Sinistra");
 }
  if(incomingByte == 51){
     stepper.move(0);
     Serial.println("Stop");
 }
 delay (50);
}

ho collegato il motore come da figura ma non si muove nulla. Il motore rimane fermo senza emettere alcun rumore e non riscaldandosi minimamente.

Ho trovato su internet un sito in cui si fa una sorta di prova di questa libreria ma con un programmino misero misero.
Ho ricavato questo codice che funziona :

#include <AccelStepper.h>
#define STEP 3
#define DIRECTION 4
#define ENABLE 5
int pos= 3600;
AccelStepper stepper(1,STEP,DIRECTION);
int incomingByte;
void setup(){
//Serial.begin(9600);
stepper.setMaxSpeed(400);

stepper.setSpeed(18);
}

void loop(){
stepper.runSpeed();

}

Il mio motore si muove ma ad una velocità lenta e a scatti, in piu non ha un movimento fluido ma trema mentre gira. Ho pensato che i parametri inviati siano sbagliati. Come faccio a farlo funzionare correttamente?
Sto usando un Nema 23 da 2.8A e 1.9Nm di coppia.

Nel tuo programma prova con move(100) e move(-100) e guarda di quanto si muove.
Attacca all'asse una linguetta fatta con lo scotch, altrimenti potresti non notare il movimento.

Ciao!
Si avevo provato a mettere i valori da te suggeriti con :

#include <AccelStepper.h>
#define STEP 3
#define DIRECTION 4
#define ENABLE 5
AccelStepper stepper(AccelStepper::DRIVER, STEP,DIRECTION);
int incomingByte;
void setup(){
Serial.begin(9600);
stepper.setEnablePin(ENABLE);
}

void loop(){
if(Serial.available()> 0){
incomingByte = Serial.read();
Serial.print("Ricevuto: ");
Serial.println(incomingByte);

}
if(incomingByte == 49){
stepper.move(100);
Serial.println(“Destra”);
}
if(incomingByte == 50){
stepper.move(-100);
Serial.println(“Sinistra”);
}
if(incomingByte == 51){
stepper.move(0);
Serial.println(“Stop”);
}
delay (100);
}

ma il risultato non cambia. con questo tipo di codice il motore non si muove per nulla. Come posso fare?

Ho ricontrollato il codice della libreria. :sweat_smile:
Dopo il comando .move devi mettere .run
Quindi:

#include <AccelStepper.h>
#define STEP 3
#define DIRECTION 4
#define ENABLE 5
AccelStepper stepper(AccelStepper::DRIVER, STEP,DIRECTION);
int incomingByte;
void setup(){
  Serial.begin(9600);
  stepper.setEnablePin(ENABLE);
}

void loop(){
 if(Serial.available()> 0){
   incomingByte = Serial.read();
   Serial.print("Ricevuto: ");
   Serial.println(incomingByte);
   
 }
 if(incomingByte == 49){
     stepper.move(100);
     stepper.run(); 
     Serial.println("Destra");
 }
 if(incomingByte == 50){
     stepper.move(-100);
     stepper.run(); 
     Serial.println("Sinistra");
 }
  if(incomingByte == 51){
     stepper.move(0);
     stepper.run();      
     Serial.println("Stop");
 }
delay (100);
}

Penso di aver capito come funziona questa libreria.
Prima setti tutti i parametri, posizione, velocità, accelerazione e poi con .run fai muovere il motore.
.run chiama .runspeed quindi quest’ultimo lo puoi ignorare.

..attenzione che come già detto il driver toshiba ha l'enable invertito, rispetto a driver come i Pololu.
Non so se la breakout sucui è montato inverta il segnale, ma nel caso così non fosse è possibile specificarlo:

stepper.setPinsInverted(false, false, true)

info:
http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#ac62cae590c2f9c303519a3a1c4adc8ab

Quoto poi Paolo, puoi anche aggiungere una riga del genere:

  while (stepper.distanceToGo() != 0) stepper.run();

dopo aver definito quanti step fare con il move() o il moveTo()

Si hai ragione era questo il codice che volevo postare nell'altra risposta. Il problema e' che si muove a scatti e non rispettagli step. In più non rispetta le direzioni. Se spingo 1 nel monitor seriale gira verso destra se poi spingo 2 gira lo stesso verso destra anche se lo blocco e lo faccio ricominciare. Se invece riavvio lo sketch e spingo prima 2 gira verso sinistra anche se spingo 1. Questo lo fa con stepper.move(-00) se metto stepper.move(1) spingendo 1 non gira nemmeno. Putroppo questa è la prima volta che utilizzo degli step motor e non so dove sbattere la testa. Ho pensato anche alla configurazione del driver.
Devo settare determinati parametri con degli switch:
Running Current : cioè la corrente di lavoro e l'ho settata correttamente.
Stop Current : 20% - 50% ; ho impostato 20%;
Excitation Mode : 1 -2-8-16 ; credo che sia per settare gli half step o 1/8 o 1/16 ed ho impostato 1;
Decay Settings : 0-25%-50%-100%; ed ho impostato 0;

Ho settato correttamente secondo voi?

@pitusso:
sulla scheda è presente EN+ ed EN- : EN- va collegato a massa e EN+ ad arduino. Visto che la scheda e' attiva bassa non ho collegato perniente EN+ visto che sto facendo un test con un solo motore.
Ho sbagliato?

Credo di si.
Se il costruttore nello schema li collega, è meglio collegarli. :roll_eyes:

Per riconnetterlo devo invertire il valore dell' ENABLE che sarà attivo basso e non piu' alto. Tenendolo staccato e' come se fosse sempre attivo basso. Cmq lo riconnettero'.

Per ora ho fatto delle prove a velocità diverse ed ho visto che sopra i 650 step/secondo non vibra e non fa nessun rumore il motore. Questo però va in disaccordo con quello che dovrei fare io:
ho creato un software in CVI che prende una immagine in bianco e nero e ne ricava i contorni neri (o bianchi) e li trasforma in una sorta di Greber personalizzato che invia ad arduino una informazione ad ogni pixel utile che trova.
A questo punto Arduino deve far muovere di conseguenza gli step motor per seguire le informazioni in ingresso uno step alla volta (che non significa uno step al secondo).
Come potrei risolvere il problema?