IoTワークショップでRaspberry Piを使う

# イントロダクション

プログラミングやIoT、プロトタイピングなどをワークショップで学ぶためのツールとして「[Raspberry Pi](https://www.raspberrypi.org/)」を使用することが増えてきました。Raspberry Piは、クレジットカードサイズのコンピュータボードで、安価で入手できるパワフルな環境として世界中に普及しており、豊富な情報を入手できます。様々な制約があるワークショップにおいて、円滑に進めるための事前準備について簡単にまとめてみました。もし、もっと良い方法をご存じでしたら、コメント等で教えていただけると助かります。

## 想定する参加者

* MacOSまたはWindowsを普通に使うことはできる
* Raspberry Piは初めて使う
* PCの代わりではなくサーバまたは特定用途の専用機としてRaspberry Piを使いたい
* 総数は数名〜十数名程度、チームあたり1〜2名で数チームを編成

## 想定する環境

* Wi-Fiでインターネットに接続できる
* PCおよびRaspberry Piに必要な電源を確保できる
* 各自の作業に必要十分なスペースが確保されている
* プロジェクタまたは大型ディスプレイが利用できる

## 想定する制約事項

* スペースまたは予算の制限によりRaspberry Piごとにディスプレイやキーボード、マウスを用意することはできない
* Wi-Fiルータの設定にアクセスしたり、ワークショップのためだけに設定を変更したりすることはできない
* 講師以外のアシスタントはいない、もしくは1名程度でチーム毎に専属のアシスタントがサポートすることはできない

# 事前準備

## ハードウェア

* 各チーム毎
  * [Raspberry Pi 2 Model B](https://www.raspberrypi.org/products/raspberry-pi-2-model-b/)と無線LANアダプタ（例：PLANEX COMMUNICATIONSの[GW-USNANO2A](https://www.planex.co.jp/products/gw-usnano2a/)）、または[Raspberry Pi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)
  * マイクロSDカード（8GB以上）
  * USBケーブル（Aオス–マイクロBオス）
  * USB電源アダプタ
* 共通
  * コンパクトなHDMI接続のディスプレイ（例：センチュリーの[LCD-8000VH2B](http://www.century.co.jp/products/pc/monitor/lcd-8000vh2b.html)）
  * コンパクトなUSB接続のキーボード（例：GMYLEの[NPL710007](http://www.amazon.co.jp/dp/B00UY9F8HW)）

## MACアドレスの確認

### 無線LANアダプタの場合

次の図はGW-USNANO2Aの例で、本体に小さな字で刻印されています。Raspberry Pi本体に接続してしまうと読み取れなくなるので、最後の4桁（この例では5197）をメモしておきます。

![IMG_1572.JPG](https://qiita-image-store.s3.amazonaws.com/0/92577/b565033e-48f6-d819-c71a-855f228b3b9f.jpeg)

### Raspberry Pi 3 Model Bの場合

Raspberry Pi 3 Model Bのオンボード無線LANチップのMACアドレスに関しては、残念ながらシール等では記載されていないようです。面倒ですが、事前に有線LANで接続するなどしてMACアドレスを確認し、そのアドレスをシール等で記載しておくとよいでしょう。

以下はRaspberry Pi 3でのMACアドレスを確認した際の例です。この中で`HWaddr`として表示されるのがWi-FiモデムのMACアドレスで、上位6バイト（b8:27:eb）はRaspberry Pi FoundationのベンダーIDなので全てのRaspberry Pi 3で同じです。下位6バイトがデバイス毎に異なるため、この6バイト（以下の例では12:34:56）をメモしておけばよいでしょう。

```shell-session:MACアドレスの確認
$ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr b8:27:eb:12:34:56  
          inet addr:192.168.1.25  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::321e:d0af:f60b:b201/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:10548 errors:0 dropped:1532 overruns:0 frame:0
          TX packets:2102 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:5898932 (5.6 MiB)  TX bytes:280956 (274.3 KiB)
```

## PC側での準備

### Windows 10よりも前のWindowsの場合

後の手順で紹介する「ホスト名.local」でのアクセスに必要となるため、Windows 10よりも前のWindows（例：Windows 8）を使用している場合には[Bonjour Print Services](https://support.apple.com/kb/DL999)もしくは[iTunes for Windows](http://www.apple.com/jp/itunes/download/)をインストールします。IPアドレスで指定する場合にはこれらのアプリケーションのインストールは不要です。

# Raspberry Piの設定

## 基本設定

1. RASPBIAN JESSIE (May 2016)を[公式サイトのダウンロードページ](https://www.raspberrypi.org/downloads/raspbian/)からダウンロードして[公式サイトで紹介されている手順](https://www.raspberrypi.org/documentation/installation/installing-images/mac.md)に従ってマイクロSDカードにコピー
  * MacOSでGUIから操作したい場合には[ApplePi Baker](http://www.tweaking4all.com/hardware/raspberry-pi/macosx-apple-pi-baker/)が便利
2. `/boot/`に`wpa_supplicant.conf`という名前のファイルを作成してアクセスポイントの情報を追記[^1]
3. マイクロSDカードをイジェクトし、Raspberry Piに挿入して起動し1分間程度待つ
4. PC上で`arp -a`コマンドを実行して同じWi-Fiルータに接続しているデバイスのMACアドレスとIPアドレスのリストを取得する
5. 取得したリストと事前に確認したMACアドレスを照合し、それぞれのRaspberry Piに割り振られたIPアドレスを取得する
6. PC上でターミナルを起動し、`ssh pi@192.168.1.23`のようにしてSSHでそれぞれのアドレスに接続する
7. `sudo raspi-config`でRaspberry Pi Software Configuration Toolを起動する
8. `5 Internationalisation Options`＞`I2 Change Timezone`で現在地を選択（例：Asia→Tokyo）する
9. `9 Advanced Options`＞`A2 Hostname`でホスト名をデフォルトの「raspberrypi」から変更する（例：team-1-pi、使用できる文字はaからzまでのASCII文字と数字、ハイフンのみ）
10. escキーでRaspberry Pi Software Configuration Toolを終了する
11. `sudo apt-get update`および`sudo apt-get upgrade`を実行する[^2]
12. `sudo reboot`で再起動する

[^1]: [RASPBIAN JESSIE (May 2016)から追加された](https://www.raspberrypi.org/blog/another-update-raspbian/)もので、`/boot/wpa_supplicant.conf`として作成したファイルは、初回起動時に`/etc/wpa_supplicant/`に移動され、無線LANが有効になると共に指定したアクセスポイントに自動的に接続される。もしもこれで上手くいかない場合には、一時的にディスプレイとキーボードを接続し、[公式サイトの説明](https://www.raspberrypi.org/documentation/configuration/wireless/)に従ってGUIで設定するのがいちばん早いかもしれない。

[^2]: ここで`sudo rpi-update`してファームウェアを最新のものに更新することを推奨している記事が多数ある。しかしながら、最新のファームウェアに対応していないアプリケーションもあるため、特に理由がない限りは闇雲に最新のものに更新しない方がいいかもしれない。

以下はWPA2パーソナル（WPA2-PSK）環境でのwpa_supplicant.confの例です。

```control:wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="YOUR_SSID"
        psk="YOUR_PASS"
        key_mgmt=WPA-PSK
}
```

一時的にディスプレイとキーボードを接続し、[公式サイトの説明](https://www.raspberrypi.org/documentation/configuration/wireless/)に従ってGUIで設定した後、/etc/wpa_supplicant/wpa_supplicant.confとして生成されたファイルを利用すると簡単でしょう。なお、このままではパスフレーズが平文で記載されてしまっているため、以下のようにして生成した文字列をpskとして指定した方が良いでしょう（ssidには二重引用符が必要なのにpskには不要なので注意）。

```shell-session
sudo wpa_passphrase <SSID> <PASSPHRASE>
```

以下は`arp -a`でPCが接続しているWi-Fiルータに接続中のデバイスのリストを取得した際の例です。この例では、192.168.1.23がRaspberry Piです。

```shell-session
$ arp -a
...
? (192.168.1.23) at 0:**:**:**:51:97 on en0 ifscope [ethernet]
...
```

```shell-session:SSHでのログイン例
$ ssh pi@192.168.1.23
pi@192.168.1.23's password:パスワード（初期設定はraspberry）

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Apr 30 10:44:57 2016 from 2001:a451:1:4000:8638:35ff:fe4b:845a
```

![raspi-config-hostname.png](https://qiita-image-store.s3.amazonaws.com/0/92577/d64590d0-da9a-bd8b-7bf7-34fe610720ff.png)
図：ホスト名の設定画面例。ここではASCII文字と数字、ハイフン以外も入力できてしまうので注意。


```shell-session:SSHログイン後のアップデート
$ sudo apt-get update
$ sudo apt-get upgrade
```

## Sambaのセットアップ

SambaはWindowsネットワークの実装の1つです。Raspberry PiにSambaをセットアップしてファイルサーバにすることで、MacOSやWindowsからアクセスしてファイルをやりとりしたり、Raspberry Pi上のファイルをPC上のテキストエディタで編集したりできるようになります。

1. `sudo apt-get -y install samba`でSambaをインストールする
2. `sudo nano /etc/samba/smb.conf`で設定ファイルを開く
3. Global Settingsの[global]に`unix charset = UTF-8`と`dos charset = CP932`の2行を追加する
4. Share Definitionsの`read only = yes`を`read only = no`に、`create mask = 0700`を`create mask = 0664`に、`directory mask = 0700`を`directory mask = 0775`に変更する
5. Ctrl-OとCtrl-Xで設定ファイルを保存する
6. `sudo smbpasswd -a pi`で新規ユーザを追加する
7. `sudo service smbd restart`でSambaを再起動する

```
#======================= Global Settings =======================

[global]
unix charset = UTF-8
dos charset = CP932
```

```
#======================= Share Definitions =======================

[homes]
   comment = Home Directories
   browseable = no

# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
   read only = no

# File creation mask is set to 0700 for security reasons. If you want to
# create files with group=rw permissions, set next parameter to 0775.
   create mask = 0664

# Directory creation mask is set to 0700 for security reasons. If you want to
# create dirs. with group=rw permissions, set next parameter to 0775.
   directory mask = 0775
```

```shell-session:新規ユーザの追加
$ sudo smbpasswd -a pi
New SMB password:
Retype new SMB password:
```

![スクリーンショット 2016-05-15 10.01.25.png](https://qiita-image-store.s3.amazonaws.com/0/92577/e26a54ac-33fc-2f54-fd5d-05204a7c30a1.png)

![スクリーンショット 2016-05-15 10.01.34.png](https://qiita-image-store.s3.amazonaws.com/0/92577/c6f3f26e-ecb8-e476-27d3-bd023680ffac.png)

## Netatalk

もし使用するのがmacOSだけであれば、sambaよりもNetatalkの方が簡単です。以下のようにしてインストールし、Finderの［移動］→［サーバへ接続…］で表示されるダイアログに`afp://kotobukipi.local/`のように入力し、Raspberry Piのユーザ名とパスワードを入力することでFinderからアクセスできます。

```bash
$ sudo apt-get install netatalk
```

# その他

## 環境の複製

ワークショップ全体の時間によっては、上記のような設定を全て行うことが難しいかもしれません。その場合には、1台のRaspberry Piであらかじめ必要とされる環境構築を済ませ、その環境をSDカードにコピーすることで時間を大幅に短縮できます。手順は以下の通りです。

1. マイクロSDカードを挿入したUSBカードリーダーをUSBポートに接続する
2. メニューのAccessoriesからSD Card Copierを起動する
3. コピー元（Copy From Device）に「Internal SD Card」を、コピー先（Copy To Device）にUSBカードリーダー（例：Generic- USB3.0 CRW -SD）を選択する
4. 「Start」ボタンを押して実行する

![2016-05-15-100616_465x180_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/92577/e4b5abdb-8ad7-0a4f-a59f-19fbc9c983d3.png)

![2016-05-15-100654_314x175_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/92577/47b761ac-98ca-2f67-0911-13cd552842f9.png)

![2016-05-15-100933_314x175_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/92577/eef6fa7e-d7aa-05da-4ad9-4d5bb760c63e.png)

![2016-05-15-102256_314x175_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/92577/30322b9e-0c76-afcc-76a8-46c9da217780.png)

なお、所要時間はそれなりに（8GBのSDに対して実測した際で約15分）かかるため、多数のSDカードを準備する場合にはそれなりの準備時間を想定しておく必要があるでしょう。

# トラブルシューティング

## SSHでログインしようとした際に警告が表示されてログインできない

このエラーは、OSをインストールし直した場合など、以前に接続したことがあるホストに接続した際、そのホストがクラックされたのではないか、ということで警告が表示されることがあります。この場合には、適当なテキストエディタで`/Users/username/.ssh/known_hosts`を開き、そのファイルから該当するホスト（この例では192.168.1.23）の情報が含まれた行を削除するとログインできるようになります。

```shell-session:SSHでセキュリティに関する警告が表示された例
$ ssh pi@192.168.1.23
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:********************************/**********.
Please contact your system administrator.
Add correct host key in /Users/username/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/username/.ssh/known_hosts:15
ECDSA host key for 192.168.1.23 has changed and you have requested strict checking.
Host key verification failed.
```

## ホスト名.localでの接続が不安定

`sudo nano /etc/avahi/avahi-daemon.conf`でavahi-daemonの設定ファイルを開き、以下のようにuse-iff-runningをyesに設定すると解決する場合があります。

```
[server]
...
use-ipv4=yes
use-ipv6=yes
...
use-iff-running=yes
```

## SSHでの反応が時々鈍くなる

この例で使用しているGW-USNANO2Aなど、一部のUSB無線LANアダプタに対してはデフォルトで省電力モードが有効になっているため、一定時間操作しなかった場合などに無線LANアダプタがスリープし、そこからの復帰に少し時間がかかる場合があります。以下のようにして設定ファイルを作成し、設定を記入することにより、次回起動時からスリープしないようになります。

```shell-session
$ sudo nano /etc/modprobe.d/8192cu.conf
```

```control
# Disable power management
options 8192cu rtw_power_mgnt=0 rtw_enusbss=0 rtw_ips_mode=1
```

# リファレンス

* [THE LATEST UPDATE TO RASPBIAN](https://www.raspberrypi.org/blog/another-update-raspbian/)
* [ツール・ラボ＞電子工作入門＞RaspberryPi電子工作入門＞第14回Raspberry Piのファイルサーバ設定をする](https://tool-lab.com/make/raspberrypi-startup-14/)
* [Raspberry PiでIoTなIT:新しく認識されたインターフェースをavahiに自動的に認識させる](http://www.homu.net/raspberry-pi%E3%81%A7iot%E3%81%AAit%E6%96%B0%E3%81%97%E3%81%8F%E8%AA%8D%E8%AD%98%E3%81%95%E3%82%8C%E3%81%9F%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%82%92avahi/)