8 (800) 350-30-16

Инфракрасный приемник и Arduino

Дата: / Категория: Связь / Автор: DOC_tr

В данной статье не будет фотографий, потому что в данный момент у меня нет возможности их сделать, но будет достаточно кода и схем для того, чтобы сделать ее не менее насыщенной.

Сегодня мы будем подключать к Arduino ИК приемник и управлять им с помощью пульта, поставляющегося в комплекте (вот кстати ссылка на него в нашем магазине).

Сразу скажу, что в русском сообществе очень мало данных о том, как подключать приемник и получать данные с пульта, поэтому, надеюсь, данная статья окажется для вас достаточно полезной.

Подключаться мы будем с помощью библиотеки IRremote. Она идет из коробки, но в той, что из коробки, множество багов, поэтому советую установить новую (я брал отсюда). 
У нашего устройства ноги расположены в следующем порядке:

И подключаем его по данной схеме

Как видите, ногу OUT мы подключили к 2 порту, что и указываем в следующем скетче:

#include <IRremote.h>

// порт, к которому подключен ик
IRrecv irrecv(2);
decode_results results;

void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
// выводим значение нажатой кнопки
Serial.println(results.value, HEX);
irrecv.resume();
delay(200);
}
}

Теперь, если откроем консоль и понажимаем на кнопки, то увидим их 16ричное значение.

Переделаем немного код, чтобы выводилось нормальное значение:

#include <IRremote.h>
int message;
String text;

IRrecv irrecv(2);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
}

void loop() {
if (irrecv.decode(&results)) {
message = results.value, HEX;
switch (message){
case 0xFF629D: text = "up"; break;
case 0xFFC23D: text = "right"; break;
case 0xFFA857: text = "down"; break;
case 0xFF22DD: text = "left"; break;
case 0xFF02FD: text = "OK"; break;
case 0xFF6897: text = "1"; break;
case 0xFF9867: text = "2"; break;
case 0xFFB04F: text = "3"; break;
case 0xFF30CF: text = "4"; break;
case 0xFF18E7: text = "5"; break;
case 0xFF7A85: text = "6"; break;
case 0xFF10EF: text = "7"; break;
case 0xFF38C7: text = "8"; break;
case 0xFF5AA5: text = "9"; break;
case 0xFF42BD: text = "*"; break;
case 0xFF4AB5: text = "0"; break;
case 0xFF52AD: text = "#"; break;
default: text = "";
}
if(text.length()){
Serial.println(text);
}
irrecv.resume();
delay(500);
}
}

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

На этом можно было бы и закончить урок, но я решил поэкспериментировать и набросал небольшой код, в котором с помощью кнопок управления (право/лево) можно выбрать нужный нам светодиод. Также это можно сделать с помощью кнопок 1-4, а с помощью кнопок вверх и вниз мы можем регулировать яркость выбранного светодиода. 

Подключаем все наше оборудование следующим образом:

И заливаем вот этот скетч:

#include <IRremote.h>
int message;
String text;

// выходы, к которым подключены светодиоды
int pins[] = {6, 9, 10, 11};
// уровень сигнала на этих выходах
int signals[] = {0, 0, 0, 0};

int pin = 0;
bool change = false;

IRrecv irrecv(2);
decode_results results;

void setup()
{
Serial.begin(9600);
// при включении мигнем всеми светодиодами, чтобы убедиться что они рабочие
for(int i = 0 ; i < 4; i++){
analogWrite(pins[i], 255);
}
delay(200);
for(int i = 0 ; i < 4; i++){
analogWrite(pins[i], 0);
}
irrecv.enableIRIn();
}

void loop() {
if (irrecv.decode(&results)) {
message = results.value, HEX;
change = false;
switch (message){
// кнопка вверх - увеличиваем сигнал на текущем выходе на 50 до 255
case 0xFF629D: signals[pin]+=50; if(signals[pin] > 255){signals[pin] = 255;} break;
// кнопка вправо - меняем текущий порт прибавляя к нему единицу. Если порты закончились идем заново
case 0xFFC23D: pin++; if(pin > 3){pin = 0;} change = true; break;
// кнопка вверх - уменьшаем сигнал на текущем выходе на 50 до 0
case 0xFFA857: signals[pin]-=50; if(signals[pin] < 0){signals[pin] = 0;} break;
// кнопка вправо - меняем текущий порт уменьшая его на единицу. Если порты закончились идем заново
case 0xFF22DD: pin--; if(pin < 0){pin = 3;} change = true; break;
// кнопки - цифры. задаем цифрой текущий пин
case 0xFF6897: pin = 0; change = true; break;
case 0xFF9867: pin = 1; change = true; break;
case 0xFFB04F: pin = 2; change = true; break;
case 0xFF30CF: pin = 3; change = true; break;
default: change = false;
}
// если текущий порт не был изменен, то меняем мощность на всех диодах
if(!change){
for(int i = 0 ; i < 4; i++){
analogWrite(pins[i], signals[i]);
}
// если был, то мигнем текущим диодом для того чтобы показать на каком именно мы сейчас находимся.
// если уровень ШИМ сигнала больше 150, то мигаем посредством его отключения, если нет, то мигаем посредством включения
} else {
analogWrite(pins[pin], signals[pin] > 150 ? 0 : 255);
delay(200);
analogWrite(pins[pin], signals[pin]);
}
irrecv.resume();
delay(200);
}
}

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

Теги: #Светодиоды, #ИК-приемник

Ваша оценка:

Рейтинг: 10.0 (Оценок: 2)

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены