цикл loop()

nurekil
Offline
Зарегистрирован: 07.03.2014

Хай комрадс.
Только начинаю программировать Arduino, возник вопрос - нужно по нажатию на кнопку, 1 раз выполнить
void loop ();  и потом ничего не делать, до повторного нажатия на кнопку и т.д.
(Что-то вроде sleep, потом нажатие кнопки, выполнения void loop(), потом опять сон)
  

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Смотрите с другой стороны. В loop проверить нажатие кнопки и выполнила что нужно, если она нажата

nurekil
Offline
Зарегистрирован: 07.03.2014

написал такую прогу - не пахает(((

int key=22;   // с 22 ноги снимаем сигнал
int buttonState = 0;    //состояние клавиши

// функция вращения шагового двигателя

void unStepMotor(int pin_1, int pin_2,int pin_3,int pin_4,int speedMotor){     
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);  
  
}
void setup(){
  // конфигурация выводов
  pinMode(50,OUTPUT);
  pinMode(51,OUTPUT);
  pinMode(52,OUTPUT);
  pinMode(53,OUTPUT);
  pinMode(key,INPUT);
  }
  //
void loop(){
  
buttonState = digitalRead(key);   // считываем состояние кнопки
  while (1){    
  unStepMotor(50,51,52,53,2);
  if (buttonState==HIGH)  // если нажата то 
  {
  delay (10000);
  break;
  }
  }
 }

 

если точнее, задача такая : есть несколько приводов, необходимо ими управлять, отталкиваясь от состояния концевых выключателей(в моем случае герконов).
то есть,
кнопку нажали -> запустился void loop();
первый движок поехал, доехал до геркона -> остановился поехал следующий и т.д.

vvadim
Offline
Зарегистрирован: 23.05.2012

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

nurekil
Offline
Зарегистрирован: 07.03.2014

делал через внешние прерывания,

attachInterrupt (0, motion, RISING);  // прерывание 0 срабатывает по фронту включая функцию motion 

но у меня плата mega 2560, а на ней  можно реализовать только лишь 6 прерываний.
посоветуйте, пожалуйста, как быть, если у меня 5 движков на каждом по 3 геркона, итого 15 сигналов, а прерываний только 6? 

Шараповерт
Offline
Зарегистрирован: 08.03.2014

nurekil пишет:
делал через внешние прерывания,

attachInterrupt (0, motion, RISING);  // прерывание 0 срабатывает по фронту включая функцию motion 

но у меня плата mega 2560, а на ней  можно реализовать только лишь 6 прерываний.
посоветуйте, пожалуйста, как быть, если у меня 5 движков на каждом по 3 геркона, итого 15 сигналов, а прерываний только 6?

завести их все на одно прерывание и на 15 входов , а внутри прерывания проверять какой из входов активен

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

Что будет если сработают несколько концевиков ? Да и в принципе- прерывания инструмент для тех кто понимает что это такое и как это использовать. Вам прерывания для решения задачи - как зайцу седло. Кстати интересно у вас этот самый моушен внутри прерывания то работает, вы пробывали :-) ? Опрашивайте последовательно кнопки в цикле и по результатам действуйте. А прерывания оставьте для самоуничтожения конструкции.

Шараповерт
Offline
Зарегистрирован: 08.03.2014

brokly пишет:
Что будет если сработают несколько концевиков ? Да и в принципе- прерывания инструмент для тех кто понимает что это такое и как это использовать. Вам прерывания для решения задачи - как зайцу седло. Кстати интересно у вас этот самый моушен внутри прерывания то работает, вы пробывали :-) ? Опрашивайте последовательно кнопки в цикле и по результатам действуйте. А прерывания оставьте для самоуничтожения конструкции.

прерывание ему не помешает, но пусть будет одно на всех (еще можно комбинировать с PCINT)

схема с "ИЛИ" ему в самый раз, в одном прерывании успеет расставить все флаги по сработавшим герконам и дальше в программе (внепрерывания) их обрабатывать и сбрасывать.

nurekil
Offline
Зарегистрирован: 07.03.2014

спасибо за помощь

nurekil
Offline
Зарегистрирован: 07.03.2014

предложенное решение годно, но для моего случая не пройдет(( т.к. у меня алгоритм начинается с того, что 5 герконов замкнуты (то есть двигатели находятся в исходном положении): 

// геркона 3, для контроля средней точки между концевиками
первый двигатель   -----замккнут--------разомкнут----------разомкнут---------
.
.

пятый двигатель     -----замккнут--------разомкнут----------разомкнут---------

-------------------------------------------------------------------------------------------------

и еще такой вопрос почему не работает следующий код

int key=40;   // через этот вывод подаем +5В
int buttonState = 0;   // состояние вывода 40

// функция вращения шаговика (рабочая)
void unStepMotor(int pin_1, int pin_2,int pin_3,int pin_4,int speedMotor){
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,HIGH);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,LOW);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,HIGH);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,LOW);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);
  //
  digitalWrite(pin_1,HIGH);
  digitalWrite(pin_2,LOW);
  digitalWrite(pin_3,LOW);
  digitalWrite(pin_4,HIGH);
  delay(speedMotor + 1);  
  
}
void setup(){
  //
  pinMode(50,OUTPUT);  
  pinMode(51,OUTPUT);
  pinMode(52,OUTPUT);
  pinMode(53,OUTPUT);
  pinMode(key,INPUT);  // 40-й вывод - вход
  }
  //
void loop(){
  
buttonState = digitalRead(key);
  for (int i=0; i<=10000; i++){    // какой-то цикл
  unStepMotor(50,51,52,53,2);    // вращаем шаговик
  if (buttonState==HIGH)      // если подали +5В н 40-й вывод
  {
    delay (10000);       // задержка
    break;      // выход из цикла
  }
  
  }
 }
  
      

 

Шараповерт
Offline
Зарегистрирован: 08.03.2014

nurekil пишет:
предложенное решение годно, но для моего случая не пройдет(( т.к. у меня алгоритм начинается с того, что 5 герконов замкнуты (то есть двигатели находятся в исходном положении): 

1. система с герконами не быстрая и  в любом случае успеете опросить несколько десятков контактов (герконов);  вам верно советовали - прерывание применить можно, но не обязательно

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

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

Смешно однако :-) Что прерывание все же помешало ? :-) Кстати в случае объединения прерываний по изменению уровня сигнала, а здесь именно такая ситуация,  придется использовать исключающее или. А если обойтись без прерываний то можно реализовать матрицу опроса. Для 16 герконов понадобится всего 4 выходных ноги, по которым бежит 0 и 4 входных, которые опрашиваем. И вообще, при использовании прерываний нужно понимать, что внутри прерывания практически любое обращение к большинству подпрограмм приведет к непредсказуемым результатам, поэтому ардуино програмисты используют семафоры. Но при ближайшем рассмотрении это странно поскольку обработка семафора происходит вне прерывания. Что мешает проверять фактор вызывающий прерывание в цикле вне прерывания ? Ничего ! Да же действий меньше. Вот поэтому я и говорил о понимании сути прерываний... жаль что меня с прерываниями не поняли :-) 

xstramento
Offline
Зарегистрирован: 19.10.2013

brokly пишет:

Смешно однако :-) Что прерывание все же помешало ? :-) Кстати в случае объединения прерываний по изменению уровня сигнала, а здесь именно такая ситуация,  придется использовать исключающее или. А если обойтись без прерываний то можно реализовать матрицу опроса. Для 16 герконов понадобится всего 4 выходных ноги, по которым бежит 0 и 4 входных, которые опрашиваем. И вообще, при использовании прерываний нужно понимать, что внутри прерывания практически любое обращение к большинству подпрограмм приведет к непредсказуемым результатам, поэтому ардуино програмисты используют семафоры. Но при ближайшем рассмотрении это странно поскольку обработка семафора происходит вне прерывания. Что мешает проверять фактор вызывающий прерывание в цикле вне прерывания ? Ничего ! Да же действий меньше. Вот поэтому я и говорил о понимании сути прерываний... жаль что меня с прерываниями не поняли :-)

Схема XOR (исключающее или) для 15 входов будет показывать четность или нечетность количества единиц на входе XOR.   Зачем козе баян?

Матрица хорошо, но так как комбинации замкнутых герконов могут быть любыми, нужны 15 шт диодов

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

Xor - что бы отлавливать изменения при сработке геркона . Если коза не понимает зачем баян, то он ей , однозначно, не нужен.   Ну да, при таком раскладе нужны диоды, а еще какие нибудь проводочки, припой с канифолем, паяльник, руки , глаза и желание ... а еще мозги нужны ! Кароче много чего нужно... Может список составим ?