Объявление

США начнут предпринимать меры экономического и военного характера, если Россия не прекратит нарушать Договор о ракетах средней и меньшей дальности (ДРСМД)

Решение главы Национального Объединения "Новая Россия - Великая Россия" Rommstaina: http://russianew.ru/viewtopic.php?f=120&t=4039

ИК приемник + Ардуино. Подключение

Правила форума
Внимание! Любой спам на нашем форуме запрещён!
Коммерческая реклама сайтов, ссылки, спам запрещены. Так же запрещены ссылки на сайты в профилях новичков.
Бан без предупреждений.

ИК приемник + Ардуино. Подключение

Сообщение admin » 01 дек 2016, 16:30

Изображение

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


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


 Начнем с аппаратной части, нам потребуется ИК-приемник который и будет принимать наши сигналы с отправленные с пульта (если на картинке нет вашего приемника то гуглим, иначе можем сжечь его неправильным подключением). GND это минус, Vs это +5 вольт и Vo это выход нашего приемника.

Изображение

Изображение

Изображение

Подключаем ИК-приемник к Arduino как показано на картинке (можно подключать без конденсаторов и на прямую без токоограничивающего сопротивления но для длительной работы нужно подключать именно так, конденсатор на 0.1 нужен для подавления помех по питанию), начальную аппаратную часть мы сделали и можно приступать к программной.


 Для работы ИК-приемником и возможно в будущем ИК-передатчиком нам потребуется библиотека IRremote (в архиве) и небольшой тестовый скетч при помощи котрого мы будем принимать коды нажатых кнопок.


 Устанавливаем библиотеку и загружаем в Arduino тестовый скетч:

Код: выделить все
#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;
}


Открываем монитор порта (Ctrl+Shift+M в программе Arduino), далее при нажатии кнопок на нашем ИК-пульте мы увидим коды кнопок которые принимает Arduino через ИК-приемник.

Изображение

Мы видим что наш ИК-пульт посылает сигналы в кодировке NEC и коды нажатых кнопок, а так же видим иногда текст "Received NEC: repeat; ignoring. " это говорит о том что срабатывает защита от залипания кнопок (защита от дребезга кнопки или повторного нажатия в очень узкий промежуток времени).


 Итак коды кнопок у нас есть теперь можно приступать к простейшему коду, для начала попробуем включать и выключать светодиод при нажатии нужных нам кнопок на ИК-пульте.


 *Следует учесть что мои коды кнопок выглядят так FF40BF, а в коде мы будем писать так 0xFF40BF, то есть добаляем к нашему коду кнопки 0x перед самим кодом.

Код: выделить все
#include <IRremote.h>      // библиотека для ИК
int RECV_PIN = 6;      // pin ИК приемника
IRrecv irrecv(RECV_PIN);      // создаем объект получения сигнала с заданного порта
decode_results results;      // переменная хранящая результат
int LED = 8;      // pin нашего светодиода

void setup() {
   irrecv.enableIRIn();      // включаем ИК-приемник
   pinMode(LED, OUTPUT);      // устанавливает режим работы - выход
}

void loop() {
   if (irrecv.decode(&results)) {      // если есть сигнал
      if (results.value == 0xFF40BF) {      // код моей кнопки "FF40BF". У Вас он будет дугой!
         digitalWrite(LED, HIGH);      // зажигаем светодиод
      }
      if (results.value == 0xFF32CD) {      // код моей кнопки "FF32CD". У Вас он будет дугой!
         digitalWrite(LED, LOW);      // тушим светодиод
      }
      irrecv.resume();      // получаем следующее значение
   }
}


Изображение

Изображение

Теперь можно управлять с ИК-пульта чем вам вздумается.
admin
Администратор
 
Сообщений: 73
Зарегистрирован: 27 ноя 2016, 18:21
ТегиИК приемник TSOP1238, Ардуино

Вернуться в Для новичков. Азы.

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

/