Raspberry Pi Zero WはPi 3と同じように使える？IoTなnpmパッケージを試してみた！

[スイッチサイエンス](https://www.switch-science.com/)さんでRaspberry Pi Zero Wを手に入れたので、Raspberry Pi 3 Model Bとどの程度同じように使えるかを検証してみたいと思います。

<img width="480" alt="Small happiness, for you." src="https://qiita-image-store.s3.amazonaws.com/0/137045/724de0f7-7179-3828-f2d5-82724a8f3168.jpeg">

# 検証方法
僕はRaspberry Piで動く何かを作るとき、RaspbianにプリインストールされているPython 2系ではなくNode.jsを使うので、Node.jsを用いて検証したいと思います。

今回は、IoTに関連しそうなnpmパッケージを4つほど試してみたいと思います。

- [request](https://www.npmjs.com/package/request)
    - HTTP/HTTPS通信を行うためのクライアント
- [node-cec](https://www.npmjs.com/package/node-cec)
    - HDMI接続でテレビを制御したりテレビの状態を取得
- [node-nfcpy-id](https://www.npmjs.com/package/node-nfcpy-id)
    - SONY PaSoRiを利用しタッチされたICカードのIDを取得
- [onoff](https://www.npmjs.com/package/onoff)
    - GPIO上にあるLEDを制御


# 検証環境
- Raspberry Pi 3 Model B, Raspberry Pi Zero W
    - Raspbian Jessie Lite 2017-07-05
        - Raspberry Pi 3 Model Bと**同じイメージファイル**を使います
        - イメージをMicroSDに書き込んだ後、MicroSDのルートディレクトリに`ssh`という名前で空のファイルを作成
            - 詳しくは[Raspberry PiとMac or Windows PCを有線で直接繋いでさくっとSSH接続する](http://qiita.com/mascii/items/7d955395158d4231aef6)などを参照

# SSH接続、無線LAN接続をする
Raspberry Pi Zero WはUSBハブを利用しない限り、USB機器をひとつしか接続できないので、無線LAN経由でSSH接続をすることにします。
[Raspberry Piの無線LANをmicroSDで設定する](http://qiita.com/mascii/items/0d1a280ac58ed8f6f999)などを参考に、設定してください。

# Node.jsのインストール
Node.jsとnpmの最新版を[Raspberry PiにNode.jsとnpmの最新版をインストールする](http://qiita.com/mascii/items/77c685df65c4cbca9315)を参照してインストールします。
今回の検証に用いたNode.jsのバージョンは、 `v8.2.0` です。

# IoTなnpmパッケージを試す
## request
HTTP/HTTPS通信を行うためのクライアントです。
LINE NotifyなどのAPIを叩くために利用したり、[cheerio-httpcli](https://www.npmjs.com/package/cheerio-httpcli)といったスクレイピングモジュールで利用されていたりします。

### テストしたコード
以前にGitHubに公開した、async/awaitを使い順番を守ってLINE Notify経由で通知を送るテスト([mascii/async-await-line-notify](https://github.com/mascii/async-await-line-notify))を使用してみました

### 結果
<img width="150" alt="mark_maru.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/bd2a43d9-95fc-44e7-e0e0-8beba0311b41.png">
動きました！

<img width="240" alt="line_notify.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/950c8ecc-920c-3fd7-f827-9b9ff8281db6.png">

このリポジトリはmacOS Sierraでしか試していませんでしたが、Raspbian on Raspberry Pi Zero Wでも何も変更なく利用することができました。

## node-cec
以前に書いた[Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する](http://qiita.com/mascii/items/132c064c30e321dea911)という記事で紹介したnpmパッケージです。
HDMI接続でテレビを制御したりテレビの状態を取得することができます。

HDMI-CECに対応したモニターやテレビを持っていない(以前に記事を書いた際は実家のテレビを使用していました)ので、Nintendo SwitchとRaspberry PiをHDMI接続し、Nintendo Switchをドックにセットした際に発信される
 `REPORT_PHYSICAL_ADDRESS` という信号が捉えられるかで判断したいと思います。

### テストしたコード
以前にGitHubに公開した、Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認([mascii/raspberrypi-hdmi-cec](https://github.com/mascii/raspberrypi-hdmi-cec)) にある `hdmi.js` を `REPORT_PHYSICAL_ADDRESS` に対応させて使用します

### 結果
<img width="150" alt="mark_maru.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/bd2a43d9-95fc-44e7-e0e0-8beba0311b41.png">
`REPORT_PHYSICAL_ADDRESS` を捉えることができました！

## node-nfcpy-id
以前に僕が公開したnpmパッケージです。
[Raspberry PiとPaSoRiでICカードのIDを取得するnpmパッケージを作ってみた](http://qiita.com/mascii/items/ec79ad5a7026f771d181)

Python 2系で動作する [`nfcpy`](https://github.com/nfcpy/nfcpy)というライブラリを利用してICカードのIDを取得し、標準入出力を用いてNode.jsに渡しています。つまり `node-nfcpy-id` が動けば、 `nfcpy` も問題なく使えることを意味します。

<img width="480" alt="P7230615.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/137045/dd240952-56d5-b2fb-4db0-ef4f6eeaa360.jpeg">

### テストしたコード
[Raspberry PiとPaSoRiでICカードのIDを取得するnpmパッケージを作ってみた](http://qiita.com/mascii/items/ec79ad5a7026f771d181)の記事の中にある、 [`loop`モードの例](http://qiita.com/mascii/items/ec79ad5a7026f771d181#loop%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E4%BE%8B)を使用します

### 結果
<img width="150" alt="mark_maru.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/bd2a43d9-95fc-44e7-e0e0-8beba0311b41.png">

若干起動するのが遅かったですが、動きました！

## onoff
GPIO上にあるLEDを制御したりするのに利用します。

### テストしたコード
```JavaScript
const Gpio = require('onoff').Gpio;
const blue = new Gpio(22, 'out') // 22の部分は接続したピンによる
blue.writeSync(1);
```

### 結果
<img width="150" alt="mark_maru.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/bd2a43d9-95fc-44e7-e0e0-8beba0311b41.png">
動きました！

<img width="480" alt="P7230621.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/137045/5013cc0a-3fcc-bbc3-d9b1-cb26108d663c.jpeg">

[GPIOピンの穴の位置はRaspberry Pi 3と同じ](https://wiki.mchobby.be/index.php?title=Fichier:RASP-PIZERO-Correspondance-GPIO_v2.jpg)なので、[2×20 ピンヘッダ](http://akizukidenshi.com/catalog/g/gC-00080/)を半田付けすればRaspberry Pi 3と同じように利用できそうです(Raspberry Pi Zero Wには、まだ勿体なくて半田付けしてません)

# まとめ
記事投稿時(2017/07/23)、Raspberry Pi Zero Wでは[Raspberry PiにNode.jsとnpmの最新版をインストールする](http://qiita.com/mascii/items/77c685df65c4cbca9315)の記事の通りに `sudo n stable` でNode.jsをインストールしようとすると、CPUがARMv6系であることに起因すると思われるエラーが発生し、 `sudo n 8.2.0` に変更する必要がありましたが、このことと動作速度以外はほぼRaspberry Pi 3 Model Bと同じように使えそうなことがわかりました。

Raspberry Pi Zero Wには無線LANが搭載されているので、USBはPaSoRiだけ接続、GPIOにLEDを取り付けることで、ICカードによる簡易的な入室通知が**コンパクトに**実現できそうです。

Raspberry Pi Zero Wでなく、Raspberry Pi Zeroでも良いことになってしまいますが、docomo回線に対応している4GモデムのL-03D[^1]や3GモデムのL-05A[^2]をRaspberry Pi Zero接続して利用することが可能だそうなので、[Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する](http://qiita.com/mascii/items/132c064c30e321dea911)で紹介した、テレビを用いた「高齢者見守りデバイス」はRaspberry Pi Zero, Zero Wで十分実現できそうです。
![mimamori2.png](https://qiita-image-store.s3.amazonaws.com/0/137045/fa82ddd4-bc0c-1856-aae4-965a2c65e561.png)

[^1]: [Raspberry Pi ZERO + L-03D + IIJmioを使ってネットに接続する](http://tiger-star.net/raspberry-pi/807)
[^2]: [Raspberry Pi Zero + L-05A + SORACOM Air + GPSモジュールでFind My HogeHogeをつくる 〜その1〜](http://qiita.com/gates1de/items/074fd48173e68e8cd751)