как сделать повторяющиеся действие?

Elektro
Offline
Зарегистрирован: 10.02.2012

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

помогити с когодом. как осуществлять такое? 

вот то что пока получилось но это совсем другое

void loop()
{

  GoForward(); //едем вперед
  
  tone(LedLeftPin, 38000); // генерируем 36кГц на левый светодиод
  delay(30);
  if(digitalRead(TsopPin)==LOW)
  {
    povorot=random(300,1200);//случайно выбираем время завершения поворота
    Stop();
    delay(800);
    GoReverse();
    delay(1000);
    MotorRightReverse();
    MotorLeftForward();
    delay(povorot);
    Stop();
    delay(2000);
  }
  noTone(LedLeftPin);

  tone(LedRightPin, 38000); //генерируем на правый светодиод
  delay(30);  
  if(digitalRead(TsopPin)==LOW)
  {
    povorot=random(300,1200);
    Stop();
    delay(800);
    GoReverse();
    delay(1000);
    MotorLeftReverse();
    MotorRightForward();
    delay(povorot);
    Stop();
    delay(2000);
  }
  noTone(LedRightPin); 
}

помогит, зарание спасибо!

mitos
Offline
Зарегистрирован: 11.12.2011

http://arduino.ru/tutorials/BlinkWithoutDelay

тут описано как обходится без delay  

Elektro
Offline
Зарегистрирован: 10.02.2012

 а как осуществить перемигивание двумя светодиодами? 

step962
Offline
Зарегистрирован: 23.05.2011

 Так же, как мигание одним - только когда этот один загорается, другой надо гасить.

И наоборот.

whoim
Offline
Зарегистрирован: 03.11.2011

 boolean state = false;

юзаем таймер, например, flexitimer

...

digitalWrite(led1pin, state);
digitalWrite(led2pin, !state);
//если сменить
state = !state;

----
все это есть в примерах, уроках всевозможных, описаниях русскоязычных. В гугле есть все!

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>povorot=random(300,1200);//случайно выбираем время завершения поворота<< 

Знакомая строчка.

Вот вам мигалка будет работать почти со всеми функциями.

Переменной val регулируйте частоту мигания.

 

   

long previousMillis = 0;
int val=0;
void setup() 
{                
  
  pinMode(12, OUTPUT);     
  pinMode(13, OUTPUT);     
}

void loop()
{
  val=1000;
  
   if (millis() -previousMillis >val) 
 {  
   previousMillis = millis();  //запучкаем таймер
   digitalWrite(13, !digitalRead(13));
    digitalWrite(12, !digitalRead(13));
 }

}

 

Elektro
Offline
Зарегистрирован: 10.02.2012

nestandart пишет:

>>povorot=random(300,1200);//случайно выбираем время завершения поворота<< 

Знакомая строчка.

=)) у вас очень хороший проект) 

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

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 >>чтоб светодиоды переключались, и можно было бы еще что то делать. пока не знаю как это можно сделать<<

Лучше поставить три TSOPа.

Лево , право , прямо.

И опрашивать в цикле.Все же один (неподвижный)  TSOP , при ширине платформы 10 и более см , не всегда сможет рассмотреть препятствие.

>>у вас постоянно вращается серва<<

Это называется телемеханическая развертка (эффект множества датчиков).

 

>>пока не знаю как это можно сделать<<

Я предоставил вам пример.

Он будет конфликтовать (некорректно работать) с функцией pulseIn.

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

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Можно попробовать так.

Должно работать (не проверял).

long previousMillis = 0;
int val=0;
int tsop=5;
void setup() 
{                
  pinMode(tsop, INPUT);     
  pinMode(12, OUTPUT);     
  pinMode(13, OUTPUT);     
}

void loop()
{
  val=1000;
  
   if (millis() -previousMillis >val) 
 {  
   previousMillis = millis();  //запучкаем таймер
    digitalWrite(13, !digitalRead(13));
    digitalWrite(12, !digitalRead(13));
    
    if(digitalRead(12)==HIGH)
    {
     noTone(10);  
    tone(9,36000);
    }
    else
    {
      noTone(9);
      tone(10,36000);
    }
    
    
    if(digitalRead(tsop)==LOW&&digitalRead(12)==HIGH)
    {
     // поворот влево
    }
    
    
    if(digitalRead(tsop)==LOW&&digitalRead(13)==HIGH)
    {
     // поворот вправо
    }
    
     if(digitalRead(tsop)==HIGH)
    {
     // вперед
    }
    //вся остальная программа
 }

}

 

Elektro
Offline
Зарегистрирован: 10.02.2012

nestandart пишет:

 >>чтоб светодиоды переключались, и можно было бы еще что то делать. пока не знаю как это можно сделать<<

Лучше поставить три TSOPа.

Лево , право , прямо.

И опрашивать в цикле.Все же один (неподвижный)  TSOP , при ширине платформы 10 и более см , не всегда сможет рассмотреть препятствие.

у меня тестовая платформа( колеса с макетной платой ) шириной 20см препятствия определяет очень хорошо на растоянии до 40+ см.

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

Прошу меня извинить за глупые вопросы) 

Elektro
Offline
Зарегистрирован: 10.02.2012

 Спасибо большое, работает))))))))

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

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

Иначе может быть некорректная работа программы.

Хотя это все индивидуально. 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>у меня тестовая платформа( колеса с макетной платой ) шириной 20см<< 

Это что за платформа такая ?

Круглая ?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Есть еще такой вариант.

Выдаем частоту на один выход (постоянно)

Плюсы светодиодов  подключены к перекидной релюшке.

На среднюю ногу релле подаете частоту.

А катушкой релле делаем вкл/выкл С определенной периодичностью.

Т.е. выдача частоты идет попеременно то на один светодиод , то на другой.

Получается так что одна нога МК "мигает" релюшкой , другая выдает частоты , третья (тсоп) принимает сигнал.

Программно так проще.

Можно так же сделать такой драйвер на транзисторах.

Elektro
Offline
Зарегистрирован: 10.02.2012

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

на скорую руку собирал :D

Elektro
Offline
Зарегистрирован: 10.02.2012

можно и так. я думал о таком ( только не на реле  а на транзисторах)

сначала думал сделать так: через один выход на два светодиода  подаем частоту а через другие две подаем землю . но подавать частоту на разные ноги оказалось проще =/