Вопрос новичка.

Тема в разделе "Arduino & Shields", создана пользователем -Mark-, 14 окт 2012.

  1. -Mark-

    -Mark- Гик

    Доброго времени суток!

    Тут на работе делаем сами один станок и я решил сам сделать автоматику.


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

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

    Нажали кнопку пуск вторично...тормоз отключился и включился мотор первый...

    Далее следующие датчики и отклики на них

    Вот скетч:


    int switchPin1 = 8;
    int ledPin1 = 11;
    int switchPin2 = 10;
    int ledPin2 = 13;
    int ledPin3 = 7;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledLevel = 0;
    int ledLevel1 = 0;

    void setup()
    {
    pinMode(switchPin1, INPUT);
    pinMode(ledPin1, OUTPUT);
    pinMode(switchPin2, INPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
    }

    boolean debounce(boolean last)
    {
    boolean current = digitalRead(switchPin1);
    if (last != current)
    {
    delay(5);
    current = digitalRead(switchPin1);
    }
    return current;
    }

    void loop()
    {
    {
    digitalWrite (ledPin1,LOW);
    digitalWrite (ledPin2,LOW);
    digitalWrite (ledPin3,LOW);
    }
    currentButton = debounce(lastButton);
    if (lastButton == LOW && currentButton == HIGH)
    {
    ledLevel = ledLevel + 1;
    }
    lastButton = currentButton;

    if (ledLevel > 2) ledLevel = 0;
    if (ledLevel == 1)
    {

    digitalWrite (ledPin1,HIGH);
    digitalWrite (ledPin2,LOW);
    digitalWrite (ledPin3,LOW);
    }

    if (digitalRead(switchPin2) == HIGH)
    {

    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);


    }

    if (ledLevel == 2)
    {

    digitalWrite (ledPin1,HIGH);
    digitalWrite (ledPin2,LOW);
    digitalWrite (ledPin3,HIGH);

    }

    }

    Часть:

    if (digitalRead(switchPin2) == HIGH)
    {

    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);


    }
    работает так...если кнопка2 нажата то и светодиод горит...остальное работает как надо


    Заранее извиняюсь за глупые вопросы ))
     
  2. Unixon

    Unixon Оракул Модератор

    А где сам вопрос то? :)
     
  3. -Mark-

    -Mark- Гик

    хорошо ))) сделать нужно следуешее: Нажали кнопку "Пуск"...вкличился 1-й мотор...сработал датчик 1-й, мотор отключился...включился его тормоз...нажали кнопку "Пуск" вторично...отключился тормоз, включился мотор1 и мотор 2...это для начала )))
     
  4. Unixon

    Unixon Оракул Модератор

    Нарисуйте конечный автомат и все само разложится по полочкам.

    Подробно в вашем коде еще не разбирался, но за могу сразу сказать одно - за деталями реализации теряется смысл действий. Комментарии бы не помешали. :)
     
  5. -Mark-

    -Mark- Гик

    последовательность такая...нажали первую кнопку- включили первый двигатель...сработал концевик1 -двигатель 1 выключили и включили его тормоз...ждем повторного нажатия клавиши "пуск" (первая кнопка"...отключили тормоз и включили двигатель1 и двигатель2...ну далее я наверное уже сам смогу
     
  6. Unixon

    Unixon Оракул Модератор

    Суть вот в чем: у системы есть N состояний, одно из них начальное и одно конечное; находясь в определенном состоянии система реагирует на некоторые воздействия и, совершая некоторое действие, соответствующее только этой комбинации {текущее состояние, воздействие} переходит из одного состояния в другое.

    В программе это реализуется следующим образом:

    Код (Text):
    const int STATE_INITIAL = 0;
    const int STATE_RUNNING = 1;
    const int STATE_STOPPED = 2;
    const int STATE_FINAL = 3;
     
    int state = STATE_INITIAL;
     
    void loop()
    {
    switch (state)
    {
      case STATE_INITIAL:
      {
      if (buttonPressed(BUTTON_START))
      {
        startMotor();
        state = STATE_RUNNING;
      }
      break;
      }
      case STATE_RUNNING:
      {
      if (buttonPressed(BUTTON_STOP))
      {
        stopMotor();
        state = STATE_STOPPED;
      }
      break;
      }
      case STATE_STOPPED:
      {
      if (buttonPressed(BUTTON_START))
      {
        startMotor();
        state = STATE_STOPPED;
      }
      else if (buttonPressed(BUTTON_OFF))
      {
        state = STATE_FINAL;
      }
      break;
      }
      case STATE_FINAL:
      {
      break;
      }
    }
    }
     
    -Mark- нравится это.
  7. Unixon

    Unixon Оракул Модератор

    Программа должна быть понятной с первого взгляда и читаться как художественное произведение :) Пусть имена переменных, констант, функций говорят сами за себя, не нужно безликих pinLed1,2,3,pin125 и т.п.
     
  8. -Mark-

    -Mark- Гик

    пойду выкину ардуина в мусорку...ничего не понял )))
     
  9. -Mark-

    -Mark- Гик


    Спасибо Вам огрмное! Все работает идеально. Если позволите, то еще один вопрос))) Как приостановить выполнение всего цикла прграммы (активные двигатели должны быть выключены) при срабатывании (кнопка "пауза" скажем) и возобновить её (вернуть тсходное состояние двигателей) при срабатывании другой кнопки? Я смотрел апаратные прерывания, но к сожалению там не возможно что-то считывать.
     
  10. Unixon

    Unixon Оракул Модератор

    Добавляете состояние STATE_PAUSED, вход в которое возможен из какого-либо другого состояния, например STATE_RUNNING, по нажатию кнопки "Pause", возврат по этому же событию в состояние, из которого произошел переход в STATE_PAUSED. Эмм... ОК, сейчас накидаю кусок кода в пример.

    Код (Text):

    void save(MachineState& currentState)
    {
     // здесь запоминаем в структуру MachineState что где крутилось
    }
     
    void halt(void)
    {
     // вырубаем все что есть
    }
     
    void resume(const MachineState& savedState)
    {
     // восстанавливаемся из структуры MachineState
     // и запускаем все как было раньше
    }
     
    MachineState motors;
    int resume_state = STATE_PAUSED;
    switch (state)
    {
     // ... здесь какие-то другие состояния ... //
     case STATE_RUNNING:
     {
      if (buttonPressed(BUTTON_STOP))
      {
       stopMotor();
       state = STATE_STOPPED;
      }
      if (buttonPressed(BUTTON_PAUSE))
      {
       save(motors);
       halt();
       resume_state = state;
       state = STATE_PAUSED;
      }
      break;
     }
     case STATE_PAUSED:
     {
      if (buttonPressed(BUTTON_PAUSE))
      {
       resume(motors);
       state = resume_state;
      }
      break;
     }
     // ... здесь тоже какие-то другие состояния ... //
    }
     
     
    Citrus нравится это.
  11. -Mark-

    -Mark- Гик

    Спасибо...буду разбираться )))