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

okta
Offline
Зарегистрирован: 10.01.2015

at0mix пишет:

Для того чтобы сделать рабочий проект - прежде всего нужно положить на бумагу ТЗ - техническое задание - а что собственно хотим получить. 

справедливости ради с этим тут более-менее норм. А вот дальше начинаются проблемы :)

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

okta пишет:

at0mix пишет:

Для того чтобы сделать рабочий проект - прежде всего нужно положить на бумагу ТЗ - техническое задание - а что собственно хотим получить. 

справедливости ради с этим тут более-менее норм. А вот дальше начинаются проблемы :)

Ну в основном с головой - извини.

Знаешь анек про летающих крокодильчиков? Так нас на работе так же пи№;%т. Так что летаем как крокодильчики.

А вот в процессе создания продукта по своему желанию - тут вопрос ответсвенности - я заявил что сделаю этот проект. И если не сделаю - и даже мне никто слова не скажет - я просто не сдержу СВОЕГО СЛОВА.

Поэтому раз сказал - Я ДОЛЖЕН ЭТО СДЕЛАТЬ!

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

Нашел основную причину того, что второй движок медленно шагал, так же поубирал лишнее, как мне кажется, посмотрите.  Сейчас оба движка работают как мне было надо, только второй бывает как-то странно подёргивается, ощущается это если держать его в руках, визуально не заметно.

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

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

 

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

Дописал плавный разгон для мотора 1.

 case 3:
      
        if(isRun == 1)
        {
          if(razgon > motorPeriod_2)
          {
            Timer1.initialize(razgon);
            razgon--;
            delay(50);
          }
        }
       break;
      
      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(300); 
       break;
            
     }//swich close
     
   }
   else 
   {
    step(false,0);
    Timer1.initialize(motorPeriod_1);
    razgon = motorPeriod_1;
    
   }
}

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Я обратил внимание на то что кейз 0 без брика - т.е. если key 0 или 1 - действие одниаковое?

3 тоже было без брика -  сейчас дописано, отличается от 4.

Но самое главное - самому понять алгоритм. Это работа аналитика. А при наличии алгоритма кодировать - просто знание язика - в нашем случае Си, с использованием встроенных функций управления портами.

По поводу советов.

Я не смогу дать точный совет просто потому что не имею нужно периферии и не горю желанием тратить деньги и время на ее приобретение %) Так что от большинства ты можешь получить совет только исключительно по коду без привязки его работы с железом - учти это.

 

По тексту.

Если

isRun=1-isRun;

просто булева инверсия то почему не использовать

isRun = !isRun;

? имхо это эффективнее. Да и переменную можно объявить как булеан.

 

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

at0mix, без break было потому, что это была заготовка. По поводу isRun = !isRun; подумаю, но чуть позже.

На данный момент реализовал почти все свои хотелки, застрял на "ENABLE", поэтому прошу помочь в таких моментах:

1. сейчас залит вот такой код (см. ниже), при включении/подачи питания на оборудование движок1 примерно 1сек пищит, такого небыло пока я не начал заниматься "ENABLE" и не изменил в void setup()  digitalWrite(enable_1, LOW); на digitalWrite(enable_1, HIGH); и соответственно для enable_2, а так же стал дописывать digitalWrite LOW/HIGH в void loop()  в зависимости от события. Почему движок может пищать? Думаю это совсем не нормально.

2. если раскомментировать строки digitalWrite(enable_1, LOW); в void EventTimer_1() и digitalWrite(enable_1, HIGH); void loop(), то движок1 при работе "троит" (как двигатель у мотоцикла с плохо настроенным зажиганием, лучшего сравнения не придумал). Думаю это происходит из-за неверно выбраного места написания строчек digitalWrite(enable_1, LOW); и digitalWrite(enable_1, HIGH);. Подскажите как и где лучше применять LOW/HIGH для enable_1 и enable_2?

3. обязательно ли в void setup() прописывать  digitalWrite(enable_1, HIGH) и digitalWrite(enable_2, HIGH), ведь в void loop() я делаю то же самое?

#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;
unsigned long razgon = motorPeriod_1;
int knopka0 = 1;


void setup() {
  pinMode(dirPin_1, OUTPUT);
  pinMode(stepperPin_1, OUTPUT);
  pinMode(enable_1, OUTPUT);
  digitalWrite(dirPin_1, LOW); 
  //digitalWrite(enable_1, HIGH);
  
  pinMode(dirPin_2, OUTPUT);
  pinMode(stepperPin_2, OUTPUT);
  pinMode(enable_2, OUTPUT);
  digitalWrite(dirPin_2, LOW); 
  //digitalWrite(enable_2, HIGH);

  Timer1.initialize(motorPeriod_1);
     
  lcd.clear(); 
  lcd.begin(16, 2);
    
  analogWrite(11, 50);
}

void EventTimer_1()
{
  //digitalWrite(enable_1, LOW);
  digitalWrite(stepperPin_1, !digitalRead(stepperPin_1)); 
}


void step(boolean dir,int stoped)
{
   digitalWrite(dirPin_2,dir);

   while(stoped > 0)
    {
     digitalWrite(enable_2, LOW);
     digitalWrite(stepperPin_2, HIGH);
     delayMicroseconds(motorPeriod_2);
     digitalWrite(stepperPin_2, LOW);
     delayMicroseconds(motorPeriod_2);
     stoped--;
    }
 }

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: //режим фокусировки(мотор 2) или задания периода мотора 1
        if(knopka0 == 1)
        {
          knopka0 = 2;
          show(isRun,knopka0,motorPeriod_1);
        }
        else
        {
          knopka0 = 1;
          show(isRun,knopka0,motorPeriod_1);
        }
        delay(300);
        break;
        
        
        case 1: //запуск мотора 2 или увеличение периода мотора 1
        if(knopka0 == 1)
        {
          step(true,1);
        }
        else
        {
          motorPeriod_1 += 10;
          Timer1.initialize(motorPeriod_1);
          show(isRun,knopka0,motorPeriod_1);
          delay(200);
        }        
        break;
        
        
        case 2: ////запуск мотора 2 или уменьшение периода мотора 1
        if(knopka0 == 1)
        {
          step(false,1);
        }
        else
        {
          if(motorPeriod_1 > motorPeriod_2)
          {
            motorPeriod_1 -= 10;
            Timer1.initialize(motorPeriod_1);
            show(isRun,knopka0,motorPeriod_1);
            delay(200);
          }
        }      
        break;
      
      
        case 3: //плавно ускоряет мотор 1
        if(isRun == 1)
        {
          if(razgon > motorForward)
          {
            Timer1.initialize(razgon);
            razgon-=10;
            show(isRun,knopka0,razgon);
            delay(200);
          }
        }
        break;
      
        case 4:// запускает/останавливает мотор 1
        isRun = 1 - isRun;
        
        if (isRun == 1)
        { 
          Timer1.attachInterrupt(EventTimer_1);
          show(isRun,knopka0,motorPeriod_1);
        } 
        else
        {
          Timer1.detachInterrupt();
          show(isRun,knopka0,motorPeriod_1);  
        }
        delay(300); 
        break;
            
     }//swich close
     
   }// if key close
   else 
   {
    step(false,0);
    
    Timer1.initialize(motorPeriod_1);
    razgon = motorPeriod_1;
    show(isRun,knopka0,motorPeriod_1);
   }
  //digitalWrite(enable_1, HIGH); 
  digitalWrite(enable_2, HIGH); 
}// loop close

int get_key(unsigned int input)
{
    int k;
    for (k = 0; k < NUM_KEYS; k++)
    {
      if (input < adc_key_val[k])
      return k;
    }
    k = -1;  // No valid key pressed
    return k;
}

int show(int run_stop, int knopka, int period)
{
  //lcd.clear(); 
  //lcd.begin(16, 2);
  lcd.setCursor(0,0);
 if(run_stop == 1)
  {
    lcd.print("Runing");
    lcd.print("     ");
    if(knopka == 1)
    {
      lcd.print("Focus");
    }
    else
    {
      lcd.print("MOD  ");
    }
  }
 else
  {
    lcd.print("Stop");
    lcd.print("       ");
    if(knopka == 1)
    {
      lcd.print("Focus");
    }
    else
    {
      lcd.print("MOD  ");
    }
  } 
  lcd.setCursor(0,1); 
  lcd.print("Speed  "); 
  lcd.print(period);
  lcd.print(" ");
}

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

CasterV пишет:

at0mix, без break было потому, что это была заготовка. По поводу isRun = !isRun; подумаю, но чуть позже.

На данный момент реализовал почти все свои хотелки, застрял на "ENABLE", поэтому прошу помочь в таких моментах:

enable это что? Явно не функция.

CasterV пишет:
1. сейчас залит вот такой код (см. ниже), при включении/подачи питания на оборудование движок1 примерно 1сек пищит, такого небыло пока я не начал заниматься "ENABLE" и не изменил в void setup()  digitalWrite(enable_1, LOW); на digitalWrite(enable_1, HIGH); и соответственно для enable_2, а так же стал дописывать digitalWrite LOW/HIGH в void loop()  в зависимости от события. Почему движок может пищать? Думаю это совсем не нормально.

digitalWrite -не есть оператор языка Си - это встроенная функция компилятора для МК Ардуино. Соответственно понять как и зачем я смогу только поставив у себя аналогичную периферию. Т.к. у меня нет потребности в ней - я ее покупать не собираюсь, и опробовать не смогу. Так что все взаимоотношения с железом плиз сам.

CasterV пишет:
2. если раскомментировать строки digitalWrite(enable_1, LOW); в void EventTimer_1() и digitalWrite(enable_1, HIGH); void loop(), то движок1 при работе "троит" (как двигатель у мотоцикла с плохо настроенным зажиганием, лучшего сравнения не придумал). Думаю это происходит из-за неверно выбраного места написания строчек digitalWrite(enable_1, LOW); и digitalWrite(enable_1, HIGH);. Подскажите как и где лучше применять LOW/HIGH для enable_1 и enable_2?

Опять же - ЭТО железо! Которого у меня нет. Извини - сам.

CasterV пишет:
3. обязательно ли в void setup() прописывать  digitalWrite(enable_1, HIGH) и digitalWrite(enable_2, HIGH), ведь в void loop() я делаю то же самое?

Сетап исполняется один раз перед запуском лупа - в нем устанавливаются стартовые данные.

В лупе идет динамическое управление.

Если ты в начале лупа поставишь установку - то они будут устанавливаться при начале каждего цикла.

Если ты ставишь внутри лупа установки по условию - то они будут устанавливаться только при наличии условия.

Если ты в сетапе не установил параметры - а в лупе устанавливаешь их по условию = то они установятся при наличии условия, в остальных случаях их поведение непредсказуемо.

ЭТО ПОНЯТНО?

Для того и сделан СЕТАП - установить СТАРТОВЫЕ установки!

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

Извиняюсь, если я всё правильно понимаю, то "ENABLE" - пин на драйвере DRV8825 предназначенный для отключения драйвера (соответсвенно снятия напряжения с обмоток мотора) при подаче на него HIGH. Мне это нужно, чтоб когда мотор остановлен, не грелся и не жрал аккумуляторы зря. 

По поводу писка мотора кажется это из-за севших аккумуляторов, заряжу, проверю.

С учетом пояснений по поводу "ENABLE", можете подсказать где и что дописать, чтоб обесточить обмотки мотора при его остановке?

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

CasterV пишет:

Извиняюсь, если я всё правильно понимаю, то "ENABLE" - пин на драйвере DRV8825 предназначенный для отключения драйвера (соответсвенно снятия напряжения с обмоток мотора) при подаче на него HIGH. Мне это нужно, чтоб когда мотор остановлен, не грелся и не жрал аккумуляторы зря. 

По поводу писка мотора кажется это из-за севших аккумуляторов, заряжу, проверю.

С учетом пояснений по поводу "ENABLE", можете подсказать где и что дописать, чтоб обесточить обмотки мотора при его остановке?

Друг, мы на планете плюк %)

Что есть енабле?????

Ежели это функция - так такой нет. Ежели переменная - так веришь - тоже нет!

Я видел пара переменных енабль-1 и енабль-2 - но они не несут какую-то функцию вне понимания автора.

Еще раз повторю - общество может помочь только исключительно в плане ошибок в программировании, или если конкретно занимается точно таким же проектом. В остальном - самостоятельно!

Извини - без наезда, просто факт.

По поводу советов. Я не телепат - я не знаю что ты и где хочешь сделать.

По комментарии слышал?

okta
Offline
Зарегистрирован: 10.01.2015

Бинго :) таки мы узнали через что управляем моторами :)))

Отдаю вам должное, большую часть фигни из кода убрали. С описанными мной проблемами  столкнулись. Не трогайте мотор1 и таймер1 котрый им управляет. За "сок" покажу таки как этот код заработает.

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

okta, каким образом мне Вас угостить соком за предоставленную подсказку? Практически уверен, что проживаем мы в разных государствах.

okta
Offline
Зарегистрирован: 10.01.2015

свяжемся, автобус с надбисью "ХЛЕБ" уже выехал

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

пока почему-то не видно

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

okta, проверьте почту.

okta
Offline
Зарегистрирован: 10.01.2015

Пусто!

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

Странно, сейчас повторю.

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

А сейчас?