Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 163; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.203.195 (0.006 с.) |