セルフ開発環境構築
この文書では、OpenBlocks IoT BX1で開発をする場合に、参考になる事柄を説明します。
IoT BX1のOSはDebian(アーキテクチャはx86)です。 同じアーキテクチャの、高性能な別のホストで開発して、その成果一式をIoT BX1にコピーするのが一般的です。 しかし、あまり大規模でなければ、IoT BX1上でセルフ開発する利便性が勝りますので、この文書が役立つでしょう。
PCへの接続
PCへの接続
IoT BX1本体にUSBケーブルを接続し、PCのUSBポートに挿入します。 Windowsに、USBシリアル変換アダプタのドライバがインストールされます。
端末エミュレータ
Windowsで端末エミュレータソフトウェアを起動して、シリアル接続します。 端末エミュレータの設定は、以下の通りです。
項目 | 値 |
ボー・レート | 115200 |
データ | 8bit |
パリティ | none |
ストップ | 1bit |
フロー制御 | none |
ログイン
rootでログインします。
項目 | 値 |
ユーザ | root |
パスワード | root |
低消費電力設定
USBシリアルの電源を自動制御か常にONに設定にします。 自動制御に設定すると、低消費電力に移行します。 Linux無負荷時、約60mAから約35mAに低下します。 低消費電力時には、シリアルコンソールからのキー入力の最初の1打目を取りこぼします。 再入力してください。 シリアルコンソールでの作業中は、常にONに設定しておくのがよいでしょう。
自動制御
# echo auto > /sys/devices/pci0000:00/0000:00:04.3/power/control
常にON
# echo on > /sys/devices/pci0000:00/0000:00:04.3/power/control
時刻設定
年月日または時刻が合っていない場合、次のコマンド
# date MMDDhhmmCCYY
を実行して、時刻を合せてください。
項目 | 値 |
MM | 月(01-12) |
DD | 日(1-31) |
hh | 時(00-23) |
mm | 分(00-59) |
CC | 20(西暦年上二桁、省略可能) |
YY | 西暦年下二桁 |
RAMディスクモードとストレージ併用モード
IoT BX1の起動には、ふたつのモードがあります。 ひとつは、ストレージを使わないRAMディスクモード、もうひとつは、ストレージを使うストレージ併用モードです。
RAMディスクモード
工場出荷時は、RAMディスクモードで起動しています。 小規模の開発ならば、RAMディスクモードですませられます。 ファイルシステムの容量が足りない場合には、ストレージモードで起動してください。
# df
Filesystem 1K-blocks Used Available Use% Mounted on rootfs 178488 152218 17054 90% / /dev/root 178488 152218 17054 90% / devtmpfs 459656 0 459656 0% /dev tmpfs 98544 216 98328 1% /run tmpfs 5120 0 5120 0% /run/lock tmpfs 197080 0 197080 0% /run/shm tmpfs 393216 296 392920 1% /.rw aufs 393216 296 392920 1% /etc aufs 393216 296 392920 1% /bin aufs 393216 296 392920 1% /home aufs 393216 296 392920 1% /lib aufs 393216 296 392920 1% /sbin aufs 393216 296 392920 1% /usr aufs 393216 296 392920 1% /var aufs 393216 296 392920 1% /root aufs 393216 296 392920 1% /opt aufs 393216 296 392920 1% /srv aufs 393216 296 392920 1% /media /dev/mmcblk0p5 1003 19 913 3% /factory
RAMディスクモードでファイルシステムを変更した場合、保存しないで再起動すると、変更した内容を失います。 変更を保存するには、次のコマンド
# flashcfg -S
を実行します。
保存した変更を削除するには、次のコマンド
# flashcfg -e
を実行します。
ストレージ併用モード
ストレージ併用モードで起動するには、以下のコマンド
# e2label /dev/mmcblk0p10 DEBIAN # reboot
を実行します。
# df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 178488 152203 17069 90% / /dev/root 178488 152203 17069 90% / devtmpfs 459656 0 459656 0% /dev tmpfs 98544 216 98328 1% /run tmpfs 5120 0 5120 0% /run/lock tmpfs 197080 0 197080 0% /run/shm /dev/mmcblk0p10 2337308 4148 2316776 1% /.rw aufs 2337308 4148 2316776 1% /etc aufs 2337308 4148 2316776 1% /bin aufs 2337308 4148 2316776 1% /home aufs 2337308 4148 2316776 1% /lib aufs 2337308 4148 2316776 1% /sbin aufs 2337308 4148 2316776 1% /usr aufs 2337308 4148 2316776 1% /var aufs 2337308 4148 2316776 1% /root aufs 2337308 4148 2316776 1% /opt aufs 2337308 4148 2316776 1% /srv aufs 2337308 4148 2316776 1% /media /dev/mmcblk0p5 1003 19 913 3% /factory
RAMディスクモードに変更するには、以下のコマンド
# e2label /dev/mmcblk0p10 "" # e2label /dev/mmcblk0p10 # reboot
を実行します。
ストレージの初期化
ストレージ併用モードで使用したストレージの初期化は、以下の手順で実行します。
RAMディスクモードで起動し、ストレージをマウントします。
# mount /dev/mmcblk0p10 /mnt/
ストレージに残っているディレクトリを、lost+foundとrootディレクトリを除いて、削除します。
# cd /mnt/ # ls bin etc home lib lost+found media opt root sbin srv usr var # rm -fr bin/ etc/ home/ lib/ media/ opt/ sbin/ srv/ usr/ var/
ストレージをアンマウントします。
# cd / # umount /mnt/
参考
工場出荷時のストレージのrootディレクトリには、以下のファイルが存在します。
.ash_history crashlog_00001 otp.bin
無線LANの設定
無線LANの設定をします。
項目 | 値 |
SSID | SSID |
パスフレーズ | パスフレーズ |
SSIDのパスフレーズの暗号化
wpa_passphraseコマンドで、SSIDのパスフレーズを暗号化します。
# wpa_passphrase SSID パスフレーズ network={ ssid="SSID" #psk="パスフレーズ" psk=暗号化されたパスフレーズ }
インタフェースの設定
ファイル/etc/network/interfacesに以下の行を追記します。
auto wlan0 iface wlan0 inet dhcp wpa-ssid SSID wpa-psk 暗号化されたパスフレーズ wpa-ap-scan 1 wpa-key_mgmt WPA-PSK wpa-proto WPA RSN wpa-pairwise CCMP TKIP wpa-group CCMP TKIP
参考ページ
HOWTO: Wireless Security - WPA1, WPA2, LEAP, etc.
インタフェースのup
インタフェースwlan0をupします。
# ifup wlan0 # ifconfig wlan0 wlan0 Link encap:Ethernet HWaddr fc:c2:de:XX:XX:XX inet addr:192.168.10.84 Bcast:192.168.10.255 Mask:255.255.255.0 inet6 addr: YYYY:YYYY:YYYY:YYYY:fec2:deff:feXX:XXXX/64 Scope:Global inet6 addr: fe80::fec2:deff:feXX:XXXX/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:50750 errors:0 dropped:0 overruns:0 frame:0 TX packets:24470 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:73133239 (69.7 MiB) TX bytes:1656666 (1.5 MiB)
設定の保存
設定を保存するために、次のコマンド
# flashcfg -S
を実行します。
注意
再起動する前に、一度実行すればよいです。 また、ストレージ併用モードでは、不要です。
NTPの設定
パッケージntpdateとntpをインストールするために、以下のコマンド
# apt-get update # apt-get install ntpdate ntp # apt-get clean
を実行します。
NTPサーバと時刻を同期させるため、次のコマンド
# ntpdate -u NTPサーバ名
を実行します。
ファイルシステムの変更を保存
ファイルシステムの変更を保存するために、次のコマンド
# flashcfg -S
を実行します。
注意
再起動する前に、一度実行すればよいです。 また、ストレージ併用モードでは、不要です。
セルフ開発環境
gccやmakeコマンドを含むパッケージbuild-essentialをインストールするために、以下のコマンド
# apt-get update # apt-get install build-essential # apt-get clean
を実行します。
ファイルシステムの変更を保存
ファイルシステムの変更を保存するために、次のコマンド
# flashcfg -S
を実行します。
注意
再起動する前に、一度実行すればよいです。 また、ストレージ併用モードでは、不要です。
helloのコンパイル
上で用意したセルフ開発環境を使う例として、helloのコンパイルとインストールをしてみます。
# wget http://ftp.gnu.org/gnu/hello/hello-2.9.tar.gz # tar zxpvf hello-2.9.tar.gz # mkdir build # cd build/ # ../hello-2.9/configure # make # ./src/hello Hello, world!
ディレクトリ/var/tmp/への仮インストールします。
# make install DESTDIR=/var/tmp/
ディレクトリ/var/tmp/に仮インストールしたファイルをアーカイブファイルに格納して、他のIoT BX1にコピーして、利用することができます。
LEDの点滅の仕方の変更
LEDの点滅は、runledデーモンで制御しています。 設定ファイル/tmp/.runledを変更すれば、点滅の仕方を変更することができます。
設定ファイル
/tmp/.runled
注意
設定ファイルを変更すると、すぐに反映されます。
書式
設定ファイル/tmp/.runledの書式は、以下の通りです。
行 | 値 | 意味 |
1 | 1以上の整数 | 点灯時間(ms) |
2 | 0以上の整数 | 消灯時間(ms) |
3 | 0,1,...,7 | 色 |
値 | 色 |
0 | 黒 |
1 | 赤 |
2 | 緑 |
3 | 黄 |
4 | 青 |
5 | マゼンタ |
6 | シアン |
7 | 白 |
例
マゼンタを1秒間隔で点滅させる
# echo -e "1000\n1000\n5" > /tmp/.runled
白を点灯し続ける
# echo -e "5000\n0\n7" > /tmp/.runled
LEDの操作
LEDはrunledデーモンで制御されています。 ここでは、runledデーモンを停止して、手動でGPIOを操作して、LEDを明滅してみます。
runledデーモンの停止
runledデーモンを停止するには、次のコマンドを実行します。
# /etc/init.d/runled stop
起動するには、次のコマンドを実行します。
# /etc/init.d/runled start
GPIOとLED
GPIOの番号とLEDの割り当ては以下の通りです。
番号 | RGB | 色 |
47 | R | 赤 |
48 | G | 緑 |
49 | B | 青 |
例
runledデーモンが起動していたため、LEDは操作できるようになっています。 以下では、操作できないようになっているものと仮定します。 それは、操作の可否をいかに実行するかを示すためです。
ディレクトリ/sys/class/gpio/に移動します。
# cd /sys/class/gpio/
lsコマンドを実行します。
# ls export gpio125 gpio127 gpio129 gpio131 gpio133 gpiochip0 gpio124 gpio126 gpio128 gpio130 gpio132 gpio134 unexport シンボリックリンクgpio47, gpio48, gpio49は、存在しません。
LEDのB(GPIO #49)を操作できるようにします。
# echo 49 >export # ls export gpio125 gpio127 gpio129 gpio131 gpio133 gpio49 unexport gpio124 gpio126 gpio128 gpio130 gpio132 gpio134 gpiochip0 シンボリックリンクgpio49が作成されました。
点灯してみます。
# ls active_low device direction edge power subsystem uevent value # echo out >direction # echo 1 >value
消灯します。
# echo 0 >value
LEDのB(GPIO #49)を操作できないようにします。
# cd .. # echo 49 >unexport # ls export gpio125 gpio127 gpio129 gpio131 gpio133 gpiochip0 gpio124 gpio126 gpio128 gpio130 gpio132 gpio134 unexport シンボリックリンクgpio49が削除されました。
8色
色を混ぜれば、8色を表現できます。 下記の表は、GPIOの番号(RGB)と変数valueの値との組合せで、どんな色が光るかを表します。
49(B) | 48(G) | 47(R) | 色 |
0 | 0 | 0 | 黒 |
0 | 0 | 1 | 赤 |
0 | 1 | 0 | 緑 |
0 | 1 | 1 | 黄 |
1 | 0 | 0 | 青 |
1 | 0 | 1 | マゼンタ |
1 | 1 | 0 | シアン |
1 | 1 | 1 | 白 |
参考文書
BT
BTの有効化
BTを有効にするために、以下のコマンドを実行します。
# bluetooth_rfkill_event & [1] 2189 1417470850.095051: idx 2 type 2 op 0 soft 1 hard 0 # rfkill unblock bluetooth 1417470864.473356: idx 2 type 2 op 2 soft 0 hard 0 # execute brcm_patchram_plus --use_baudrate_for_download --no2bytes --enable_fork --enable_lpm --enable_hci --baudrate 3000000 --patchram /etc/firmware/bcm43341.hcd --bd_addr 98:4F:EE:02:EA:07 /dev/ttyMFD0 Done setting line discipline 1417470864.941364: idx 3 type 2 op 0 soft 0 hard 0[Enter] # hciconfig hci0: Type: BR/EDR Bus: UART BD Address: XX:XX:XX:XX:XX:XX ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:584 acl:0 sco:0 events:27 errors:0 TX bytes:412 acl:0 sco:0 commands:27 errors:0
BLE機器との接続
BLE機器をスキャンするために、以下のコマンドを実行します。
# hcitool lescan LE Scan ... YY:YY:YY:YY:YY:YY (unknown) YY:YY:YY:YY:YY:YY SensorTag ^C
みつかったBLE機器に接続するために、以下のコマンドを実行します。
# gatttool -b YY:YY:YY:YY:YY:YY -I [YY:YY:YY:YY:YY:YY][LE]> connect Attempting to connect to YY:YY:YY:YY:YY:YY Connection successful [YY:YY:YY:YY:YY:YY][LE]> primary attr handle: 0x0001, end grp handle: 0x000b uuid: 00001800-0000-1000-8000-00805f9b34fb attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb attr handle: 0x0010, end grp handle: 0x0022 uuid: 0000180a-0000-1000-8000-00805f9b34fb attr handle: 0x0023, end grp handle: 0x002a uuid: f000aa00-0451-4000-b000-000000000000 attr handle: 0x002b, end grp handle: 0x0035 uuid: f000aa10-0451-4000-b000-000000000000 attr handle: 0x0036, end grp handle: 0x003d uuid: f000aa20-0451-4000-b000-000000000000 attr handle: 0x003e, end grp handle: 0x0048 uuid: f000aa30-0451-4000-b000-000000000000 attr handle: 0x0049, end grp handle: 0x0054 uuid: f000aa40-0451-4000-b000-000000000000 attr handle: 0x0055, end grp handle: 0x005c uuid: f000aa50-0451-4000-b000-000000000000 attr handle: 0x005d, end grp handle: 0x0061 uuid: 0000ffe0-0000-1000-8000-00805f9b34fb attr handle: 0x0062, end grp handle: 0x0068 uuid: f000aa60-0451-4000-b000-000000000000 attr handle: 0x0069, end grp handle: 0x0073 uuid: f000ccc0-0451-4000-b000-000000000000 attr handle: 0x0074, end grp handle: 0xffff uuid: f000ffc0-0451-4000-b000-000000000000 [YY:YY:YY:YY:YY:YY][LE]> quit #
起動しなくなった場合
ファームウェアの更新に失敗するなどして、起動しなくなった場合の復旧方法を説明します。
U-Bootのプロンプト
シリアルコンソールで、以下の文字列
*** Ready to receive application ***
が表示されたら、U-Bootのプロンプトが表示されるまで、スペースバーを2回以上連打します。
****************************** PSH KERNEL VERSION: b0182727 WR: 20104000 ****************************** SCU IPC: 0x800000d0 0xfffce92c PSH miaHOB version: TNG.B0.VVBD.0000000c microkernel built 23:15:13 Apr 24 2014 ******* PSH loader ******* PCM page cache size = 192 KB Cache Constraint = 0 Pages Arming IPC driver .. Adding page store pool .. PagestoreAddr(IMR Start Address) = 0x04899000 pageStoreSize(IMR Size) = 0x00080000 *** Ready to receive application *** U-Boot 2014.04 (Aug 20 2014 - 16:08:32) Watchdog enabled DRAM: 980.6 MiB MMC: tangier_sdhci: 0 In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 boot >
Yoctoの起動
IoT BX1には、緊急用OSとしてYoctoを搭載しています。 Yoctoを起動するために、次のコマンド
boot > run bootYocto
を実行します。
ログイン
rootでログインします。 パスワードは不要です。
edison login: root
注意
文字を入力した場合に、最初の1文字が表示されない場合があります。 その場合は、入力しなおしてください。
無線LAN
無線LANの設定ファイルを作成します。
# wpa_passphrase SSID パスフレーズ >/etc/wpa_supplicant/wpa_supplicant.conf # vi /etc/wpa_supplicant/wpa_supplicant.conf # cat /etc/wpa_supplicant/wpa_supplicant.conf network={ ssid="SSID" #psk="パスフレーズ" psk=暗号化されたパスフレーズ key_mgmt=WPA-PSK proto=WPA WPA2 pairwise=CCMP TKIP group=CCMP TKIP }
wpa_supplicantを起動するために、次のコマンド
# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf &
を実行します。 DHCPサーバからIPアドレスを取得するために、次のコマンド
# udhcpc -i wlan0
を実行します。
ファームウェアのダウンロード
ファームウェアを置くパーティションをマウントするために、次のコマンド
# mount /dev/mmcblk0p8 /mnt/
を実行します。
不具合のあるファームウェアを削除するために、次のコマンド
# cd /mnt/ # rm bzImage # rm ramdisk-wheezy.obsbx1.img.gz
を実行します。
ファームウェアは、ふたつのファイルからできています。
イメージ | ファイル名 |
カーネル | bzImage |
RAMディスク | ramdisk-wheezy.obsbx1.img.gz |
wgetコマンドでファームウェアをダウンロードします。 以下は、FTPサーバからファームウェアをダウンロードする例です。
# wget ftp://ユーザ名:パスワード@FTPサーバ名/bzImage # wget ftp://ユーザ名:パスワード@FTPサーバ名/ramdisk-wheezy.obsbx1.img.gz
を実行します。
再起動
ファームウェアを置いたパーティションをアンマウントしてから再起動します。
# cd / # umount /mnt/ # reboot目次に戻る