Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Скетч для получения кодов ИК-пультаСодержание книги
Поиск на нашем сайте Первая задача — получить список кодов клавиш пульта. Пульт Marmitek (ИК и радио 433 МГц), внешний вид которого приведен на рисунке 55.23.
Определить список клавиш пульта для управления движением робота: <↑> — движение вперед; <↓> — движение назад; <←> — поворот влево; <→> — поворот вправо; <-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; просмотров: 227; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.006 с.) |