Ha az autódban ülsz és be akarsz jutni a garázsodba, tudom, hogy nem divatos, de a leg kényelmesebb eszköz a kulcskarikádon lógó kicsi távirányító (valami az autoba integrált cucc jobb és divatosabb lenne, talán csinálok valami ilyesmit később).
Ahhoz, hogy távirányítani tudjam az OpenHAB-ot és rajta keresztül a garázskaput/világítást, vettem egy ilyen ugrókódos távirányítót az aliexpressen:
http://www.aliexpress.com/item/RF-Rolling-Code-Decoding-Receiver-Module-2-Transmitters-DC-5V-4CH-TTL-Output-Learning-Momentary-Toggle/32295201884.html
A tervem az, hogy a garázsvilágítás, a garázskapu és még néhány (miután két gombja marad, pontosan kettő) dolog távirányítására használom.
Először is felraktam egy breadboard-ra, bekapcsoltam, hogy kipróbáljam, működik-e.
Az első próbálkozásra tökéletesen működött, kitalálni, melyik csatorna melyik gombhoz tartozik, gyerekjáték volt.
Az egyetlen probléma a cuccal, hogy 5V-os logikai kimenetei vannak, én a BeagleBone Green-hez akarom kötni, aminek a GPIO portjai nem tolerálják az 5V-ot.
Úgy döntöttem, hogy a világ legyegyszerűbb szintillesztőjét fogom használni hozzá. Egy ellenállásosztót. Egy 39K-s és egy 68K-s ellenállás megoldoja a kérdést, multiméteren mérve.
A következő rész, a BeagleBone GPIO felkonfigurálása. Az OpenHAB a Linux GPIO Sysfs interfészt használja, ami nagyon egyszerű (https://www.kernel.org/doc/Documentation/gpio/sysfs.txt).
Először megpróbáltam adatot olvasni parancssorból. A vevő egy csatornáját rákötöttem a BBG 60-as GPIO (P9, 12-es érintkező) portra.
A konzolon a következő parancsokat szükséges kiadni:
echo '60' > /sys/class/gpio/export
echo 'in' > /sys/class/gpio/gpio60/direction
Ezek után az érték, ezzel a paranccsal olvasható:
Ezek után az érték, ezzel a paranccsal olvasható:
cat /sys/class/gpio/gpio60/value
A parancsok jól működtek, de akár megnyomtam a gombot akár nem, mindíg 1-est kaptam vissza.
Megmérve a bemenetet, 1.6V-ot kaptam akkor is amikor a vevő kimenetén 0V volt. Ez azt jelenti, hogy a BBG bemenet tápra van húzva.
Ebből adódóan két lehetőségem maradt:
1. Kikapcsolom a felhúzó ellenállást valahogy
2. Az ellenállások helyett valami aktív szintillesztőt használok.
Az elsőt választottam.
Körülnézve tisztán kiderült, hogy a felhúzó ellenállás vezérlése nem része a Linux GPIO csomagnak. Sokat olvasva kiderült, hogy a BBG Cape Manager Overlay-eket használ ennek megoldására. Ez a múltban (korábbi kernel verziók) hol volt, hol nem volt. A 4.1.x-esre amit én használok, viszont már része a mainline kernelnek.
Itt van némi olvasnivaló:
https://github.com/jadonk/validation-scripts/blob/master/test-capemgr/README.md
http://www.thing-printer.com/cape-manager-is-back-baby/
http://www.valvers.com/embedded-linux/beaglebone-black/step04-gpio/
Az overlay repository (tanulhatsz belőle, de nem szükséeges ennek a feladatnak a megoldásához):
https://github.com/RobertCNelson/bb.org-overlays
A leghasználhatóbb dolog amit találtam ez a tool volt:
http://kilobaser.com/blog/2014-07-28-beaglebone-black-devicetreeoverlay-generator
Ez képes a szükséges overlayt előűllítani.
Tehát a 60-as GPIO felhúzóellenállásának a kikapcsolásához a következőkre van szükség::
1. Mentsük el a következő fájlt a /lib/firmware könyvtárba bspm_p9_12_2f-00A0.dts néven:
A parancsok jól működtek, de akár megnyomtam a gombot akár nem, mindíg 1-est kaptam vissza.
Megmérve a bemenetet, 1.6V-ot kaptam akkor is amikor a vevő kimenetén 0V volt. Ez azt jelenti, hogy a BBG bemenet tápra van húzva.
Ebből adódóan két lehetőségem maradt:
1. Kikapcsolom a felhúzó ellenállást valahogy
2. Az ellenállások helyett valami aktív szintillesztőt használok.
Az elsőt választottam.
Körülnézve tisztán kiderült, hogy a felhúzó ellenállás vezérlése nem része a Linux GPIO csomagnak. Sokat olvasva kiderült, hogy a BBG Cape Manager Overlay-eket használ ennek megoldására. Ez a múltban (korábbi kernel verziók) hol volt, hol nem volt. A 4.1.x-esre amit én használok, viszont már része a mainline kernelnek.
Itt van némi olvasnivaló:
https://github.com/jadonk/validation-scripts/blob/master/test-capemgr/README.md
http://www.thing-printer.com/cape-manager-is-back-baby/
http://www.valvers.com/embedded-linux/beaglebone-black/step04-gpio/
Az overlay repository (tanulhatsz belőle, de nem szükséeges ennek a feladatnak a megoldásához):
https://github.com/RobertCNelson/bb.org-overlays
A leghasználhatóbb dolog amit találtam ez a tool volt:
http://kilobaser.com/blog/2014-07-28-beaglebone-black-devicetreeoverlay-generator
Ez képes a szükséges overlayt előűllítani.
Tehát a 60-as GPIO felhúzóellenállásának a kikapcsolásához a következőkre van szükség::
1. Mentsük el a következő fájlt a /lib/firmware könyvtárba bspm_p9_12_2f-00A0.dts néven:
/*
* This is a template-generated file from BoneScript
*/
/dts-v1/;
/plugin/;
/{
compatible = "ti,beaglebone", "ti,beaglebone-black";
part_number = "BS_PINMODE_P9_12_0x2f";
exclusive-use =
"P9.12",
"gpio1_28";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
bs_pinmode_P9_12_0x2f: pinmux_bs_pinmode_P9_12_0x2f {
pinctrl-single,pins = <0x078 0x2f>;
};
};
};
fragment@1 {
target = <&ocp>;
__overlay__ {
bs_pinmode_P9_12_0x2f_pinmux {
compatible = "bone-pinmux-helper";
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bs_pinmode_P9_12_0x2f>;
};
};
};
};
2. Fordítsuk le:
dtc -O dtb -o /lib/firmware/bspm_P9_12_2f-00A0.dtbo -b 0 -@ /lib/firmware/bspm_P9_12_2f-00A0.dts
3. Töltsük be:
echo bspm_P9_12_2f > /sys/devices/platform/bone_capemgr/slots
Ezután a felhúzóellenállás megszűnt létezni. A távirányító státusza olvasható lett.
Rendben, ez most működik egy csatornára, de mi van néggyel? Tudok négy overlay-t generálni, de hogyan kombinálom egy fájlba? Elég kevés infót találtam, mindaddig amíg rá nem akadtam erre az Adafruit dokumentációra:
https://learn.adafruit.com/introduction-to-the-beaglebone-black-device-tree/device-tree-overlays
A doksi alapján sikeresen kombináltam a négy generált overlay-t. Végülis a P8 7-10 lábait használtam.
Az overlay (suf_keeloq-00A0.dts):
/*
* SUF - 4-Channel Keyloq receiver cape
*/
/dts-v1/;
/plugin/;
/{
compatible = "ti,beaglebone", "ti,beaglebone-black";
part_number = "SUF-KEELOQ";
exclusive-use =
"P8.7",
"P8.8",
"P8.9",
"P8.10",
"mmc1_sdcd",
"gpio2_3",
"gpio2_5",
"gpio2_4";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
suf_keeloq_pins: pinmux_suf_keeloq_pins {
pinctrl-single,pins = <
0x090 0x2f
0x094 0x2f
0x09c 0x2f
0x098 0x2f
>;
};
};
};
fragment@1 {
target = <&ocp>;
__overlay__ {
suf_keeloq_pinmux {
compatible = "bone-pinmux-helper";
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&suf_keeloq_pins>;
};
};
};
};
fordítás és betöltés:
dtc -O dtb -o /lib/firmware/suf_keeloq-00A0.dtbo -b 0 -@ /lib/firmware/suf_keeloq-00A0.dts
echo suf_keeloq > /sys/devices/platform/bone_capemgr/slots
Ez már működik, csak jó lenne valahogy boot időben betölteni.
Ahhoz, hogy ezt elérjük, hozzá kell adnunk a /boot/uEnv.txt fájlhoz:
cape_enable=bone_capemgr.enable_partno=suf_keeloq
Következik: Integráció az OpenHAB-bal