Съдържание:

Инфрачервено дистанционно управление I2C с Arduino: 8 стъпки (със снимки)
Инфрачервено дистанционно управление I2C с Arduino: 8 стъпки (със снимки)

Видео: Инфрачервено дистанционно управление I2C с Arduino: 8 стъпки (със снимки)

Видео: Инфрачервено дистанционно управление I2C с Arduino: 8 стъпки (със снимки)
Видео: Remotely Monitor your Home Energy Consumption | PZEM-004T | RemoteXY IoT Cloud | FLProg 2024, Ноември
Anonim
Инфрачервено дистанционно управление I2C с Arduino
Инфрачервено дистанционно управление I2C с Arduino
Инфрачервено дистанционно управление I2C с Arduino
Инфрачервено дистанционно управление I2C с Arduino

PreambleThis Instructable описва как да създадете универсално дистанционно управление, използвайки I2C за интерфейса.

Колко странно казвате, че използвате I2C подчинено устройство?

Да, I2C подчинено устройство.

Това е така, защото точното време на IR пакетите е доста взискателно и с това типичен Arduino ще се бори, ако вече изпълнява много други задачи едновременно. По -добре е да се разпределя изчислителното натоварване, като се присвояват интензивни времеви дейности на специализирани процесори, когато е възможно (по -добре го направете в хардуер). Като се има предвид, че I2C е добре документиран и стабилен комуникационен метод между интегралните схеми, аз избрах това като интерфейс.

Въведение

Както бе споменато по -горе, тази инструкция описва как да управлявате домакински уреди като телевизор, DVD плейър и сателит и др., Като използвате библиотеката IRremote на Arduino.

Той завършва с пример за проектиране, превръщащ Arduino в I2C подчинен модул за дистанционно управление (снимка 1 по -горе) с прототипна тестова верига (снимка 2 по -горе) и продължава с подробности как да свиете дизайна до необходимите минимални компоненти, за да може да бъде вграден в друг дизайн. В моя случай използвам това вградено устройство в универсално устройство за дистанционно управление на IoT, базирано на ESP8266-12E.

Какви части са ми необходими?

За да изградите схемата, изобразена в Стъпка 1 (IR предавател), ще ви трябват следните части;

  • 2 от 10K резистора
  • 1 от 390R резистор
  • 1 от 33R резистор
  • 1 от 3K8 резистор
  • 1 изключен Червен светодиод
  • 1 изключен IR Led TSAL6400
  • 1 изключен транзистор BC337
  • 1 от 220uF кондензатор
  • 1 от Arduino Uno

За да изградите схемата, изобразена в Стъпка 4 (IR приемник), ще ви трябват следните части;

  • 1 от 10K резистор
  • 1 от TSOP38328
  • 1 от 220uF кондензатор
  • 1 от Arduino Uno

За да изградите схемата, изобразена в Стъпка 5 (Изпитателна верига на подчинен), ще ви трябват следните части;

  • 4 изключени 10K резистора
  • 2 от 390R резистор
  • 1 от 33R резистор
  • 1 от 3K8 резистор
  • 2 изключен Червен светодиод
  • 1 изключен IR Led TSAL6400
  • 1 изключен транзистор BC337
  • 1 от 220uF кондензатор
  • 2 изключени бутони SPST
  • 2 от Arduino Unos

За да изградите схемата, изобразена в Стъпка 6 (Сгъстен дизайн), ще ви трябват следните части;

  • 3 от 10K резистора
  • 1 от 270R резистор
  • 1 от 15R резистор
  • 4 изключени 1K резистора
  • 1 изключен Червен светодиод
  • 1 изключен IR Led TSAL6400 или TSAL5300
  • 1 изключен транзистор BC337
  • 1 изключен електролитичен кондензатор 220uF @ 6.3v
  • 1 off 1000uF кондензатор електролитен @ 6.3v
  • 2 от 0,1uF кондензатори
  • 2 изключени 22pF кондензатора
  • 1 от 16MHz Xtal
  • 1 от ATMega328P-PU

Забележка: Ще ви е необходимо и FTDI устройство за програмиране на ATMega328P

Какви умения са ми необходими?

  • Минимално разбиране на електрониката,
  • Познаване на Arduino и неговата IDE,
  • Малко търпение,
  • Някои познания за I2C биха били полезни (вижте тук за някои общи подробности за I2C/Wire Library).

Обхванати теми

  • Кратък преглед на веригата,
  • Кратък преглед на софтуера,
  • Съдържание на пакети I2C,
  • Придобиване на кодове за дистанционно управление (ui32Data),
  • Как да тествате вашето I2C Slave устройство,
  • Свивайки вашия дизайн,
  • Заключение,
  • Използвани препратки.

Опровержение

Както винаги, вие използвате тези инструкции на свой собствен риск и те не се подкрепят.

Стъпка 1: Кратък преглед на веригата

Кратък преглед на веригата
Кратък преглед на веригата

Целта на веригата е да предава IR кодове за дистанционно управление. Дизайнът му е доста прав и доста прост.

Когато транзистор Q1 е включен BC337 NPN чрез логически от Arduino PWM O/P D3 към резистор R5, токът преминава през Led 1 и 2. Ограничен само от баластни резистори R3 и R4 съответно. Q1 се използва за увеличаване на тока, преминаващ през инфрачервения диод (IF Max = 100mA) до този над този, който Arduino O/P е способен да захранва ~ 40mA @ +5v.

Кондензаторът C1 a 220uF Electrolytic осигурява известна стабилизация, предотвратявайки падането на захранващата шина от мощността, поемана от светодиоди 1 и 2.

Резисторите R1 и R2 са I2C издърпвания.

Стъпка 2: Кратък преглед на софтуера

Кратък преглед на софтуера
Кратък преглед на софтуера
Кратък преглед на софтуера
Кратък преглед на софтуера
Кратък преглед на софтуера
Кратък преглед на софтуера

Преамбюл

За успешно компилиране на този изходен код ще ви е необходима следната допълнителна библиотека;

IRremote.h

  • От: z3t0
  • Предназначение: Инфрачервена отдалечена библиотека за Arduino: изпращане и приемане на инфрачервени сигнали с множество протоколи
  • От:

Преглед на кода

Както е показано на снимка 1 по-горе, при стартиране кодът конфигурира входа/изхода на микроконтролера, след което проучва състоянието на вътрешния софтуерен флаг „bFreshDataFlag“. Когато този флаг е зададен, контролерът потвърждава, че е „Зает“(изпраща нисък пин на данни D4 ниско) и се премества в състояние „eBUSY“, като последователно чете бутоните, натиснати командите, държани в uDataArray и изпращайки IC модулирани данни към IR LED в a последователност на предаване.

След като данните, съхранявани в uDataArray , бъдат напълно изпратени, състоянието „eIDLE“се възобновява и линията „Зает“се отменя (изпращането на пин за данни D4 високо). Устройството вече е готово да получи повече натискания на бутони, отбелязващи края на предаването.

Получаване на данни за натискане на IR бутон

Когато данните се изпращат към дистанционното управление InfraRed чрез I2C, то задейства прекъсване и извикването на функцията receiveEvent () се задейства асинхронно.

След задействане получените I2C данни се записват последователно в буфера „uDataArray ”.

По време на приемането на данни, ако краят на последователността е сигнализиран от главния (bFreshData! = 0x00), се задава 'bFreshDataFlag', като по този начин се сигнализира началото на предаването.

Снимки 2… 3 дават пример за типична последователност от пакети.

Забележка: Пълният изходен код е достъпен тук

Стъпка 3: Съдържание на пакети I2C

Съдържание на пакети I2C
Съдържание на пакети I2C

Форматът на контролния пакет, изпратен на подчиненото устройство по I2C, е даден по -горе на снимка 1, значението на всяко поле е дадено по -долу

Значение на полетата на контролния пакет

байт bEncoding;

  • Кодиране на IR дистанционно управление,

    • RC6 (небе) = 0,
    • SONY = 1,
    • SAMSUNG = 2,
    • NEC = 3,
    • LG = 4

uint32_t ui32Data;

Шестнадесетичното представяне на двоичния IR поток от данни 4 байта данни (без знаци дълги), LSByte … MSByte

байт bNumberOfBitsInTheData;

Брой битове в данните (максимум 32). Обхват = 1… 32

байт bPulseTrainRepeats;

Колко повторения на този импулсен влак. Обхват = 1… 255. Обикновено 2… 4 повторения. Може да искате да разширите това за команди за включване/изключване, тъй като приемното устройство понякога изисква няколко допълнителни импулсни повторения, за да получи сигнал за включване

байт bDelayBetweenPulseTrainRepeats;

Забавяне между повторенията на този импулсен влак. Обхват = 1… 255 mS. Обикновено 22mS… 124mS

байт bButtonRepeats;

Симулира многократно натискане на същия бутон (но не поддържа модифицирания код като дистанционно на Apple, просто повтаря кода на бутона). Диапазон = 1… 256. По подразбиране = 1

uint16_t ui16DelayBetweenButtonRepeats;

Забавяне между повторения на бутони (без знак int). 2 байта общо LSByte … MSByte. Обхват = 1… 65535mS. По подразбиране = 0 ms

байт bFreshData;

  • Свежи данни. Стойност, различна от нула. Записано последно, задейства IR TX последователността. Обхват 0x00… 0xFF

    • Предстоят още контролни пакети = 0
    • Това е окончателният контролен пакет = Ненулева стойност 1, 2,… 255

Обърнете внимание на използването на директивата за компилатор „_packed_“. Това е, за да се гарантира, че данните са пакет байт за байт в паметта, независимо от използваната целева система (Uno, Due, ESP8266 и т.н.). Това означава, че обединението между registerAllocationType и dataArrayType се нуждае само от последователен часовник/такт в байтове от контролен пакет, което прави софтуера TX/RX опростен.

Стъпка 4: Придобиване на кодове за дистанционно управление (ui32Data)

Придобиване на кодове за дистанционно управление (ui32Data)
Придобиване на кодове за дистанционно управление (ui32Data)
Придобиване на кодове за дистанционно управление (ui32Data)
Придобиване на кодове за дистанционно управление (ui32Data)
Придобиване на кодове за дистанционно управление (ui32Data)
Придобиване на кодове за дистанционно управление (ui32Data)
Придобиване на кодове за дистанционно управление (ui32Data)
Придобиване на кодове за дистанционно управление (ui32Data)

Има три начина, по които можете да получите съответния код на ключ за дистанционно управление;

  1. Чрез броене на битове с осцилоскоп,
  2. Потърсете го на уебсайт,
  3. Декодирайте го директно от потока от данни в софтуера.

Чрез преброяване на битове с обхват

Това не е ефективен метод, тъй като отнема доста време и потенциално изисква повече от един опит, но може да бъде много точен. Той е полезен и при визуално валидиране на кодове, получени по методи 2 и 3, също и при определяне на всякакви особености на дистанционното управление. Например, когато задържите бутон на дистанционно управление на Apple IR. Дистанционното първоначално ще издаде командна последователност, след което следва тази с многократно компресирана последователност от 0xF….

Потърсете го на уебсайт

Базата данни с кодове за дистанционно управление на уебсайта за инфрачервено дистанционно управление на Linux е добър източник.

Недостатъкът обаче е, че може да се наложи да опитате няколко кода, докато не намерите този, който работи за вас. Може също да се наложи да интерпретирате някои от представянията на кодовете, за да ги преобразувате в еквивалентната им шестнадесетична форма.

Декодирайте го директно от потока от данни

Използвайки схемата на снимка 1 по -горе, заедно с примера на библиотеката IRremote „IRrecvDumpV2.ino“, е възможно да се декодира потокът от данни директно от дистанционното. Снимка 2 показва декодирано дистанционно управление на телевизора на Samsung за натискане на бутон за включване/изключване в прозореца на терминала на Arduino IDE.

Комбиниран приемник/предавател

Снимки 3 и 4 по -горе изобразяват решение, което позволява едновременно приемане и предаване на IR команда, за да позволи лесно прототипиране.

За декодиране на натискане на бутони за дистанционно управление ще трябва да мигате Arduino с примера „IRrecvDumpV2.ino“, който се доставя с библиотеката IRremote.

Той също така работи еднакво добре за предаване, ако IR командва. Червен светодиод е включен като визуална индикация, че устройството е в действие.

Стъпка 5: Как да тествате вашето I2C подчинено устройство

Как да тествате вашето I2C подчинено устройство
Как да тествате вашето I2C подчинено устройство
Как да тествате своето I2C подчинено устройство
Как да тествате своето I2C подчинено устройство

Използвайки изходния код тук и схемата, описана по -горе на снимка 1, програмирайте „Master“Arduino с „IR_Remote_Sim_Test.ino“и „Slave“Arduino с „IR_Remote_Sim.ino“.

Ако приемем, че имате телевизор Sony Bravia, Sky HD кутия и Sony BT SoundBar, натиснете бутон 1 и вашият телевизор ще премине към BBC1 (канал 101). Натиснете бутон 2 и вашата звукова лента ще заглуши. Натиснете отново и звукът ще се изключи.

По време на изпълнение на последователността на IR предаване LED3 ще светне, показвайки, че подчиненият е зает и LED1 ще трепне в съответствие с процеса на IR предаване.

Разбира се, ако нямате настроена същата система за забавление, както по-горе, можете да препрограмирате подчинения с „IRrecvDumpV2.ino“, да декодирате вашите отдалечени команди, които представляват интерес, след което да ги програмирате в „IR_Remote_Sim_Test.ino“за вашия даден сценарий.

Снимка 2 показва общ преглед на софтуерния тест за системно ниво между Master и Slave.

Стъпка 6: Свиване на вашия дизайн

Свиване на вашия дизайн
Свиване на вашия дизайн

Добре, така че ако приемете, че сте следвали тази инструкция, разчитането на два Arduinos за контрол на домашните ви устройства не е най -ефективното използване на вашия Arduino запас. Следователно, ако изградите схемата, показана на снимката по -горе и следвате инструкциите тук, за да програмирате ATMega328P с 'IR_Remote_Sim.ino', ще можете да намалите цялата система до минималните компоненти. Това ще ви позволи да вградите вашия дизайн в друга система.

Стъпка 7: Заключение

Заключение
Заключение
Заключение
Заключение

Решението е стабилно и работи добре, вградено е в друга система от доста седмици без никакви проблеми.

Избрах Arduino Uno R3, тъй като исках устройство с достатъчно RAM, така че да имам буфер с бутони с разумна дълбочина. Аз се задоволих с размер на буфера от 20 пакета (MAX_SEQUENCES).

Хибридният TX/RX щит, който направих, също беше много полезен при декодиране на дистанционното управление на Sony и Sky. Въпреки че трябва да призная, че използвам цифровия си обхват от време на време, за да проверя софтуерната декодирана IR команда, беше същата като тази, получена от получената IR (TSOP38328).

Единственото нещо, което бих направил по различен начин, би било да използвам верига за задвижване с постоянен ток за инфрачервения светодиод, както е показано по -горе на снимка 2.

Още един момент, който трябва да се отбележи, е, че не всички IR предаватели са модулирани с 38KHz, TSOP38328 е оптимизиран за 38KHz.

Стъпка 8: Използвани справки

IRRemote.h

  • От: z3t0
  • Предназначение: Инфрачервена отдалечена библиотека за Arduino: изпращане и приемане на инфрачервени сигнали с множество протоколи
  • От:

IR дистанционна библиотека

  • z3t0.github.io/Arduino-IRremote/
  • https://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

IR (инфрачервен) сензор на приемника - TSOP38238 (еквивалент)

https://cdn-shop.adafruit.com/datasheets/tsop382.pdf

За да се избегне добавянето на структурата на данните до границите на думите

  • https://github.com/esp8266/Arduino/issues/1825
  • https://github.com/tuanpmt/esp_bridge/blob/master/modules/include/cmd.h#L15
  • https://stackoverflow.com/questions/11770451/what-is-the-meaning-of-attribute-packed-aligned4

Добър източник на инфрачервени дистанционни данни

https://www.sbprojects.com/knowledge/ir/index.php

I2C

  • https://playground.arduino.cc/Main/WireLibraryDetailedReference
  • https://www.arduino.cc/en/Reference/WireSend

IR отдалечена база данни

  • https://www.lirc.org/
  • https://lirc-remotes.sourceforge.net/remotes-table.html

Информационен лист BC337

https://www.onsemi.com/pub/Collateral/BC337-D. PDF

1N4148 Лист с данни

https://www.vishay.com/docs/81857/1n4148.pdf

Препоръчано: