Помогите дописать скетч
- Войдите на сайт для отправки комментариев
Всем здравствуйте!
Прошу дописать/исправить/оптимизировать скетч. Скетч раньше крутил один мотор теперь нужно крутить два плюс добавляется функционал. Попытался задачу решить самостоятельно, но ничего не получилось, только мусора в код понаписывал.
Заранее благодарю!
Оборудование: ардуино 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