BeagleBone Black で遊ぶ

ビーグルボーン・ブラック(BBB)は、高性能なミニPC基板である。

bbb_image.jpg

Rev.C は、標準で Linux の Debian が基板上のフラッシュメモリへインストールされている。

Raspberry Pi と同様に UNIX を知らない人間が、安さにつられて手を出すと痛い目に会うこと請け合いである。

http://beagleboard.org/

初期設定

すべてrootユーザーでログインして作業する。

タイムゾーン

% dpkg-reconfigure tzdata

電源ぶち切り対応 (Read-only filesystem)

再インストール

SDイメージをダウンロードし、ddコマンド等でmicroSDへ書き込む。

https://beagleboard.org/latest-images

microSDをソケットへ差し込み起動する。

/boot/uEnv.txt を編集して

cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3.sh

を書き加える。

rebootすると、microSDからフラッシュへ書き込む処理が始まる。

Wi-Fi

USBの無線LANドングルを使う。

Debian 9.5 / Linux beaglebone 4.14.71-ti-r80

connmanctl コマンドで設定できる。

% connmanctl
connmanctl> disable wifi
connmanctl> tether wifi off
connmanctl> enable wifi
connmanctl> scan wifi
Scan completed for wifi
connmanctl> services
    SSID    wifi_***_managed_psk
  :
connmanctl> agent on
Agent registered
connmanctl> connect wifi_***_managed_psk
  :
Passphrase?
  :
Connected wifi_***_managed_psk
connmanctl> quit

<古> Debian 8.4 / Linux beaglebone 4.4.9-ti-r25

例:Buffalo WLI-UC-GNM2

/etc/network/interfaces

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
    wpa-ssid "SSID"
    wpa-psk  "PASS"

<古> Debian 8.6 / Linux beaglebone 4.4.30-ti-r64

例:EDIMAX EW-7811UN

コマンドでVendor ID/Device IDを確認する

% lsusb
Bus 001 Device 002: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]

/etc/rc.local

modprobe rtl8192cu
echo "7392 7811" > /sys/bus/usb/drivers/rtl8192cu/new_id
ifdown wlan0
ifup wlan0

/etc/network/interfaces

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="SSPD"
        psk="PASSPHRASE"
        key_mgmt=WPA-PSK
}

LCD

専用の液晶ディスプレイが 4D Systems から販売されており、つなげばすぐ使える。

タッチパネルも動作する。

http://www.4dsystems.com.au/products

bbb_lcd01.jpg bbb_lcd02.jpg

うまく表示されない場合 /boot/uEnv.txt を編集し、次の行を有効化する。

dtb=am335x-boneblack-emmc-overlay.dtb

コンソールの変更

そのままでは不要なGUIデスクトップが起動してしまうので、まずこれをOFFにしてコマンドライン(シェル、CUI)だけにする。

UNIXでリモートデスクトップも意味わからん。 X Client で display を指定すればよい。

% systemctl set-default multi-user.target

テキストモードへその場で切り替える (runlevel 3)

% systemctl isolate multi-user.target

グラフィカルモードへその場で切り替える (runlevel 5)

% systemctl isolate graphical.target

シリアルコンソール

基板上のピンヘッダに FTDI TTL-232R-3V3 を接続すると、シリアルコンソールとして使える。

115200bps

X11

Xサーバをlistenするようにする。

起動オプションに -nolisten tcp がないことを確認

/etc/lightdm/lightdm.conf

xserver-allow-tcp=true

~debian/.xsessionrc

xhost +

Xサーバへコンソールからアプリケーションを飛ばす

% xeyes -display localhost:0.0 &

または

% export DISPLAY=localhost:0.0
% xeyes &

I/O

I/OはUNIXらしくデバイスドライバによりデバイスファイル化されており、これをオープンしたり読み書きすることにより制御できる。

もちろん root 権限で作業するか、setuid の立ったプロセスにしておく。

LEDチカチカ

基板上のLEDのデバイスファイルは /sys/class/leds/beaglebone:green:usr[0-4] がそれにあたる。

コマンドラインであれば下記のようなコマンドで点灯/消灯させることができる。

% echo 1 > /sys/class/leds/beaglebone:green:usr0/brightness
% echo 0 > /sys/class/leds/beaglebone:green:usr0/brightness

C言語であれば fopen の追記モードで開き、”1” (High) または “0” (Low) を出力する。
ソースコードは以下。

#include <stdio.h>

#define LED0_PATH "/sys/class/leds/beaglebone:green:usr0"

int main () {
    int i;
    FILE *fp;

    printf("Hello World\n");

    fp = fopen(LED0_PATH "/brightness", "r+");
    if (fp) {
        for (i = 0; i < 10; i ++) {
            fprintf(fp, "1");
            fflush(fp);
            usleep(500000);
            fprintf(fp, "0");
            fflush(fp);
            usleep(500000);
        }
        fclose(fp);
    }
}

※ バッファリングされてしまうので、毎回 fflush() していることに注意する。

GPIO

ソケットに出ている端子をコントロールするには、まず /sys/class/gpio/export へ使いたいピン番号を出力する。
すると /sys/class/gpio/gpio番号 というデバイスファイルの入ったフォルダができる。
そこで /sys/class/gpio/gpio番号/value を入出力することによりコントロールできる。
入力・出力の切り替えは /sys/class/gpio/gpio番号/direction へ “in” または “out” を出力すればよい。
使い終わったら /sys/class/gpio/unexport ピン番号を出力すると消える。

% echo 60 > /sys/class/gpio/export
% cat /sys/class/gpio/gpio60/value
0
% echo out > /sys/class/gpio/gpio60/direction
% echo 1 > /sys/class/gpio/gpio60/value
% echo 0 > /sys/class/gpio/gpio60/value

% echo 60 > /sys/class/gpio/unexport

C言語でのサンプルプログラム。

#include <stdio.h>

#define GPIO_PATH "/sys/class/gpio"
#define GPIO_NUM "60" // GPIO1_28 or pin 12 on the P9 header

int main () {
    int i;
    FILE *fp;

    printf("Hello World\n");

    fp = fopen(GPIO_PATH "/export", "a");
    if (fp) {
        fprintf(fp, GPIO_NUM);
        fclose(fp);
    }

    fp = fopen(GPIO_PATH "/gpio" GPIO_NUM "/direction", "r+");
    if (fp) {
        fprintf(fp, "out");
        fclose(fp);
    }

    fp = fopen(GPIO_PATH "/gpio" GPIO_NUM "/value", "r+");
    if (fp) {
        for (i = 0; i < 10; i ++) {
            fprintf(fp, "1");
            fflush(fp);
            usleep(500000);
            fprintf(fp, "0");
            fflush(fp);
            usleep(500000);
        }
        fclose(fp);
    }

    fp = fopen(GPIO_PATH "/unexport", "a");
    if (fp) {
        fprintf(fp, GPIO_NUM);
        fclose(fp);
    }
}

※ それぞれファイルのオープンモードに注意が必要。

ライブラリ

メモ

昔から Linux ではデバイスドライバを経由せず、直接ハードウェアにアクセスする方法が用意されている。

#include <asm/io.h>

iopl(3);  または
ioperm(port, num, 1);

FreeBSD では /dev/io をオープンしていれば、そのプロセスには特権が与えられる。

#include <machine/cpufunc.h>

fd = open("/dev/io", 000);

outb(val, port);  // outw(), outl()
inb(port);  // inw(), inl()

よくプリンタポートを使って入出力したもんです。
最近なら /dev/ppi0 を開いて ioctl() をコールしたほうがよい。

シリアル(UART)

I2C

i2cget [-f] [-y] i2cbus chip-address [data-address [mode]]
i2cset [-f] [-y] [-m mask] [-r] i2cbus chip-address data-address [value] ...  [mode]

-f オプションは、カーネルの管理によるbusyを無視します。

-y オプションは、対話モードを無効にします。

chip-address は、7bit (LSB justified) のアドレスです。

バッテリー

リチウムイオン(リチウムポリマー)電池を接続する端子が用意されている。

LCDもバッテリーで駆動される。

ASCII���{"DeviceAngle":-0.2982809}

http://www.beaglebone-asterisk.org/uninterruptible-power-supply-ups-for-beaglebone-black-a-diy-project/

http://mitaka1954.cocolog-nifty.com/blog/2014/12/beaglebone-blac.html

http://ameblo.jp/y4h25i46/theme-10075901238.html

homebridge

インストール

% apt-get update
% apt-get install libavahi-compat-libdnssd-dev

% npm cache clean
% npm install -g n
% n 5.12.0
% npm install -g homebridge
% npm install -g homebridge-dummy
% npm install -g homebridge-cmd

~/.homebridge/config.json

{
    "bridge": {
        "name": "My home",
        "username": "AA:BB:CC:DD:EE:FF",
        "port": 51826,
        "pin": "012-34-567"
    },

    "description": "My home bridge",

    "accessories": [
        {
            "accessory": "DummySwitch",
            "name": "コーヒーメーカー"
        },
        {
            "accessory": "CMD",
            "name": "電気",
            "on_cmd": "/home/homekit/on.sh",
            "off_cmd": "/home/homekit/off.sh"
        }
    ]
}
文書の先頭へ
bbb.txt · 最終更新: 2018/12/06 12:27 by sugakoubou