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

logo

A cura di Davide Munaretto

In questa puntata, proseguiamo con lo sviluppo del codice inserendo l’acquisizione dei dati da tastiera in modo diretto.

Questo ci consente di rendere più agevole e flessibile l’utilizzo del programma di gestione del nostro Divisore Elettronico.

Il prossimo passo sarà quello di creare una funzione che ci permetta di azionare il motore premendo un tasto e quindi facendolo avanzare manualmente.

/* 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 Div = 0;              // Valore digitato da tastiera
int StepTeorici = 0;
int Microstep = 800; // Step per giro del Motore

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

Div = getdivisioni();  //funzione di acquisizione dati da tastiera

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

void loop()
{
// Setta la posizione corrente a 0:
stepper.setCurrentPosition(0);

delay(1500);

// 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,3); // posiziona il cursore nella prima colonna della terza riga.
lcd.print(“Passi Percorsi: “); lcd.print(stepper.currentPosition()); // Stampa la scritta “Passi Percorsi”
delay(1000);
}

// Attiva la funzione di acquisizione da tastiera
float getdivisioni()
{
float Div = 0.00;
float num = 0.00;
char key = kpd.getKey();
lcd.clear();
lcd.setCursor(0,0);lcd.print(“Num. Divisioni:”);
lcd.setCursor(0,3);lcd.print(“# = Inv.”);
lcd.setCursor(16,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;
}
Div=num;
StepTeorici = Microstep / Div;    //Calcolo numero di passi Teorici per ogni divisione
key = kpd.getKey();
}
}