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

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

 

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

Никто не поможет?(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Попробуйте обратиться в "Ищу исполнителя". Здесь помогают тем, кто делает сам. Вам же просто нужно переписать чужой скетч, как я понимаю.

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

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

CasterV пишет:

Если я правильно понял, в этом разделе помогают тем у кого уже что-то есть, а в разделе "Ищу исполнителя" просят написать с нуля. 

Нет, неправильно. Здесь помогают тому, кто делает самС чужим скетчем (которого хозяин не понимает) помочь невозможно - можно только сделать самому.

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

По Вашей подсказке создал аналогичную тему в разделе "Ищу исполнителя", надеюсь кто-то откликнется.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Удачи!

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

Обратился за помощью в раздел "Ищу исполнителя", там помогают только за деньги, мне такой вариан не подходит, здесь тоже никто не хочет помочь. Год назад я обратился за помощью в этот раздел с подобной проблемой, и мне человек (к сожалению ник не помню, всего хорошего ему) помог быстро, качественно и без лишних вопросов, теперь какие-то ограничения, мой код, не мой код. Что мне делать? 

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

CasterV пишет:

Что мне делать? 

плати бабло и не задавай лишних вопросов.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

CasterV пишет:

Год назад я обратился ... 

И Вы за год не научились программировать?

CasterV пишет:

Что мне делать? 

А что Вы обычно делаете, когда надо сделать что-нибудь, чего Вы сами не умеете?

Также и здесь. Либо учиться программировать самому, либо платить тому, кто умеет.

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

Клапауций 322, платить или не платить, задавать вопросы или не задавать, я буду решать сам! Выше я написал, что вариант за деньги мне не подходит, поэтому, если Вы не можете или не хотите помочь мне БЕСПЛАТНО, оставьте подобные бесценные советы при себе!

ЕвгенийП, да, за год я так и не научился программировать, потому как это мне и не нужно было, система Ардуино + двигатели призвана помочь мне в моём хобби, наблюдении звезд, год назад добрый человек под ником maksim (отыскал его ник) помог мне в этом вопросе, устройство работало, большего мне не требовалось до сегодняшнего момента.  Я не сразу же прибежал на этот форум, я читал, пробовал, что-то получалось, что-то нет, какие-то моменты я понимаю, какие-то нет. К примеру, понимаю, что приведенный выше скетч зацикливается на условии while в функции запуска второго мотора, по отдельности получается крутить, вместе нет. В общем, пока я буду разбираться что к чему методом проб и ошибок пройдет уйма времени и будут упущены бесценные ясные ночи для наблюдений.

А на счет платить, я понимаю, что любой труд должен быть оценен по достоинству и оплачен, но видимо наивно полагал, что не все в этом мире завязано на бабле (как выше выразился товарищ с очень дельным советом) и люди могут помогать просто так, человеку умеющему писать код, здесь работы на 20 мин с перекуром.

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

CasterV пишет:

Клапауций 322, платить или не платить, задавать вопросы или не задавать, я буду решать сам! 

сам ты будешь решать у себя под одеялом.

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

Ожидаемая реакция дурно воспитанного человека. Прошу Вас ещё раз, не можете помочь, проходите мимо, мне абсолютно не интересно общение с Вами на эту тему и в подобном тоне!

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

CasterV пишет:

Прошу Вас ещё раз

попроси меня ещё три раза.

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

Такие как Вы, когда не могут победить в честном бою, идут на подлости, в Вашем случае это минусовать мои посты. Чего Вы эти хотите добиться? Выглядите смешно и жалко! Дабы не опускаться до Вашего уровня интеллекта, это будет последнее моё сообщение Вам. Всего доброго!

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

CasterV пишет:

Ожидаемая реакция дурно воспитанного человека. Прошу Вас ещё раз, не можете помочь, проходите мимо, мне абсолютно не интересно общение с Вами на эту тему и в подобном тоне!

Увы но дурно воспитанный тут автор темы %(

Ладно, попробую объяснить. Я уже лет двадцать не вожусь с электроникой, и лет 10 не пишу программы - для этого есть специалисты у меня в подчинении (я руководитель ИТ-службы на предприятии).

Когда решил сделать проект игровых реквизитов для своего ЛИЧНОГО хобби (страйкбол) - остановился на ардуино. Аналогично попросил о помощи - и совершенно предсказуемо получил такой же ответ - иди в раздел "Ищи исполнителя" и договаривайся о сумме.

В результате я поставил эмулятор Протеус, нарисовал в нем схему, написал прообраз скетча, проверил в работе. Потом купил пару нано-ардуинок, индикаторы, друзъя подогнали клавиатуру и считку ТМ-ключей с ключами. Собрал в макете. Написал кусок кода для работы с индикатором. Потом - с клавиатурой. Потом - с ТМ-ключем. Потом собрал все вместе. Потом написал блок управления/администрирования (меню). Потом добавил еще один сценарий в виде отдельной функции вызываемой из меню. Потом все это проверил.

Сейчас собираю первый рабочий образец.....

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

Или платить тем кто это умеет.....

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

И в догонку.

Объясни зачем и какой собственно смысл:

 

061 void step(boolean dir,int stoped)
062 {
063    digitalWrite(dirPin_2,dir);
064    delay(50);
065    while(stoped > 0)
066     {
067      digitalWrite(stepperPin_2, HIGH);
068      delayMicroseconds(motorPeriod_2);
069      digitalWrite(stepperPin_2, LOW);
070      delayMicroseconds(motorPeriod_2);
071     }
072  }

 

 

074 int get_key(unsigned int input)
075 {
076     int k;
077     for (k = 0; k < NUM_KEYS; k++)
078     {
079       if (input < adc_key_val[k])
080             return k;
081     }
082        if (k >= NUM_KEYS)
083       k = -1;  // No valid key pressed
084     return k;
085 }

 

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

CasterV пишет:

Такие как Вы, когда не могут победить в честном бою

каком бою, чучело плоскостопое?

у меня экран 110% и я вообще не наблюдаю стрелок +-

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

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

Теперь по теме вопроса. Я рад, что у Вас хватило времени, терпения и желания довести Ваш проект до этапа сборки рабочего образца. К сожалению, у меня не слишком много свободного времени которое я могу уделить на освоение программирования под ардуино. Выше я писал, что пытался разобраться, что-то даже получалось, но на это затрачивается довольно много времени. Ладно бы я хотел и дальше этим заниматься, тогда без вариантов, но на данный момент такого не планирую. Давненько писал простенькие програмки на С# в визуал студии, поэтому базовые понятия, что такое IF или WHILE имеются, но здесь другая ситуация, циклическое выполнение кода и невозможность поставить точку остановки, чтобы отладить какой-то кусок кода, посмотреть какие значения принимаю переменные в данный момент или найти в каком месте выполнения кода я пошел по ложному пути. Плюс здесь куча незнакомых мне функций, переменных и много чего другого. 

Первый кусок кода, это функция которая при вызове должна крутить второй движок в одну или другую сторону в зависимости от принимаемого значения true / false. Внутри оператор while выбран мной неудачно, думаю он является причиной зацикливания и невозможности остановить движок при отпускании кнопки.

Второй кусок кода был изначально, как я думаю, это функция определения и присвоения переменной номера нажатой кнопки.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

CasterV пишет:

Я не сразу же прибежал на этот форум, я читал, пробовал, что-то получалось, что-то нет, 

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

CasterV пишет:
наивно полагал, что не все в этом мире завязано на бабле (как выше выразился товарищ с очень дельным советом) и люди могут помогать просто так

Ну, почему, наивно? Так и есть - не всё. Как видите, я не предлагаю Вам сделать эту работу за деньги. Вы можете найти десятки постов в этом разделе, где я что-то подсказывал коллегам, но не найдёте ни одного в "Ищу исполнителя" где бы я предлагал что-то сделать за деньги. Мне это неинтересно.

Вот Вы говорите ...

CasterV пишет:
человеку умеющему писать код, здесь работы на 20 мин с перекуром.

таким образом, Вы согласны с тем, что передо мною стоит выбор: либо 20 минут поиграть с моей очаровательной внучкой, либо потратить их на то, чтобы написать для Вас кусок кода. Назовите мне хоть одну причину выбрать второе.

Совсем другое дело, когда человек пытается писать сам. Такого человека я воспринимаю как начинающего коллегу и стараюсь ему помочь (вы можете найти десятки постов в этом разделе, где я это делаю). А если человек, как Вы, заявляет, что "не научился программировать, потому как это мне и не нужно", то с какого перепугу программировать за него должно быть нужно мне? Вот скажите, с какого?

Ну, и последнее, насчёт 20 минут. Тут есть два соображения:

1) Это не 20 минут, это ещё огромное время, затраченное специалистом на то, чтобы научиться всё это делать за 20 минут. Вам на это (на учёбу) жалко тратить время, а чужим можно пользоваться?
2) У вас же не возникает вопроса платить или не платить за 20 минут работы таксисту? Платите и даже тени сомнений нет в том, что платить надо и что это правильно. А вот платить за 20 минут работы инженеру Вы почему-то считаете неправильным. Не находите в этом противоречия?

 

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

CasterV пишет:

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

99% отвечающих толком на форуме считают нормой обращение на ТЫмежду коллегами по хобби - мы не приеме у ангицкой королевы ;)

В приказном тоне никто никому не указывает - просто опытный товрищ пальцем тыкает куда илти и что читать. Если неопытный чечако начинает качать права не имея на то прав - его посылают еще дальше.

CasterV пишет:
Теперь по теме вопроса. Я рад, что у Вас хватило времени, терпения и желания довести Ваш проект до этапа сборки рабочего образца. К сожалению, у меня не слишком много свободного времени которое я могу уделить на освоение программирования под ардуино.

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

CasterV пишет:
Выше я писал, что пытался разобраться, что-то даже получалось, но на это затрачивается довольно много времени. Ладно бы я хотел и дальше этим заниматься, тогда без вариантов, но на данный момент такого не планирую. Давненько писал простенькие програмки на С# в визуал студии, поэтому базовые понятия, что такое IF или WHILE имеются, но здесь другая ситуация, циклическое выполнение кода и невозможность поставить точку остановки, чтобы отладить какой-то кусок кода, посмотреть какие значения принимаю переменные в данный момент или найти в каком месте выполнения кода я пошел по ложному пути. Плюс здесь куча незнакомых мне функций, переменных и много чего другого.

Переменные они всегда незнакомые ;)

Описание всего это лежит тут же рядом

http://arduino.ru/Reference

CasterV пишет:
Первый кусок кода, это функция которая при вызове должна крутить второй движок в одну или другую сторону в зависимости от принимаемого значения true / false. Внутри оператор while выбран мной неудачно, думаю он является причиной зацикливания и невозможности остановить движок при отпускании кнопки.

Смотри:

void step(boolean dir,int stoped)

т.е. ты передаеш переменную в функцию.

потом

while(stoped > 0)

066     {
067      digitalWrite(stepperPin_2, HIGH);
068      delayMicroseconds(motorPeriod_2);
069      digitalWrite(stepperPin_2, LOW);
070      delayMicroseconds(motorPeriod_2);
071     }

А где и каким образом изменяется эта переменная? Если хоть чутка подумать то станет ясно что сама переменная будет ВСЕГДА иметь значение полученное при вызове функции. Это причина вечного кайфа в цикле.

CasterV пишет:
Второй кусок кода был изначально, как я думаю, это функция определения и присвоения переменной номера нажатой кнопки.

Теперь смотри:

    for (k = 0; k < NUM_KEYS; k++)

к меняется от 0 до 4 (нум-кей=5)

Далее

       if (k >= NUM_KEYS)

но т.к. к меняется от 0 до 4 то оно НИКОГДА не станет больше или равно 5.

ЧТО ТУТ НЕПОНЯТНОГО?

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

ЕвгенийП пишет:

выкладывайте свои пробы и объясняйте, что получается, а что нет.

В первом посте последний вариант на котором я застрял.

ЕвгенийП пишет:

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

Не сомневаюсь, что так оно и есть.

ЕвгенийП пишет:

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

Выбор здесь очевиден!

ЕвгенийП пишет:

когда человек пытается писать сам. Такого человека я воспринимаю как начинающего коллегу и стараюсь ему помочь. 

Но при этом, Вам прийдется потратить на много больше чем 20 мин.

ЕвгенийП пишет:

с какого перепугу программировать для него должно быть нужно мне? Вот скажите, с какого?

Только из желания помочь и только на добровольной основе.

ЕвгенийП пишет:

1) Это не 20 минут, это ещё огромное время, затраченное специалистом на то, чтобы научиться всё это делать за 20 минут. Вам на это (на учёбу) жалко тратить время, а чужим можно пользоваться?
2) У вас же не возникает вопроса платить или не платить за 20 минут работы таксисту? Платите и даже тени сомнений нет. А вот платить за 20 минут инженеру Вы почему-то считаете неправильным. Не находите это противоречивым?


 

1) Полностью согласен, специалистом становятся не за 20 мин. На счет тратить чужое время, повторюсь, всё на добровольной основе, каждый для себя решает сам, тратить или не тратить время, сколько тратить. Я же не могу Вас заставить.

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

Поймать попутку на этом форуме, как я понял, не получится. Остаётся вариант идти пешком, но сам я этот путь не осилю, пробовал. Вы согласны помогать, подсказывать, направлять меня в сторону решения и реализации описанной в первом посте задачи? Если да, то в первую очередь заранее благодарю, а во вторую, хотелось бы сразу к делу. Как мне кажется, начать стоит с функции void step(boolean dir,int stoped), оператор while здесь не годится, что посоветуете вместо него или предложите свой вариант продвижения к намеченой цели?

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

at0mix, по поводу while понял и согласен, только не знаю как и какую переменную запихнуть в цикл while которая будет изменяться, когда в функцию прийдет значение переменной на остановку двигателя.

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

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

Что если в цикле while применить break или goto? Цикл один раз выполнится, далее идем в начало функции и проверяе значение переменной stoped, далее опять в while если условие stoped>0 выполняется и так по кругу.

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

Мда, очередная клиника. Организм уже не принимает столько попкорна за раз :)

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

DIYMan, это Вы мне? Поясните, почему клиника и что Вас развеселило?)

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

CasterV пишет:

DIYMan, это Вы мне? Поясните, почему клиника и что Вас развеселило?)

Смысл? Если вы всё равно не поймёте? Вам уже и так, и эдак объясняли - не понимаете. Зачем ещё я? Я лучше попкорна пожую.

bwn
Offline
Зарегистрирован: 25.08.2014

CasterV пишет:

Что если в цикле while применить break или goto? Цикл один раз выполнится, далее идем в начало функции и проверяе значение переменной stoped, далее опять в while если условие stoped>0 выполняется и так по кругу.

Представьте себе while, как еще один loop из которого можно выйти по условию и как в loop, никто не запрещает вызывать из него любые функции, которые и могут изменить сие условие.

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

bwn, Вы предлагаете в нем вызывать функцию, которая будет проверять и возвращать значение перемнной отвечающей за "крутить/не крутить" движок? При таком варианте разве не получится неравномерное вращени из-за времени на выполнения этой функции раз в цикл? Мне для второго движка это конечно не критично, но может есть более првильное решение, без while и функции в функции? В любом случае, спасибо за совет!

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

CasterV пишет:

Что если в цикле while применить break или goto? Цикл один раз выполнится, далее идем в начало функции и проверяе значение переменной stoped, далее опять в while если условие stoped>0 выполняется и так по кругу.

Увы это клиника.

для особо одаренных и ВЕЖЛИВЫХ.

В среде русских на ВЫ называют либо старших по возрасту, либо по званию-должности.

Здесь общаются фанаты, и мне при моем возрасте приятно общение на ты (у меня внук и внучка ;)

Подчиненных я тоже не вижу, начальников тем более. Это по обращению.

По пониманию. Я так понимаю - если чел передает в функцию переменную, внутри функции ставит цикл на контроль изменения этой переменной при этом саму переменную нигде не меняя - ЭТО КЛИНИКА.

Ну мозго то включить можно? Элементарную логику без применения к языку программирования?

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

CasterV пишет:

at0mix, по поводу while понял и согласен, только не знаю как и какую переменную запихнуть в цикл while которая будет изменяться, когда в функцию прийдет значение переменной на остановку двигателя.

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

https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%A1%D0%B8_%28%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%29

Прочти хотя бы это.....

Или это

http://arduino.ru/Reference

Есть куча примеров - по ним просто понять как другие пишут скетчи.

Если нет желания читать, вникать и понимать - тогда нужно просто найти исполнителя за соответствующую плату.

PS - моя з/п позволяет нанять исполнителя, но мне интересно самому разобратья, ошибиться, исправить и понять!

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

Я, не зная ни возраста человека, ни имени, привык обращаться на "Вы".  Ко мне можете обращаться на "Ты", проблем в этом не вижу.

Может и клиника, но глумиться не обязательно. Я понимаю, что надо изменить значение переменной, как - не знаю!

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

Я смотрел пример по while, там счетчик, мне счетчик не подходит.

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

ТАК понятно?

 

Да, вот ПРИМЕР:

Пример
var = 0;
 
while(var < 200){
 // выполнить что-то, повторив 200 раз
 var++;

}

bwn
Offline
Зарегистрирован: 25.08.2014

CasterV пишет:

bwn, Вы предлагаете в нем вызывать функцию, которая будет проверять и возвращать значение перемнной отвечающей за "крутить/не крутить" движок? При таком варианте разве не получится неравномерное вращени из-за времени на выполнения этой функции раз в цикл? Мне для второго движка это конечно не критично, но может есть более првильное решение, без while и функции в функции? В любом случае, спасибо за совет!

Просто уверен, что есть другое решение и не одно. Я не смотрел ваш код, предложил вариант. По скорости функций, если там нет откровенных делеев, то недавно ЕвгенийП исследовал скорость пустого loop, получилось около 2млн раз в секунду. Даже если останется тысяча проходов, движок это не поймет. ИМХО.
Главное это придумать алгоритм и потом проверить его на практике. Переложить на понятный МК язык, это уже самое простое (чистая механика).  Если простого алгоритма не достаточно, начинаем оптимизировать.

bwn
Offline
Зарегистрирован: 25.08.2014

CasterV пишет:

Я смотрел пример по while, там счетчик, мне счетчик не подходит.

А если запишем while(i = 1). При любом другом i цикл остановится. Счетчик исчез.))))

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

bwn, аккуратнее, чел ведь может и повторить.... while (i==1)

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

at0mix, у Вас дважды уменьшается значение переменной stoped, это опечатка или так и должно быть?

bwn
Offline
Зарегистрирован: 25.08.2014

Andy пишет:

bwn, аккуратнее, чел ведь может и повторить.... while (i==1)

Виноват, признаю)))

А чтобы таких косяков не было, еще правильнее while (1 ==  i)

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

CasterV пишет:

at0mix, у Вас дважды уменьшается значение переменной stoped, это опечатка или так и должно быть?

А прочитать хотя бы просто описание языка слабо? Слово "инкремент" - "декремент" ни о чем не говорит?

Унарные операции?

Еще раз повторяю - или чел учится и читает умные книги, или идет в тему "Ищу исполнителя".

Ты походу ни читать ни учиться просто не желаешь %(

УВЫ.

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

Не работал с библиотекой TimerOne но, мои скромные многофигзнаетсколькочасовые бдения над даташитом микроконтроллера, плюс мимолетный взгляд на название библиотеки позволяют предположить, что используется ОДИН первый таймер. И так просто под два мотора вы этот скетч не переделаете. Даже если решите все остальные косяки кода (особо не вглядывался), то дополнительно нужно будет при каждом срабатывании прерывания таймера отдельно рассчитывать - что же нужно конкретно в этот момент сделать и когда таймер должен сработать следующий раз. Это так, на вскидку. Так что ваша задача действительно не такая простая, как могло показаться вам в начале.

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

at0mix, дописал декремент, движок шагает, но очень медленно.

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

okta, когда мне дописали этот таймер, сказали, что когда функция запущена, то что происходит в loop никак не мешает работе таймера. Если Вы об этом.

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

Нет, не об этом. А о том, что для управления вторым мотором тоже нужен таймер. Вашим способом нормально крутить мотор и одновременно следить за отжатием кнопки не получится. Либо, как вариант, при нажатии кнопки вешать прерывание на отжатие, и в прерывании обнулять stopped, но тут еще надо смотреть как у вас кнопки подключены.

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

поменяй

stoped--;

на

int step=10;

stoped-=step;

потом меняя step подберешь нужную скарость.

и прочитай описание на унарные операторы.

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

okta, а в чем будет выражаться проблема "нормально крутить мотор и одновременно следить за отжатием кнопки не получится"?

Кнопки подключены к А0, остальные номера пинов соответствуют номерам пинов на Нано, за исключением 10го пина, он повешен на 11 пин из-за использования 10го таймером.

at0mix, вечером попробую, спасибо!

 

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

тем, что у вас шаг мотора 400 микросекунд, почитайте сколько времени у микроконтроллера занимает АЦП, которое будет использоваться для чтения состояния кнопки if(analogread(0)>800){stopped=0;}(это тонкий намек - как выйти из цикла), и посчитайте какая после этого будет погрешность и как будет колбасить мотор (хотя это теория, на практике может вас и устроит).

PS а чем таким таймер занимается на 10м пине? :)

 

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

okta, на 10м пине раньше управлял яркостью дисплея, применив таймер, дисплей начал мерцать, как выяснили товарищи, с частотой примерно 13Гц, это очень раздражало поэтому пришлось использовать 11й пин.

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

:) ну да, шим (если именно через него пытались яркость регулировать) на 9 и 10 пинах управляется таймером 1. А он у вас задействован в скетче под другие нужды. Но сам по себе таймер на пин ни как не влияет :) Хотя, если надергать кусками код даже приблизительно не понтересовавшись что к чему, то результаты бывают очень удивительные. Что-то мне говорит, что моя подсказка в предыдущем посте вам не поможет (хотя она напрямую указыват как сделать так, что бы именно ваш код хоть как-то заработал). Увы. Соглашусь с предыдущими, вам это нужно для разовой задачи, и сами разбираться либо не хотите, либо не можете. Так что вам в "ищу исполнителя", или ждать школьника, который захочет на вашей задаче потренироваться.

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

CasterV пишет:

Кнопки подключены к А0, остальные номера пинов соответствуют номерам пинов на Нано, за исключением 10го пина, он повешен на 11 пин из-за использования 10го таймером.

at0mix, вечером попробую, спасибо!

Нет такой купюры %) (С) Одесса.

Шутю.

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

Например.

У меня в проекте было 3 блока - индикатор, клавиатура, считка ТМ-ключа.

Я подключил индикатор, написал скетч работы с ним.

Потом подключил кнопки и с индикацией на индикаторе написал скетч нажатия кнопок.

Потом подключил считку ТМ-настроил считывание ключей.

А вот потом началось самое главное - собрать все в кучу и написать код меню управления ;)

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

Нужно помочь самому себе. Пост:

https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%A1%D0%B8_%28%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%29

https://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%81%D1%82%D1%83%D0%BF_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

http://lib.ru/CTOTOR/kernigan.txt_with-big-pictures.html

Абрам 30 лет молился богу - я работаю в поте лица, не пропускаю молитв и всегда прошу помочь мне! Ну почему боже ты не можешь дать мне например миллион долларов?

БОГ - Абрам, дай мне шанс - КУПИ ЛОТЕРЕЮ!

Ребята, прочтите книжку! (Керниган и Ритчи) Куча вопросов отпадет.....

Ну а на десерт - 4х томник Кнута "Искусство программирования"- классика жанра ;)

https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F