Ciao a tutti, vi rompo le scatole per risolvere il mio problema.
ho sviluppato un programma con arduino nano, testato prima su mega e poi rivisto i pin per il nano per motorizzare l'asse x della mia fresa ed in futuro fare anche Y e z e convertirla in CNC, ma dovrei prima imparare a disegnare in cad...
Ho usato un driver DM556 ed uno stepper nema 32 da 6nm, alimentatore da 24 V ma ho anche un 48V eventualmente a disposizione.
Con il mio programma a vuoto funziona tutto, se lo collego sull'asse x della fresa a velocità bassa nessun problema, ma se utilizzo il pulsante spostamento rapido mi perde una marea di passi
Come logica di funzionamento ho messo 2 potenziometri (su ingressi analogici A0 e A1) per gestire la velocità dei passi in funzionamento normale (quindi mentre freso) ed uno spostamento rapido per il posizionamento tramite la pressione di un pulsante.
sul driver il Pulse+, dir+, Ena+ sono collegati a +5V.
l'azionamento è dato da due interruttori in pullup in realtà è un joystik con 4 interruttori per le varie direzioni.
nelle mie sperimentazioni anche a vuoto se aumentavo troppo la velocità di rotazione perdeva passi ed il motore ringhiava parecchio.
Probabilmente ho sbagliato io qualcosa nello sketch per questo chiedo a voi un aiuto per una possibile soluzione
Altro problema riscontrato è che nel Void normal se metto i valori in microSeconds non mi funziona correttamente mentre in mills si.. (non ho capito il perchè)
Codice:
#define puls_sx 3 //pulsante controller SX
#define puls_dx 4 //pulsante controller DX
#define ena 5 //ENA stepper Driver
#define dir 6 //DIR stepper Driver
#define pul 7 //PUL stepper Driver
#define rapid 8 //Pulsante rapido
#define potS A0 //Potenziometro velocità normale
#define potR A1 //Potenziometro velocità Rapida
#define fcsx 10 //Fine corsa SX NC
#define fcdx 11 //Fine corsa DX NC
#define ledSx 12 //Led direzione SX
#define ledDx 9 //Led direzione DX
//#define buzzer 9 // Buzzer segnalazioni acustiche
#define power_on 2 //led stato acceso
int val_p_sx =0;
int val_p_dx =0;
int val_fcsx =0;
int val_fcdx =0;
int val_potS =0;
int val_potR =0;
int val_rapid =0;
int delay_MicrosS = 0;
int delay_MicrosR = 0;
void setup() {
Serial.begin(9600);
pinMode(puls_sx, INPUT_PULLUP);
pinMode(puls_dx, INPUT_PULLUP);
pinMode(ena, OUTPUT);
pinMode(dir, OUTPUT);
pinMode(pul, OUTPUT);
pinMode(potS, INPUT);
pinMode(potR, INPUT);
pinMode(fcsx, INPUT_PULLUP);
pinMode(fcdx, INPUT_PULLUP);
pinMode(ledSx, OUTPUT);
pinMode(ledDx, OUTPUT);
// pinMode(buzzer, OUTPUT);
pinMode(power_on, OUTPUT);
pinMode(rapid, INPUT_PULLUP);
digitalWrite(power_on, HIGH);
digitalWrite(ledSx,LOW);
digitalWrite(ledDx,LOW);
delay(200);
digitalWrite(ledSx, HIGH);
digitalWrite(ledDx, HIGH);
Serial.println ("Ready");
delay(1000);
digitalWrite(ledSx, LOW);
digitalWrite(ledDx, LOW);
tone(1, 1000, 600);
delay(1000);
}
/* void tone_err() {
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
Serial.println("Tono Errore");
} */
void loop() {
check_valori();
direzione();
}
void start_normal() {
// if (digitalRead(val_rapid)==1){ //se puls rapid non premuto
//leggo velocita potS
delay (delay_MicrosS); //in millis perchè con i micros non lavora correttamente
digitalWrite(pul, HIGH);
delayMicroseconds(10);
digitalWrite(pul, LOW);
}
void start_rapid() {
// if(digitalRead(val_rapid)==0) { //se premo rapid
//leggo potR
delayMicroseconds (delay_MicrosR);
digitalWrite(pul, HIGH);
delayMicroseconds(10);
digitalWrite(pul, LOW);
}
//}
void check_valori() {
val_p_sx = digitalRead(puls_sx);
val_p_dx = digitalRead(puls_dx);
val_fcsx = digitalRead(fcsx);
val_fcdx = digitalRead(fcdx);
val_rapid = digitalRead(rapid);
delay_MicrosS = map(analogRead(potS), 0, 1023,1,50);
delay_MicrosR = map(analogRead(potR), 0, 1023, 5, 500);
}
void direzione(){
if ((val_p_sx == 0)&&(val_p_dx==1)) { //funziona a SX
if (val_fcsx == 0) {
digitalWrite(ledSx, HIGH);
digitalWrite(dir, HIGH);
digitalWrite(ena, HIGH);
if (val_rapid==0){
start_rapid();
}
else {
start_normal();
}
}
else { if (val_fcsx == 1) { //finecorsa sx aperto blocco movimento
digitalWrite(ledSx, LOW); {
digitalWrite(ena, LOW);
Serial.println("finecorsa sinistra");
// tone_err();
}
}
}
}
if ((val_p_dx == 0)&&(val_p_sx==1)){
if (val_fcdx == 0){ //funziona a dx
digitalWrite(ledDx, HIGH);
digitalWrite(dir, LOW);
digitalWrite(ena, HIGH);
if (val_rapid==0){
start_rapid();
}
else {
start_normal();
}
}
else { if(val_fcdx == 1); { //finecorsa dx aperto blocco movimento
digitalWrite(ledDx, LOW); {
digitalWrite(ena, LOW);
Serial.println("finecorsa destra");
// tone_err();
}
}
}
}
if (((val_p_dx==0) && (val_p_sx==0))||((val_p_dx==1) && (val_p_sx==1))){
digitalWrite(ena, LOW);
digitalWrite(ledSx, LOW);
digitalWrite(ledDx, LOW);
//Serial.println("Stop");
}
}