Ciao a tutti,
Sto provando a far muovere i motori della cnc da Arduino Mega2560 (la macchina ha un controller PlanetCnc MK1) inviando segnali direttamente dai pin del microcontrollore alla DB25 del controller. Ho già scritto il programma usando pinMode e digitalWrite e funziona perfettamente, però poi ho voluto provare a usare le port per fare la stessa cosa e qui mi è sorto un problema, ovvero che l'asse Z si sposta solo verso l'alto, non riesco ad invertire il senso di marcia, nonostante abbia impostato la porta e il valore del pin correttamente (a questo punto non ne sono più così sicuro). Gli assi X e Y funzionano correttamente e Z no. Per chiarezza il pin della direzione dell'asse Z è il nr 8 di Arduino
Questo qui sotto è il mio codice, se qualcuno vedesse un errore che io non riesco a vedere o avesse consigli da darmi, sarebbe molto apprezzato.
Grazie!
P.S. le definizioni delle porte e dei pin, li ho presi dal datasheet dell'ATMega2560
int millisBtwSteps = 1;
byte SP_DISABLE = B00010000; // Port E bit 4 (ALWAYS HIGH)
byte STEP_X_H = B00110000; // Port E bit 5 & 4 (SP_DISABLE ever HIGH)
byte STEP_X_L = B00010000; // Port E bit 5 & 4 (SP_DISABLE ever HIGH)
byte STEP_Y_H = B00011000; // Port E bit 3 & 4 (SP_DISABLE ever HIGH)
byte STEP_Y_L = B00010000; // Port E bit 3 & 4 (SP_DISABLE ever HIGH)
byte DIR_UP_X = B00100000; // Port G bit 5
byte DIR_DOWN_X = B00000000; // Port G bit 5
byte DIR_UP_Y = B00001000; // Port H bit 3
byte DIR_DOWN_Y = B00000000; // Port H bit 3
byte STEP_Z_H = B00010000; // Port H bit 4
byte STEP_Z_L = B00000000; // Port H bit 4
byte DIR_UP_Z = B00000000; // Port H bit 5
byte DIR_DOWN_Z = B00100000; // Port H bit 5
void setup() {
DDRE = B00111000; // Pin 2 3 5 - SP ENABLE, X_STEP, Y_STEP
DDRG = B00100000; // Pin 4 - X_DIR
DDRH = B00111000; // Pin 6 7 8 9 - Y_DIR, Z_STEP, Z_DIR
// Disable spindle
PORTE = SP_DISABLE;
}
void loop() {
unsigned long time_now = 0;
// Move X by 10mm
// Direction UP
PORTG = DIR_UP_X;
for (int i = 0; i < 4000; i++) {
PORTE = STEP_X_L;
time_now = millis();
PORTE = STEP_X_H;
while(millis() < time_now + millisBtwSteps){
//wait approx. millisBtwSteps
}
}
// Move X by 10mm
// Direction DOWN
PORTG = DIR_DOWN_X;
for (int i = 0; i < 4000; i++) {
PORTE = STEP_X_L;
time_now = millis();
PORTE = STEP_X_H;
while(millis() < time_now + millisBtwSteps){
//wait approx. millisBtwSteps
}
}
// Move Y by 10mm
// Direction UP
PORTH = DIR_UP_Y;
for (int i = 0; i < 4000; i++) {
PORTE = STEP_Y_L;
time_now = millis();
PORTE = STEP_Y_H;
while(millis() < time_now + millisBtwSteps){
//wait approx. millisBtwSteps
}
}
// Move Y by 10mm
// Direction DOWN
PORTH = DIR_DOWN_Y;
for (int i = 0; i < 4000; i++) {
PORTE = STEP_Y_L;
time_now = millis();
PORTE = STEP_Y_H;
while(millis() < time_now + millisBtwSteps){
//wait approx. millisBtwSteps
}
}
// Move Z by 5mm
// Direction UP
PORTH = DIR_UP_Z;
for (int i = 0; i < 2000; i++) {
PORTH = STEP_Z_L;
time_now = millis();
PORTH = STEP_Z_H;
while(millis() < time_now + millisBtwSteps){
//wait approx. millisBtwSteps
}
}
// Move Z by 5mm
// Direction DOWN
PORTH = DIR_DOWN_Z;
for (int i = 0; i < 2000; i++) {
PORTH = STEP_Z_L;
time_now = millis();
PORTH = STEP_Z_H;
while(millis() < time_now + millisBtwSteps){
//wait approx. millisBtwSteps
}
}
}