Универсальный ИК-контроллер с клавиатурой

Проекты на Arduino Uno и Slot Shield

Устройство построено на оригинальной Arduino Uno. Плата управляет бытовой техникой с помощью ИК-передатчика. Коды команд управления заранее считаем ИК-приёмником с родного пульта и сохраним на microSD. Сохранённую команду можно запустить из консоли или вручную с четырёхкнопочной клавиатуры.

Видеоинструкция

Что потребуется

Как собрать

Установите Troyka Slot Shield на Arduino Uno

Вставьте ИК-приёмник в разъём С. Ножка S должна подключится к пину 4. Аналогично подключите ИК-передатчик к пину 9 слота E.

Подключите SD-картридер к пинам SPI слота D.

Установите четырёхкнопочную клавиатуру в пины разъёма B. Сигнальный пин S1 модуля должен подключится к пину A2 платы.

Скетч

Прошейте контроллер скетчем через Arduino IDE.

ir-remoute-with-keyboard.ino
// Библиотека для работы с SPI
#include <SPI.h>
// Библиотека для работы с SD-картами
#include <SD.h>
 
// Библиотека для работы с ИК-приёмником и передатчиком
#include <IRremote.h>
 
// Имя пина, которому подключен приёмник
#define RECV_PIN 4
// Имя пина, к которому подключен передатчик
#define SEND_PIN 9
// Имя для CS пина microSD-карты
#define SD_CS_PIN  8
 
// Имена пинов для кнопок
#define BUTTON_S1 A2
#define BUTTON_S2 A3
#define BUTTON_S3 3
#define BUTTON_S4 6
 
// Строка с хранением данных введенных в последовательный порт
#define command_S1  "C_S1.txt"
#define command_S2  "C_S2.txt"
#define command_S3  "C_S3.txt"
#define command_S4  "C_S4.txt"
 
// Создаём объект для ИК-передатчика
IRsend irsend;
 
// Флаги для однократного срабатывания кнопок
bool fS1 = false;
bool fS2 = false;
bool fS3 = false;
bool fS4 = false;
 
// Частота (КГц) с которой будут передаваться сигналы
int khz = 38;
 
void setup() {
  // определяем пины кнопок, как входы с подтяжкой
  pinMode(BUTTON_S1, INPUT_PULLUP);
  pinMode(BUTTON_S2, INPUT_PULLUP);
  pinMode(BUTTON_S3, INPUT_PULLUP);
  pinMode(BUTTON_S4, INPUT_PULLUP);
  // открываем последовательный порт
  Serial.begin(9600);
  // выводим сообщение в Serial-порт о поиске карты памяти
  Serial.println("Initializing SD card...");
  // если microSD-карта не была обнаружена
  if (!SD.begin(SD_CS_PIN)) {
    // выводим сообщение об ошибке
    Serial.println("Card failed, or not present");
    // завершаем процесс
    return;
  } else {
    Serial.println("Card initialized.");
  }
}
 
void loop() {
  // считываем сигналы с кнопок
  bool bS1 = !digitalRead(BUTTON_S1);
  bool bS2 = !digitalRead(BUTTON_S2);
  bool bS3 = !digitalRead(BUTTON_S3);
  bool bS4 = !digitalRead(BUTTON_S4);
  // проверяем, какая из кнопок нажата, кнопка S1?...
  if (bS1 == true && fS1 == true) {
    fS1 = false;
    // если пришла команда C_S1, выполняем отправку соответствующей команды
    sending (command_S1);
    // выводим сообщение об отправке
    Serial.println("Signal \"C_S1\" sent.");
  } 
  if (bS1 == false) fS1 = true;
  // ... кнопка S2?...
  if (bS2 == true && fS2 == true) {
    fS2 = false;
    // если пришла команда C_S2, выполняем отправку соответствующей команды
    sending (command_S2);
    // выводим сообщение об отправке
    Serial.println("Signal \"C_S2\" sent.");
  }
  if (bS2 == false) fS2 = true;
  // ... кнопка S3?...
  if (bS3 == true && fS3 == true) {
    fS3 = false;
    // если пришла команда C_S3, выполняем отправку соответствующей команды
    sending (command_S3);
    // выводим сообщение об отправке
    Serial.println("Signal \"C_S3\" sent.");
  }
  if (bS3 == false) fS3 = true;
  // ... кнопка S4?...
  if (bS4 == true && fS4 == true) {
    fS4 = false;
    // если пришла команда C_S4, выполняем отправку соответствующей команды
    sending (command_S4);
    // выводим сообщение об отправке
    Serial.println("Signal \"C_S4\" sent.");
  }
  if (bS4 == false) fS4 = true;
}
 
// функция отправки ИК-команд
void sending (String command) {
  // создаём файл для отправки
  File dataRead = SD.open(command, FILE_READ);
  // если файл доступен для чтения
  if (dataRead) {
    // промежуточный массив для декодирования символов
    int num [6];
    // счетчик степеней декодированного сигнала
    int count = 0;
    // счетчик массива сигналов
    int j = 0;
    // пока считываются данные из файла
    while (dataRead.available()) {
      // записываем из файла посимвольно данные в промежуточный массив
      for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++) {
        // переменная для хранения полученного символа
        char point = dataRead.read();
        if (point == ' ') {
          break;
        } else {
          // преобразуем полученные символы в числа
          num[i] = point - '0';
          count++;
        }
      }
      // преобразуем массив с отдельными числами в единый сигнал и записываем его в массив
      for (int i = 0; i < count; i++) {
        irparams.rawbuf[j] += num[i] * ceil (pow(10, count - i - 1));
      }
      // переходим к следующему элементу массива
      j++;
      count = 0;
    }
    // отправляем массив сигналов
    irsend.sendRaw(irparams.rawbuf, sizeof(irparams.rawbuf) / sizeof(irparams.rawbuf[0]), khz);
    // после отправки очищаем массив
    for (int i = 0; i < sizeof(irparams.rawbuf) / sizeof(irparams.rawbuf[0]); i++) {
      irparams.rawbuf[i] = 0;
    }
    // закрываем файл
    dataRead.close();
  } else {
    // если файл не доступен
    Serial.println("Error opening in \"sending\"");
  }
}

Часто задаваемые вопросы

Где скачать необходимые библиотеки и как их установить?

Что дальше

  • Добавьте Power Shield — контроллер можно будет переносить по разным помещениям.
  • Вставьте устройство в корпус из #cтруктора. Slot Box придаст игре законченный вид.