#include <GyverStepper.h>;
#include <LiquidCrystal_I2C.h>
#define shnekStopButton 7 //порт кнопки запуска/остановки работы шнеков
#define nozhStopButton 4 //порт кнопки запуска/остановки работы ножа
#define shnekCLK 8 //порт CLK энкодера скорости шаговика шнеков
#define shnekDT 9 //порт DT энкодера скорости шаговика шнеков
#define nozhCLK 10 //порт CLK энкодера управления ножом
#define nozhDT 11 //порт DT энкодера управления ножом
#define nozhSW 12 //порт SW энкодера управления ножом
#define shnekStep 6 //порт STEP шаговика шнеков
#define nozhkStep 5 //порт STEP шаговика ножа
#define shnekDir 3 //порт DIR шаговика шнеков (не используется)
#define nozhDir 2 //порт DIR шаговика ножа (не используется)
int shnekMinSpeed = 10; //ввод переменной минимальной скорости шаговика шнеков
int shnekMaxSpeed = 500; //ввод переменной максимальной скорости шаговика шнеков
int speedShnek = 200; //ввод переменной скорости шаговика шнеков
int shnekAccel = 1;
int oldSpeedShnek = speedShnek+5; //ввод вспомогательной переменной скорости шаговика шнеков
int pauseCut = 10000; //ввод переменной паузы между махами ножа
int speedCut = 200; //ввод переменной скорости махов ножа
int nozhUgol = 360; //значение угла поворота вала двигателя ножа
bool shnekLastClk = HIGH;
bool nozhLastClk = HIGH;
bool shnekStopFlag = HIGH;
bool shnekStopFunc = HIGH; //HIGH - стоп, LOW - работа
bool nozhStopFunc = HIGH; //то же самое, но дл ножа
bool nozhMode = LOW;
long nozhSpeed = 4000000*nozhUgol/square(speedCut);
uint32_t encoderTime = millis();
uint32_t timeStopShnek = 0;
uint32_t nozhEncoderTime = millis();
uint32_t shnekEncoderTime = millis();
uint32_t timeNozh = -30000;
uint32_t shnekStoppingTime = millis();
LiquidCrystal_I2C lcd(0x27, 16, 2);//обозначение ЖК дисплея
GStepper<STEPPER2WIRE> shneki(200, shnekStep, shnekDir); //определение шаговика "shneki"
GStepper<STEPPER2WIRE> nozh(200, nozhkStep, nozhDir); //определение шаговика "hozh"
void setup() {
Serial.begin(115200);
lcd.init(); //инициация ЖК дисплея
lcd.backlight(); //включение задней подсветки ЖК дисплея
//Назначение пинов
pinMode(shnekStopButton, INPUT);
pinMode(nozhStopButton, INPUT);
pinMode(shnekCLK, INPUT);
pinMode(shnekDT, INPUT);
pinMode(nozhCLK, INPUT);
pinMode(nozhDT, INPUT);
pinMode(nozhSW, INPUT_PULLUP);
pinMode(shnekStep, OUTPUT);
pinMode(nozhkStep, OUTPUT);
//pinMode(shnekDir, OUTPUT);
//pinMode(nozhkDir, OUTPUT);
nozh.setRunMode(FOLLOW_POS); //режим следования к позиции на шаговике ножа
shneki.setRunMode(KEEP_SPEED);//режим поддержания постоянной скорости на шаговике шнеков
nozh.setMaxSpeedDeg(6*3000); //установка максимальной скорости вращения вала шаговика ножа (3000 об/мин)
nozh.setAccelerationDeg(nozhSpeed); //установка ускорения ножа
shneki.setMaxSpeedDeg(6*shnekMaxSpeed); //установка максимальной скорости вращения вала шаговика шнеков (5оо об/мин)
shneki.setAccelerationDeg(360*shnekAccel); //установка ускорения шаговика шнеков
lcd.setCursor(0, 0); //вывод 1 строки на ЖК дисплее
lcd.print("P,s: C,s: S,RPM:");
//вывод значения паузы между махами в "с"
lcd.setCursor(0, 1);
lcd.print(pauseCut/1000.0,1);
//вывод значения времени маха в "с"
lcd.setCursor(5, 1);
lcd.print(float(speedCut)/1000.0,1);
//вывод скорости вращения шаговика шнеков
lcd.setCursor(11, 1);
lcd.print(speedShnek);
//показать стрелочкой выбранный режим настройки (паузы между махами)
lcd.setCursor(4, 0);
lcd.write(127);
}
void loop() {
Serial.println(nozhSpeed);
if (shnekStopFunc == LOW) {
shneki.tick();};
nozh.tick();
//опрос энкодера скорости
int shnekNewClk = digitalRead(shnekCLK);
if (shnekNewClk != shnekLastClk && millis()-encoderTime >= 10){
shnekLastClk = shnekNewClk;
int shnekValueDT = digitalRead(shnekDT);
if (shnekNewClk == LOW && shnekValueDT == HIGH) {speedShnek+=5;} //при движении энкодера по часовой
if (shnekNewClk == LOW && shnekValueDT == LOW) {speedShnek-=5;};//при движении энкодера против часовой
speedShnek = constrain(speedShnek, shnekMinSpeed, shnekMaxSpeed);
lcd.setCursor(11, 1);
lcd.print(speedShnek);
lcd.print(" ");
lcd.print(" ");
lcd.print(" ");
encoderTime = millis();
};
if (shnekStopFunc == LOW) {
shneki.tick();};
nozh.tick();
//назначение новых скоростей
if (speedShnek != oldSpeedShnek && digitalRead(shnekStopButton)==true && millis() - shnekEncoderTime >= 2500){
oldSpeedShnek = speedShnek;
shneki.setSpeedDeg(6*speedShnek, SMOOTH);
if (shnekStopFunc == HIGH){shnekStopFunc = LOW;};
if (shnekStopFlag == HIGH){shnekStopFlag = LOW;};
shnekEncoderTime = millis();
};
if (shnekStopFunc == LOW) {
shneki.tick();};
nozh.tick();
//останов
if (shnekStopFlag==HIGH && shnekStopFunc == LOW && millis() - shnekStoppingTime >= timeStopShnek) {shnekStopFunc = HIGH;};
//расчёт времени для останова
if (digitalRead(shnekStopButton)==false && shnekStopFlag==LOW) {
timeStopShnek = abs(((speedShnek/shnekAccel)*16.67));
shnekStoppingTime = millis();
oldSpeedShnek = speedShnek+20;
shneki.stop();
shnekStopFlag=HIGH;
};
if (shnekStopFunc == LOW) {
shneki.tick();};
nozh.tick();
//настройка ножа
if (digitalRead(nozhSW) == LOW && millis() - encoderTime >= 1000) {
nozhMode = !nozhMode;
lcd.setCursor(4, 0);
if (nozhMode == LOW){lcd.write(127);}
else {lcd.write(126);};
encoderTime = millis();
}
if (shnekStopFunc == LOW) {
shneki.tick();};
nozh.tick();
int nozhNewClk = digitalRead(nozhCLK);
if (nozhNewClk != nozhLastClk && millis()-encoderTime >= 10) {
nozhLastClk = nozhNewClk;
int nozhValueDT = digitalRead(nozhDT);
if(nozhMode == LOW){
if (nozhNewClk == LOW && nozhValueDT == HIGH) {pauseCut+=500;} //при движении энкодера по часовой
if (nozhNewClk == LOW && nozhValueDT == LOW) {pauseCut-=500;};//при движении энкодера против часовой
pauseCut = constrain(pauseCut, 1000, 30000);
lcd.setCursor(0, 1);
lcd.print(pauseCut/1000.0,1);
lcd.print(" ");
};
if (shnekStopFunc == LOW) {
shneki.tick();};
nozh.tick();
if(nozhMode == HIGH){
if (nozhNewClk == LOW && nozhValueDT == HIGH) {speedCut+=100;} //при движении энкодера по часовой
if (nozhNewClk == LOW && nozhValueDT == LOW) {speedCut-=100;};//при движении энкодера против часовой
speedCut = constrain(speedCut, 100, 1000);
lcd.setCursor(5, 1);
lcd.print(float(speedCut)/1000.0,1);
lcd.print(" ");
nozhSpeed = nozhSpeed = 4000000*nozhUgol/square(speedCut);
nozh.setAccelerationDeg(nozhSpeed);
};
encoderTime = millis();
}
if (shnekStopFunc == LOW) {
shneki.tick();};
nozh.tick();
//запуск по таймеру
if (digitalRead(nozhStopButton)==true && millis() - timeNozh >= pauseCut){
if(nozhStopFunc == HIGH){nozhStopFunc = LOW;};
nozh.setTargetDeg(nozhUgol, RELATIVE);
timeNozh = millis();
};
if (shnekStopFunc == LOW) {
shneki.tick();};
nozh.tick();
//останов
if (digitalRead(nozhStopButton)==false && nozhStopFunc == LOW) {
nozh.stop();
nozhStopFunc = HIGH;
};
}Пауза/Скорость между махами
Скорость шнеков