Tech Sketch Bucket of Technical Chips by TIS Inc.

話題のEdisonを使ってみよう1 セットアップとその他の環境構築

Pocket

今年1月のInternational CESでお披露目されて以来、出るぞ出るぞと言われて待たされていたIntel Edisonが日本発売されてから一月弱ほど経過しました。技術系のブログを読まれるような方たちには、すでにその名前と存在は浸透してきているのではないでしょうか?ということで、筆者も一つ入手しましたので、これから何かやってみようとする足がかりとなるような投稿をいくつかしてみようかと思います。第1回の今回は導入として、諸々の環境構築を行います。

Intel Edisonとは?

EdisonはIntelが市場投入した汎用コンピューティング・プラットフォームでIoTやロボティクスその他もろもろの開発を迅速に行えるように様々な機能が組み込まれています。

Atom SoCが採用され、500MHzで動作するデュアルコア、デュアルスレッドのCPUと100MHz/32ビットのQuarkプロセッサー・マイクロコントローラーが搭載されています。その他、40個のGPIO、1GBのLPDDR3メモリ、4GBのeMMC、デュアルチャンネルのWifi、BLEというほとんど全部盛りなものをSDカード大の中に実装しています。詳細な仕様については、公式ページを参照してください。

開発では、Arduinoの開発環境とC/C++直での開発がデフォルトでサポートされており、Node.jsやPython、RTOSの他、ビジュアルプログラミング環境の導入も計画されているようです。

まずはセットアップから

さて、早速セットアップして使えるようにします。

現在入手できるEdisonは、単体のEdisonモジュール、GPIOの引き出しができるBreakout Board Kit、Arduino Uno互換のボード付きのIntel Edison Kit for Arduinoのそれぞれのキット形態です。その他にもSparkFunさんなどから独自の拡張モジュールが出ています。価格的には単体<Breakout Board Kit<Arduino Kitとなりますが、今回は扱いやすさ優先でArduino Kitを利用しています。Intelも初めてEdisonを利用してみる場合はArduino Kitの使用を推奨しています。Arduino Kitを利用してEdisonの扱いにひと通り慣れてきたら、あとは用途に合わせ単体のEdisonと前述の様々な拡張モジュールとを組み合わせて利用するのがよいかもしれません。

それでは公式のGetting Started Guideをベースにしてセットアップを行っていきます。いくつかGetting Startedに記載されていない内容をボードの仕様書やサポートコミュニティでのディスカッションなどから追記しています。公式サイトではMac、Windows、Linuxでの手順がそれぞれまとめられていますが、今回使う環境はLinux(Ubuntu14.04 64bit)です。

モジュールの組み込み

Arduino Kitを開封すると、EdisonとArduino Boardは別梱包されています。

DSC_0017

Edisonを取り出してArduino Boardに差し込みます。白い四角枠が差し込み場所です。ガイドの写真のコメントにあるようにEdisonモジュール本体を押し込んで「カチッ」と手応えがあるまで差し込みます。この手のものはみなそうですが、ビビって力を入れないとなかなか入ってくれませんので、慎重かつ適切な力の入れ具合で作業をします。差し込んだ状態がこちらです。

DSC_0018

差し込み後は付属のナットで左上隅と右下隅を固定します。ナットがとても小さいので、紛失しないように作業場所をなるべく物がないキレイな状態にしておくことをおすすめします。工具などを使って締め付けせずに指で回して締める程度でよいようです。

続いて手順上はスペイサーの取り付けになりますが、こちらは適宜必要に合わせて行えば(特に取り付けずに利用しても)問題はないと思います(当然基盤のウラ面には気をつけるべきですが)。利用用途によって取り付けましょう。

PCと接続

Arduino BoardへのEdisonの組み込みが終わったら、USBケーブルでPCと接続してみます。MicroUSBのポートが2つありますが、2つともケーブルを差し込みPCに接続します。その際、2個のMicroUSBポートと通常のUSBポートの間にあるスイッチがMicroUSB側に切り替わっていることを確認してから接続します。Getting Startedにはとにかくこの状態に切り替えてからつなげろとしか書いてありませんが、このスイッチはUSB接続時のモードを切り替えるものです。MicroUSB側に切り替わっている状態はデバイスモードでの接続となります。デバイスモードでの接続時は給電もUSB経由で行います。外付けのアダプターを給電に使う場合は、スイッチを反対側に切り替えてホストモードにする必要があります。ちなみに同じ外付けでもリチウムイオンバッテリーを利用したUSB接続のモバイルバッテリーで給電するような場合はデバイスモードです。

edison_mode_switch

2個ともUSBのケーブルを接続するのは、1本は給電(基盤にJ16と記載されたポート)に、もう1本はUART2経由のリモートコンソール接続(基盤にJ3と記載されたポート)にそれぞれ利用するためです。正常に接続できている場合はボード上のLEDが点灯します。

DSC_0020

最新イメージの書き込み

Edisonの組み込みとUSBでのPCとの接続確認ができたら、Edisonに最新イメージを書き込みます。

公式サイトではボードにEdisonモジュールを組込み後行う作業とされていますが、Getting StartedのStep上には出てこない作業です。Prerequisiteに記載があるのですが、Prerequisiteに気付かずにステップ通りに進もうとすると戸惑うかもしれません。この作業もステップに入れればよいのでは?と思うのですが、Edisonの配布形態がArduino Kitだけではないから、共通な作業であるイメージの書き込みは別記載しているのかもしれません。

最新イメージは公式サイトのリンクから取得します。一覧のうち、Yocto complete imageと記載されているものになります。このタイミングであとで必要となる、Edison用のArduino IDEもダウンロードしておくとよいでしょう。

USB接続すると、Edisonがドライブとしてマウントされるはずです。Linuxで接続している場合、マウントされたディレクトリは/media/[ユーザ名]/Edisonとなります。初期状態は空です。今後、すでにイメージを一度書き込んだ後に最新のイメージに書き換える際は、こちらのディレクトリの中身をすべて削除してから作業を開始します。コピーした状態は以下の通りです。

edison_image_copy_bksi

ダウンロードしてきたYoctoのファイルを解凍し、解凍したディレクトリ下の全てのファイルをマウントされたディレクトリにコピーします。コピーした後イメージを書き込みますが、その際screenコマンドを利用してシリアル接続しますので、もし設定に利用している環境にscreenがインストールされていない場合は先にインストールしておきます。

ターミナルから以下の通り、screenコマンドを利用し、デバイスファイルを/dev/ttyUSB0、ボーレートを115200指定で接続します。2回連続でenterを押さないとLoginプロンプトが表示されません。全くの初期状態だと、ユーザやパスワードの設定がされていませんのでrootでかつパスワードなしでログインします。rootで入るという記述が公式サイトのLinuxを利用した際の手順には書いていないので、最初やや戸惑いました(MacOSからの設定の方には記載がありました)。

ログインできたらrebootコマンドにotaオプションを付けて実行し、イメージを書き込みます。無事書き込みが終了すると、再びログインプロンプトが表示されるはずです。

以降、ログイン後は普通のLinuxとして利用できるので、標準的なコマンドはひと通り使えます。また、電源を落とすのも普通にshutdownコマンドで行えます。

IDEの準備と動作確認

次に開発環境を準備します。

最初に書いた通り、EdisonはArduinoベースでの開発に対応しているため、Arduinoでの開発と全く同様にArduino IDEによるコード作成とコンパイル、アップロードが可能です。Arduinoをすでに使ったことがある人はご存知だと思いますが、IDEを動かすのにJavaのランタイムが必要となります。手元にJavaのランタイムがない場合は事前にインストールしておきます。

IDEはJavaのランタイムさえインストールされていれば、先ほどダウンロードした最新のIDEの圧縮ファイルを解凍するだけで利用できるようになります。解凍後のディレクトリに移動してIDEを実行しますが、その際sudoを使って特権付きで実行します。まれに特権付き実行ができない場合がありますが、その場合はsudoでの環境変数の引き継ぎなどができていないなどの問題が考えられますので、適宜sudoersなどの設定を確認してみるとよいと思います。

続いて公式サイトの手順では、動作確認としておなじみのLチカを行っています。Lチカのためのコードは配布されているExampleの中に含まれています。実行についてはArduinoを使ったことがある人であればおなじみの手順です。IDEでコンパイルしてEdisonにアップロードするだけですので、細かい話は割愛します。

WiFiの接続設定

続いてWiFiの接続設定を行います。

再びscreenコマンドを使って接続します。接続時のオプションは先ほどと同様です。接続できたら、同様にrootでログインします。ログインできたらconfigure_edisonコマンドをsetupオプション付きで実行します。全くの初期状態で実行するとEdisonの名前指定とパスワード指定のフローになります。対話型になっていますので、指示通り進めていきます。こちらの設定終了以降、Edisonの接続時にrootでログインする際は、設定したパスワードを利用することになります。また、以降はログイン後のコマンドラインに表示されるデバイス名(ユーザ名@〜の〜部分)もデフォルトのedisonからこちらで設定したものになります。

パスワード指定まで終わるとWiFiネットワークの検索と設定の処理に移行します。こちらも対話型ですので、指示通り進めてWiFiとの接続を確立します。基本的には通常のモバイル機器での設定と同様で、接続可能なAPのSSID一覧から接続先を選択し、パスワードを入力するだけです。接続が確立できたら、正常に接続できているか確認してみます。対話型設定の最後にメッセージで表示されるhttp://[IP]もしくはhttp://myedison.localに、同一APに接続して同じネットワーク下にあるPCなどのブラウザからアクセスしてみてデバイス情報の表示が出れば接続が正常に行われている状態です。

ここまでが使い始めでのひと通りの設定となります。

その他の設定や確認

さて、ひと通り公式のセットアップが終了しましたので、次にその他にやっておいて方がよい設定などを確認しておきます。

WiFi経由でSSH接続

WiFiの接続設定を行っていない状態だとEdisonへの接続はUSBを利用したUART2経由のリモートコンソールを利用することになりますが、WiFiでの接続設定後はWiFi経由のSSHで接続できるようにすることも可能です。

筆者の環境では、特に設定変更等行わずにifconfigで確認できるwlan0のIPアドレスに同一ネットワークからSSH接続することが可能でした。ただ、サポートコミュニティでは、おそらく以前のバージョンのファームイメージでのSSH接続に関する投稿だと思うのですが、デフォルトのままだと接続できないといった例が上がっています。こちらに関してはコミュニティ内のやり取りで原因と対策が判明しています。イーサネットデバイス(ifconfigで確認できるもの)の中でusb0とwlan0のIPアドレスのセグメントの関係でそれらが同時に利用可能とならないといった問題のようです。イメージを最新にしていれば問題ないと思いますが、もし接続できなかった場合は/etc/systemd/system/basic.target.wants/network-gadget-init.serviceのusb0に関連するIPアドレスを書き換えてみると接続できるようになるかもしれません。

Bluetooth/BLEを利用可能にする

Edisonが全部盛りだということは最初に書きましたが、Bluetoothに関しては、デフォルトのままだと使える状態になっていないため、使えるようにします。

rfkillコマンドを利用して、以下のように無線デバイスリストを表示してみます。2:のBluetoothのデバイスのSoft blockedがyesの状態ですのでこちらのブロックを解除することから始めます。

ブロックを解除するにはrfkillにunblockオプションを付けて実行します。

ブロック解除後に再びデバイスリストを表示して、BluetoothのSoft blockedがno、hci0のデバイスがあらわれていることを確認します。

続いてhciconfigコマンドを実行してhci0デバイスの状態を見てみます。

UP RUNNINGではなくDownしている場合はhciconfigにupオプションをつけて起動状態にしてやります。

ここまででBluetoothの機器と連携するための準備がまずできた状態ですが、IoT関連での利用などを考えた場合は、当然BLEを利用するということが考えられますので、BLEでの接続を試しておきます。

接続する機器ですが、今回はTexas Instruments社のSensorTagを使ってみます。SensorTagに関する詳細な説明は割愛しますが、複数のセンサーが実装されており、センサー値をBLE経由で取得することができます。まずはhcitoolでスキャンしてSensorTagが見つけられるか確かめてみます。hcitoolにlescanオプションを付けて実行します。

SensorTagが見つけられているようですので、実際にセンサー値が取れるか確かめてみます。EdisonはデフォルトでNode.jsが利用できるようになっています。Node.jsからBluetooth/BLEを利用できるようにするためのいくつかのモジュールをnpmを利用してインストールします。また、各Nodeモジュールのインストール時のビルドに必要なBluezの最新のヘッダなども事前にインストールする必要があります。

まず事前に必要なパッケージ群ですが、公式のデフォルトでは入らないので、パッケージマネージャのopkgを利用して別途インストールします。opkgの設定ファイルを開いて以下各リポジトリを追記します。設定ファイルは/etc/opkg/base-feeds.confになります。

設定を追加したらopkgコマンドを以下の通り実行します。

次にNodeのモジュールをインストールします。必要なモジュールはasync、noble、sensortagになります。asyncはNodeを普段お使いの方ならおなじみかと思いますが、非同期処理を扱うためのモジュールです。nobleはBLEのセントラルの処理を行うためのモジュールです。asyncはこちらのnobleの中で利用されています。sensortagはSensorTag用のユーティリティモジュールです。nobleの作者の方が個人で開発しているようです。sensortagモジュールを利用しなくても素のnobleモジュールのメソッド群を利用して実装することは可能ですが、センサー値の変換など面倒な細かい処理をラップしてくれていますので、使わせてもらうことにします。SensorTag以外の機器で接続を確認してみる場合は、nobleのGetting startedなどを参考にテストコードを書いて確認してみましょう。

また、ついでですが、Edison側をセントラルではなくペリフェラルとして利用する場合もあるかもしれないので、同じ作者作でペリフェラル側の実装に利用できるblenoモジュールもインストールしておきます。

インストールが終了したら、sensortagモジュールに同梱されているtest.jsを実行して、実際にSensorTag上のセンサー値が取れるか試してみます。

無事センサー値がとれて、諸々の値が表示できる状態になりました。

次回以降

ひと通りの設定ができた状態になりましたので、次回以降はiotkit-comm libraryを利用した開発や、シールドを装着した操作など、より具体的な内容をいくつかまとめて行こうと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?