Помогите пожалуйста доработать скетч.

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

Помогите пожалуйста доработать скетч.

Жезо: ардуино нано (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
Offline
Зарегистрирован: 12.02.2012
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);
  }
}

Ну и причем тут кнопки?

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

maksim, я пробовал такой вариант и попробовал только что еще раз Ваш, не работает, двигатель вибрирует, но вал не крутится. Вопрос пока остался не решенным.

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

Ну а если в моем варианте сделать так

  if (key == 1) 
  { 
    stepper1.runSpeed();
  }

  if (key == 2) 
  { 
    stepper1.runSpeed();
  }

то двигатель тоже не крутится?

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

Можно зайти с другой стороны

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;
}

 

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

Прошу прощеня, был невниметелен и нижний кусок кода не заметил, сейча попробовал снова, работает за маленьким нюансом. после вращения кнопками 1 и 2 по нажатию на кнопку 4, вал вращается в ту сторону в которую крутился последний раз (если я правиль нонял закономерность), желательно, что бы по нажатию на кнопку 4 направление вращения вала всегда соответствовало направлению  заданному по умолчанию.

За оказанную помощь благодарю! 

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

Второй вариант тоже интересен, но сейчас не могу его испытать, ухожу, попробую завтра. Еще раз спасибо!

maksim
Offline
Зарегистрирован: 12.02.2012
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;
}