Как правильно выйти из цикла???

zhitomir82@gmail.com
Offline
Зарегистрирован: 17.02.2014

Помогите правильно выйти из цикла. 

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

Проблема! Как сделать так, чтобы при нажатии на кнопку №2 робот остановился и снова ожидал команду с пульта??? Помогите разобраться. 




#include <IRremote.h> // это скачанная библиотека
#define Trig 9
#define Echo 8
int RECV_PIN = 11; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;

unsigned int impulseTime=0; 
unsigned int distance_sm=0; 


// motor A
int dirForw_A = 2; 
int dirBack_A = 3;

// motor B
int dirForw_B = 4;
int dirBack_B = 5;

int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.

void setup()
{
irrecv.enableIRIn(); // включить приемник
 // Serial.begin(9600);  
  pinMode(L13, OUTPUT); // назначаем пины как выходы
  pinMode(dirForw_A, OUTPUT);
  pinMode(dirBack_A, OUTPUT);
  pinMode(dirForw_B, OUTPUT);
  pinMode(dirBack_B, OUTPUT);
  pinMode(Trig, OUTPUT); //инициируем как выход 
  pinMode(Echo, INPUT); //инициируем как вход 
 
} 

void loop() {
if (irrecv.decode(&results)) {

if (results.value == 0xFF52AD) 
{
  digitalWrite(Trig, HIGH); 
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(10); // равный 10 микросекундам 
  digitalWrite(Trig, LOW); // Отключаем 
  impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса 
  distance_sm=impulseTime/58; // Пересчитываем в сантиметры 
  //Serial.println(distance_sm); // Выводим на порт 
  
}  
// начинаем движение 

if (distance_sm>30)   // Если расстояние более 30 сантиметром 
    {
      digitalWrite(L13, HIGH); 
      digitalWrite(dirForw_A, HIGH);  // Задаем направление вращения 1 двиг
      digitalWrite(dirBack_A, LOW);
      digitalWrite(dirForw_B, HIGH);  // Задаем направление вращения 2 двиг
      digitalWrite(dirBack_B, LOW);
     
    }
    
 else
    {
      digitalWrite(L13, LOW); 
      digitalWrite(dirForw_A, HIGH);  // Задаем направление вращения 1 двиг
      digitalWrite(dirBack_A, LOW);
      digitalWrite(dirForw_B, LOW);  // Задаем направление вращения 2 двиг
      digitalWrite(dirBack_B, HIGH);


  }
    
  delay(50); //пауза между повторами //  
} 
}
 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

zhitomir82@gm, узнать скан-код кнопки номер два и создать цикл if. У вас в скетче код только одной кнопки.

 

zhitomir82@gmail.com
Offline
Зарегистрирован: 17.02.2014

Код второй кнопки есть. Просто, когда программа доходит сюда: 

// начинаем движение 
51	 
52	if (distance_sm>30)   // Если расстояние более 30 сантиметром 
53	    {
54	      digitalWrite(L13, HIGH); 
55	      digitalWrite(dirForw_A, HIGH);  // Задаем направление вращения 1 двиг
56	      digitalWrite(dirBack_A, LOW);
57	      digitalWrite(dirForw_B, HIGH);  // Задаем направление вращения 2 двиг
58	      digitalWrite(dirBack_B, LOW);
59	      
60	    }
61	     
62	 else
63	    {
64	      digitalWrite(L13, LOW); 
65	      digitalWrite(dirForw_A, HIGH);  // Задаем направление вращения 1 двиг
66	      digitalWrite(dirBack_A, LOW);
67	      digitalWrite(dirForw_B, LOW);  // Задаем направление вращения 2 двиг
68	      digitalWrite(dirBack_B, HIGH);

 

У меня инфракрасный приемник не принимает сигнал. И я не могу выйти из этого цикла.

maksim
Offline
Зарегистрирован: 12.02.2012

Тут нет никакого цикла. Как думаете зачем этот метод?

irrecv.resume(); // resume receiver

 

#include <IRremote.h> // это скачанная библиотека

#define Trig 9
#define Echo 8
#define RECV_PIN 11 //вход ИК приемника
// motor A
#define dirForw_A 2
#define dirBack_A 3
// motor B
#define dirForw_B 4
#define dirBack_B 5

#define L13 13 //пины управляющие моторами, светодиодами, или реле, чем угодно.

IRrecv irrecv(RECV_PIN);
decode_results results;

unsigned int impulseTime=0; 
unsigned int distance_sm=0; 

byte mode = 0;

void setup()
{
  irrecv.enableIRIn(); // включить приемник
  // Serial.begin(9600);  
  pinMode(L13, OUTPUT); // назначаем пины как выходы
  pinMode(dirForw_A, OUTPUT);
  pinMode(dirBack_A, OUTPUT);
  pinMode(dirForw_B, OUTPUT);
  pinMode(dirBack_B, OUTPUT);
  pinMode(Trig, OUTPUT); //инициируем как выход 
  pinMode(Echo, INPUT); //инициируем как вход 
} 

void loop() 
{
  if(irrecv.decode(&results)) 
  {
    if (results.value == 0xFF52AD) mode = 1; // первая кнопка
    if (results.value == 0x000000) mode = 0; // вторая кнопка
    irrecv.resume(); // resume receiver
  }

  if(mode == 1) 
  {
    digitalWrite(Trig, HIGH); 
    /* Подаем импульс на вход trig дальномера */
    delayMicroseconds(10); // равный 10 микросекундам 
    digitalWrite(Trig, LOW); // Отключаем 
    impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса 
    distance_sm=impulseTime/58; // Пересчитываем в сантиметры 
    //Serial.println(distance_sm); // Выводим на порт 
    // начинаем движение 
    if(distance_sm > 30)   // Если расстояние более 30 сантиметром 
    {
      digitalWrite(L13, HIGH); 
      digitalWrite(dirForw_A, HIGH);  // Задаем направление вращения 1 двиг
      digitalWrite(dirBack_A, LOW);
      digitalWrite(dirForw_B, HIGH);  // Задаем направление вращения 2 двиг
      digitalWrite(dirBack_B, LOW);
    }
    else
    {
      digitalWrite(L13, LOW); 
      digitalWrite(dirForw_A, HIGH);  // Задаем направление вращения 1 двиг
      digitalWrite(dirBack_A, LOW);
      digitalWrite(dirForw_B, LOW);  // Задаем направление вращения 2 двиг
      digitalWrite(dirBack_B, HIGH);
    }
    delay(50); //пауза между повторами //  
  }
} 

 

zhitomir82@gmail.com
Offline
Зарегистрирован: 17.02.2014

Да, спасибо за подсказку. Проблема была в опустошении ресивера ИК сигнала. 

Подскажите в чем разница инициализации ?? #define LED 13  и  int LED = 13; 

maksim
Offline
Зарегистрирован: 12.02.2012

В том что #define просто подставляет в коде вместо LED число 13, в то время как int выделяет в оперативной памяти 2 байта под переменную.

zhitomir82@gmail.com
Offline
Зарегистрирован: 17.02.2014

Спасибо! Я только учусь.

Буду дальше разбираться.