Edited at

Raspberry Pi Zero(W, WH)のセットアップ

2017/2にRaspberry Pi Zero (以下Pi Zero) 国内販売が始まり、2017/7/18にようやくPi Zero Wが販売されるので、久しぶりに更新しました。

電源を入れるだけでリモートログインできる状態にし、ヘッドレス運用ができることを目標として、セットアップ方法の紹介をします。シンプルなUSB接続(USB On-The-Go, 以下USB OTGと記載)によるセットアップ方法を前半に記載します。また、インターネット接続を得る方法について、母艦PCのUSB接続経由、Wifi、Bluetoothテザリング経由の3つを記載しました。

上記のセットアップを行うと、以下のようにPi Zero(W)を使用できます。


  • USBケーブル一本で電源供給+ネットワーク接続

    (内側のMicroUSBコネクタをPCに接続し、データ転送と電源供給をする。USB機器は使用できない)



  • USB or GPIOで電源供給、内臓WifiまたはBluetoothでネットワーク接続

    (外側のMicroUSBコネクタから電源を供給。内側のMicroUSBコネクタが空くのでUSB機器を使用可)



※過去に記載した「マウス、キーボード、モニタを用意して行う」セットアップを後半に残しました。Raspbian OSではUSB OTGが使用できるので、今となっては手間がかかるだけになりました。UART-USBケーブルを用いたシリアルコンソール経由でのセットアップも同様です。

とはいっても、BuildrootやYoctoOSといった無駄なパッケージを極力省いた組み込み向けOSを使用する場合は、確実に動作確認できるので、実行環境を揃えておいて損はないと思います。

Raspberry Pi Zero Wを用いて、自分は主に下記のデバイスを作っています。

サイクルコンピューターをガチで作ってみたら、割とできてしまったという話


USB接続によるセットアップ


用意するもの


  • Micro USBケーブル:Pi Zeroの内側のMicro USBコネクタで母艦と接続します。

  • Micro SDカード:用途にもよりますが、4GBだとあっという間に使い切るので、8GB以上は欲しいです。また、ガッツリ使うならそれなりに高性能なものを。

  • OSイメージ:オフィシャルサイトより、RASPBIAN STRETCHのイメージをダウンロードします。

  • USB Wifiアダプタ(オプション):Pi Zero Wは2.4GHzのwifiをサポートしているので、環境によっては不要です。Pi Zeroの場合は何かしら必要になりますが、2.4GHz帯のみ対応のアダプタはドライバ追加なしで動く場合が多いようです。自分はWN-G150UMW(rtl8192cu)を用意しました。一方、5GHz帯が使えるアダプタの対応は進んでいないようなので、別途ドライバのインストール必要です。一例を別記事で記載しています。


イメージのインストール

Etcherを使うとzipイメージのままインストール可能です。下記はzipイメージを解凍してSDカードに書き込む手順を示しています。

Adafruitさんの「Introducing the Raspberry Pi Zero」を参考にしました。

自分の環境はMacなので、 Raspberry-PI-SD-Installer-OS-Xを使いました。リンク先の右上方にある「Download Zip」よりダウンロードするか、ターミナルを起動して以下のコマンドで取得します。

$ git clone https://github.com/RayViljoen/Raspberry-PI-SD-Installer-OS-X.git

ファイルが展開されたら、ダウンロードしてきたStretchイメージを同じフォルダに置きます。また、MicroSDカードをMacに繋ぎ、ドライブがマウントされることを確認します。マウントされない場合はディスクユーティリティでFAT32で一旦初期化してください。

以下のコマンドでディスクに書き込みます。(201X-XX-XXはイメージファイルのリリース日ですので、適宜読み替えて下さい)

console

$ sudo ./install 201X-XX-XX-raspbian-stretch.img

「Select the disk to use by enetering the disk number.」と表示され、書き込むディスクを選べと出てきます。Size欄より、MicroSDカードの容量になっているドライブを注意深く選び(下のほうにあるはずです)、実行します。選択を誤るとシステムパーティションを壊しますので注意してください!


SSHを有効にする

無事、書き込みが終了したら、一旦MicroSDカードをMacから外し、再度接続します。bootというドライブが現れるはずです。SSHを有効にするには、boot内にsshという空のファイルを配置する必要があります。

$ touch /Volumes/boot/ssh


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

bootドライブ内のcmdline.txtに "modules-load=dwc2,g_ether" を追加します。

新しい行ではなく、1行目の最後に追加になります。

エディタはvimを使っていますが、適宜変えてください。

$ vim /Volumes/boot/cmdline.txt

(以下、コード表示だと折り返しなしの1行となり見辛いので、引用という形で表現しています。末尾までカーソルを移動させて、空白を入力後、ペーストします。)


dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh quiet splash plymouth.ignore-serial-consoles modules-load=dwc2,g_ether


次に、config.txtの末尾に"dtoverlay=dwc2"を追加します。

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


起動

母艦PC側でUSB接続のインターネット共有を有効にします。

まず母艦PCとPi Zeroをデータ転送ができるUSBケーブルで接続します。Pi Zero側は内側のMicroUSBコネクタに繋いでください。電源が入り、起動します。

macOSの場合、「設定>ネットワーク」で「RNDIS/Ethernet Gadget」が出現しているのを確認し、

「設定>共有」の「インターネット共有」を開き、「RNDIS/Ethernet Gadget」にチェックを入れた状態で「インターネット共有」を有効にしてください。

(母艦はandroidスマートフォンでも代用可能です。内側のMicro USBコネクタをUSBテザリングがONになったスマートフォンへ接続、外側のMicro USBコネクタから電源を供給します。ターミナルのアプリは別途用意してください。IPアドレスを調べる方法は後述しています)

初回起動時は再パーティションをしているので、SSHでログインできるようになるまで若干時間がかかります。

$ ssh pi@raspberrypi.local

(bonjourを使用してます)

初期ユーザーはpi、初期パスワードはraspberryになります。

この時点でネットワーク接続ができるので、$sudo raspi-config でホスト名、タイムゾーン、ログインパスワードを適宜変更して初回設定は終了です。WifiやBluetoothによる接続を設定したい場合は、さらに読み進めてください。


追加のネットワーク設定

wifiで接続する方法と、bluetoothテザリングで接続する方法の両方を紹介します。Pi Zero Wの場合、内臓で2.4GHzのWifiとBluetoothが使えますので、接続できるものがあれば設定しておいて損はないと思います。


Wifi編

本家の設定方法を参照するのが良いと思います。wifiに接続しなくても、接続の設定自体はできます。また、$sudo raspi-config の「2 Network Options > N2 Wifi」でも設定可能です。

$ vim pass.txt

(wifiのパスワードを記載)

$ sudo sh -c 'wpa_passphrase "wifiのアクセスポイント名" < pass.txt >> /etc/wpa_supplicant/wpa_supplicant.conf'

$ sudo wpa_cli reconfigure


Bluetooth編

※2018/8/16追記 最近のmacOS Hige Sierraでは接続がうまく行きません。Androidスマートフォンでは接続を確認しています。

まずはペアリングをします。

Bluetoothテザリングができる状態で母艦(PC or スマートフォン)のBluetoothをオンにし、Pi Zero側で下記コマンドを実行すると、Macアドレスが取得できるので、控えておきます。

$ hcitool scan


Scanning ...
XX:XX:XX:XX:XX:XX (ホスト名)

次にbluetoothctlコマンドで実際にペアリングをします。

$ bluetoothctl


(スマートフォンとペアリングする際は以下3行を入力)
[bluetooth]# agent DisplayOnly
[bluetooth]# default-agent
[bluetooth]# discoverable on

[bluetooth]# scan on
[NEW] Device XX:XX:XX:XX:XX:XX XX-XX-XX-XX-XX-XX

[bluetooth]# pair XX:XX:XX:XX:XX:XX
(先ほどのMACアドレスを貼り付ける or 先頭1文字入力してタブ補完)

※母艦側でペアリング許可のダイアログが出るはずですので、許可します

[bluetooth]# trust XX:XX:XX:XX:XX:XX
[bluetooth]# exit

テザリングはbt-panスクリプトを用います。

$ wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan


$ chmod 755 bt-pan
$ sudo ./bt-pan client XX:XX:XX:XX:XX:XX

※dbusがないとエラーが出た場合は下記を別途インストール
$ sudo apt-get install python-dbus

接続が成功すると母艦側でも確認のダイアログが出るはずです。IPアドレスを調べるには、Pi Zero上でifconfigコマンドでbnep0を探します。

$ ifconfig


bnep0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.xxx.xxx Bcast:192.168.xxx.xxx Mask:255.255.255.0
(以下略)

運用方法は各自工夫してください。

接続方法(bluetoothテザリング)

- 起動時に自動接続したい場合は、/etc/rc.localにbt-panコマンドを記述

- 一定間隔で自動接続させたい場合はcronを利用 (消費電力が懸念)

- 手動で再接続したい場合は、GPIOのボタンで実装、あるいはPiTFT使用の場合はデスクトップにショートカット配置かGUIの機能にbt-panコマンドを組み込む

IPを知る

- Bonjourを使う。母艦側にbonjour等zeroconfが入っていれば(Androidはアプリあり)、接続形態に関わらず、普通にホスト名.localで接続できます。また、Pi Zeroを複数つなぐ場合はraspi-configコマンドでホスト名を変更するのが必須です。

- nmap -sP 192.168.xxx.*等でスキャンする。(xxxはお使いのネットワークアドレスを入れてください)

- bt-panで接続した直後にIPアドレスをどこかに送信する。

- LCDディスプレイやPiTFT等でIPアドレス表示の機能を用意しておく

- IPを固定する。母艦側のネットワークに縛られますので注意。

$ sudo vim /etc/network/interfaces

(192.168.2.*のネットワークにいる前提で、IPアドレスを192.168.2.2に固定する例)

allow-hotplug bnep0
iface bnep0 inet static
address 192.168.2.2
netmask 255.255.255.0
gateway 192.168.2.1

以上です。お疲れ様でした!


マウス、キーボード、モニタを用意して行うセットアップ

(USB OTGがまだできなかった2016/1ごろに記載した内容です)

USB接続によるセットアップ」で記載したSDカード、USB Wifiアダプタ等用意してください。SDカードはイメージ書き込み済みで話を進めます。

※画像は2016/1時点のもので古いですが、大枠は変化ないので特に差し替えていません。


用意するもの


  • USBハブ・USBキーボード・USBマウス:手元にあるもので 

  • HDMI入力端子があるモニタ・HDMIケーブル:ない場合はDVI変換等を行い、モニタに映せるようにしましょう。

※USB-UARTケーブルがあれば、別端末よりセットアップが可能になりますので、USBハブ、USBキーボード、USBマウス、モニタ、HDMIケーブルは不要になります。一方、下記のネットワークの接続はコンソールで行ってください。


初回起動

MicroSDカードをPi Zeroに装着し、HDMIモニタ、USBハブを繋ぎ、最後にUSB電源を繋いで電源をONにします。電源ON後、直ちにコンソールの起動画面が出て、しばらくするとデスクトップ画面が立ち上がります。

(ちょっと感動しました)


ネットワークの接続

デスクトップ画面が無事に出てきたら、右上の無線LANマークより無線LANに接続します。いったん接続すると、以後設定が保存されます。

ifconfigコマンドでMACアドレスを調べ、ルーター側でDHCP固定割当の設定をしたほうが後々SSHから入る場合に楽ですね。

この時点で他のマシンからログインして作業ができるようになります。

続きは下記「初期設定 (コンソール編)」になります。


初期設定 (コンソール編)

SSHでPi Zeroに接続した状態で進めてください。

Rasberry Piのお作法に倣い、raspi-configコマンドを実行します。以下のスクリーンショットは他のマシンからSSH接続で行った例です。

※後述の「初期設定 (デスクトップ編)」からも大体の設定ができます。

$ sudo raspi-config

カーソル上下でメニューの選択、タブキーで下部の左右メニューに移動、Escキーで戻るになります。


パーティション拡張

※最近のバージョンは初回起動時に自動で行うようになっているので、読み飛ばして下さい。

メニューの一番上、"1 Expand Filesystems"を選択します。

一旦リブートします。容量確認はdf -h等で行ってみてください。


パスワード変更

"2 Change Password"から行います。


デスクトップ起動ではなく、コンソール起動に切り替え

"3 Boot Options"を選択し、B1 Console を選択します。オートログインも合わせて指定できますがお好みで。なお、コンソールで起動した状態からデスクトップを起動したい場合は startxコマンドを使います


ロケール設定

"5 Internationalisation Options"を選択し、次に表示されるメニューのうち、"I1 Change Locale"を選択します。

英語しか使わない場合、デフォルトのen_GB.UTF-8 UTF-8でもいいですが、お好みになりますが、デフォルトでよく使われるen_US.UTF-8 UTF-8に変更します。

また、後述にリンクで示した日本語を表示、入力したい場合は日本語ロケールである ja_JP.EUC-JP EUC-JP と ja_JP.UTF-8 UTF-8 も選択します。(コンソールのみ複数選択可で、後述のデスクトップから設定を行う場合は複数選択できないようです)

最後にデフォルトのロケールを聞いてくるので、en_US.UTF-8 UTF-8にしておきます。ここで日本語を選択すると、ターミナル等でも日本語が表示されますので、お好みで。


タイムゾーン

"5 Internationalisation Options"から、"I2 Change Timezone"を選択します。

日本の設定をしたい場合は、Asia -> Tokyoとします。


キーボード

ヘッドレス運用をする場合、設定を省略しても構いませんが、"5 Internationalisation Options"から、"I3 Change Keyboard Layout"から行えます。

デフォルトは英語キーボードの設定です。製品固有のキーを使いたい場合は詳細なモデルを別途指定すれば使用できると思われます。

汎用的な日本語キーボードの場合、Generic 105-key (Intl) PC から言語を Other を選択し、言語一覧から Japanese を選択、日本語キーボードの種類一覧から Japanese を選びます。


その他

ホスト名変更、SSHの起動、SPIやI2CのON/OFFは"9 Advanced Options"から行います。SSHはデフォルトでオンになっています。お好みに合わせて変更してください。

ここまで一通りの設定が終了したら再起動します。


初期設定 (デスクトップ編)

デスクトップ画面のPreferences -> Raspberry Pi Configuration から上記の「初期設定 (コンソール編)」と大体の設定ができます。ロケール設定だけ言語の複数選択ができませんでした。


システムのアップデート

再起動後、システムをアップデートします。

$ sudo apt-get update

$ sudo apt-get upgrade

ついで、必要なパッケージをインストールします。(自分はvimとscreenがまず必要なので)

$ sudo apt-get install screen vim

以上、USB電源を入れるのみでネットワークに接続され、SSHからログインできるPi Zeroのできあがりです。いろいろ使い倒しましょう!


デスクトップ日本語対応

デスクトップやVNCを使う時に、日本語フォントの表示・入力ができません。とりあえずはブラウザを使う際に不便かと思います。Raspberry Pi の軽量な日本語化 (2014/11/03, 2015/02/17)を参考にすると日本語環境が出来上がります。


続き

カーネルをクロスコンパイルする手順を示したいと思います。例として、そのままでは使えない5GHzの無線LANに対応したUSBアダプタをPi Zeroで使用できるようにします。

Raspberry Pi Zero用のカーネルをクロスコンパイルし、ドライバモジュールを作成する