Доброго времени суток! Столкнулся с проблемой при работе с шаговым двигателем на драйвере a4988 и дисплеем LCD 1602. При отправке теста на дисплей по каналу I2C, в момент обновления дисплея, шаговый двигатель замирает на доли секунды из за чего происходит рывок. Как от этого избавиться? Микрокотроллер Wemos mini.
C++:
#include <LCD_1602_RUS.h>
#include "GyverButton.h"
#include "GyverStepper.h"
LCD_1602_RUS lcd(0x27, 16, 2);
String empStr = " ";
GStepper<STEPPER2WIRE> stepper1(400, D7, D8, D4);
GButton myButt1;
GButton myButt2;
GButton myButt3;
GButton myButt4;
float MotorSpeed=400, MotorSpeedSM; //максимум 10 об/сек. (10*400 шагов)
bool auto_falg=false, stop_flag=false;
float Odo;
void ICACHE_RAM_ATTR sens(); //прирывание
volatile unsigned long lastflash, flash, lastshow;
unsigned int RPS;
void setup()
{
//Debug mode
//Blynk
//Encoder
attachInterrupt(D6, sens, RISING); // подключить прерывание на D6 пин при повышении сигнала
//Buttion
Serial.begin(9600);
pinMode(D6, INPUT);
myButt1.setType(LOW_PULL);
myButt2.setType(LOW_PULL);
myButt3.setType(LOW_PULL);
myButt4.setType(LOW_PULL);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Redy to work");
lcd.setCursor(0, 1);
lcd.print("Waiting...");
//StepMotor
stepper1.setRunMode(KEEP_SPEED);
stepper1.setAcceleration(0);
stepper1.disable();
//Menu
}
void loop()
{
int analog = analogRead(0);
myButt1.tick(analog < 200 && analog > 160);
myButt2.tick(analog < 330 && analog > 290);
myButt3.tick(analog < 545 && analog > 505);
myButt4.tick(analog < 730 && analog > 690);
if (!auto_falg) { //Ессли ручной режим
if (analog < 200 && analog > 160) {
if (stop_flag) {stepper1.enable(); stepper1.setSpeed(MotorSpeed); lcd.setCursor(0, 0); lcd.print("Unclick to stop");}
if (millis() - lastshow > 100) {
MotorSpeedSM += (MotorSpeed-MotorSpeedSM)*0.2;
stepper1.setSpeed(MotorSpeedSM);
lastshow = millis(); // сброс таймера
}
stop_flag=false;
}else{
if (millis() - lastshow > 100 && MotorSpeedSM>10) {
MotorSpeedSM += (0-MotorSpeedSM)*0.4;
Serial.println(MotorSpeedSM);
stepper1.setSpeed(MotorSpeedSM);
lastshow = millis();
if (MotorSpeedSM<10 & !stop_flag) {
stepper1.disable();
lcd.setCursor(0, 0); lcd.print("Press to start");
stop_flag=true;
}
}
}
}
if (myButt2.isClick()) {
MotorSpeed+=400;
if (MotorSpeed>2400) MotorSpeed=2400;
if (MotorSpeed==0) MotorSpeed=400;
lcd.setCursor(0, 1); lcd.print(empStr); lcd.setCursor(0, 1); lcd.print("Speed: " + String(60*int(MotorSpeed)/1600)+ "RPM");
}
if (myButt3.isClick()) {
MotorSpeed-=400;
if (MotorSpeed<-2400) MotorSpeed=-2400;
if (MotorSpeed==0) MotorSpeed=-400;
lcd.setCursor(0, 1); lcd.print(empStr); lcd.setCursor(0, 1); lcd.print("Speed: " + String(60*int(MotorSpeed)/1600)+ "RPM");
}
if (myButt4.isClick()) {
MotorSpeed=MotorSpeed*-1;
lcd.setCursor(0, 1); lcd.print(empStr); lcd.setCursor(0, 1); lcd.print("Speed: " + String(60*int(MotorSpeed)/1600) + "RPM");
}
if (myButt4.isHolded()) {
auto_falg = !auto_falg;
stepper_enable();
}
if (auto_falg) {
if (millis() - lastflash > 1000/20) { //Вывод скорости каждую 1/20 сек
RPS = flash*20;
Odo = Odo + 0.012*float(flash)/37;
//Serial.println("Enc. speed:" + String(RPS) + "step/sec, Flash psi:" + String(flash) + ", Odo: " + String(Odo) ); // выводим RPS
lastflash = millis(); // сброс таймера
flash=0;
stepper1.setSpeed(RPS);
if (RPS==0) {stepper1.disable(); }
if (millis() - lastshow > 2000) { //Вывод показаний одометра
//Serial.println("Odometor:" + String(Odo) + "m");
lcd.setCursor(0, 1); lcd.print("Odometor:" + String(Odo) + "m");
lastshow = millis(); // сброс таймера
}
}
}
stepper1.tick();
}
void sens() {
flash += 1;
}
void stepper_enable() {
if (auto_falg) {
stepper1.enable();
Serial.print("Enable");
lcd.setCursor(0, 0); lcd.print(empStr); lcd.setCursor(0, 0); lcd.print("Auto mode");
}else{
stepper1.disable();
Serial.print("Disable");
lcd.setCursor(0, 0); lcd.print(empStr); lcd.setCursor(0, 0); lcd.print("Manual mode");
}
}