Помогите пожалуйста доработать скетч.
- Войдите на сайт для отправки комментариев
Помогите пожалуйста доработать скетч.
Жезо: ардуино нано (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; }
Ну и причем тут кнопки?
maksim, я пробовал такой вариант и попробовал только что еще раз Ваш, не работает, двигатель вибрирует, но вал не крутится. Вопрос пока остался не решенным.
Ну а если в моем варианте сделать так
то двигатель тоже не крутится?
Можно зайти с другой стороны
Прошу прощеня, был невниметелен и нижний кусок кода не заметил, сейча попробовал снова, работает за маленьким нюансом. после вращения кнопками 1 и 2 по нажатию на кнопку 4, вал вращается в ту сторону в которую крутился последний раз (если я правиль нонял закономерность), желательно, что бы по нажатию на кнопку 4 направление вращения вала всегда соответствовало направлению заданному по умолчанию.
За оказанную помощь благодарю!
Второй вариант тоже интересен, но сейчас не могу его испытать, ухожу, попробую завтра. Еще раз спасибо!