Raspberry Pi Zero WでJupyter Notebookを起動し、MacからUSB経由でPythonコードでLチカする

# 1. 背景

初心者でもお手軽に、Raspberry Pi Zero W上でPythonプログラムでLEDを光らせられる環境を構築する。作るまではある程度手間だけど、できてしまえばUSB接続したRaspberry PiをJupyter NotebookのPythonプログラムで操作できる。

前提となる環境は以下の通り。

* Raspberry Pi Zero W
* ホストはMac
* USB接続

USB接続にこだわったのは、使用環境がネットワークに依存しないようにしたかったから。

Windows10でもできるように検討したが、現状ではUSB接続にするとドライバのインストールや設定が大変で、とてもでないが初心者にオススメできないので諦めた。できなくはないが、普通にできても時間がかかる。簡単な方法があれば教えて欲しい。

# 2. SDカードの準備

## 2-1. イメージの取得

今回はこれを使う。
RASPBIAN Buster LITE
https://www.raspberrypi.org/downloads/raspbian/

## 2-2. SDカードにイメージを書き込む

SDカードをスロットに挿入する。

```
diskutil list
```

でSDカードのデバイスを調べてから、以下のコマンドを実行。
以降、SDカードのデバイスは`/dev/disk2`として説明する。

```
sudo diskutil umountDisk /dev/disk2
sudo dd bs=1m if=./2019-07-10-raspbian-buster-lite.img of=/dev/disk2
```
自分のマシンでだいたい4分ちょっとかかった。

bootディスクがマウントされていればOK

## 2-3. ネットワークの設定

### SSHを有効にする

以下のコマンドを実行。

```
touch /Volumes/boot/ssh
```

### USB経由のインターネット接続を有効にする

vi /Volumes/boot/cmdline.txt
でファイルを編集する。以下のように、rootwaitの後ろに
`modules-load=dwc2,g_ether`を挿入する。

```
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=17869 b7d-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet init    =/usr/lib/raspi-config/init_resize.sh
```

また、以下のコマンドを実行する。

```
echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt
```

### マウント解除してSDカードを抜き取る

マウントの解除は以下のコマンド。

```
sudo diskutil umountDisk /dev/disk2
```

# 3. Raspberry Pi Zero(W)の起動

* SDカードをRaspberry Pi Zero(W)に挿入する
* USB接続でMacにつなぐ（電源が入る）

以下のコマンドでログインできる

```
ssh pi@raspberrypi.local
```

パスワードはデフォルトで`raspberry`。

#  4. Raspberry Pi Zero(W)の設定

ここからはRaspberry Piの上で作業。

## 4-1. ディスクの拡張
以下のコマンドを実行する。

```
sudo raspi-config  --expand-rootfs
```

ここでリブートするようにメッセージ表示されるのでリブートする。
リブートは以下のコマンド。

```
sudo reboot
```

## 4-2. ホスト名を変更する

sshでデフォルトのraspberrypi.localでログインしているが、複数のRaspberry Piを接続すると衝突するため、重ならないホスト名を設定する。
ここでは`raspi0`というホスト名にするため、以下のコマンドを実行する。

```
sudo raspi-config nonint do_hostname raspi0
```

変更の確認は/etc/hostnameの中を見る。

```
cat /etc/hostname
```

再起動しないと、hostnameコマンドでは古いホスト名が表示される。必ずリブートすること。

```
sudo reboot
```

次からは以下のコマンドでログインできる。

```
ssh pi@raspi0.local
```

##  4-3. WiFiの設定

raspberry.localからMacOSを介してインターネット接続を試みるがうまくいかず。WiFiでネットワークに接続してなんとかaptとかpipを使えるようにした。

```
sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
```

以下のように　入力して保存。

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
     ssid="SSID-NAME"
     psk="PASSWORD"
}
```

SSID-NAMEとPASSWORDは適宜入力すること
WiFiを有効にするため、再起動する。

```
sudo reboot
```

補足）~~ここは再起動しなくても、以下のコマンドでいいかも（未確認）~~
以下を実行するとエラーになったので、素直にrebootした方がいい。

```
sudo wpa_cli -i wlan0 reconfigure
sudo dhclient wlan0
```

## 4-4. システムのアップデート
以下のコマンドを入力する。

```
sudo apt update
sudo apt upgrade
```

## 4-5. PythonからGPIOを制御するパッケージをインストール
以下のコマンドを実行する。

```
sudo apt install python-rpi.gpio
sudo apt install -y python3-pip
pip3 install RPi.GPIO
```

## 4-6. Jupyterをインストールする

以下のコマンドを実行する。

```
pip3 install jupyter
jupyter notebook --generate-config
```

`.jupyter/jupyter_notebook_config.py`を以下のように修正する。

```
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.notebook_dir = '/home/pi/jupyter_notebook'
c.NotebookApp.token = 'password'
```

passwordの部分は適当なパスワード文字列にすること

## 4-7. Jupyter Notebookを起動する

以下のコマンドを入力する。

```
mkdir /home/pi/jupyter_notebook
cd /home/pi/jupyter_notebook
jupyter notebook
```

Macからhttp://raspi0.local:8888 をアクセスする。

ここまでで、参考文献(4)で紹介されているPythonプログラムが実行できるはず。

# 5. 課題

* Jupyter Notebookを自動起動
* Windows10にも対応（一旦あきらめたけど）

追記
Windows10とRaspberry Piの接続で、LANケーブルで直接接続できる（Raspberry Pi 2とか3とか）なら以下の方法で接続できた。
http://moguno.hatenablog.jp/entry/2015/09/12/100231

# 6. 参考文献

(1) Raspberry Pi Zero(W, WH)のセットアップ
https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573

(2) 必要最小限でRaspberry PiにJupyter (Python3)をInstallする方法（2018-08-10）
https://qiita.com/iton/items/1bd670bc84f264024d5d

(3) Raspberry pi 喋らせよう jupyter note で試す
https://qiita.com/hiratarich/items/a829f2550ecf5e3ca206

(4) GPIOでLEDの点滅(Python)
http://make.bcde.jp/raspberry-pi/gpioでledの点滅python/