Automazione: Gestione e connessione schermo LCD (Terza parte)

logo

A cura di Davide Munaretto

In questa terza parte, vediamo come sia particolarmente utile sfruttare un monitor per visualizzare determinati comandi o verificare gli spostamenti dell’albero motore.

A questo scopo ho preso come esempio il codice di controllo del motore attraverso la rotazione di un Encoder esterno e visualizzando i valori di spostamento angolare ottenuti con la regolazione dell’Encoder.

La risoluzione dell’Encoder ci consente di ottenere divisioni differenti, in questo caso l’Encoder utilizzato ha una risoluzione di 1600 impulsi/giro.

/* Codice che permette di controllare un Motore Passo_Passo o un ServoMotore
* con l’ausilio di un Encoder.
*/
// Include le librerie:
// LiquidCrystal_I2C.h
// Wire per comunicare con I2C
// AccelStepper:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>

// Connessione del modulo I2C: pin SDA connesso ad A4 e pin SCL ad A5.
// Monitor LCD 20×4 I2C
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); // per monitor LCD 16×2 cambiare con (0x27,16,2).

// Definizione dei pin di connessione dell’Encoder e inizializzazione delle variabili:
#define encoder_pin_A 8
#define encoder_pin_B 9
int encoder_pin_A_last = LOW;
int encoder_pos = 0;
int n = LOW;
// Definizione dei pin di connessione del motore:
#define stepper_pin_step 3
#define stepper_pin_dir 2

// Calcolo degli impulsi da assegnare all’Encoer per la rotazione
// L’Encoder usato ha 1600 impulsi per giro
// Il Motore fa 800 steps per giro
// Volendo: 1 giro encoder = 1 giro del Motore
// 800 / 1600 = 0.5

float steps_per_pulse = 0.5;

// Crea l’istanza AccelStepper:
AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);

void setup() {

// Inizializza LCD:
lcd.init();
lcd.backlight();

// Setta la massima velocità e Accelerazione:
stepper.setMaxSpeed(800.0);
stepper.setAcceleration(300.0);

pinMode(encoder_pin_A, INPUT_PULLUP);
pinMode(encoder_pin_B, INPUT_PULLUP);
}

void loop() {
// Legge la posizione dell’ Encoder
n = digitalRead(encoder_pin_A);

if ((encoder_pin_A_last == LOW) && (n == HIGH)) {
if (digitalRead(encoder_pin_B) == LOW) {
encoder_pos–;
} else {
encoder_pos++;
}

lcd.setCursor(0, 0); // posiziona il cursore nella prima colonna della prima riga.
lcd.print(“Angolo : “); lcd.print(encoder_pos/4.5);// Stampa il valore dell’angolo percorso

// Posiziona il Motore sulla nuova posizione calcolata
stepper.moveTo((long) round(encoder_pos*steps_per_pulse));
}
encoder_pin_A_last = n;

stepper.run();
}