Raspberry Pi 3 コンソールのみ(ヘッドレス)でRaspbianセットアップからLチカまで

本記事では、Raspberry Pi 3のOSインストール、SSHまたはシリアルコンソールによるログイン、Wi-FiやSSHのセットアップ、そしてPythonによるLチカと、Raspberry Piを使い始めるのに必須な項目をまとめました。入門記事などではRaspberry Piにモニターとキーボードを接続した状態でのセットアップの解説も多いですが、ここでは余っているモニターやキーボードがなくてもセットアップが完了する方法を解説します。

本記事で私が用いた環境は以下の通りです。

- OS(ホストPC): Windows10 Home
- Raspberry Piの種類: Raspberry Pi 3 Model B
- OS(Raspberry Pi): Raspbian Lite stretch(9.1)

# OSイメージが焼かれたMicro SDカードの用意

Raspberry Pi 3は、Micro SDカードにOSのイメージを書き込み、それを差し込むことで起動するようになります。まずはOSイメージが書き込まれたMicro SDカードを用意します。

## OSの選定

Raspberry Piでは何種類ものOSが利用可能ですが、ここでは最もベーシックなRaspbianを選択します。著名なLinuxディストリビューションであるDebianをベースとしており、記事執筆時点(2017年11月14日)での最新バージョンは9.1 stretchです。

Raspbianにはwith DesktopとLiteの2種類があります。LiteはGUIがないバージョンです。GUIが必要であればwith Desktopを、不要ならLiteをダウンロードします。

https://www.raspberrypi.org/downloads/raspbian/

## Micro SDカードの選定

SDカードはそれなりに高速でかつ十分な容量があるものを選べばよいでしょう。公式ドキュメント(https://www.raspberrypi.org/documentation/setup/ )ではClass4、8GBが推奨されています。もっと速くてもよいですし、Liteバージョンならば2GB程度でも動作するでしょう。ただしOSをインストールするともとあったデータは完全に消えてしまうので注意です。

## OSイメージの書き込み

ダウンロードしたファイルを解凍すると中に.imgという拡張子のファイルがあります。これをSDカードに書き込みます。

https://www.raspberrypi.org/documentation/installation/installing-images/

こちらのガイドが参考になります。Etcherというソフトウェアを使うのが簡単なようです。__くれぐれもimgファイルをSDカードにコピー、というのはやめてください。起動しません。__

イメージを書き込むと2つのパーティションができますが、そのうち一つはWindowsやMacOSでは読めない形式です。「ボリュームを読み込めませんでした」といったようなエラーが出るかもしれませんが正常なので無視します。

# 初回のログイン方法

最初に書いたように、この記事では外付けのモニターやキーボードに頼らない、いわゆるヘッドレスセットアップをします。

もしもホストPCとしてLinuxを使っているならば、SDカードのルートパーティション(2番目の大きなパーティション)をマウントして下のWi-Fi設定を行えば起動すればWi-Fi接続ができます
(SSHログインのためにSSHの設定は必要)。そうでなければ、最初は

- 有線LANでSSHからRaspberry Piに接続する
- シリアルコンソールからRaspberry Piに接続する

の2通りです。基本的には上のSSHを使う方が楽なのでおすすめです。

## SSHを使うための設定

https://www.raspberrypi.org/documentation/remote-access/ssh/README.md

新しいRaspbianでは、SSHはデフォルトで無効化されています。有効にするにはSDカードのブートパーティション（WindowsやMacでも読める、.dtbという名前のファイルがたくさん入っているパーティション/ボリューム）に`ssh`という名前のファイルを作成します。

## シリアルコンソールを使うための設定

以前のバージョンと異なり、Raspberry Pi 3ではデフォルトではシリアルコンソールでログインすることができません。これはシリアルポートがBluetooth用に使用されてしまっているためです。シリアルでログインするには、Raspberry Piを起動する前に設定を変更しておく必要があります。手順は下の通りです。

（参考: https://www.raspberrypi.org/documentation/configuration/uart.md ）

1. SDカードのブートパーティション（WindowsやMacでも読める、.dtbという名前のファイルがたくさん入っているパーティション/ボリューム）内の`cmdline.txt`ファイルを開き、`console=serial0,115200`のような感じの部分を削除する。__あとでもとに戻すので、元のファイルをバックアップしておくこと！__
2. 同じ場所にある`config.txt`を開き、最終行に以下を追加。
`dtoverlay=pi3-disable-bt`

# 起動・各種設定

Micro SDカードをRaspberry Piに差し込み、シリアルコンソールを使用する場合はRaspberry Piのシリアル端子をPCと接続します。

## SSH接続

もしもWi-Fi設定を既に済ませていれば、電源を入れるとWi-Fiに繋がりSSHがスタートします。そうでなければ

- ルーターやスイッチに有線で接続する
- ホストPCに直接接続する

のいずれかでRaspberry Piを接続し起動します。

ホストPCに直接接続する場合、ホストPCに有線LANのポートが必要です。あるいはUSB-LAN変換アダプタを使用します。使用するケーブルは基本的には一般的なLANケーブルで問題ありません(もしかしたらクロスケーブルと呼ばれる特殊なケーブルが必要になるかもしれません)。Windows以外のOSの場合、設定で有線LAN(Ethernet)ポートの"インターネット共有(Internet sharing)"を有効にしておきます。ケーブルでホストPCとRaspberry Piを接続した状態で起動すると、SSHが起動し、IPアドレスも割り振られます。

Raspbianには初期設定で`avahi-daemon`というソフトウェアが走っており、Raspberry Piは`raspberrypi`というホスト名を持っています。 この場合IPアドレスの代わりに`raspberrypi.local`を用いることができます。ただしWindowsの場合はiTunesをインストールしてある必要があります(iTunesに同梱されているBonjourというプログラムが必要)。`ping raspberrypi.local`などとすればIPアドレスがわかります。ただ現状SSHはこの名前ではできないので注意してください。

上の方法が使えずIPアドレスが必要な場合、IPアドレスを特定するには、`arp`コマンドや`ping`コマンドを使用します。以下のリンクに詳しいです。自分のIPアドレスとサブネットマスクは`ip addr`コマンドや`ipconfig`コマンドで調べます。

https://www.raspberrypi.org/documentation/remote-access/ip-address.md
https://www.indetail.co.jp/blog/170414/

IPアドレスと、ユーザー名`pi`でSSHログインします。パスワードは`raspberry`です。

## シリアル接続

接続にはUSBシリアル変換ケーブル/モジュールを使用します。様々なものが市販されています。

- モジュール型の例: https://www.switch-science.com/catalog/1032/
- ケーブル型の例: http://akizukidenshi.com/catalog/g/gM-05840/

注意点としては、シリアル変換ケーブルには様々な電圧のものがありますが、Raspberry Piの電圧は3.3Vなので、それ以外のものを接続するとRaspberry Piが壊れる恐れがあります。必ず3.3V対応のものを購入し、3.3Vモードにして使用します。

接続には以下の3つのピンを使います。

- 変換器のGNDピン-Raspberry PiのGNDピン(いくつかあるが、例えば6番ピン)
- 変換器のTX(D)ピン-Raspberry PiのRXDピン(10番ピン)
- 変換器のRX(D)ピン-Raspberry PiのTXDピン(8番ピン)

ピン番号はGPIO HEADERで並んでいる順番に割り当てられています。以下のサイトなどが見やすいです。

https://pinout.xyz/

USBをホストPCに接続し、TeraTerm(https://ttssh2.osdn.jp/ )やToken2Shell/MD(http://choung.net/token2shell-md/ )などのプログラムからシリアル接続をします。ボーレート(Baud Rate)という設定項目がありますが、115200とします。

電源ケーブルをRaspberry Piに差すと起動します。シリアルコンソールあるいはモニターにログインプロンプトが現れ、ユーザー名: pi、パスワード: raspberryでログインできます。

## 各種設定

Raspbianでは、Raspbianに関する各種設定をまとめて行うことのできる"Raspberry Pi Software Configuration Tool"が同梱されています。`sudo raspi-config`で起動します。
このツールについては下のリンクに詳しいです。

https://www.raspberrypi.org/documentation/configuration/raspi-config.md

### Expand Filesystem

デフォルトではSDカードには未割当領域があり、その領域は使用することができません。もったいないので`raspi-config->Advancded Options->Expand Filesystem`でファイルシステムをSDカードいっぱいに拡張します。再起動後設定が反映されます(すぐに再起動する必要はありません)。

### Locale設定

raspi-configからもLocale設定はできるはずなのですが、私が試していないためraspi-configを使わない方法で書きます。
Raspberry Piを使っていてLocale関係でエラーが出ることがあります（私はデフォルトの状態でそうでした）。これは日本語と英語のロケールが混ざっていることが原因だったりします。英語のロケールに統一するには

```
export LANGUAGE=en_GB.UTF-8
export LC_ALL=en_GB.UTF-8
sudo update-locale LANG=en_GB.UTF-8
```

### Wi-Fi設定

https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md

が参考になります。

`sudo iwlist wlan0 scan`で使用可能なアクセスポイントがずらっと出力されます。5GHz帯のWi-Fiは見えていないはずです。目当てのAPが見つかったら
`wpa_passphrase "[SSID]" "[Password]" | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf > /dev/null`
で設定をします。`wpa_cli -i wlan0 reconfigure`を実行するとWi-Fiに接続するはずです。

### SSH設定

raspi-configからSSHを有効化できます。初回にSSHログインをした場合もraspi-configから設定する必要があるようです（試していないのではっきりしません、すみません）。

セキュリティを高めるには、`/etc/ssh/sshd_config`を編集し各種設定を行います。例えば

https://www.adminweb.jp/web-service/ssh/index8.html

SSHでは公開鍵ログインがおすすめです。下記リンク等に詳しいです。

https://qiita.com/StoneDot/items/a38a35baf50e2cba2b67

また、SSHでホスト名でログインできるようにするにはAvahiの設定が必要です。AvahiにSSHとSFTPのサービスを登録するには

`sudo cp /usr/share/doc/avahi-daemon/examples/ssh.service /etc/avahi/services`
`sudo cp /usr/share/doc/avahi-daemon/examples/sftp-ssh.service /etc/avahi/services`

もしもSSHに22番ポート以外のポートを割り当てている場合などは、これらのファイルを修正します。

※この設定をしても、なぜかWindows Subsystem for LinuxとToken2Shell/MD上からはSSHログインできませんでした。。。

### Serial Consoleの無効化

シリアルコンソールからログインした場合、Bluetoothの機能が無効あるいは制限された状態になっています。Bluetoothを使いたい場合、Raspberry Pi上から、または電源を切った後ホストマシン上で`cmdline.txt`と`config.txt`の設定を元にもどします。再起動後に反映されます。

# Lチカプログラミングを始める準備

各種設定が済んだら、Lチカプログラミングを始める準備をしていきます。

この記事ではPython 3言語を用い、pigpio(http://abyz.me.uk/rpi/pigpio/index.html )というライブラリを用いてLEDを制御します。pigpioはRaspbianに標準で取り込まれており、使いやすくかつとても高機能なライブラリです。

## pigpioの準備

pigpioを使うには設定が必要です。まず、pigpioを使うにはpigpiodというプログラムが走っている必要があります。

`sudo apt install pigpio`

そして次にpigpiodがOS起動時に自動で立ち上がるようにします。
`sudo systemctl enable pigpiod`
今すぐスタートするには
`sudo systemctl start pigpiod`
ストップするには
`sudo systemctl stop pigpiod`
状態を確認するには
`sudo systemctl status pigpiod`
とします。

## Pythonの準備

Raspbianには初めからPython2, 3がインストールされていますが、pigpioライブラリはインストールされていません。まず、パッケージマネージャをインストールします。

`sudo apt install python3-pip`

次にpigpioライブラリをインストールします。

`pip3 install pigpio`

# プログラミング

ここまで完了したらプログラミングです。Raspberry Pi上でコードを書いてもよいのですが、SSH接続をしているならホストPC上でプログラミングをするのがおすすめです。SSHで接続していれば`scp`、`sftp`、`rsync`などのコマンドでファイルをRaspberry Piに転送/同期できるほか、PyCharm Professional(学生は無料)のようなIDEを使えばIDE上で実行やデバッグまで完結します。

pigpioを用いたLチカのサンプルは下のようになります。

```py3:main.py
import pigpio
import time

LED_PIN = 18 # GPIO18番ピンを使用

pi = pigpio.pi()
pi.set_mode(LED_PIN, pigpio.OUTPUT) # 18番ピンをOUTPUTに設定

try:
    while True:                  # 無限に繰り返す
        pi.write(LED_PIN, 1)     # 18番ピンをHIGHに(LED点灯)
        time.sleep(0.5)          # 0.5秒待つ
        pi.write(LED_PIN, 0)     # 18番ピンをLOWに(LED消灯)
        time.sleep(0.5)          # 0.5秒待つ

except KeyboardInterrupt:        # 実行中にCtrl+Cを押すとループを抜けここに
    pass

# cleanup
pi.set_mode(LED_PIN, pigpio.INPUT) # 18番ピンをINPUTに戻す
pi.stop()
```
そしてLEDを配線します。電子工作部分については詳しく解説しませんが、下のページのピンアウトの表をもとに、LEDと抵抗を18番ピン(下記ページではBCM 18ピン、通し番号で12番目にある)とGNDの間に配線します。

`python3 main.py`

を実行するとLEDが1秒周期で点滅するはずです。`Ctrl+C`で終了します。

# 終わりに

本記事では正しい情報を書くよう気を付けましたが、私が全てテストをしたわけではないことをご了承ください（特にWindows以外のプラットフォーム）。何かありましたらコメント等をお寄せいただければ幸いです。