CHIRIMENでGPIOが動かない時に確認すること


## はじめに

今回は、CHIRIMENでGPIOを扱っていて、「動かないな？」と思った時に確認すべき項目を説明します。[WebGPIO polyfill](https://github.com/club-wot/WebGPIO)の利用を前提としています。


確認するべき項目は以下の通りです。
* ハードウェアに問題がないか調べる
* polyfillがきちんとインストールできているか確認する
* GPIOのexportがきちんとできているか確認する
* プルアップ/プルダウンを確認する

## ハードウェアに問題がないか調べる（コマンドラインでGPIO制御をしてみる）

GPIOが動かない時、まずは原因がハードウェアにあるのかソフトウェアにあるのか切り分けたいと思います。CHIRIMENでは（他のlinuxと同様）コマンドラインからGPIOの制御を行うことが可能です。

### adbのインストール
* CHIRIMENのコマンドラインを操作するために、adbコマンドを使えるようにする必要があります。
* 以下のページを参考にしてadbコメンドをインストールしてください。
* [Macの場合](https://developer.mozilla.org/ja/docs/Mozilla/B2G_OS/Debugging/Installing_ADB)
* [Windowsの場合](https://chirimen.org/docs/ja/dev_windows.html)（Windowsの場合はCHIRIMEN用ドライバのインストールも必要になります。）


### adb shellでCHIRIMENにログイン
* adbコマンドが使えるようになったら、PCとCHIRIMENのmicro USB(OTG)をUSBケーブルで接続します。
* CHIRIMENを接続後、

```
$ adb shell
```

でCHIRIMENにログインします。

### GPIOのexport
* CHIRIMENにログイン後、まずは使いたいGPIOポートのexportを行います。
* CHIRIMENのCN1-9(gpio198)を使用する場合、以下のコマンドを実行します。

```
$ echo 198 > /sys/class/gpio/export
```

* 以下のコマンドを実行して、gpio198というファイルができていれば、exportは正常にできています。

```
$ ls /sys/class/gpio/
```

### GPIOの入出力設定
* GPIOのexport後、GPIOを入力（in）として使用するか、出力（out）として使用するかを設定します。
* 入力の場合は'in'を、出力の場合は'out'を指定して、以下のようにコマンドを実行します。（こちらは'out'の例）

```
$ echo 'out' > /sys/class/gpio/gpio198/direction
```

* 正しく設定できていれば、以下のコマンドを実行した際、'in'か'out'が表示されます。

```
$ cat /sys/class/gpio/gpio198/direction 
```


### GPIOの値の確認
* 現在のGPIOの値を確認するためには、以下のコマンドを実行します。

```
$ cat /sys/class/gpio/gpio198/value
```

* 現在のGPIOの値が'0'か'1'かで出力されます。
* 動作確認したいハードウェアがタクトスイッチなどの入力機器の場合、機器を操作しながらこのコマンドでGPIOの値を確認することで、ハードウェア側に問題がないかどうか確認できます。

### GPIOの制御
* GPIOを'out'で設定している場合、以下のコマンドでGPIOの制御ができます。
* '0'か'1'を指定してコマンドを実行します。

```
$ echo 1 > /sys/class/gpio/gpio198/value
```

* 動作確認したいハードウェアがLEDなどの出力機器の場合、こちらのコマンドでGPIOの制御を行うことでハードウェア側に問題がないかどうか確認できます。

## WebGPIO polyfillのインストール

* ハードウェアに問題がないことがわかったら、ソフトウェア側の問題を確認していきます。
* CHIRIMEN githubページの[examples](https://github.com/chirimen-oh/examples)など、現在作成されているCHIRIMENのサンプルプログラムは、ほとんどが[WebGPIO polyfill](https://github.com/club-wot/WebGPIO)を使用して作られていますので、polyfillがきちんとインストールできているか確認していきます。

### polyfillのインストール
* WebGPIO polyfillは[webgpio.js](https://github.com/club-wot/WebGPIO/blob/draft-20160125/dist/webgpio.js)と、workerスレッドである[worker.js](https://github.com/club-wot/WebGPIO/blob/draft-20160125/dist/worker.js)の２つのファイルで構成されています。
* polyfillを使用するためには、2つのファイルを同じディレクトリに設置する必要があります。webgpio.jsが存在するディレクトリにworker.jsもあるか確認してください。
* worker.jsは今後名前が変わる可能性有り[詳細](https://github.com/club-wot/WebGPIO/issues/22)。


### polyfillの読み込み
* htmlからは、webgpio.jsのみ読み込みます。worker.jsはwebgpio.js内で参照されているため、htmlからの読み込みは不要です。

読み込み例

```
<script src="webgpio.js"></script>
```

## GPIOのexport状態を調べる
* WebGPIO polyfillを使用してGPIOのaccessorを取得すると、CHIRIMENで使用できる全てのGPIOのexport処理が行われます。
* 現状、全てのexportが完了するまでに数秒掛かる場合があることや、exportが途中で止まってしまう場合があることが確認されています。
* そのため、export処理が正しく行われているか、GPIOの状態を確認していきます。


### コマンドラインからexport状態の確認
* CHIRIMENとUSBで接続し、adb shellでログインします。
* 以下のコマンドを実行します。

```
$ ls /sys/class/gpio/
```

* export処理が正しく行われていれば、以下のように14個のGPIOポートが表示されます。

```
gpio163
gpio192
gpio193
gpio196
gpio197
gpio198
gpio199
gpio243
gpio244
gpio245
gpio246
gpio283
gpio284
gpio353
```

* export処理まで正しく行われていれば、あとはプログラムの問題である可能性が高いです。
* ports.get()でポート番号の指定が正しいかなど、地道にデバッグしていきましょう。


## プルアップ/プルダウンの確認
* CHIRIMENのGPIO端子は、プルアップされているものとプルダウンされているものが混在しています。[GPIO端子の設定](https://chirimen.org/docs/ja/board_connectors.html)を確認してみてください。
* GPIOを出力として使用する場合はそれほど問題になりませんが、入力として使用する場合は注意が必要です。
* 入力として使用する場合は、電子回路的にプルアップかプルダウンに統一して使用するか、CHIRIMENのGPIO端子の設定を前提としたソフトウェアを組むことで対応する必要があります。

## まとめ
GPIOが動かない時には
* コマンドラインからGPIO制御を行ってみて、ハードウェアに問題がないか確認する。
* WebGPIO polyfillがきちんと設定できているか確認する。
* GPIOのexport処理がきちんとできているか確認する。
* CHIRIMENのプルアップ/プルダウンの設定を確認する。
これでデバッグが捗ると思います。

将来的にはWebGPIO API側でこれらの確認やエラー処理ができるようにしていきたいものです。