Arduino и радио модули 433 мгц

Содержание

Работа с беспроводным приемопередающим модулем nRF24L01+

Однако для того, чтобы наш nRF24L01 работал без проблем, мы могли бы рассмотреть следующие вещи. Я долгое время работал с этим nRF24L01+ и изучил следующие моменты, которые могут помочь вам избежать препятствий. Вы можете попробовать это, когда модули не работают в нормальном режиме.

Большинство модулей nRF24L01+ на рынке являются поддельными. Самые дешевые, которые мы можем найти на Ebay и Amazon, являются худшими (не волнуйтесь, с помощью нескольких ухищрений мы можем заставить их работать).
Основная проблема – источник питания, а не ваш код

Большинство примеров кода в интернете работают правильно.
Обратите внимание, что модули, которые промаркированы как NRF24L01+, на самом деле это Si24Ri (да, это китайский продукт).
Клоны и поддельные модули будут потреблять больше энергии, поэтому разрабатывайте свою схему питания не на основе технического описания nRF24L01+, поскольку Si24Ri будет иметь высокое потребление тока, около 250 мА.
Остерегайтесь пульсаций напряжения и скачков тока, эти модули очень чувствительны и могут легко выйти из строя (я пока поджарил 2 модуля).
Добавление пары конденсаторов (10 мкФ и 0,1 мкФ) между Vcc и Gnd модуля помогает очистить питание, и это работает с большинством модулей.

Управляй телевизором силой мысли и Arduino

Название проекта: Управляй телевизором силой мысли и ArduinoПлатформа: Arduino

Пульт от телевизора больше не нужен. Все что нужно сделать – это подумать о смене канала. В проекте использован чип из игры Star Wars Force Trainer (Звездные войны), выпущенной в 2009 году.

Использованные компоненты: Arduino UNO, игра Star Wars Force Trainer, ИК-приемник / ИК-передатчик

,

Сайт проекта: http://goo.gl/8lwjjp

Если вы когда-нибудь мечтали переключать каналы телевизора, просто думая, об этом, то этот arduino-проект – ваша удача. Не только системы “умный дом”, но и магия становятся реальностью.

Более того, некоторые проекты мейкеров доказывают, что фантастические трюки можно сделать самому, затратив при этом не много средств.

Она включает в себя гарнитуру, способную обнаруживать электрические поля разума (по аналогии с ЭЭГ). Сигналы ретранслируются и вентилятор поднимает мяч, находящийся в трубе, в воздух. Иллюзия левитации. Сила работы вентилятора зависит от мыслей пользователя.

https://youtube.com/watch?v=jIIm9sU681c

Мейкер разобрал игру и обнаружили чип NeuroSky ЭЭГ, встроенный в гарнитуру, который он решил подключить к Arduino Uno (ATmega328), чтобы собирать и преобразовывать исходные данные ЭЭГ на компьютере. В проекте также были использованы ИК-приемник и ИК-передатчик от старого видеомагнитофона.

Чтобы посмотреть какие сигналы передает пульт дистанционного управления на ИК-приемник при нажатии кнопок достаточно воспользоваться Serial-монитором, предварительно загрузив в arduino простую программу.

Код кнопки нужно записать для последующего использования. Написав совсем немного строк кода, мейкер создал умопомрачительный проект. Шлем позволяет переключать каналы на ТВ и выключать его питание, просто путем сосредоточения мыслей.

Исходный код проекта можно скачать на GitHub.

Другие проекты на этой платформе:

  • Робот на Arduino, управляемый с помощью жестов
  • Как сделать аниматронный хвост
  • Вездеход из Lego с видео и bluetooth на Raspberry Pi
  • Робот Juno: изучай Arduino и программирование
  • Робот-манипулятор из настольной лампы IKEA
  • Arduino-робот, объезжающий препятствия
  • Роботизированная интеллектуальная система — РИС
  • Серво-выключатель света для умного дома
  • Робот-рыба на Arduino
  • Сделай сам большого человекоподобного робота

Программирование Arduino

Микросхема Si в этом проекте является ведомым устройство I2C, имеющим фиксированный адрес 0x11; при этом ведущим устройством (мастером) является плата Arduino. Однако скорость обмена информацией по I2C у этой микросхемы относительно медленная: максимальная поддерживаемая скорость 50 кГц. Кроме того, во время процедуры включения питания скорость не должна превышать 10 кГц. Чтобы удовлетворить эти требования, мы должны явно установить у Arduino скорость I2C, которая, как правило, слишком велика для Si4844-A10. К счастью, благодаря большому количеству документации по функциям I2C Arduino, мы можем легко выполнить необходимые изменения.

В принципе, скорость I2C для наших целей определяется в программном обеспечении Arduino двумя переменными. Эти переменные – это и . Биты 0 и 1 управляют предделителем, который работает со значением для установки скорости I2C. Скорость (тактовая частота) передачи по I2C рассчитывается по формуле:

Частота = Тактовая частота процессора / (16 + (2 * () * (предделитель))

Arduino Pro mini 3,3В работает на частоте 8 МГц. Чтобы установить скорость I2C на 10 кГц, мы используем значение 98 и установим предделитель в значение 4 (путем установки в 1 только бита 0 ). Таким образом,

8 000 000 / (16 + (2 * 98 * 4 )) = 10 000 или 10 кГц

Чтобы установить скорость I2C на 50 кГц, мы используем значение 18 и установим предделитель в значение 4 (путем установки в 1 только бита 0 ). Таким образом,

8 000 000 / (16 + (2 * 18 * 4)) = 50 000 или 50 кГц

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

Еще один важный момент, связанный с программирование, заключается в том, что нам в коде нужно использовать подпрограмму внешнего прерывания. Мы используем на Arduino, и, когда Si4844-A10 установит уровень на этом выводе в 1, выполнится простая функция, которая «привязана» к этому прерыванию. Всё, что делает эта функция, это изменяет значение переменной флага, которая может быть проверена и изменена в других частях программы. Si4844-A10 будет запускать прерывания (т.е. подавать уровень логической единицы на вывод INT) при определенных условиях, в основном в случае изменения сопротивления потенциометра настройки. Так Si4844-A10 сообщает Arduino, что вы повернули ручку настройки, и что необходимо обновить данные на дисплее.

ИК-приемник VS1838B и arduino

Управлять своими устройствами можно очень многими способами, один из них – это с помощью ИК-сигналов, про этот метод постараюсь расписать в сегодняшней статье. Тут поможет любой ИК-пульт – от телевизора, музыкального центра или любого другого домашнего устройства, которое есть у каждого.

Пульт дистанционного управления являться передатчиком информации, а в качестве приемника можно использовать инфракрасный датчик VS1838B, который продается совсем за смешные деньги.

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

Подключение ИК-датчика VS1838B к arduino

Для считывания ИК-сигнала и преобразования его к человеческому виду – числу, можно воспользоваться библиотекой IRremote, с ее помощью весь скетч займет всего несколько строк.Ссылка на библиотеку: IRremote .

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

Ниже приведена фотография VS1838B с подписанными ножками:

Ногу, которая отвечает за передачу данных, будем подключать к пину 11 arduino. Так же для наглядности подключим к 13 пину светодиод, который будет включаться и выключаться при нажатии на кнопки на ИК-пульте.

Код скетча для ИК-приемника VS1838B

Каждая кнопка ИК-пульта имеет уникальный код, который мы будем получать с помощью датчика VS1838B. В первую очередь запишем скетч, который выводит в консоль коды кнопок, после чего уже дополнить программу условиями на конкретные кнопки.Ниже приведет скетч для работы с ИК-приемником VS1838B и arduino, скачать его можно тут: скачать.

#include // подключаем библиотеку int ledPin = 13; // светодиод int reciverPin = 11; // пин, к котрому подключен ИК-приемник IRrecv irrecv(reciverPin); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // запуск приемника pinMode(ledPin, OUTPUT); } void loop() { // постоянно считываем данные с приемника if (irrecv.decode(&results)) { // выводим в консольку, что получили, число в 16-ричном виде Serial.println(results.value, HEX); // проверяем сигналы – и если это те, что нам нужны, то вкл или выкл светодиод if(results.value == 0x926DC837) digitalWrite(13, HIGH); if(results.value == 0x926D48B7) digitalWrite(13, LOW); irrecv.resume(); // готовы принимать следующий сигнал } }

Пример работы ИК-датчика VS1838B и arduino можно посмотреть ниже на видео.

Сохранение декодированных данных в лист Excel

Для передачи данных на лист Excel мы будем использовать плагин PLX-DAQ, который позволяет непосредственно передавать данные с Arduino в лист Excel на вашем компьютере. По приведенной ссылке скачайте данный плагин, извлеките его из архива и установите его на свой компьютер. После своей установки плагин создаст на вашем компьютере папку PLX-DAQ.

После этого откройте файл ‘PLX-DAQ spreadsheet’ из этой папки. Если в вашем Excel отключены макросы, то вы увидите предупреждающее сообщение как на следующем рисунке.

Включите макросы и после этого вы на своем экране должны увидеть следующее:

После этого выберите скорость “9600” и COM порт, к которому подключена плата Arduino к вашему компьютеру. Затем нажмите на Connect чтобы начать прием данных от Arduino – в результате вы на экране увидите примерно следующую картину:

Этот будет означать что наш проект декодера инфракрасных сигналов на основе платы Arduino успешно работает.

IR транскодер на Arduino

Устройства с управлением от инфракрасного пульта тесно вошли в нашу жизнь. Иногда пульт от телевизора или древней аудиосистемы теряется, а купить новый за давностью лет уже невозможно. Заказать новый пульт не всегда возможно, изготовить клон тоже, но обладая донором или информацией о нём можно изготовить конвертер.

Такой транскодер будет принимать команды одного пульта и транслировать их в формат другого.

Для Arduino существует прекрасная библиотека IRemote которая делает построение разнообразных ИК систем управления очень простым.

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

Собранная схема нужна нам для получения кодов команд от обеих пультов, к несчастью снять команды с устройства для которого пульт утерян несколько сложнее. Вы можете всё-таки найти пульт донор, воспользоваться универсальным пультом подобрав код (а зачем тогда вам тогда транскодер, раз уж пульт подошёл?) или попытавшись воспользоваться данными из интернет баз по IR кодам.

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

Для чтения данных используем пример IRrecvDumpV2 из поставки IRremote, если ваш пульт относится к распознаваемым библиотекой то сырой результат сканирования вам не понадобится, хотя например пульт от LG у меня ложно распознавался как Samsung и не заработал при попытке отправлять команды через sendLG.

Пример полученных данных под спойлером:Encoding: SAMSUNG Code: 34346897 (32 bits) Timing: +4450, -4350 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 550, -1650 + 550, — 550 + 550, — 550 + 550, -1650 + 550, — 550 + 550, -1650 + 550, -1600 + 600, -1600 + 600 unsigned int rawData = {4450,4350, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 550,1650, 550,550, 550,550, 550,1650, 550,550, 550,1650, 550,1600, 600,1600, 600}; // SAMSUNG 34346897

unsigned int data = 0x34346897;

В случае если захват выдаёт сообщение “IR code too long. Edit IRremoteInt.h and increase RAWLEN” библиотеку придётся немного исправить — увеличив размер буфера для команд.

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

Для встраиваемого устройства его можно смело увеличивать до 200 Ом а если передатчик должен быть дальнобойным то придётся дополнить его нехитрым транзисторным каскадом, иначе тока от Arduino обязательно не хватит.

При наличии кодов команд от обеих пультов код транскодера приобретает следующий видvoid loop() {
if (irrecv.decode(&results)) { switch(results.value){ case(0x845E5420):{ irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal), khz); }break; } } irrecv.resume(); irrecv.enableIRIn();
}

Запускаем скетч, заливаем в Arduino. Как ни странно после запуска одна команда проходит, после чего все последующие устройством игнорируются. Чтобы не связываться с отладкой добавляем в цикл мигалку на 13 пине и видим что после первой попытки отправить команду плата зависает.

Можно эмпирически добавить задержку в пол секунды (delay(500) )и всё будет работать, но зная что сырые данные у нас представляют собой отсчёты времени в миллисекундах то можно просто добавить функцию отправки с задержкой.

В модуле Irsend есть даже подходящая функция custom_delay_usec, которой я изначально воспользовался неправильно, забыв домножить величину задержки на множитель USECPERTICK из библиотеки (50 мс).

void sendDelayed(unsigned int array[]){ irsend.sendRaw(array, sizeof(array) / sizeof(array), khz); int array_size = sizeof(array) / sizeof(array); for(int i=0;i

Дистанционное управление роботом на базе Ардуино своими руками

Перевёл alexlevchenko для mozgochiny.ru

Сегодня никого не удивишь радиоуправляемыми самоделками.

Но согласитесь, как-то «по старинке» нажимать на клавиши управления… Гораздо интереснее управлять поделками с помощью движений кисти, не так ли? В данной статье показан пример того, как можно организовать дистанционное управление при помощи платы Arduino и нескольких датчиков изгиба. В качестве подопытного будет выступать PHIRO Pro

Шаг 2: Загружаем стандарт Firmata на Arduino

Необходимо загрузить стандарт firmata на плату Ардуино, для того, что соединить её с Pocket Code. В данном проекте используем Arduino UNO, однако может быть использована любая плата Arduino.

  • Подключаем плату Arduino к компьютеру/ноутбуку.
  • В Arduino ID выбираем COM Port. Tools -> Serial Port -> Corresponding COM Port
  • Далее выбираем тип платы. Tools -> Board -> Your Arduino Board
  • Затем выбираем стандарт Firmata. Examples -> Firmata -> Standard Firmata
  • Нажимаем «Upload» и загружаем код на плату.

Шаг 3: Соединяем датчики с платой и крепим их на перчатку

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

Шаг 4: Подсоединяем Bluetooth модуль HC-05 к Arduino

Соединяем выводы bluetooth модуля и платы Arduino следующим образом:

  • HC05 Tx — Arduino Rx
  • HC05 Rx — Arduino Tx
  • Vcc — 5V
  • GND — GND

Шаг 5: Соединяем Arduino с батареей

Используем 9В батарею для питания платы Arduino с Bluetooth модулем. Такой тип компоновки объясняется возможностью легкого монтажа на запястье/браслете. Чем компактнее тем лучше.

Шаг 6: Программа Pocket Code

Ниже представлены примеры использования программы. Прежде всего убедитесь, что PHIRO Pro находится в Mode 3 (Bluetooth Mode). Нажмите на кнопку Mode на PHIRO не раньше, чем синий светодиод, что расположен рядом с дисплеем на верху, включится.

https://youtube.com/watch?v=aIeEFt1r4gY

Для программы, в общем есть 7 режимов.

  • Указательный палец выпрямлен. Фары светятся красным. Программа показывает STOP.
  • Указательный и средний палец выпрямлены. Фары светятся зеленым. Программа показывает STOP.
  • Указательный, средний и безымянный пальцы выпрямлены. Фары светятся синим. Программа показывает STOP.
  • Ладонь открыта. PHIRO движется вперёд. Фары светятся белым. Программа показывает FORWARD (вперёд).
  • Ладонь сжата в кулак. PHIRO останавливается. Фары выключены. Программа показывает STOP.
  • Ладонь сжата в кулак и наклонена влево (телефон наклонён влево). PHIRO поворачивает налево. Левая фара светится желтым. Программа показывает LEFT (влево).
  • Ладонь сжата в кулак и наклонена вправо (телефон наклонён вправо). PHIRO поворачивает вправо. Правая фара светится желтым. Программа показывает RIGHT (право).

Шаг 7: Проводим финальный монтаж

Для крепления телефона на руке, можете воспользоваться наручной повязкой или сделать так, как сделал я.

Купил дешевую крышку под мой мобильник, прорезал отверстия и протянул ленту липучку. Наручная повязка с телефоном готова.

Вот и всё!) Спасибо за внимание)

(A-z Source)

Декодирование инфракрасных сигналов управления с помощью Arduino

Плата Arduino в рассматриваемом проекте выполняет сразу две функции: одна заключается в декодировании инфракрасных сигналов от пультов ДУ, а вторая — в управлении инфракрасным излучателем.

Для декодирования сигналов от инфракрасных пультов ДУ мы будем использовать заголовочный файл от Ken Shirriff’s IRremote, который значительно упрощает эти процессы. Для работы с этим заголовочным файлом вы должны сделать следующую последовательность действий:

Текст программы для декодирования сигналов от инфракрасных пультов ДУ:

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

Представленный пример программы для декодирования сигналов инфракрасных пультов ДУ был взят из подпапки ‘examples’ (примеры) папки IRremote (которую мы скачали по вышеприведенной ссылке). Также в подпапке ‘examples’ вы можете при желании изучить и другие примеры работы с устройствами инфракрасной связи.

Начинаем работать с модулем влажности DHT11

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

Нам понадобиться: модуль влажности DHT11, резистор на 10 кОм.

Чем отличаются
датчики DHT11 и DHT22?

Две версии сенсоров DHT похожи друг на друга и имеют
одинаковую распиновку. Их отличия в характеристиках. Спецификации:

Сенсор DHT11:

определение влажности в диапозоне 20-80%

определение температуры от 0°C до +50°C

частота опроса 1 раз в секунду

Сенсор DHT22:

определение влажности в диапазоне 0-100%

определение температуры от -40°C до +125°C

частота опроса 1 раз в 2 секунды

Таким образом, характеристики датчика DHT22 лучше по
сравнению с DHT11, и поэтому он чуть-чуть дороже. Снимать показания чаще, чем
раз в 1-2 секунды не получится, но, возможно, для вашего проекта более высокое
быстродействие и не требуется.

Подключение
сенсоров DHT к Arduino

Датчики DHT имеют стандартные выводы и их просто
установить на breadboard.

Датчики DHT имеют 4 вывода:

питание.

вывод данных

не используется.

GND (земля).

Между выводами питания и вывода данных нужно разместить
резистор номиналом 10 кОм.

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

Что нужно сделать? А все просто: сначала правильно
подключим датчик к плате ардуино. Далее нужно установить библиотеку. Об этом
лучше не сто раз прочитать, а один раз увидеть, поэтому вам в помощь видео «Как
подключить библиотеку…». Когда все вопросы с применением библиотеки (поверьте
там ничего сложного нет) останутся позади то можно будет записать скетч на
плату ардуино и протестировать наш датчик.

https://youtube.com/watch?v=0OebxObAKss

Выводы: несмотря на средние характеристики датчик
температуры и влажности DHT11 вполне можно использовать (хотя бы для того чтобы
просо попробовать поработать с ним, знания никогда лишними не бывают, да и
пригодиться все это при освоении других аналоговых датчиков). А что получилось
у меня, можно посмотреть в видео ниже:

https://youtube.com/watch?v=kyhB_O80TCs

How to Connect an IR Receiver to the Arduino

There are several different types of IR receivers, some are stand-alone, and some are mounted on a breakout board. Check the datasheet for your particular IR receiver since the pins might be arranged differently than the HX1838 IR receiver and remote set I am using here. However, all IR receivers will have three pins: signal, ground, and Vcc.

Lets get started with the hardware connections. The pin layout on most breakout boards looks like this:

The pinout of most stand-alone diodes is like this:

To connect a breakout board mounted IR receiver, hook it up to the Arduino like this:

To connect a stand-alone receiver diode, wire it like this:

Управляем освещением при помощи датчика освещенности

В этом примере наш блок управления светом будет управлять светом автоматически. Поможет ему в этом датчик освещенности, который будет передавать информацию на микроконтроллер о состоянии текущего показателя освещения. Если освещенность очень низкая, то микроконтроллер будет автоматически включать лампочку, подключенную к сети 220 вольт.  Такую систему освещения еще называют адаптивной. Для примера сборки схемы с адаптивным освещением потребуется такое оборудование и ПО:

  • Arduino UNO — одна из разновидностей плат ардуино;
  • Блок реле SRD-12VDC-SL-C;
  • Резистор на 10 кОм;
  • Фоторезистор (выступает в роли датчика освещенности);
  • Arduino IDE — программное обеспечение для загрузки микрокода в микроконтроллер Arduino;
  • Лампочка, подключаемая к сети 220 вольт.

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

Теперь откроем Arduino IDE и внесем в нее такой код:
Этот код не предназначен для включения нашей лампочки. С помощью этого кода мы проверим наш датчик освещенности. Поэтому загрузим этот код в Arduino UNO и откроем «Монитор порта».

В «Мониторе порта» видно, что мы получаем значения с фоторезистора, а это значит, что он нормально функционирует. Теперь пришло время загрузить основной код для автоматического управления светом. Для этого вставьте этот код в Arduino IDE:
Принцип работы этого скетча основан на условном операторе, при котором выполняется условие «s2 < 700». Это условие означает, что при значении датчика меньше 700 лампочка будет включаться, а если значение больше 700, то лампочка отключится. Из примера видно, как легко можно создать адаптивную систему автоматического освещения.

This is a short comparison and may not be complete or correct

I created this comparison matrix for myself in order to choose a small IR lib for my project and to have a quick overview, when to choose which library.
It is dated from 03.02.2021. If you have complains about the data or request for extensions, please send a PM or open a discussion.

Subject IRMP IRLremote IRLib2mostly unmaintained IRremote Minimal NEC
Number of protocols 50 Nec + Panasonic + Hash * 12 + Hash * 17 + Hash * NEC
3.Party libs needed % PinChangeInterrupt if not pin 2 or 3 % % %
Timing method receive Timer2 or interrupt for pin 2 or 3 Interrupt Timer2 or interrupt for pin 2 or 3 Timer2 or interrupt for NEC Interrupt
Timing method send PWM and timing with Timer2 interrupts Timer2 interrupts Timer2 and blocking wait PWM with Timer2 and blocking wait with delayMicroseconds() %
Send pins All All All ? Timer dependent %
Decode method OnTheFly OnTheFly RAM RAM OnTheFly
Encode method OnTheFly OnTheFly OnTheFly OnTheFly or RAM %
Callback suppport x % % % x
Repeat handling Receive + Send (partially) % ? Receive + Send x
LED feedback x % x x x
FLASH usage (simple NEC example with 5 prints) 1820(4300 for 15 main / 8000 for all 40 protocols)(+200 for callback)(+80 for interrupt at pin 2+3) 1270(1400 for pin 2+3) 4830 1770 900
RAM usage 52(73 / 100 for 15 (main) / 40 protocols) 62 334 227 19
Supported platforms avr, megaAVR, attiny, Digispark (Pro), esp8266, ESP32, STM32, SAMD 21, Apollo3(plus arm and pic for non Arduino IDE) avr, esp8266 avr, SAMD 21, SAMD 51 avr, attiny, esp8266, esp32, SAM, SAMD All platforms with attachInterrupt()
Last library update 2/2021 4/2018 9/2019 2/2021 2/2021
Remarks Decodes 40 protocols concurrently.39 Protocols to send.Work in progress. Only one protocol at a time. Consists of 5 libraries. Project containing bugs — 45 issues, no reaction for at least one year. Decoding and sending are easy to extend.Supports Pronto codes. Requires no timer.

* The Hash protocol gives you a hash as code, which may be sufficient to distinguish your keys on the remote, but may not work with some protocols like Mitsubishi

Contributing

If you want to contribute to this project:

  • Report bugs and errors
  • Ask for enhancements
  • Create issues and pull requests
  • Tell other people about this library
  • Contribute new protocols

Check here for some guidelines.

Тестирование основной схемы

Когда у вас будет собранная на макетной плате схема, подключенные к ней Arduino и аудиоколонки со встроенным усилителем, вы сможете запустить тестовую программу, которая приведена в архиве в конце статьи (Si4844_Quick_Test.ino). Эта программа выполняет простой тест, который включает питание устройства, устанавливает диапазон FM (УКВ) и предоставляет информацию о версии микросхемы. Если всё пройдет хорошо, вы сможете настроить частоту радиоприемника, повернув ручку VR1, увидите частоту, динамически отображаемую на экране и, конечно, услышите то, что выдает радиоприемник.

Скриншот экрана с результатами вывода тестовой программы

Если основная схема и ее подключение к Arduino работают, то можно собирать полноценный радиоприемник.

Подключение Arduino

Еще одна вещь, которую надо решить до включения схемы для тестирования, – это взаимодействие с Arduino. Здесь я решил использовать плату Arduino Pro Mini 3В/8МГц. Это небольшая плата Arduino, полностью работающая на напряжении 3,3 В и совместимая с Si4448-A10, что является главным преимуществом. Небольшой размер платы – второе преимущество. Подключение к Si4448-A10 осуществляется по четырем линиям, как описано ниже:

Подключение Arduino к Si4844-A10
Arduino (3.3 В) Si4844-A10
A5/SCL SCLK
A4/SDA SDIO
D2 INT
D12 RST

Кроме того, используется стандартный преобразователь USB/TTL для подключения Arduino к компьютеру для программирования. Таким образом, у Arduino также будут задействованы выводы TX, RX и GND. Так вы сможете программировать и тестировать Si4844-A10 «внутрисхемно», что облегчает разработку и экспериментирование. Когда всё будет завершено, это подключение может быть убрано для автономной работы нового радиоприемника. Питание платы радио и платы Arduino должно осуществляться внешним стабилизированным источником питания на 3,3 В. Не пытайтесь запитывать их от преобразователя USB/TTL, даже если у него есть выходной вывод 3,3 В – нельзя полагаться, что он обеспечит необходимый ток для питания и Arduino, и Si4844-A10.

Чтение кодов кнопок ПДУ

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

Прежде чем мы начнем управлять светодиодами или реле, нам нужно знать коды каждой кнопки ПДУ (или, по крайней мере, тех кнопок которыми мы хотим управлять).

В этом нам поможет пример из библиотеки. Чтобы запустить его, выберите  Файл  >  Примеры  >  IRremote  >  IRrecvDump  и загрузите скетч. Теперь откройте  монитор последовательного порта и по очереди  нажимайте кнопки на пульте дистанционного управления. На мониторе должно появиться что-то вроде этого:

Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров…

Подробнее

Нас интересует шестизначное шестнадцатеричное число. Я пометил образец кода на скриншоте красной рамкой.

Выберем две кнопки на пульте дистанционного управления CH + и CH- и, используя этот метод, определим соответствующие коды:  0xFFE21D (CH +) и  0xFFA25D(CH-). Код кнопки начинается с 0x  — это говорит о том, что это число в шестнадцатеричной системе исчисления. Часто это обозначение используется в листингах программ.

Имея коды кнопок, перейдем к самой программе управления.

#include <IRremote.h>
#define IRRECV 11 // Номер контакта ИК-приемника
#define RELAY 8 // Номер контакта реле

Директива  #include сообщает IDE Arduino, что мы будем использовать библиотеку IRremote. Две последующие директивы (#define) вводят метки IRRECV и RELAY. С этого момента мы можем писать в программном коде  IRRECV и RELAY, в IDE Arduino будет заменять IRRECV  на 11 и RELAY на 8.

Кто-то может задать резонный вопрос: зачем использовать такие метки, если мы можете написать просто числа в программном коде?

А все просто. Наш модуль реле подключен к контакту 8. Если в будущем мы захотим изменить номер контакта для реле, то достаточно будет исправить номер в директиве #define, и нам не придется искать все места, где мы использовали данный номер.

IRrecv irrecv (IRRECV);

В следующей строке мы создаем объект irrecv. Это тип IRrecv (инфракрасный приемник), определенный в библиотеке IRremote. Теперь irrecv становится связующим звеном между нашей программой и кодом, содержащимся в библиотеке IRremote. Этот код знает, как декодировать сообщения, полученные инфракрасным приемником.

void setup() {
irrecv.enableIRIn();
pinMode(RELAY, OUTPUT);
}

Функция setup() подготавливает Arduino к работе. Две строки — первая включает ИК-приемник, вторая настраивает контакт, к которому мы подключили реле, в режим вывода.

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

Когда код из библиотеки IRremote распознает полную последовательность импульсов, он преобразует ее в читаемый вид. Arduino остается сопоставить код кнопки. В нашей программе мы используем следующие функции  readIRCode:

unsigned long readIRCode() {
decode_results results;
unsigned long resultValue = results.value;
irrecv.resume();
return resultValue;
}

decode_results — это тип переменной, определенный библиотекой IRremote. Создаем переменную results, которая через поле value позволяет читать последний считанный код кнопки. Мы сохраняем код во вспомогательной переменной resultValue и вызываем irrecv.resume() заставляя библиотеку IRremote прослушивать последующие импульсы.

Далее код на усмотрение: в основном цикле  у нас будет только структура if, которая проверяет, является ли считанный код кодом одной из кнопок CH+ или CH-, и если да, мы включаем или выключаем модуль реле.

Поскольку единовременно может быть считана только одна кнопка, то в коде будет выполнена только одна из команд в условии if. Если код кнопки не совпадает с CH+ или CH-, никакой код выполняться не будет.