Работа с ардуино и IR приёмник - один из способов дистанционного управления Arduino

Итак, начнём изучать способы дистанционного управления Arduino, а конктретно ИК сигналы. Инфракрасный(ИК) спектр не виден человеческому глазу, но отлично воспринимается цифровыми камерами и ИК приёмниками(с ними и будем работать). Данный способ управления удобен для управления техникой в прямой видимости (телевизор, кондиционер, аудио и видео аппаратура). Но об этом мы поговорим во втором уроке. Для начала научимся считывать IR сигнал с любого пульта. 

Для этого нам понадобится: 
- Arduino 
- IR приёмник (в моём случае TSOP2238) 
- Перемычки и макетная плата для удобства монтажа 

Подключение

Для начала необходимо посмотреть , чтобы не перепутать ножки для подключения. 



OUT(сигнал) к Pin6 (у меня 1 ножка) 
Vs(+) к 5V (2 ножка) 
GND к GND (3 ножка) 

 

Программная часть

Для удобства работы с IR сигналами необходимо воспользоваться библиотекой "IRremote.h". 
Скачать можно в гугле по запросу "IRremote.h". 

Для установки данной библиотеки скопируйте содержимое архива в: arduino-1.x/libraries/IRremote Где arduino-1.x – это папка куда установлена Arduino IDE После чего должен быть доступен файл arduino-1.x/libraries/IRremote/IRremote.cpp и IRremote.h



Начинаем!


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

#include <IRremote.h>
int RECV_PIN = 6;
int BUTTON_PIN = 12;
int STATUS_PIN = 13;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(BUTTON_PIN, INPUT);
pinMode(STATUS_PIN, OUTPUT);
}
// Storage for the recorded code
int codeType = -1; // The type of code
unsigned long codeValue; // The code value if not raw
unsigned int rawCodes[RAWBUF]; // The durations if raw
int codeLen; // The length of the code
int toggle = 0; // The RC5/6 toggle state
// Stores the code for later playback
// Most of this code is just logging
void storeCode(decode_results *results) {
codeType = results->decode_type;
int count = results->rawlen;
if (codeType == UNKNOWN) {
Serial.println("Received unknown code, saving as raw");
codeLen = results->rawlen - 1;
// To store raw codes:
// Drop first value (gap)
// Convert from ticks to microseconds
// Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
for (int i = 1; i <= codeLen; i++) {
if (i % 2) {
// Mark
rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
Serial.print(" m");
}
else {
// Space
rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;
Serial.print(" s");
}
Serial.print(rawCodes[i - 1], DEC);
}
Serial.println("");
}
else {
if (codeType == NEC) {
Serial.print("Received NEC: ");
if (results->value == REPEAT) {
// Don't record a NEC repeat value as that's useless.
Serial.println("repeat; ignoring.");
return;
}
}
else if (codeType == SONY) {
Serial.print("Received SONY: ");
}
else if (codeType == RC5) {
Serial.print("Received RC5: ");
}
else if (codeType == RC6) {
Serial.print("Received RC6: ");
}
else {
Serial.print("Unexpected codeType ");
Serial.print(codeType, DEC);
Serial.println("");
}
Serial.println(results->value, HEX);
codeValue = results->value;
codeLen = results->bits;
}
}
void sendCode(int repeat) {
if (codeType == NEC) {
if (repeat) {
irsend.sendNEC(REPEAT, codeLen);
Serial.println("Sent NEC repeat");
}
else {
irsend.sendNEC(codeValue, codeLen);
Serial.print("Sent NEC ");
Serial.println(codeValue, HEX);
}
}
else if (codeType == SONY) {
irsend.sendSony(codeValue, codeLen);
Serial.print("Sent Sony ");
Serial.println(codeValue, HEX);
}
else if (codeType == RC5 || codeType == RC6) {
if (!repeat) {
// Flip the toggle bit for a new button press
toggle = 1 - toggle;
}
// Put the toggle bit into the code to send
codeValue = codeValue & ~(1 << (codeLen - 1));
codeValue = codeValue | (toggle << (codeLen - 1));
if (codeType == RC5) {
Serial.print("Sent RC5 ");
Serial.println(codeValue, HEX);
irsend.sendRC5(codeValue, codeLen);
}
else {
irsend.sendRC6(codeValue, codeLen);
Serial.print("Sent RC6 ");
Serial.println(codeValue, HEX);
}
}
else if (codeType == UNKNOWN /* i.e. raw */) {
// Assume 38 KHz
irsend.sendRaw(rawCodes, codeLen, 38);
Serial.println("Sent raw");
}
}
int lastButtonState;
void loop() {
// If button pressed, send the code.
int buttonState = digitalRead(BUTTON_PIN);
if (lastButtonState == HIGH && buttonState == LOW) {
Serial.println("Released");
irrecv.enableIRIn(); // Re-enable receiver
}
if (buttonState) {
Serial.println("Pressed, sending");
digitalWrite(STATUS_PIN, HIGH);
sendCode(lastButtonState == buttonState);
digitalWrite(STATUS_PIN, LOW);
delay(50); // Wait a bit between retransmissions
}
else if (irrecv.decode(&results)) {
digitalWrite(STATUS_PIN, HIGH);
storeCode(&results);
irrecv.resume(); // resume receiver
digitalWrite(STATUS_PIN, LOW);
}
lastButtonState = buttonState;
}



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

Таким образом мы выяснили две вещи: 
1. Наш пульт посылает сигналы в кодировке NEC 
2. Коды кнопок пульта (что нам и было нужно) 

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

 

Теперь напишем скетч, при котором нажатие кнопки 1 будет подавать команду на включение светодиода, а нажатие кнопки 2 - на выключение. 

#include <IRremote.h>

int RECV_PIN = 6; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
int LED = 8;

void setup()

{
irrecv.enableIRIn(); // включить приемник
pinMode(LED, OUTPUT);
}

void loop() {

if (irrecv.decode(&results))
{
  if (results.value == 0x2FD807F) //код моей кнопки "2FD807F". У Вас он будет дугой
  {
    digitalWrite(LED, HIGH);
  }
    if (results.value == 0x2FD40BF)//код моей кнопки "2FD40BF". У Вас он будет дугой
    {
      digitalWrite(LED, LOW);
    }
 irrecv.resume();
}
}

Так же не забываем о экономии при покупке товаров на Алиєкспресс с помощью кэшбэка 

Для веб администраторов и владельцев пабликов  главная страница ePN

Для пользователей покупающих на Алиэкспресс с быстрым выводом % главная страница ePN Cashback

Удобный плагин кэшбэка браузерный плагин ePN Cashback

  • Работа с ардуино и  IR приёмник - один из способов  дистанционного управления Arduino

Похожие статьи

Как работают шаговые двигатели

Как работают шаговые двигатели

Использование шаговых двигателей является одним из самых простых, дешевых и легких решений для реализации систем точного позиционирования. Эти двигатели очень часто используются в различных станках ЧПУ и роботах. Сегодня я расскажу о том, как устроены шаговые двигатели и как они работают.

Драйвер шагового двигателя и двигателя постоянного тока L298N и Arduino

Драйвер шагового двигателя и двигателя постоянного тока L298N и Arduino

Драйвер шагового двигателя и двигателя постоянного тока L298N и Arduino

Модуль L298N H-bridge можно использовать для двигателей, напряжение питания которых находится в диапазоне от 5 до 35 вольт. Кроме того, на многих подобных платах есть встроенный 5В регулятор, который дает возможность запитывать ваши устройства.

Подключение модуля L298N

Все самое вкусное под катом... >

Теги: Работа с ардуино и IR приёмник - один из способов дистанционного управления Arduino