Automazione: Divisore Elettronico semplice con schermo LCD e Tastiera (Terza Parte)

logo

A cura di Davide Munaretto

Nella seconda parte di questa trattazione abbiamo visto come creare un codice che ci consenta di inserire da tastiera il numero di divisioni desiderati per poi renderli eseguibili trami la pressione di un tasto.

Nel codice che segue invece delle divisioni è stato previsto l’inserimento del valore angolare da assegnare alla divisione.
/* Codice che permette di controllare un Motore Passo_Passo o un ServoMotore
* con visualizzazione dei parametri su schermo LCD I2C e inserimento da tastiera
* ServoMotore da 800 Step/giro con Encoder 1000 linee */

// Include le librerie:
// LiquidCrystal_I2C.h
// Wire per comunicare con I2C
// AccelStepper
// Keypad.h

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <AccelStepper.h>

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{‘1′,’2′,’3′,’A’},
{‘4′,’5′,’6′,’B’},
{‘7′,’8′,’9′,’C’},
{‘.’,’0′,’#’,’D’}
};

byte rowPINS[ROWS] = {11,10,9,8};
byte colPINS[COLS] = {7,6,5,4};

Keypad kpd = Keypad(makeKeymap(keys),rowPINS,colPINS, ROWS, COLS);

LiquidCrystal_I2C lcd(0x27,20,4); // SCL – A5, SDA – A4, VCC – +5, Gnd – Gnd
// Definizione dei pin di connessione del motore e delle interfacce motore nel caso vi fossero più di un motore.
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

// Crea l’istanza AccelStepper:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

float Angolo = 0.00; // Valore digitato da tastiera
int StepTeorici = 0.00;
float Microstep = 800; // Step per giro del Motore

void setup()
{
lcd.init();
lcd.backlight();

Angolo = getdivisioni();

// Stabilisce la massima velocità in steps per secondi:
stepper.setMaxSpeed(1500);
}

void loop()
{
lcd.clear();

// Attiva la rotazione premendo il pulsante “A”.
char key = kpd.getKey();
lcd.setCursor(0,0);lcd.print(“A: Rotazione” );
lcd.setCursor(0,3);lcd.print(“B: Menu” );
while(key != ‘A’)
{
switch (key)
{
case ‘B’:
lcd.init();
return setup();
}
key = kpd.getKey();

}
// Setta la posizione corrente a 0:
stepper.setCurrentPosition(0);

delay(100);

// Fa ruotare il motore a 1500 steps/secondo fino al raggiungimento dei passi teorici:
while(stepper.currentPosition() != StepTeorici)
{
stepper.setSpeed(1500);
stepper.runSpeed();
}
lcd.setCursor(0,1); // posiziona il cursore nella prima colonna della terza riga.
lcd.print(“Passi Percorsi: “); lcd.print(stepper.currentPosition()); // Stampa la scritta “Passi Percorsi”
delay(1000);
}
float getdivisioni()
{
float Angolo = 0.00;
float num = 0.00;
char key = kpd.getKey();
lcd.clear();
lcd.setCursor(0,0);lcd.print(“Angolo:”);
lcd.setCursor(0,3);lcd.print(“#: Invio”);
lcd.setCursor(8,0); //posiziona il cursore all’inizio del numero da inserire

while(key != ‘#’)
{
switch (key)
{
case NO_KEY:
break;

case ‘0’: case ‘1’: case ‘2’: case ‘3’: case ‘4’:
case ‘5’: case ‘6’: case ‘7’: case ‘8’: case ‘9’:
num = num * 10 + (key – ‘0’);
lcd.print(key);
break;
}
Angolo=num;
StepTeorici = (Microstep/360)*Angolo; //Calcolo numero di passi Teorici per ogni divisione
key = kpd.getKey();

}
}