Questo è il codice, ho corretto i BUG e compila senza errori, ma questo vuol dire solo che il linguaggio va bene, "quello che si dice con il linguaggio" potrebbe essere tutto sbagliato,
un po come quando dico cazzate ma le parole sono giuste
Per le librerie mi sono basato sugli esempi perché non le uso e quindi non le ricordo a memoria.
La libreria lcd I2C non l'ho trovata con gestione librerie si vede che è una libreria vecchia, sono andato a cercare download zip.
La parte fisica è composta da LCD I2C, keypad numeri e caratteri A B C D, scheda compatibile arduino cha abbia almeno 17 pin digitali.
Il principio è questo,
1)Accendo il sistema, almeno una volta premo il tasto D del tastierino, e inserisco un valore di avanzamento F in millimetri al minuto
Resta memorizzata l'ultima F avanzamento inserito, per cui se non devo modificare dopo la prima volta non devo piu inserirlo.
2) Ho i pulsanti A B C sul tastierino, corrispondono alla selezione degli assi rispettivamente X Y X
3) Seleziono un asse e inserisco il valore di spostamento, positivo o negativo relativo, dal punto in cui si trova nel verso degli assi cartesiani completi x+ x- y+ y-
Preciso che il tasto cancelletto deve essere premuto per conferma "invio" dopo inserimento di valore numerico.
Valore positivo o negativo, sarà in un verso e nel verso opposto, ma poi dipende dai collegamenti se corrisponde a positivo e negativo degli assi cartesiani.
Ecco biscottino, se non funziona ma si puo correggere non è avariato, se non puo mai funzionare allora sono d'accordo che è avariato e da buttare, comunque non sono un pasticciere non si puo pretendere che sia sempre buono
Codice: Seleziona tutto
/* Un posizionatore fresatrice per gli assi X Y Z
Il pricipio è questo, sono su un punto sulla tavola è l'origene assi cartesiani
Decido in che direzione mi devo spostare X+ X- Y+ Y-
Premo pulsante asse sul tastierino, e inserisco spostamento, positivo o negativo a seconda del verso.
il canencelleto nel tastierno è tato conferma.
*/
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
#include <Keypad.h>
#define PASSIAMM 100 //Quanti step per spostamento di un mm IN BASE a step e meccanica
// i pin della sceda mettere numero pin effettivamente utilizzato
#define STEPPIN1 11
#define DIRPIN1 10
#define STEPPIN2 9
#define DIRPIN2 8
#define STEPPIN3 7
#define DIRPIN3 6
#define XBUTTON 5
#define YBUTTON 4
#define ZBUTTON 3
AccelStepper stepper1(AccelStepper::DRIVER, STEPPIN1, DIRPIN1);
AccelStepper stepper2(AccelStepper::DRIVER, STEPPIN2, DIRPIN2);
AccelStepper stepper3(AccelStepper::DRIVER, STEPPIN3, DIRPIN3);
// Scegliere indirizzo giusto lcd
LiquidCrystal_I2C lcd(0x3f, 16, 2);
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{ '1', '2', '3', 'X' },
{ '4', '5', '6', 'Y' },
{ '7', '8', '9', 'Z' },
{ '.', '0', '#', 'D' } // Ho sostituito * con il punto per numeri decimali, * su tastiera corrisponte a .
};
byte rowPins[ROWS] = { 9, 8, 7, 6 }; // METTERE I PIN USATI DAL KEYPAD
byte colPins[COLS] = { 5, 4, 3, 2 };
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup() {
lcd.begin(16, 2);
pinMode(STEPPIN1, OUTPUT);
pinMode(DIRPIN1, OUTPUT);
pinMode(STEPPIN2, OUTPUT);
pinMode(DIRPIN2, OUTPUT);
pinMode(STEPPIN3, OUTPUT);
pinMode(DIRPIN3, OUTPUT);
pinMode(XBUTTON, INPUT_PULLUP);
pinMode(YBUTTON, INPUT_PULLUP);
pinMode(ZBUTTON, INPUT_PULLUP);
// impostare valori accelerazione e maxspeed adatti
stepper1.setMaxSpeed(200.0);
stepper1.setAcceleration(200.0);
stepper2.setMaxSpeed(200.0);
stepper2.setAcceleration(200.0);
stepper3.setMaxSpeed(200.0);
stepper3.setAcceleration(200.0);
}
char stato = 0;
char AsseSelezionato = 'X';
float Avanzamento = 0;
float spostamento = 0;
void loop() {
if (digitalRead(XBUTTON) == LOW) {
AsseSelezionato = 'X';
stato = 1;
} else if (digitalRead(YBUTTON) == LOW) {
AsseSelezionato = 'Y';
stato = 2;
} else if (digitalRead(ZBUTTON) == LOW) {
AsseSelezionato = 'Z';
stato = 3;
}
//Impostazione avanzamento F solo se si preme tasto D tastierino TASTIERNO CON LETTERE A=x B=y C=z D
if (customKeypad.getKey() == 'D') {
display("cancella");
display("F= ");
Avanzamento = tastierino();
// Calcolo velocita passi al secondo corrispondente ad avanzamento impostato in MM al minuto F
// Millimetri al minuto/60=millimetri al secondo / passi a millimetro
Avanzamento = (Avanzamento / 60) / PASSIAMM;
//Imposto velocita setSpeed sui tre motori
stepper1.setSpeed(Avanzamento);
stepper2.setSpeed(Avanzamento);
stepper3.setSpeed(Avanzamento);
}
switch (stato) {
case 1:
display("cancella");
display("X= ");
spostamento = tastierino();
stato = 4;
case 2:
display("cancella");
display("Y= ");
spostamento = tastierino();
stato = 4;
case 3:
display("cancella");
display("Z= ");
spostamento = tastierino();
stato = 4;
case 4:
//In base all'asse selezionato con i pulsanti, comanda il movimento del driver associato
if (AsseSelezionato = 'X') {
stepper1.move((int)(spostamento * PASSIAMM));
} else if (AsseSelezionato = 'Y') {
stepper2.move((int)(spostamento * PASSIAMM));
} else if (AsseSelezionato = 'Z') {
stepper3.move((int)(spostamento * PASSIAMM));
}
stato = 0; // In stato di attesa nuovo comando
}
//NEL loop richiamo continuamente il movimento dei motori
stepper1.runSpeed();
stepper2.runSpeed();
stepper3.runSpeed();
}
void display(char* s) {
if (strcmp(s, "cancella") == 0) {
lcd.clear();
lcd.setCursor(0, 1);
}
lcd.print(s);
}
float tastierino() {
//Premere il tato cancelleto una volta terminato insermento dei valori numerici
char carattere;
char stringa[20];
int i = 0;
do {
carattere = customKeypad.getKey();
if (carattere != NO_KEY) {
stringa[i++] = carattere;
display(carattere);
}
} while (carattere != '#');
stringa[--i] = '\0';
return atof(stringa);
}