
Si tratta di una possibile elettronica di gestione per la movimentazione di un asse tramite motore passo-passo, alla stregua di quello che molti hanno realizzato motorizzando gli assi di fresatrici e tornii senza però arrivare a renderle cnc.
Questo Pseudo-Jog-DRO mette a disposizione queste funzionalità :
Movimentazione di un motore passo passo tramite un volantino encoder rotativo
Gestione dei due fine-corsa
Una rudimentalissima procedura di home
Una rudimentalissima visualizzazione della coordinata dell'asse (da calibrare scrivendo la risoluzione nel codice sorgente)
Come si può vedere il cuore del sistema è una scheda Arduino.
Ai pin 1 e 2 della scheda sono collegati i segnali A e B dell'encoder, i segnali vengono letti in quadratura tramite procedure assegnate a interrupt. Nel mio caso, l'encoder è stato recuperato da una vecchia stampante HP DeskJet 500.
Una foto del circuito ancora in una forma incompleta (mancano i pulsanti per Home e azzeramento coordinata): Dai pin 11 e 12 dell'Arduino si possono prelevare rispettivamente i segnali di DIR e STEP da collegare al driver del motore passo passo. In fase di debug, ho voluto mettere in parallelo a questi segnali dei led che mi indicassero che effettivamente i segnali (non ho un oscilloscopio).
I pin 6 e 7 sono deputati ai fine corsa, che devono essere di tipo normalmente chiuso e devono essere a massa quando il fine-corsa non è ingaggiato.
Come potete vedere qui sotto, l'"asse" su cui ho condotto gli esperimenti è un carrello di una stampante: Infine, ai pin 4 e 8 sono collegati rispettivamente l'azzeramento del pseudo-visualizzatore, e il lancio della bizzarra procedura Home. Bizzarra perchè dopo aver toccato entrambi i finecorsa, manda i segnali per spostare l'asse al centro, senza peraltro gestire alcuna forma di rampa di accelerazione e decelerazione.
La funzione di visualizzazione è decisamente acerba in quanto il programma dell'Arduino non fa altro che rimandare al computer, attraverso la USB, una stringa di testo contenente la coordinata attuale ogni frazione di secondo. Quindi il visualizzatore è il pc con un progamma di terminale (il monitor dell'IDE di Arduino, o Hyperterminal se aveve un sistema operativo Windows, o simili)
Questo è il codice dello sketch di Arduino:
Codice: Seleziona tutto
#define STEP_PIN 12
#define DIR_PIN 11
#define QUAD_A_PIN 2
#define QUAD_B_PIN 3
#define X_INF_LIM_PIN 6
#define X_SUP_LIM_PIN 7
#define ZERO_BTN_PIN 4
#define HOME_BTN_PIN 8
volatile long pos_x = 0;
long max_pos_x = 0;
float risol_x = 0.026560424966799469; // mm/passo
const int STEP_DUR = 10;
const int PAUSE_DUR = 100;
void setup() {
// inìzializzazione
Serial.begin(19200);
Serial.println("TEST LETTURA ENCODER");
pinMode(QUAD_A_PIN, INPUT);
digitalWrite(QUAD_A_PIN, HIGH); //Attivo la resistenza interna di pull-up
pinMode(QUAD_B_PIN, INPUT);
digitalWrite(QUAD_B_PIN, HIGH); //Attivo la resistenza di pull-up
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(X_INF_LIM_PIN, INPUT);
pinMode(X_SUP_LIM_PIN, INPUT);
digitalWrite(X_INF_LIM_PIN,HIGH);
digitalWrite(X_SUP_LIM_PIN,HIGH);
pinMode(ZERO_BTN_PIN, INPUT);
digitalWrite(ZERO_BTN_PIN,HIGH);
pinMode(HOME_BTN_PIN, INPUT);
digitalWrite(HOME_BTN_PIN,HIGH);
attachInterrupt(0, leggi_A, CHANGE);
}
void loop() {
Serial.println(pos_x * risol_x, DEC);
if(digitalRead(ZERO_BTN_PIN) == LOW){
pos_x = 0;
}
if(digitalRead(HOME_BTN_PIN) == LOW){
perform_homing();
}
delay(500);
}
void perform_homing()
{
Serial.print("Performing HOMING -- Max X:");
digitalWrite(DIR_PIN, LOW);
while(digitalRead(X_INF_LIM_PIN) == LOW){
do_step();
delayMicroseconds(PAUSE_DUR);
}
max_pos_x = 0;
digitalWrite(DIR_PIN, HIGH);
while(digitalRead(X_SUP_LIM_PIN) == LOW){
do_step();
delayMicroseconds(PAUSE_DUR);
max_pos_x += 1;
}
pos_x = max_pos_x;
Serial.println(max_pos_x, DEC);
digitalWrite(DIR_PIN, LOW);
for (int i = 1; i < max_pos_x / 2; i++){
do_step();
delayMicroseconds(PAUSE_DUR);
pos_x -= 1;
}
}
void do_step(){
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(STEP_DUR);
digitalWrite(STEP_PIN, LOW);
}
void leggi_A(){
if (digitalRead(QUAD_A_PIN) == digitalRead(QUAD_B_PIN)) {
if (digitalRead(X_SUP_LIM_PIN) == LOW) {
pos_x++;
digitalWrite(DIR_PIN, HIGH);
do_step();
}
} else {
if (digitalRead(X_INF_LIM_PIN) == LOW) {
pos_x--;
digitalWrite(DIR_PIN, LOW);
do_step();
}
}
}
Movimento manuale: http://www.youtube.com/watch?feature=pl ... 7pEQ2W8YCQ
Procedura di Home: http://www.youtube.com/watch?feature=pl ... r94-IJ6n-c
Il "Visualizzatore": http://www.youtube.com/watch?feature=pl ... p6pE09Btao
Invito tutti a non risparmiare commenti e critiche.