Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Скетч для получения кодов ИК-пульта

Поиск

Первая задача — получить список кодов клавиш пульта.

Пульт Marmitek (ИК и радио 433 МГц), внешний вид которого приведен на рисунке 55.23.

 

Рисунок 55.23- Пульт Marmitek


 

Определить список клавиш пульта для управления движением робота:

 <↑> — движение вперед;

 <↓> — движение назад;

 <←> — поворот влево;

 <→> — поворот вправо;

 <-CH> — увеличение скорости при движении вперед/назад;

 <CH+> — уменьшение скорости при движении вперед/назад;

 <-VOL> — круговое движение на месте влево;

 <VOL+> — круговое движение на месте вправо;

 <0> — остановка робота.

 

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

 

#include <IRremote.h>

// вход ИК-приемника int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN); decode_results results; unsigned long ir_dt, old_ir; long ir_kod;

unsigned long ir_time1, ir_time2;

void setup()

{

// последовательный порт Serial.begin(9600);

// включить приемник irrecv.enableIRIn(); ir_time1=0;ir_time2=0;

// прерывания для ИК

// FALLING - вызов прерывания при изменении уровня напряжения // с высокого (HIGH) на низкое (LOW) attachInterrupt(0, get_ir_kod, FALLING);

}

void loop()

{

// обработка кода нажатия if(ir_kod>0)

{

ir_go(ir_kod);

Serial.println(ir_kod); ir_kod=0;

}

}

// получить код, переданн^1й с ИК-пульта void get_ir_kod()

{

detachInterrupt(0); // отключить прерывание 0 if (irrecv.decode(&results))

{

if (results.value > 0 && results.value < 0xFFFFFFFF)

{

ir_dt = results.value; ir_time2=millis ();

// прошла 1 сек? if (ir_time2-ir_time1>1000)

{ir kod = ir dt;ir time1=ir time2;}


else ir_kod = 0;

}

irrecv.resume();

}

// активировать процедуру прерывания 0 attachInterrupt(0, get_ir_kod, FALLING);

}

 

Оформить их в виде констант:

 

// коды клавиш ИК-пульта (marmitek)

#define FORWARD 1936 // т

#define BACK 3984 // |

#define SPEED_UP 144 //ch+

#define SPEED_DOWN 2192 //ch-

#define LEFT 3472 // ^

#define RIGHT 1424 // -

#define CIRCLE_LEFT 3216 //vol+

#define CIRCLE_RIGHT 1168 //vol- #define STOP 2320 // 0 - стоп

Определять поступление команды с пульта будет по прерыванию 0 (на digital pin2). По прерыванию запускается процедура get_ir_kod(), которая определяет код, поступающий с пульта, и записывает его в переменную ir_kod. Процедура ioop() проверяет переменную ir_kod, и в случае ненулевого значения переменной (полу­чения кода с пульта) вызывает процедуру вывода действия ir_go (). На данном эта­пе — это вывод в последовательный порт предполагаемого по нажатию клавиши действия (рисунок 55.24).

 

forward

speed++

speed++

speed++

right

le ft

speed-

back

speed++

speed++

stop

Рисунок 55.24 – Вывод на монитор последовательного порта результата команды с пульта

 

Данный скетч:

#include <IRremote.h>

// вход ИК-приемника int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN); decode_results results; unsigned long ir_dt, old_ir; long ir_kod;

unsigned long ir_time1, ir_time2;

// коды клавиш ИК-пульта (marmitek)

#define FORWARD 1936

#define BACK 3984

#define SPEED_UP 144 //ch+

#define SPEED_DOWN 2192 //ch-

#define LEFT 3472 #define RIGHT 1424 #define CIRCLE_LEFT 3216 //vol+

#define CIRCLE_RIGHT 1168 //vol- #define STOP 2320 //0

void setup()

{

// последовательный порт Serial.begin(9600);

// включить приемник irrecv.enableIRIn(); ir_time1=0;ir_time2=0;

// прерывания для ИК

// FALLING - вызов прерывания при изменении уровня напряжения // с высокого (HIGH) на низкое (LOW) attachInterrupt(0, get_ir_kod, FALLING);

}

void loop()

{

// обработка кода нажатия if(ir_kod>0)

{

ir_go(ir_kod);

ir_kod=0;

}

}

// получить код переданный с ИК-пульта void get_ir_kod()

{

detachInterrupt(0); // отключить прерывание 0 if (irrecv.decode(&results))

{

if (results.value > 0 && results.value < 0xFFFFFFFF) {

ir dt = results.value; ir time2=millis();

// прошла 1 сек? if (ir_time2-ir_time1>1000)

{ir kod = ir dt;ir time1=ir time2;} else ir_kod = 0;

}

irrecv.resume();

}

// активировать процедуру прерывания 0 attachInterrupt(0, get_ir_kod, FALLING);

}

// действие по полученному коду void ir go(kod)

{

switch(kod)

{

case FORWARD: // направление вперед Serial.print("forward\n"); break;

case BACK: // направление назад

Serial.print("back\n"); break;

case SPEED_UP: // скорость++

Serial.print("speed++\n"); break;

case SPEED_DOWN: // скорость—

Serial.print("speed—\n"); break; case LEFT: // влево Serial.print("left\n"); break; case RIGHT: // вправо Serial.print("right\n"); break;

case CIRCLE RIGHT: // кружение вправо Serial.print("circle right\n"); break;

case CIRCLE_LEFT: // кружение влево Serial.print("circle left\n"); break;


case STOP: // стоп

Serial.print("stop\n"); break; default: break;

}

}

Контрольные вопросы:

1. Как осуществляется обмен данными в инфракрасном диапазоне?

2. Какие существуют протоколы для ИК-пультов?

3. Как осуществляется подключение ИК-приемника к Arduino?

4. Для чего предназначена библиотека IRremote?

 

 


 



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 163; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.203.195 (0.006 с.)