Как правильно выйти из цикла???
- Войдите на сайт для отправки комментариев
Ср, 19/02/2014 - 18:03
Помогите правильно выйти из цикла.
Есть робот, который при нажатии кнопки №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); //пауза между повторами //
}
}
zhitomir82@gm, узнать скан-код кнопки номер два и создать цикл if. У вас в скетче код только одной кнопки.
Код второй кнопки есть. Просто, когда программа доходит сюда:
// начинаем движение 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);У меня инфракрасный приемник не принимает сигнал. И я не могу выйти из этого цикла.
Тут нет никакого цикла. Как думаете зачем этот метод?
#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); //пауза между повторами // } }Да, спасибо за подсказку. Проблема была в опустошении ресивера ИК сигнала.
Подскажите в чем разница инициализации ?? #define LED 13 и int LED = 13;
В том что #define просто подставляет в коде вместо LED число 13, в то время как int выделяет в оперативной памяти 2 байта под переменную.
Спасибо! Я только учусь.
Буду дальше разбираться.