Ola Kae Tode Tai

すべてのエンジニアに、追い風を祈る。

Raspberry Pi 3でAndroid Thingsを始めよう!(準備編)

f:id:kironono:20170212003654p:plain

Android Thingsとは

Googleの新しいIoTプラットフォームで、AndroidAPIGoogleのサービスを利用することでスマートデバイスを簡単に開発できる…!って代物です。Android Thingsは今のところデベロッパー・プレビューとして公開されていて、対応ハードウェアとしてIntel Edison、NXP Pico、Raspberry Pi 3をサポートしています。

Androidアプリの開発環境がそのまま使えるので、Android StudioAndroid SDKGoogle Playのサービスなど、これまでのAndroidアプリケーション開発で培った知識が役に立ち、Androidアプリケーション開発者でもスマートデバイスの開発を始めやすいと言えそうです。

用意するもの

デベロッパー・プレビューで公開されているAndroid ThingsプラットフォームをRaspberry Pi 3で試してみます。

まずは、Android Thingsで開発を始めるために必要なものを集めましょう。

  • Raspberry Pi 3 Model B
  • 電源用マイクロUSBケーブルとアダプター
  • マイクロSDカード(8GB以上)
  • マイクロSDカードリーダー・ライター
  • HDMIが入力に使えるディスプレイとHDMIケーブル
  • イーサネットケーブル

うーん、意外と用意するものが多いですね…。一つづつ見ていきたいと思います。

Raspberry Pi 3 Model B

Raspberry Pi 3 MODEL B 【RS正規流通品】

Raspberry Pi 3 MODEL B 【RS正規流通品】

Raspberry Piの3代目です。CPUが64bit対応、Wi-FiBluetoothが内蔵されるなど、Raspberry Pi 2からいろいろ強化されました。

Raspberry Piには、RSコンポーネンツ製とElement14製がありますがどちらのものでも性能差はないはずです。

電源用マイクロUSBケーブルとアダプター

Raspberry Pi 3用の電源です。Raspberry Pi 3は5V/2.5A以上の電流容量が必要になります。

2.5A以上の電源容量を持ったAC-USBアダプターが都合よく手元にある人は少ないと思うので、用意が必要だと思います。

マイクロSDカード(8GB以上)

普通のマイクロSDカードです。このカードにAndroid Thingsのイメージを書き込みます。

カードの容量は8GB以上必要のようです。

マイクロSDカードリーダー・ライター

Android Thingsのイメージを書き込む際に利用します。PCにSDカードリーダーがついてる場合は、それを利用します。

SDカード-マイクロSDカードのアダプターも状況に合わせて。

HDMIが入力に使えるディスプレイとHDMIケーブル

起動確認と初期セットアップ時に使います。ディスプレイ表示が必要なアプリケーションの場合も必要です。

イーサネットケーブル

Raspberry PiWi-Fiアダプタを搭載していますが、Android ThingsでWi-Fiの設定をするまでは使えないので、有線LAN経由で最初の設定をします。 Wi-Fiの設定後は必要なければ外せます。

Android Things のシステムイメージを書き込む

Android Thingsのシステムイメージをダウンロードし、SDカードに書き込みます。

今回はMacでやってみます。

イメージをダウンロード

f:id:kironono:20170214235052p:plain

System Image DownloadsのページからRaspberry Pi用のイメージをダウンロードします。

ファイル形式はzipですが、Mac標準のアーカイブユーティリティでは展開に失敗するので、The Unarchiverを使います。インストールしていない場合は、Mac App Storeからでも入手できます。

f:id:kironono:20170214234907p:plain

展開すると、 iot_rpi3.img が作成されます。

SDカードをフォーマットする

f:id:kironono:20170215000352p:plain

まずはSDカードをフォーマットします。ディスクユーティリティを使えばGUIでフォーマットすることができます。

f:id:kironono:20170215000631p:plain

ディスクユーティリティの左側のリストから挿入したSDカードを選んで、「消去」します。フォーマットはMS-DOS(FAT)を選びます。

f:id:kironono:20170215001002p:plain

これでフォーマットされました。「マウント解除」を押して、マウントを解除します。

SDカードにイメージを書き込む

f:id:kironono:20170215001504p:plain

f:id:kironono:20170215001605p:plain

ディスクユーティリティの「情報」を押して、SDカードのデバイス位置を調べます。

「情報」を押して表示されるウィンドウのBSD装置ノードのところに表示されているdisk5という文字列をメモっておきます。 ( disk に続く数字は環境によって違います )

f:id:kironono:20170215001904p:plain

ターミナルを起動します。

f:id:kironono:20170215002220p:plain

さきほど展開したThingsイメージのディレクトリまで移動します。

以下のコマンドで、 iot_rpi3.img を書き込みます。

$ sudo dd bs=1m if=iot_rpi3.img of=/dev/rdisk5

/dev/rdisk5 のdisk5の部分は、さきほどメモった文字列と合わせます。( /dev/rdisk5r はタイポではありません。)

f:id:kironono:20170215003913p:plain

書き込み完了まで、15分くらいかかりますが上のように xxxx bytes transferred in yyyy と表示されれば、書き込み完了です。

f:id:kironono:20170215004032p:plain

書き込みが終わった後に、このようなダイアログが出た場合は、「取り出す」で、SDカードを取り出します。

起動する

Android Thingsのシステムイメージを書き込んだマイクロSDカードをRaspberry Piのカードスロットに挿入します。

f:id:kironono:20170215215709j:plain

イーサネットケーブル、HDMIディスプレイ、電源を繋いで起動します。

f:id:kironono:20170215215358p:plain

Android Thingsが起動しました。画面下部に有線LANのIPアドレスが表示されています。

PCから接続するためにここに表示されたIPアドレスをメモっておきます。今回の場合は、 192.168.11.39 ですね。

youtu.be

起動の様子。

adbで接続する

adb(Android Debug Bridge)とはAndroid SDK platform-toolsに含まれるツールです。Androidバイスを列挙したり、リモートからAndroidのシェルコマンドを実行できたりします。

adbの細かい説明はこちらのドキュメントが参考になります。

Mac上でAndroid StudioAndroid SDK、platform-toolsをセットアップしている場合は、 ~/Library/Android/sdk/platform-tools/ にあります。

では、さっそく起動したデバイスに接続してみましょう。

$ ./adb connect 192.168.11.39
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
connected to 192.168.11.39:5555

画面で確認したIPアドレスを指定して、 adb connect で接続しました。

$ ./adb disconnect 192.168.11.39
disconnected 192.168.11.39

adb disconnect で接続解除できます。

また、Raspberry Piを使っていて、ホスト側がマルチキャストDNSBonjour)をサポートしている場合 Android.local でも接続できます。

$ ./adb connect Android.local
connected to Android.local:5555

Wi-Fiに接続する

<SSID> <PASS> の部分を接続したいWi-Fiの接続情報に読み替えます。

$ ./adb shell am startservice \
>     -n com.google.wifisetup/.WifiSetupService \
>     -a WifiSetupService.Connect \
>     -e ssid <SSID> \
>     -e passphrase <PASS>
Starting service: Intent { act=WifiSetupService.Connect cmp=com.google.wifisetup/.WifiSetupService (has extras) }

成功すると、画面下部に表示されていたIPアドレスの部分が変化しているはずです。

f:id:kironono:20170215222316p:plain

“nanoha” というSSIDWi-Fiに接続しました。

$ ./adb logcat -d | grep Wifi
...
02-15 13:17:14.197  1491  1491 V WifiWatcher: Network state changed to CONNECTED
02-15 13:17:14.198  1491  1491 V WifiWatcher: SSID changed: "nanoha"
02-15 13:17:14.209  1491  1506 I WifiConfigurator: Successfully connected to nanoha

adb logcat を使ってログを表示させ、上記のようなログがあることを確認することでも、接続されたかわかります。

外部に接続できるかテストする

Wi-Fiに接続できたら、外部のホストに接続できるか試してみます。

IPアドレス 8.8.8.8ping して応答があるか調べます。

$ ./adb shell ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=14.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=57 time=16.3 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=57 time=3.98 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=57 time=3.43 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=57 time=3.68 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=57 time=7.29 ms
64 bytes from 8.8.8.8: icmp_seq=7 ttl=57 time=11.7 ms

8.8.8.8 に到達できていることが確認できました!

まとめ

Android Thingsを始めよう!準備編ということで、システムイメージをSDカードに書き込んで、Raspberry Piで起動。 adbでデバイスに接続して、Wi-Fiの設定を行いました。

Raspberry Piを使ったことがある方は、すんなりいけるかもしれませんが、初めての場合は意外と準備するものが多くて少し大変だったかもしれません。

次回は、実際にAndroid Thingsで動くプログラムを書いて、Raspberry PiのGPIOを制御して、LEDをチカチカ点滅させるやつをやってみます!