Salve a tutti spero di aver caricato bene il mio post, sono nuovo sto usando arduino mega 2560, ho un problema, leggo un encoder correttamente e stampo su un display, ma se nel loop lascio la chiamata stampa il motore passo passo va a scatti e molto lento, se la cancello il motore va bene. C è qualche soluzione? ho provato anche a terminare prima il posizionamento tramite un if a movimento concluso stampare su display il valore dell encoder, e comunque il motore non va liscio come dovrebbe. C è un altro sistema?
grazie a tutti ragazzi
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#include <Wire.h>
#include "Timer.h"
//lettura encoder
int encoderPin1 = 18;
int encoderPin2 = 19;
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
//lettura encoder
#include <AccelStepper.h>
AccelStepper stepper1(AccelStepper::DRIVER,2,3);
unsigned long tempo=0;
void setup() {
lcd.begin();
TCCR3B = TCCR3B & B11111000 | B00000001;
pinMode(encoderPin1, INPUT);
pinMode(encoderPin2, INPUT);
digitalWrite(encoderPin1, HIGH);
digitalWrite(encoderPin2, HIGH);
attachInterrupt(4, updateEncoder, CHANGE);
attachInterrupt(5, updateEncoder, CHANGE);
stepper1.setMaxSpeed(3000.0);
stepper1.setAcceleration(1000.0);}
void loop() {
stepper1.moveTo(12000);
stepper1.run();
stampa();
}
void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
lastEncoded = encoded;}
void stampa(){
lcd.setCursor(0,1);
lcd.print("Posiz encoder =");
lcd.setCursor(14,1);
lcd.print(encoderValue);
if (encoderValue<10000){
lcd.setCursor(18,1);
lcd.print(" ");}
if (encoderValue<1000){
lcd.setCursor(17,1);
lcd.print(" ");}
if (encoderValue<100){
lcd.setCursor(16,1);
lcd.print(" ");}
if(encoderValue<10){
lcd.setCursor(15,1);
lcd.print(" ");
lcd.setCursor(14,1);
lcd.print(encoderValue); }
}