Помогите дописать скетч
- Войдите на сайт для отправки комментариев
Всем здравствуйте!
Прошу дописать/исправить/оптимизировать скетч. Скетч раньше крутил один мотор теперь нужно крутить два плюс добавляется функционал. Попытался задачу решить самостоятельно, но ничего не получилось, только мусора в код понаписывал.
Заранее благодарю!
Оборудование: ардуино Nano, LCD шилд с кнопками, два драйвера DRV8825, два биполярных мотора.
Необходимые условия функционала:
1. Мотор1 должен шагать по таймеру точно с заданными задержками, параллельные процессы не должны влиять на стабильность его работы.
2. При остановке мотора(-ов) отключать драйвер, что бы не грелись моторы и не садили батарею.
3. Нажатие на кнопку 4 запускает мотор1 с заданным периодом motorPeriod_1, повторное нажатие останавливает его.
4. Нажатие и удержание кнопки 3 при работающем моторе1 плавно (~5сек.) уменьшает значение motorPeriod_1 до значения motorForward, после отпускания кнопки вернуть (не плавно) прежнее значение motorPeriod_1.
5. Кнопка 0 задаёт режим работы кнопок 1 и 2. Режим 1 «Focus» (по умолчанию), режим 2 «Mod». Режимы циклически сменяют друг друга по каждому нажатию кнопки 0.
6. При выбранном режиме 1 «Focus» кнопки 0, нажатие и удержание кнопки 1 крутит мотор2 с периодом motorPeriod_2, отпускание останавливает мотор2, аналогично для кнопки 2 только мотор2 должен крутиться в противоположную сторону.
При выбранном режиме 2 «Mod» кнопки 0, однократное нажатие кнопок 1 и 2 увеличивает и уменьшает соответственно значение motorPeriod_1 на величину motorMod, при нажатии и удержании кнопок 1 и 2 выполнять действие циклически с небольшой задержкой. Значение motorPeriod_1 не должно принимать значение меньше motorForward.
7. На дисплее надо отображать в первой строке текущее состояние мотора1 (Run/Stop) и режим кнопки 0 (Focus/Mod), во второй строке текущее значение motorPeriod_1 «Speed (значение)».
#include <TimerOne.h> #include <LiquidCrystal.h> int NUM_KEYS = 5; LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); int adc_key_val[5] = {50, 200, 400, 600, 800}; int dirPin_1 = 3; //motor1 int stepperPin_1 = 2; int enable_1 = 12; int dirPin_2 = 16; //motor2 int stepperPin_2 = 15; int enable_2 = 17; unsigned long motorPeriod_1 = 595; unsigned long motorForward = 300; unsigned long motorPeriod_2 = 400; unsigned long motorMod = 10; int adc_key_in; int key = -1; int isRun = 0; static bool runing = 0; int napr = 0; void setup() { pinMode(dirPin_1, OUTPUT); pinMode(stepperPin_1, OUTPUT); pinMode(enable_1, OUTPUT); digitalWrite(dirPin_1, LOW); digitalWrite(enable_1, LOW); pinMode(dirPin_2, OUTPUT); pinMode(stepperPin_2, OUTPUT); pinMode(enable_2, OUTPUT); digitalWrite(dirPin_2, LOW); digitalWrite(enable_2, LOW); Timer1.initialize(motorPeriod_1); lcd.clear(); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("Stop "); lcd.setCursor(0,1); lcd.print("Speed "); lcd.print(motorPeriod_1); lcd.print(" "); analogWrite(11, 9); } void EventTimer_1() { digitalWrite(stepperPin_1, !digitalRead(stepperPin_1)); } void step(boolean dir,int stoped) { digitalWrite(dirPin_2,dir); delay(50); while(stoped > 0) { digitalWrite(stepperPin_2, HIGH); delayMicroseconds(motorPeriod_2); digitalWrite(stepperPin_2, LOW); delayMicroseconds(motorPeriod_2); } } 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; } 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 { switch(key) { case 0: case 1: if (!runing) { step(true,1); runing = 1; delay(200); } break; case 2: if (!runing) { step(false,1); runing = 1; delay(200); } break; case 3: case 4: isRun = 1 - isRun; lcd.setCursor(0,0); if (isRun == 1) { lcd.print("Run "); Timer1.attachInterrupt(EventTimer_1); } else { lcd.print("Stop "); Timer1.detachInterrupt(); } delay(250); break; }//swich close lcd.setCursor(0, 1); lcd.print("Speed "); lcd.print(motorPeriod_1); lcd.print(" "); delay(50); } else if (runing) { lcd.print("Stop "); runing = 0; step(false,0); } }
Я надеялся на бесплатную помощь, изначально написал в разделе "Программирование", там меня направили в этот раздел, но если здесь помогают только за деньги, то получается я опять не по адресу. Куда же мне ещё обратиться, чтоб помогли?
Может вам какие нибудь курсы окончить ? Еще вопрос гложет меня... Почему вам должны помогать ? :)
Почему вам должны помогать ? :)
поправка: не помогать, а написать за него.
Я надеялся на бесплатную помощь...
А что вы можете в обмен бесплатного предложить?
Да помогите же Вы ему, народ.
Скетч ему нужен для печатного станка. Денег напечатает, потом отблагодарит. :-)
Я надеялся на бесплатную помощь...
А что вы можете в обмен бесплатного предложить?
привет, если еще актуально, пиши на почту, обсудим. lovsander@yandex.ru