Задачата на Pi номер 2 е да управлява разни нещица, като TV, климатик, лампи и т.н. и тъй като всички те работят с IR дистанционни, то решението се нарича LIRC - Linux Infrared Remote Control.
Инсталацията на LIRC в Raspbian Wheezy е абсолютно тривиална:
apt-get install lirc
В /etc/modules добавяте:
lirc_dev
lirc_rpi gpio_in_pin=17 gpio_out_pin=22
gpio_in_pin и gpio_out_pin са всъщност номерата на GPIO портовете, а не pin-овете на конектора! Можете да ползвате произволни, но поне за rev2 на Pi не ползвайте 27, защото lirc_rpi не познава този номер а номера от rev1, който е 21 и съответно реве.
Хардуера също не е нещо особено. Схемата, компонентите и всичко необходимо можете да намерите тук:
http://alexba.in/blog/2013/06/08/open-source-universal-remote-parts-and-pictures/ Общо взето трябват ви един NPN транзистор, два IR светодиода (може и един, но трябва да добавите съпротивление на мястото на другия, пък и ако имате два можете да ги насочите в различни посоки), един резистор 10K и един IR приемник. Общата сума е сигурно под 10 лева.
Лично аз ползвам за транзистор P2N2222AG, IR светодиодите ми са L-53F3BT а IR приемника ми е TSOP32338SS1V, който бях поръчал по погрешка. По параметри е сходен с TSOP38238, но са разменени краката на захранването и масата.
Как изглежда творението:
Има малко компоненти в повече, но за това ще пиша някой друг път.
Наложи ми се да презапоявам всичко, защото пробната платка имаше слети писти по края си ... не ме питайте защото са изобщо там, но пък правеха много хубаво късо :) В крайна сметка всичко тръгна и нямаше нито един изгорял компонент, нито пък изгорял GPIО порт на Pi-to!
В заглавието пише екстри. Причината е, че нормалните дистанционни могат лесно да бъдат "записани" от LIRC. Това става с командата:
irrecord -d /dev/lirc0 --disable-namespace
disable-namespace ще ви даде свобода да си именувате копчетата, както на вас ви харесва, а не според някакви стандарти.
И така стигаме до екстрите. Опита да се "научи" LIRC да си говори с дистанционното на климатика ми Daikin се оказаха не толкова успешни.
Причината за това е, че дистанционното не праща просто една команда, както правят например дистанционните на телевизорите, а изпраща цялата информация - температура, настройка на вентилатор, режим та даже и таймерите!
Това означава, че всеки път когато се натисне клавиш от дистанционното на климатика се изготвя код, който съдържа цялата нужна информация и се изпраща. А това пък означава, че ако решите да "записвате" командите ще имате доста на брой комбинации, което пък си е жива хамалогия.
За разкодирането и самия код, който говори климатика ще пиша друг път.
Сега проблема беше, че по някакъв начин трябваше да накарам LIRC да праща код, който аз външно ще генерирам.
Решението се нарича patch за LIRC за да може да изпраща CCF сигнали -
http://www.harctoolbox.org/lirc_ccf.html Въпросният patch добавя SEND_CCF_ONCE към irsend. По този начин можете да пращате какъвто искате код с една проста команда.
irsend SEND_CCF_ONCE 0000 006C 0022 0002 015B 00AD 0016 0016 0016 0041 0016 0016 0016 0041 0016 ...
До тук добре ще си кажете, но как да patch-нем lirc-а от Rasbian Wheezy, така че да не се занимаваме с теглене на изходен код, търсене на същите опции с които е компилиран т.н. Ето как:
Добавяте в /etc/apt/sources.list следното:
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
След това правим:
apt-get update
apt-get upgrade
След това е време за същинската част:
apt-get -b source lirc
Изчаквате, докато започне компилацията и натискате Ctrl C за да я спрете. Спокойно ... все пак трябва да patch-нем LIRC нали?
И така теглим patch-a:
wget http://www.harctoolbox.org/downloads/ccf_patch_lirc-0.9.0.diff
Тук някъде аз трябваше да редактирам patch-a, защото се оказа, че буфера, който е заложен е малък за командата, която пращам към климатика. Две са промените - на ред 164 има:
#define PACKET_SIZE 1000
Просто го смених на 5000, защото не ми се смяташе колкото точно ще ми трябва.
Втората промяна е на ред 193
#define PACKET_SIZE 1024
Отново го направих на 5000.
Patch-ваме
cd lirc-0.9.0~pre1 (или версията, която имате)
patch -p1 <../ccf_patch_lirc-0.9.0.diff
cd ..
Сега повтаряме:
apt-get -b source lirc
След известно време компилацията ще приключи и е време да инсталирате двата готови пакета.
dpkg -i lirc_0.9.0~pre1-1_armhf.deb liblircclient0_0.9.0~pre1-1_armhf.deb
Това е :) Стартирате LIRC и сте вие ...
След тази операция поне при мен apt настояваше да си слага бинарната версия при всеки upgrade. Затова създавате файл lirc в /etc/apt/preferences.d със следното съдържание:
Package: lirc
Pin: release n=precise
Pin-Priority: -1
След това apt-get upgrade спря да настоява да сменя пакета :)
Май това е за сега ...
напиши нов коментар
I want to use use your Daikin solution, but I have a problem with the Lirc patch. I have followed your steps, but when i use the irsend SEND_CCF_ONCE 0000 0022 0002 ... I get the following error message:
irsend: command failed: SEND_CCF_ONCE 0000 0022
irsend: Can only handle CCF codes of type 0000.
Can you please help me?
best regards
MiKe