Raspberry Pi 3でAndroid Things入門

#はじめに
この記事は [Aizu Advent Calendar 2018](https://adventar.org/calendars/3023) 23日目の記事になっています。22日目の記事は[mt_coff](https://mt-coff.hatenablog.com/)さんの[Vue.jsでゆるくAtomic Designをやる](https://mt-coff.hatenablog.com/entry/2018/12/25/022126)です。24日目の記事は追加されたらリンクを貼ります。

Android Thingsの入門記事が少なく感じたのでメモ兼ねて書いてみました。
間違い等あったら遠慮なくコメントでご指摘ください。

#用意するもの
Raspberry Pi 3一式
ブレッドボード、LED、抵抗などLチカするのに必要なもの

#今回のゴール
Android Thingsの導入からLチカまでができる

#Android Thingsとは
Googleが「IoT向けのプラットフォーム」として発表したOSなどを含むソフトウェア群…らしいです。正直この辺が調べてもなんとなくしかわからなかったので詳しい人教えて下さい。
この記事ではIoT機器向けのOSを指すことにします。

###（個人的に思う）Androidアプリ開発者にとってのAndroid Thingsのメリット
- Androidアプリ開発のノウハウをIoTデバイスの開発に活かすことができる
- 使い慣れたIDE(Android Studio)で開発ができる
- Java/Kotlinが使える
- GPIOの制御が比較的簡単にできる
- 画面をAndroidアプリのように設計できる

僕はKotlinが好きなので、開発にKotlinを使えるというのが個人的に嬉しいです。

#Android Thingsのはじめかた

##Raspberry Pi側の準備

###プロダクトの追加
[Android Things Console](https://partner.android.com/things/console/)へ移動
<img width="1440" alt="スクリーンショット 2018-12-22 18.08.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/3349d2cf-cfe7-f176-d02c-265daa2c438d.png">
ADD A PRODUCTをクリックし、プロダクトを追加します。
<img width="384" alt="スクリーンショット 2018-12-22 18.25.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/8e8c456e-267d-04c5-14c0-30562bc7040f.png">

- Product name
プロダクト名
- SOM type
今回はRaspberry Pi 3 を選択
- Product description
プロダクトの説明（省略可）

###microSDカードに書き込むイメージをビルド
Modelsからモデルをクリック（この画面では2ju8p7）
<img width="1440" alt="スクリーンショット 2018-12-22 18.34.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/3addd762-52b7-a13c-dcc2-be14400fcb3f.png">

CREATE A BUILD CONFIGURATIONをクリックしビルドの設定をします。
<img width="1433" alt="スクリーンショット 2018-12-22 18.48.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/9f17c36c-80dd-1ef2-66c8-f680956083d7.png">

- ビルド名を入力
- Android Thingsのバージョンを選択

今回はその他は初期設定で大丈夫です。

<img width="435" alt="スクリーンショット 2018-12-22 19.13.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/9ad1066e-42cc-4eba-79d4-7d55cf927ed8.png">

###ビルドしたイメージのダウンロード

- ActionsからDevelopmentを選択しダウンロード
- ダウンロードされたzipファイルを解凍し、imgファイルをmicroSDカードへ書き込み


<img width="1440" alt="スクリーンショット 2018-12-22 21.25.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/879d109a-adb0-946c-80d8-d92863f666b6.png">

imgファイルを焼いたmicroSDをRaspberry Pi 3に挿入し起動して、次のような画面になれば成功です。（直撮りすみません）


![DSC_0626.JPG](https://qiita-image-store.s3.amazonaws.com/0/270890/3dc476b9-f047-a650-5fdf-0397e6860c7a.jpeg)

##Android Thingsアプリの実装
通常のAndroidアプリ開発と同様、Android Studioを使います。開発の流れもほぼ同じです。

###プロジェクトの準備

プロジェクトを作成し、
<img width="1012" alt="スクリーンショット 2018-12-22 21.48.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/f30c1d59-1bdf-23af-7660-d2b481a369dc.png">

Target Android DevicesでAndroid Thingsにチェックを入れます。
<img width="1012" alt="スクリーンショット 2018-12-22 22.10.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/a2e78da2-fe50-1631-cc32-613a647bda14.png">

Activityを選択します。今回はAndroid Things Empty Activityを選択しました。
<img width="1012" alt="スクリーンショット 2018-12-22 22.13.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/e5035977-5455-2ca2-e667-9b597c7357f9.png">

Activityの設定をして準備完了です。
<img width="1012" alt="スクリーンショット 2018-12-22 22.16.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/270890/73e6a6f1-1a7d-fccd-311b-c027eb20054b.png">

###実際にLチカしてみる

プロジェクトの準備はできたのであとはコードを書いていくだけです。
Android ThingsでGPIOを制御する流れとしては

- AndroidManifestに`USE_PERIPHERAL_IO`のパーミッションを追加
- `PeripheralManager.getInstance()` でPeripheralManagerのインスタンスを取得
- `インスタンス.openGpio("GPIO名")` でGPIOを取得していろいろする

こんな感じです。
Android ThingsでのRaspberry Pi 3のGPIO一覧は[こちら](https://developer.android.com/things/hardware/raspberrypi)を確認してください。

それではLチカまでの流れを実際にコードを載せて解説します。

####パーミッションの設定

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yt8492.ledblink">

    <!-- ↓追加 -->
    <uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO" />
    <!-- ↑追加 -->
    <application android:label="@string/app_name">
        <uses-library android:name="com.google.android.things"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
```

####Lチカ部分のコード

```kotlin:MainActivity.kt
class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val manager = PeripheralManager.getInstance()
        val led = manager.openGpio("BCM17")
        led.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW)
        led.setActiveType(Gpio.ACTIVE_HIGH)
        repeat(10) {
            led.value = true
            Thread.sleep(1000)
            led.value = false
            Thread.sleep(1000)
        }
    }
}
```


`led.setDirection`でモードを入力か出力か設定します。
`DIRECTION_IN`で入力、`DIRECTION_OUT_INITIALLY_LOW`で初期電圧がLOWの出力、`DIRECTION_OUT_INITIALLY_HIGH`で初期電圧がHIGHの出力になります。

`led.setActiveType`でHIGHとLOWどちらがtrueか設定します。

あとは1秒ごとにLEDの点滅を10回繰り返しています。

Raspberry Piをネットワークに接続している場合は、`adb connect <ラズパイのIPアドレス>`で接続してAndroid Studioから実行できます。

お疲れ様でした。

#参考

https://developer.android.com/things/get-started/
https://developer.android.com/things/sdk/pio/gpio
https://developer.android.com/things/hardware/raspberrypi