Помогите дописать скетч

CasterV
Offline
Зарегистрирован: 30.04.2015

Всем здравствуйте!

Прошу дописать/исправить/оптимизировать скетч. Скетч раньше крутил один мотор теперь нужно крутить два плюс добавляется функционал. Попытался задачу решить самостоятельно, но ничего не получилось, только мусора в код понаписывал. 

Заранее благодарю!

Оборудование: ардуино 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);
    
   }
}

 

m_t
Offline
Зарегистрирован: 29.03.2012
Можем обсудить.
пишите на почту 
m_t01@mail.ru
В сообщении  указывайте ссылку на тему.
Какой бюджет?
 
CasterV
Offline
Зарегистрирован: 30.04.2015

Я надеялся на бесплатную помощь, изначально написал в разделе "Программирование", там меня направили в этот раздел, но если здесь помогают только за деньги, то получается я опять не по адресу. Куда же мне ещё обратиться, чтоб помогли?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Может вам какие нибудь курсы окончить ? Еще вопрос гложет меня... Почему вам должны помогать ? :)

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

brokly пишет:

Почему вам должны помогать ? :)

поправка: не помогать, а написать за него.

Vad33
Vad33 аватар
Offline
Зарегистрирован: 02.06.2015

CasterV пишет:

Я надеялся на бесплатную помощь...

А что вы можете в обмен бесплатного предложить?

MacSim
Offline
Зарегистрирован: 28.11.2012

Да помогите же Вы ему, народ.

Скетч ему нужен для печатного станка. Денег напечатает, потом отблагодарит. :-)

maksim
Offline
Зарегистрирован: 12.02.2012

Vad33 пишет:

CasterV пишет:

Я надеялся на бесплатную помощь...

А что вы можете в обмен бесплатного предложить?

Бесплатно принять вашу помощь. Не?

lovsander
lovsander аватар
Offline
Зарегистрирован: 25.11.2015

привет, если еще актуально, пиши на почту, обсудим. lovsander@yandex.ru