Raspberry Pi Zero (W) + USB セルラーモデムで SORACOM に接続する

## Raspberry Pi Zero (W) にセルラーネットワークを！

Raspberry Pi Zero (W 含む) ※でセルラーネットワークを使う例を見つけられなかったので試してみました

※以下、RPi Zero と表記します

ちなみに： ~~試してないのですが Raspberry Pi Zero (Wi-Fi や Bluetooth が無いモデル) でも動くはずですので、~~ → Raspberry Pi Zero でも動きました！ (4/9)

* (2019/12/27 追記) オンデマンド・リモートアクセスサービス SORACOM Napter について追記してあります

## TL;DR

下記の組み合わせで動きました

| Raspberry Pi | OS | USB セルラーモデム | SIM |
|--------------|----|-------------------|-----|
| RPi Zero       | Raspbian Stretch Lite (March 2018) | [AK-020](https://soracom.jp/products/ak-020/) | [日本向け SORACOM Air SIM](https://soracom.jp/services/air/cellular/price/) |
| RPi Zero       | Raspbian Stretch Lite (March 2018) | [MS2131i-8](https://soracom.jp/products/ms2131i8/) | [日本向け SORACOM Air SIM](https://soracom.jp/services/air/cellular/price/) |
| RPi Zero       | Raspbian Stretch Lite (March 2018) | [MS2131i-8](https://soracom.jp/products/ms2131i8/) | [ **グローバル向け** SORACOM Air SIM](https://soracom.jp/services/air/cellular/price_global/) |

- 実は「グローバル向け SIM」は、日本国内でも使うことができるんです

図は一番最初の組み合わせ (RPi Zero + AK-020) の接続の様子です。ちなみに GPIO に刺さっているのはシリアルコンソール用のケーブルです

![IMG_0617.JPG](https://qiita-image-store.s3.amazonaws.com/0/22754/9885f2e2-96b2-5a71-0943-f71fb715f596.jpeg)

## やり方

SORACOM のサイトに掲載されている [Raspberry Pi ＋ USB モデム で動かす](https://dev.soracom.io/jp/start/device_setting/#raspi_usb) の手順で動きます（あっさり）

### TIPS

RPi Zero を利用する際には **USB OTG によるネットワークアクセスの有効化** と **GPIO によるシリアルコンソールの有効化** をしておくと非常に便利です

### USB OTG によるネットワークアクセスの有効化

RPi Zero は USB OTG (On-The-Go) に対応しています
※なぜか 3 とかは対応していない...

細かい話は [Windows10でRaspberry Pi Zero (W) をOTGを使ってセットアップする](https://qiita.com/msquare33/items/dc6fc9098f50d9b9dbf2) をご覧ください

```:bootパーティション/cmdline.txtを変更
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=a8fe70f4-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet init=/usr/lib/raspi-config/init_resize.sh
```

※ ` modules-load=dwc2,g_ether` が追加されている

```:bootパーティション/config.txtへ追記
# USB Gadget
dtoverlay=dwc2
```

### GPIO によるシリアルコンソールを有効化

USB OTG を利用すると、USB ポートを占有してしまいます（あたりまえ）
この状態では USB セルラーモデムを使えませんが、逆にモデムを使おうとするとコンソールが使えなくなるという、渋い状況になってしまいます※

そのためシリアルコンソールを使えるようにしておくと便利です

```:bootパーティション/config.txtへ追記
# OnBoard Serial
dtoverlay=pi3-miniuart-bt
```

※若干お金はかかりますが [SORACOM Gate](https://soracom.jp/services/gate/) や [Public Gate](https://dev.soracom.io/jp/docs/public_gate/) を使えば ssh 等のリモートアクセスは可能です

USB OTG と GPIO シリアルコンソールを有効にした `config.txt` の末尾は以下の通りになってるはずです

```:bootパーティション/config.txtの末尾
# USB Gadget
dtoverlay=dwc2
# OnBoard Serial
dtoverlay=pi3-miniuart-bt
```

### `setup_air.sh` の実行について

[手順](https://dev.soracom.io/jp/start/device_setting/#raspi_usb)では _USB セルラーモデムを接続してから `setup_air.sh` を実行する_ となっていますが、実はどんな状態でも `setup_air.sh` は実行可能ですので、 USB OTG で接続した状態 (= USB セルラーモデムは接続していなくても) `setup_air.sh` を実行しても大丈夫です

ただし必要なソフトウェア (wvdial などの deb パッケージ) をダウンロードしますので PRi Zero からインターネットに接続できるようにはしておいてください

たとえば USB OTG で接続した状態でPCやMacの[インターネット共有を利用すれば](https://qiita.com/mascii/items/7d955395158d4231aef6#windows-1)インターネットに出られます

Raspberry Pi Zero W であれば `wpa_supplicant.conf` による Wi-Fi 接続も有効な方法です

## 消費電力について

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">RaPi Zero WにUSBドングル刺したら電源足りなくて落ちるって聞いたことあるけど普通に動くのか。知見。 <a href="https://t.co/0cknHPMrlO">https://t.co/0cknHPMrlO</a></p>&mdash; masato_ka (@masato_ka) <a href="https://twitter.com/masato_ka/status/983329119181012992?ref_src=twsrc%5Etfw">2018年4月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ちょっと心配になったので [簡易電力計](https://www.amazon.co.jp/gp/product/B01N6PVU9R) で RPi Zero の消費電力を計ってみました

### 計測環境 (AK-020);
Raspberry Pi Zero W + Raspbian Stretch Lite (March 2018) + AK-020

| 操作       | max    | avg    |
|------------|-------:|-------:|
| `apt update` | 0.41 A | 0.32 A |
| `curl -o /dev/null ubuntu.iso` | 0.36 A | 0.32 A |

### 計測環境 (MS2131i-8);
Raspberry Pi Zero W + Raspbian Stretch Lite (March 2018) + MS2131i-8

| 操作       | max    | avg    |
|------------|-------:|-------:|
| `apt update` | 0.36 A | 0.30 A |
| `curl -o /dev/null ubuntu.iso` | 0.36 A | 0.30 A |

* max や avg はそれぞれ、目視してた時の最大とそこそこの平均になります

AL-020 の方がちょっと高めでしょうか。通信側の負荷と共に OS やディスクに対するアクセスもありますので高めですね
とはいえ、このくらいなら連続運用や負荷が高くなっても大丈夫そうです
加えて `setup_air.sh` を使ってセットアップしたのならば、再起動時に接続してくれるようになるので、 crontab あたりに `@reboot` エントリーを書いておいて通知させるのもいいのではないでしょうか（ちょっと弱腰）

## 設置後のメンテは？ / SORACOM Napter

Raspberry Pi Zero は USB ポートが1つしかありません。そのため、セルラーモデムをつなげてしまうと、OTG 経由でログインできないので、メンテナンスどうする？という課題が発生します。

が、2019年7月の新サービス「SORACOM Napter」を利用することで、セルラー通信している Raspberry Pi Zero に SSH 等でログインすることができるようになりました。

利用方法は [SORACOM Napter を利用してIoTデバイスにSSHログインする](https://dev.soracom.io/jp/start/napter_ssh/) をご覧ください。無料枠があります！

## あとがき

Raspberry Pi Zero (無印) が家に転がっててよかった。

EoT