8.12.2014

foto Petr Bravenec

Petr Bravenec
Twitter: @BravenecPetr
+420 777 566 384
petr.bravenec@hobrasoft.cz

Je to s podivem, ale občas někdo zaznamenal, že teploměr, který mám připojený v kanceláři přes Beaglebone na web, přestal fungovat (přečtete si: Busybox v roli http serveru). Do věčných lovišť odešla SD karta (utilitky spojené s teploměrem byly samozřejmě bez záloh), potom jsem potřeboval Beaglebone jinde. Nedávno jsem koupil několik dalších desek BeagleBone, takže se teploměr mohl vrátit na své místo. Oživit utility potřebné pro fungování teploměru bylo podle návodu, který jsem psal dříve, docela jednoduché.

Nově zakoupené desky Beaglebone se od staré desky liší. Původně jsem pracoval s deskami Beaglebone (dnes označované jako Beaglebone White), dnes pracuji s deskami Beaglebone Black. Jaký je mezi nimi rozdíl?

Beaglebone White

  • 256 MB RAM
  • žádná grafická karta
  • žádný flash disk
  • systém běžel pouze z SD karty

Distribuce Angstrom v původním Beaglebone White mi byla naprosto k ničemu - kernel nebyl přeložený s podporou IPv6. Musel jsem si tedy překládat kernel vlastní. Kernel se musel upravovat a překládat i pro připojení vlastních rozšiřujících desek. Na disku se mi tedy válí upravené zdrojáky kernelu přesně na míru mojí aplikaci. Stejně jako jsem překládal kernel, potřeboval jsem pro Beaglebone překládat i celý systém - měl jsem zde nainstalovanou distribuci Gentoo (ani se neptejte, jak se překládají balíky jako glibc).

Jako kritické místo Beaglebone White se mi jeví SD karta. Karty mají silnou tendenci umírat jak na běžícím pásu, aplikace je nutné běhu na SD kartě přizpůsobit (přečtěte si článek Jak nakonfigurovat SD kartu pro embedded systém).

Beaglebone Black

  • 512 MB RAM
  • 4GB flash disk
  • vestavěná grafická karta s výstupem na HDMI
  • vývodově kompatibilní s Beaglebone White
  • deska je výrazně levnější
  • modré LED na desce svítí tak, že nepotřebujete stolní lampu

Výrazně se Beaglebone Black liší v nainstalovaném software. Kernel už má nakonfigurovanou podporu IPv6 a zcela přepracovanou podporu pro rozšiřující desky. Kernel se tedy nemusí překládat ani kvůli podpoře IPv6, ani kvůli podpoře vlastních desek. Na vestavěném flash disku je nainstalovaná distribuce Debian - s tím už se dokážu vyrovnat.

Připojení teploměru

K desce Beaglebone Black se teploměr DS1820 připojuje jinak. Možná to není jednodušší, ale je to mnohem univerzálnější - mohu si zvolit libovolný neobsazený pin, nejsem natvrdo omezený na jeden konkrétní pin, jak tomu bylo u desky Beaglebone White.

Celý teploměr jsem si proto připájel na jeden konektor:

  • DS1820 vývod 1, GND = Beaglebone P9.1, GND
  • DS1820 vývod 2, DQ = Beaglebone P9.12, gpio1_28
  • DS1820 vývod 3, VDD = Beaglebone P9.6, +5V

Soubor DTS - popis použitých pinů

Datový vývod je potřeba systému nějak představit. K tomu slouží soubory dtbo uložené v adresáři /lib/firmware. Soubory dtbo jsou už přeložené, určené pro kernel, ale je možné je snadno programem dtc přeložit zpět na tvar dts (zdrojový tvar). Soubory dts jsou na první pohled poněkud kryptické. Pokud potřebujete vytvořit nový dts soubor pro svou aplikaci, je nejvhodnější sáhnout po nějakém jiném dts souboru a ten upravit. Soubor 'DS1820-00A0.dts' pro můj teploměr vypadá takto:

/dts-v1/;
/plugin/;

/ {
    compatible = "ti,beaglebone", "ti,beaglebone-black";
    part-number = "DS1820";
    version = "00A0";

    exclusive-use = "P9.12";

    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
             ds1820_pins: pinmux_ds1820_pins {
                 pinctrl-single,pins =  <0x78 0x37>;
             };
        };
    };

    fragment@1 {
        target = <&ocp>;
        __overlay__ {
            onewire@0 {
                status          = "okay";
                compatible      = "w1-gpio";
                pinctrl-names   = "default";
                pinctrl-0       = <&ds1820_pins>;
                gpios           = <&gpio2 28 0>;
            };
        };
    };
};

Soubor je potřeba přeložit:

dtc -O dtb -o /lib/firmware/DS1820-00A0.dtbo -b 0 -@ DS1820-00A0.dtc

Po přeložení se řekne správci rozšiřujících desek v kernelu, že má virtuální desku s teploměrem nastavit:

echo DS1820 > /sys/devices/bone_capemgr.*/slots

Je dobré se přesvědčit, že se deska skutečně načetla, vypsat si soubor /sys/devices/bone_capemgr.*/slots

cat /sys/devices/bone_capemgr.*/slots
 0: 54:PF--- 
 1: 55:PF--- 
 2: 56:PF--- 
 3: 57:PF--- 
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
 7: ff:P-O-L Override Board Name,00A0,Override Manuf,DS1820
 8: ff:P-O-L Override Board Name,00A0,Override Manuf,HOBRASOFT-4x232

Další informace můžete najít v souboru /sys/kernel/debug/pinctrl/44e10800.pinmux/pingroups

Pokud se nepodařilo nakonfigurovat desku (příkaz echo DS1820 hlásí chybu), může vám pomoci příkaz dmesg:

bone-capemgr bone_capemgr.9: part_number 'DS1820', version 'N/A'
bone-capemgr bone_capemgr.9: slot #7: generic override
bone-capemgr bone_capemgr.9: bone: Using override eeprom data at slot 7
bone-capemgr bone_capemgr.9: slot #7: 'Override Board Name,00A0,Override Manuf,DS1820'
bone-capemgr bone_capemgr.9: slot #7: Requesting part number/version based 'DS1820-00A0.dtbo
bone-capemgr bone_capemgr.9: slot #7: Requesting firmware 'DS1820-00A0.dtbo' for board-name 'Override Board Name', version '00A0'
bone-capemgr bone_capemgr.9: slot #7: dtbo 'DS1820-00A0.dtbo' loaded; converting to live tree
bone-capemgr bone_capemgr.9: slot #7: #2 overlays

Nalezení teploměru

Teploměr by měl být přístupný v adresáři /sys/bus/w1/devices:

ls /sys/bus/w1/devices/
28-0000027d912e  w1_bus_master1

Upozorňuji, že teploměry se mi nedařilo nalézt, pokud byl Beaglebone napájený z USB. Je vhodné napájet desku z externího pětivoltového zdroje s proudovou zatížitelností alespoň 1 A.

Jakmile je teploměr viditelný, můžete si jeho hodnoty jednoduše vypsat:

cat /sys/bus/w1/devices/28-0000027d912e/w1_slave 
6f 01 4b 46 7f ff 01 10 67 : crc=67 YES
6f 01 4b 46 7f ff 01 10 67 t=22937

Aby systém věděl o teploměru i po restartu, je nutné desku uvést do souboru /etc/default/capemgr:

# Default settings for capemgr. This file is sourced by /bin/sh from
# /etc/init.d/capemgr.sh

# Options to pass to capemgr
CAPE=DS1820

Užitečné odkazy

Obrázky

Hobrasoft s.r.o. | Kontakt