Помогите пожалуйста доработать скетч.
- Войдите на сайт для отправки комментариев
Помогите пожалуйста доработать скетч.
Жезо: ардуино нано (ATmega328), шилд с кнопками, шаговый двигатель 28BYJ-48 с драйвером ULN2003.
Сейчас реализовано:
- по нажатию кнопок 0 и 3 задается скорость вращения вала двигателя (если не устраивает скорость заданная по умолчанию);
- по нажатию кнопки 4 двигатель начинает вращаться с заданной скоростью, повторное нажатие кнопки останавливает двигатель;
Необходимо, для кнопок 1 и 2 дописать код, что-бы пока нажата кнопка 1 двигатель вращался с установленной скоростью, при ее отпускании - останавливался, для кнопки 2 все то же самое только вал должен вращаться в обратную сторону.
Ну и в целом посмотрите на скетч (не я писал), может что-то можно оптимизировать или улучшить, энергопотребление всей этой ситемы снизить.
Заранее всем спасибо!
#include <AccelStepper.h>
#include <LiquidCrystal.h>
#define HALFSTEP 8
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
int adc_key_val[5] ={50, 200, 400, 600, 800 };
// Motor pin definitions
#define motorPin1 2 // IN1 on the ULN2003 driver 1
#define motorPin2 3 // IN2 on the ULN2003 driver 1
#define motorPin3 11 // IN3 on the ULN2003 driver 1
#define motorPin4 12 // IN4 on the ULN2003 driver 1
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int isRun;
int speeds = -326;
int maxspeed = 1000;
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
void setup()
{
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print(" Stopped ");
lcd.setCursor(0,1);
lcd.print("Speed ");
lcd.print(speeds);
lcd.print(" ");
isRun = 0;
analogWrite(10, 5);
stepper1.setMaxSpeed(maxspeed);
stepper1.setSpeed(speeds);
}
void loop()
{
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key >= 0) // if keypress is detected
{
if (key == 1)
{
//????????
}
if (key == 2)
{
//????????
}
if (key == 0)
{
speeds += 10;
delay(200);
}
if (key == 3)
{
speeds -= 10;
delay(200);
}
if (speeds>maxspeed)
{
speeds = maxspeed;
}
if (speeds<-maxspeed)
{
speeds = -maxspeed;
}
if (key == 4)
{
isRun = 1 - isRun;
lcd.setCursor(0,0);
if (isRun == 1)
{
lcd.print("+++ Running +++ ");
}
else
{
lcd.print(" Stopped ");
}
delay(250);
}
lcd.setCursor(0, 1);
lcd.print("Speed ");
lcd.print(speeds);
lcd.print(" ");
stepper1.setSpeed(speeds);
delay(50);
}
if (isRun == 1)
{
stepper1.runSpeed();
}
}
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
return k;
}
if (k >= NUM_KEYS)
k = -1; // No valid key pressed
return k;
}
if (key >= 0) // if keypress is detected { if (key == 1) { stepper1.setSpeed(speeds); stepper1.runSpeed(); } if (key == 2) { stepper1.setSpeed(speeds*-1); stepper1.runSpeed(); } if (key == 0) { speeds += 10; delay(200); } if (key == 3) { speeds -= 10; delay(200); } if (key == 4) { isRun = 1 - isRun; lcd.setCursor(0,0); if (isRun == 1) { lcd.print("+++ Running +++ "); } else { lcd.print(" Stopped "); } delay(250); } static int prevspeeds = 0; if(speeds != prevspeeds) { prevspeeds = speeds; if (speeds > maxspeed) { speeds = maxspeed; } if (speeds < -maxspeed) { speeds = -maxspeed; } lcd.setCursor(0, 1); lcd.print("Speed "); lcd.print(speeds); lcd.print(" "); stepper1.setSpeed(speeds); delay(50); } }Ну и причем тут кнопки?
maksim, я пробовал такой вариант и попробовал только что еще раз Ваш, не работает, двигатель вибрирует, но вал не крутится. Вопрос пока остался не решенным.
Ну а если в моем варианте сделать так
if (key == 1) { stepper1.runSpeed(); } if (key == 2) { stepper1.runSpeed(); }то двигатель тоже не крутится?
Можно зайти с другой стороны
static bool runing = 0; if (key >= 0) // if keypress is detected { if (key == 1) { if(!runing) { isRun = 1; runing = 1; } } if (key == 2) { if(!runing) { stepper1.setSpeed(speeds*-1); isRun = 1; runing = 1; } } if (key == 0) { speeds += 10; delay(200); } if (key == 3) { speeds -= 10; delay(200); } if (key == 4) { isRun = 1 - isRun; lcd.setCursor(0,0); if (isRun == 1) { lcd.print("+++ Running +++ "); } else { lcd.print(" Stopped "); } delay(250); } static int prevspeeds = 0; if(speeds != prevspeeds) { prevspeeds = speeds; if (speeds > maxspeed) { speeds = maxspeed; } if (speeds < -maxspeed) { speeds = -maxspeed; } lcd.setCursor(0, 1); lcd.print("Speed "); lcd.print(speeds); lcd.print(" "); stepper1.setSpeed(speeds); delay(50); } } else if(runing) { stepper1.setSpeed(speeds); isRun = 0; runing = 0; }Прошу прощеня, был невниметелен и нижний кусок кода не заметил, сейча попробовал снова, работает за маленьким нюансом. после вращения кнопками 1 и 2 по нажатию на кнопку 4, вал вращается в ту сторону в которую крутился последний раз (если я правиль нонял закономерность), желательно, что бы по нажатию на кнопку 4 направление вращения вала всегда соответствовало направлению заданному по умолчанию.
За оказанную помощь благодарю!
Второй вариант тоже интересен, но сейчас не могу его испытать, ухожу, попробую завтра. Еще раз спасибо!
static bool runing = 0; if (key >= 0) // if keypress is detected { switch(key) { case 1: if(!runing) { isRun = 1; runing = 1; } break; case 2: if(!runing) { stepper1.setSpeed(speeds*-1); isRun = 1; runing = 1; } break; case 0: speeds += 10; if (speeds > maxspeed) speeds = maxspeed; delay(200); break; case 3: speeds -= 10; if (speeds < -maxspeed) speeds = -maxspeed; delay(200); break; case 4: isRun = 1 - isRun; lcd.setCursor(0,0); if (isRun == 1) { lcd.print("+++ Running +++ "); } else { lcd.print(" Stopped "); } delay(250); break; } static int prevspeeds = 0; if(speeds != prevspeeds) { prevspeeds = speeds; lcd.setCursor(0, 1); lcd.print("Speed "); lcd.print(speeds); lcd.print(" "); stepper1.setSpeed(speeds); delay(50); } } else if(runing) { stepper1.setSpeed(speeds); isRun = 0; runing = 0; }