Android Things をインストールしてLチカさせてみた！

# この記事は何？
Android ThingsのOSのインストールとLチカに関しての記事です。
基本的には[ここ](https://developer.android.com/things/index.html)に従って動作させた筋道を記録します。2017年5月19日現在のトライの記録です。

# Android Thingsとは
スマホ向けのOSのAndroidではなく、IoT機器向けのOS。

# どこで買えるの？
Android Things自体は[こちら](https://developer.android.com/things/preview/download.html)から無償でダウンロードできます。
2017年5月現在では以下の機器用のOSがイメージとして提供されています。

+ Intel Edison
+ Intel Joule
+ NXP Pico i.IMX6UL
+ NXP Argon i.IMX6UL
+ NXP Pico i.MX7D
+ Raspberry Pi 

それぞれの[機器の対比表はこちら](https://developer.android.com/things/hardware/developer-kits.html)です。

# Raspberry Piにインストール
購入した機器はこれらです。(米国amazonですみません＞＜)

+ [CanaKit Raspberry Pi 3 with 2.5A Micro USB Power Supply (UL Listed)](https://www.amazon.com/gp/product/B01C6FFNY4/)
+ [OSOYOO 3.5” HDMI Touch Screen LCD Display Monitor 1920x1080 Audio Output with Stylus for Raspberry Pi 3 2 Model B](https://www.amazon.com/gp/product/B01N447AEY/)
+ [SanDisk Extreme 32GB MicroSDHC UHS-I Card](https://www.amazon.com/gp/product/B013CP5HCK/)
+ [CAT7 RJ45 Ethernet LAN Networking Cable(3m)](https://www.amazon.com/gp/product/B00QIFWYXC/)

# 早速インストール
[ここに従ってインストール](https://developer.android.com/things/hardware/raspberrypi.html)したら1時間くらいで完了しました。
使ったコンピュータはMacです。

+ [先程の一覧ページ](https://developer.android.com/things/preview/download.html)から **Raspberry Pi** のイメージをダウンロード。
+ ダウンロードしたファイルを解凍して、以下を実行してMacに接続したSDカードに書き込む。

```shell
$ sudo dd bs=1m if=(解凍したファイルへのパス＆ファイル名).img of=/dev/rdiskn;
```

> コマンドの最後の「``rdiskn``」の`n`は実際は数字が入ります。「Disk Utility」で表示されます。
> ddでSDに書き込むのが最も時間がかかりました。

 [<参考ページ>](https://www.raspberrypi.org/documentation/installation/installing-images/mac.md)

+ 書込完了後にRaspberry Pi（ここではPi 3）のSDカードをスロットに接続する
+ 電源を入れて、起動したら完了。

起動完了するとこんな画面になります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/61221/45efa144-8fe5-8024-558e-dbd7d1fd0a80.jpeg" width=400>


# 自作アプリのインストール
自作アプリインストールはコンピュータ（ここではMac）からインストールを行います。

> ここからAndroid Studio、Android SDKがコンピュータにインストールされていることを想定して書いています。
[それぞれのインストール方法はこちら](https://developer.android.com/studio/index.html)

## 有線でRaspberry Piに接続
Macなので、Terminalを開きます。
Terminalからコマンドを打ってネットワークを経由して接続します。まずはEthenetケーブルで物理的にRaspberry Pi 3をネットワークに接続をします。次にIPアドレスを調べて、

```bash
$ adb connect <ip-address>;
```

で接続完了です。
接続解除は以下です。

```bash
$ adb disconnect <ip-address>;
```

接続を確認するには、

```bash
$ adb devices;
```

をすると接続されている機器のリストが表示され

```bash
$ adb logcat -d;
```

を実行するとログが表示されます。（Androidのエミュレータは停止、実機は接続していない状況を想定）
## Wi-FiでRaspberry Piに接続
一度有線で接続してから、以下のコマンドを入力。

```shell
$  adb shell am startservice \  
    -n com.google.wifisetup/.WifiSetupService \  
    -a WifiSetupService.Connect \  
    -e ssid <Network_SSID> \  
    -e passphrase <Network_Passcode>  
```

パスワードがない場合は省力することで接続できるとのこと。

> SSID/Passphraseは記録されますので、``$ adb connect <ip-address>;``を使いWi-Fiに一度接続をしてしまえば、これで電源を切っても、電源の再投入後は自動的にWi-Fiに接続されますので、Ethenetケーブルは切断することが可能になります。

ちなみに、Wi-FiのSSID/Passphraseの削除は以下です。

```shell
$ adb shell am startservice \
    -n com.google.wifisetup/.WifiSetupService \
    -a WifiSetupService.Reset
```

## アプリのインストール
```bash
$ adb connect <ip-address>;
```
が成功していれば、Android Studioにてコンパイルする際にターゲットのデバイスとしてリストされるはずです。リストされていなければ、 **有線でRaspberry Piに接続** からやり直してみてください。

## Lチカ
せっかくなのでLチカさせてみました。
![EAgpTAiprTu2KOlC0MMeLwkl76vEahfwgxdCIRJ0wAwegAAMYAKy0AOQwAdkIBy2AUGwZzx+AfXGsNtW7ww5cpdARA39jQ3dcEbgUMkEbpgCAgA7.gif](https://qiita-image-store.s3.amazonaws.com/0/61221/c9fbfced-043e-d6c6-3cdd-9d3b10c7ec10.gif)


以下がコードです。
Android Studioで、新規にUIなしの空のアクティビティを作って、以下を書いて実行しています。

```java
public class MainActivity extends Activity {

    private static final int INTERVAL_BETWEEN_BLINKS_MS = 300;
    private static final String LED = "BCM4";

    private Handler mHandler = new Handler();
    private Gpio mLedGpio;

    private String TAG="ANDROIDTHINGS";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        PeripheralManagerService service = new PeripheralManagerService();

        try {
            mLedGpio = service.openGpio(LED);
            mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
            Log.i(TAG, "Start blinking LED GPIO pin");
            
            while(true) {
                // Toggle the GPIO state
                mLedGpio.setValue(!mLedGpio.getValue());
                Log.d(TAG, "State set to " + mLedGpio.getValue());
                SystemClock.sleep(INTERVAL_BETWEEN_BLINKS_MS);
            }
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "Closing LED GPIO pin");
        try {
            mLedGpio.close();
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        } finally {
            mLedGpio = null;
        }
    }
}
```
（[このブログ](https://androidthings.rocks/2017/01/08/your-first-blinking-led/)を参考にしています）

# その他
「さて、その先を何する？」
となりそうですが、このビデオではLEDを光らせたり、温度センサからの値の取得をどう書くかが紹介されています。（別途[Pimoroni Rainbow HAT](https://shop.pimoroni.com/products/rainbow-hat-for-android-things)が必要）

- [Developing for Android Things using Android Studio (Google I/O 2017)](https://events.google.com/io/schedule/?section=myio&sid=4c833889-90e6-4599-bd86-390705a19c1b)

- [Raspberry Pi 3のピン配置](https://developer.android.com/things/hardware/raspberrypi-io.html)