ラズパイを10分間隔で起動して3G経由でツイートさせてみた

[前回](http://qiita.com/MechaTrax/items/7624cde463f4f66ae5d6 "SORACOM Airと太陽光パネルで完全スタンドアローンな計測システム")からだいぶ時間が空いてしまいました、メカトラックスの永里です。
今回、フリーランスエンジニアの大嶺さんのご協力を頂き、3GPI（ラズパイ用3G通信モジュール）とslee-Pi（ラズパイ用電源管理モジュール）を使用した、ラズパイの間欠動作＆3G通信についてまとめて頂きました。3GPIとslee-Piの連携動作の記事は殆ど無いのでご参考になれば幸いです！

*尚、文中の機材一式（IoTスタータキット）は近日中にハッカソン等イベントへの無償貸し出しならびに一般販売を予定しています。詳細はしばしお待ちください。。。*

***

はじめまして。フリーランスエンジニアをやっています[タイガースターの大嶺](http://tiger-star.net/ "Tiger Star")と申します。
今日はメカトラックス社様から、近日リリース予定のIoTスタータキットを借りる事ができたので軽く触ってみようと思います。
![IoTスターターキット内容](https://qiita-image-store.s3.amazonaws.com/0/100149/0c4e1b75-1906-29f1-a5dc-5fb6cb29a71d.jpeg "IoTスターターキット内容")
IoTスターターキットを開封したところ


# キットの内容
IoTスターターキットは下記の機材で構成されています。
今回は同梱されている3GPIとslee-Piを使って簡単なアプリを作ってみます。

* Raspberry Pi3本体
* 3GPI(Raspberry Pi 向け3G通信モジュール)
* slee-Pi(Raspberry Pi 向け電源管理モジュール)
* SDカード（OS等インストール済）
* ACアダプタ、コード、ネジ等備品

![IoTスターターキット組立](https://qiita-image-store.s3.amazonaws.com/0/100149/898093df-34c0-6157-7a50-2f0c8e880363.jpeg "組み立てた様子")
工具等は必要なく、ポン付けでOKです。
特に説明なくとも組み立ては問題ないかと思います。何かレゴみたいですね。

# 3GPIでネットに接続する
まずは3GPIを使ってネットへ接続できるよう設定を行います。
*（補足）以下のSIMカード挿入、SDカード挿入は電源を入れない状態で行ってください*

まずは、SIMカードを挿入します。今回は[SORACOM](https://soracom.jp/ "SORACOM")社のSORACOM Air SIMを使用しました。

SIMカード挿入
![SIMカード挿入](https://qiita-image-store.s3.amazonaws.com/0/100149/2149b8bb-5124-ee3a-873b-1ec9591e2be8.jpeg "SIMカードを差し込む")
SIMカードの差し込み口だけ少し戸惑いました。
カバーが開くようになっていますので、開いた後SIMカードを差し込みます。

SIMカード止める
![SIMカード止める](https://qiita-image-store.s3.amazonaws.com/0/100149/e2714075-92b1-97a4-929b-fb6a8d07fc74.jpeg "SIMカードを止める")
SIMカードを差し込んだ後はパチンと閉じましょう。
大きさは標準SIMなので購入時にはサイズに注意してください。
同梱されているSDカードには既にOS（raspbian）と必要なソフトがインストールされていますので、SDカードをラズパイに差し込んで電源を入れます。

USB接続の3Gモデム等を使う場合、モデムを繋いだ後ドライバを入れたり設定をあーだこーだする必要があるのですが、3GPIを使用する場合は下記の設定1つで済みます。
*（補足）後述のとおり、SORACOM Air SIMを使用する場合、この設定も不要です*

## 3GPI接続設定
### APN設定

今回はSORACOM Airを使用したのでAPN設定は下記になります。

* APN: soracom.io
* ユーザー名: sora
* パスワード: sora

[メカトラックス社の3GPIドキュメント](https://github.com/mechatrax/3gpi/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2#21-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A)のアクセスポイントの設定を参考に、以下のように設定します。

`sudo nmcli con add type gsm ifname "*" con-name soracom apn soracom.io user sora `

*（補足）SORACOM Airに関しては、同梱SDカードにて、既に上記APN設定が済んでおり、ここに記載されているAPN設定は不要です*

### 接続確認
設定が終わったらifconfigを叩いて確認します。

`ifconfig`

```bash
eth0      Link encap:Ethernet  HWaddr b8:27:eb:b9:70:7a  
          inet addr:192.168.1.17  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: 2001:a43d:2133:0:ba27:ebff:feb9:707a/64 Scope:Global
          inet6 addr: fe80::ba27:ebff:feb9:707a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1185 errors:0 dropped:0 overruns:0 frame:0
          TX packets:241 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:65972 (64.4 KiB)  TX bytes:27276 (26.6 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:10.131.223.78  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:152 errors:0 dropped:0 overruns:0 frame:0
          TX packets:195 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
```

ppp0にIPが割り振られていれば成功です。組み立て後コマンド一発で3G接続ができるようになりました！
他にも安いUSBモデム等も沢山ありますが、市販されているUSBモデムは大抵がWindowsのノートパソコン用に作られており、ラズパイで使用する場合は**頑張れば使える**類のものです。
ネットを漁れば色々と文献は出てきますが、型番やバージョン違いで上手くいかなかったりで時間を取られる事も珍しくありません。

その点3GPIは完全にラズパイ専用に作られていますので、ほぼ悩む事ないでしょう。
**値段は少しお高いですが**検討する価値は十分にあると思います。
*（補足）値段は少しお高いですが。。。orz*

## IPv6を止める
aptで何かインストールしたりする時、IPv6を見に行って遅かったりするので無効にしてしまいます。

`sudo vi /etc/sysctl.conf`

下記設定を追記

```bash
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```

設定を反映

`sudo sysctl -p`


## ツイッターでつぶやいてみる
ネット接続ができようになりましたのでラズパイからツイッターでつぶやいてみます。

まずはtwitter gemをインストールします。

`sudo gem install twitter`

つぶやきを行うrubyプログラムを作成します。

`vi tweet.rb`

```ruby
require 'twitter'

# ツイッターのAPIキー
CONSUMER_KEY     = "xxxxxx"
CONSUMER_SECRET  = "xxxxxx"
ACCESS_TOKEN_KEY = "xxxxxx"
ACCESS_SECRET    = "xxxxxx"
 
begin
  client = Twitter::REST::Client.new do |config|
    config.consumer_key       = CONSUMER_KEY
    config.consumer_secret    = CONSUMER_SECRET
    config.access_token       = ACCESS_TOKEN_KEY
    config.access_token_secret = ACCESS_SECRET
  end
 
  # ツイート
  client.update("テストなぅ #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}")

rescue => e
  STDERR.puts "[EXCEPTION] " + e.to_s
  exit 1
end
```


ツイッターのAPIキー取得方法については割愛しています。
ファイルを保存したら一度実行してみます。

`ruby tweet.rb`

![つぶやき](https://qiita-image-store.s3.amazonaws.com/0/100149/b48a4e60-a354-32bf-5219-d60c9784d103.jpeg "つぶやくことに成功")
つぶやきました。


## 起動時につぶやく
ラズパイ起動時に自動的につぶやくよう設定します。

`sudo vi /etc/rc.local`

```bash
sleep 30
ruby /home/pi/tweet.rb
```

ここで少しハマったのですが、起動時にノータイムでつぶやくスクリプトを実行するとネットワーク設定が有効になっていないようでネット接続エラーとなります。
3GPIの起動が結構時間かかるようなので、かなり多めに30秒ほどsleepを入れます。
*（補足）キャリアとの通信セッション確立に所要の時間が必要となってます*

`sudo reboot`

再起動したら新しくつぶやきが追加されている事を確認します。

![つぶやき2](https://qiita-image-store.s3.amazonaws.com/0/100149/dc5684d7-70f4-216a-8ee1-52bcb080133d.jpeg "ラズパイ起動時に自動でつぶやく事に成功")
つぶやきました！


# slee-Piを使って電源をON/OFFする
次にslee-Piを使ってラズパイ本体の電源をON/OFFしてみます。

[メカトラックス社のslee-Piドキュメント](https://github.com/mechatrax/slee-pi/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2#1-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従って必要なソフトをインストールします

```bash
sudo bash -c 'echo "deb http://mechatrax.github.io/sleepi ./" > /etc/apt/sources.list.d/sleepi.list'
sudo apt-get update
sudo apt-get install sleepi-archive-keyring
sudo apt-get install sleepi-firmware sleepi-utils sleepi-monitor
sudo reboot
```

ソフトのインストールが終わったらslee-Piの時計を合わせます。

```bash
sudo hwclock -w
sudo reboot`
```


次にコマンドラインで5分後に電源を入れるようアラームを設定してシャットダウンしてみます。

```bash
sudo sleepictl --set alarm "+5min"
sudo poweroff
```

![電源ON](https://qiita-image-store.s3.amazonaws.com/0/100149/d8796eed-7bc8-fe7c-94ad-486ce9403077.jpeg "電源が投入された")
5分後、slee-Piにより自動的に電源が投入されました！


# 3GPI + slee-Piを使ってツイッターでつぶやき続ける
3G接続と電源の操作が出来るようになりましたので、10分毎に自動ツイートを行いシャットダウンするよう設定してみます。
電源入れっぱなしで10分毎にプログラムを動かすのはcronなりを使えばすぐ出来ますが、今回は**つぶやく時だけ電源を入れる**事で電力消費を抑える事を目的とします。

起動時のスクリプトを修正します

`sudo vi /etc/rc.local`

```bash
sleep 30
ruby /home/pi/tweet.rb &
sleepictl --set alarm "+10min"

sleep 90 #←重要

poweroff
```

まず起動時につぶやきを行い、10分後に電源を再投入するようアラームをセットした後シャットダウンを行います。
注意点はラズパイ起動後、自動的にシャットダウンするスクリプトになっていますので**シャットダウン前に少しスリープを入れておきましょう。**
スリープが無い場合、**起動と同時にシャットダウンし続けるラズパイになってしまいます。**

やらかしてしまった人はシングルユーザーモードで/etc/rc.localを修正してください。筆者も一度やらかしました。

設定できたら再起動します。

`sudo reboot`

![つぶやき結果](https://qiita-image-store.s3.amazonaws.com/0/100149/c5ac5319-31c0-0fe0-6656-596293cf6a96.jpeg "10分おきにつぶやいてます")
再起動後、暫く放っておくと10分おきにつぶやいてる事を確認できました

# まとめ
以上で3G回線によるネット接続と、電源操作をカンタンに行える事を確認できました。

必要な時だけ電源ONにすることが出来るので限られたバッテリー等で稼働させる場合、消費電力をギリギリまで抑える事ができそうです。

ソーラーパネルやカメラ、各種センサー等と組み合わると非常に面白いキットなのではないかと思います。

***
以上です、大嶺さんありがとうございました。
基本的に原文そのままですが、一部*斜体*にて永里より補足を入れさせてもらってます！