Homebridge入門: (1) Raspberry Pi Zero WでLチカする

AppleのHomeKit互換アクセサリを実現できるフリーソフトウェアHomebridgeを使って、macOSマシンをブートするデバイスを作りたいと思います。その準備のためにRaspberry Pi Zero WにLinuxを導入し、LEDを点滅させました。

前回の経緯と今回の方針

前回の記事で、「Hey Siri, Macをつけて」とSiriにお願いすると、Macが起動する仕組みを作りました。

そこでは、Raspberry Pi上に作ったnode.jsサーバからWOLのマジックパケットを流して、Macを起動しました。このサーバにhttpアクセスするためのショートカットを、iPhoneに登録して、それをHomePod上のSiriから呼び出しました。この方式は設定が簡単なのですが、iPhoneが必須という問題があります。iPhoneをWi-Fiが届かない場所に置いてきてしまうと、使えません。iPhoneがその場にあってもHomePodとの接続が不安定だと、接続できないというメッセージが出て動きません。またmacOSのSiriからは使用できません。そこで、本格的なHomeKit対応のアクセサリとして実装したいと考えました。

ちゃんとしたHomeKitのアクセサリになっていれば、iPhoneがなくてもHomePod単体で動きます。また、iPhoneの機能を呼び出せないmacOSのSiriからも使えます。ショートカットで動かすよりは、より完璧なHomeKitデバイスになります。

Raspberry Pi Zero W

このようなアクセサリを作るためには、HomeKitに応答するサーバとして実装する必要があります。そこで、小さくて安くて省電力でお手軽なLinuxコンピュータを用意することにしました。Raspberry Pi Zero Wです。Linuxが動くRaspberry Piシリーズでは最安、最小、最弱のコンピュータですが、Wi-FiとBluetooth (今回は使いません) が搭載されています。スイッチサイエンスのサイトでの価格はなんと税込1320円(プラス送料200円)です。でもこの価格は「より多くの人にRaspberry Piを体験してもらうこと」を目的に設定されているため、ショップで登録した会員一人に1台限りです。ショップ会員登録するのが面倒とか、2台以上欲しい場合は、他のサイトで通常価格で買うことになります。例えばAliExpressだとZero Wは送料込2,117円です。AmazonやYodobashiのサイトでも売られていますが、AliExpressが安いようです。納期もそれほどかかりません。ちなみに、Zeroは無線無し、Zero WはWi-Fi/Bluetooth付き、Zero WHはヘッダピン付きです。ヘッダピンは必要なら半田付けすれば良いので、Zero Wがお勧めかと思います。


AliExpress: Raspberry Pi Zero /W/WH

スイッチサイエンスの製品は技適が通っているので安心ですが、実はAliExpressの製品も同じもののようです。下の写真の、上がスイッチサイエンス、下がAliExpressのZero Wの基板です。全く同じ内容が印刷されています。技適マークも番号も入っていますので、どちらも安心して使えると思います。

Zeroのコネクタは小さい

Raspberry Pi Zeroシリーズは小型なため、コネクタが特殊です。電源がマイクロUSB Type-Bなのは普通なのですが、USBのコネクタも同じマイクロUSB Type-Bです。本来のUSBの規格ではコントローラ側はType-Aであるべきなのですが、デジカメでType-Bをコントローラ側に使いたいという要望があって、ここでもそれが採用されているようです。通常のType-Aに変換するために、On The Go (OTG)ケーブルという、いかにも「出先なら規格から外れても仕方ないね」的な名前がついた変換ケーブルが用意されています。なので、Raspberry Pi ZeroシリーズにUSBキーボードやマウスを接続するためには、OTGケーブルでUSB Type-Aに変換する必要があります。400円くらいの変換アダプタです。でも後述するようにこれは無しでも設定できます。

また同様に、ディスプレイもマイクロHDMIなので、通常のHDMIに変換するアダプタ、もしくは対応したケーブルが必要です。ディスプレイ無しで運用するサーバならば、これも無しで設定できます。必須なのは、補助記憶装置用のmicro SDカードです。Linuxを動かすために8GB以上のカードが必要です。AliExpressで探したらmicro SDカードの価格は、8, 16, 32GBでほとんど違わないので32GBにしました。

Raspberry Pi OSをインストール

Raspberry PiではDebianベースのLinuxが動きます。昔は、Raspbianと呼ばれていましたが、今はRaspberry Pi OSと呼ばれてます。以下のサイトからmacOSで動くインストーラをダウンロードできます。

ここでダウンロードしたRaspberry Pi Imagerというソフトを起動すると、インストーラが立ち上がります。

OSのバージョンは、Raspberry Pi OS Liteにします。GUIデスクトップなしの、CUIだけのバージョンです。サーバとして清々しい正しい姿だと思います。

インストール先のSDカードを指定すれば、フォーマットされてOSがインストールされます。これをRaspberry Piに挿して起動すれば、すぐにLinuxとして動き始めます。Linuxマシンとして起動した後は、HDMIディスプレイ+USBキーボードで操作できるのですが、最初からsshで接続できるように設定しておけば、それらの接続は不要です。先に説明したOTGケーブルも不要です。その方法が、こちらで紹介されていました。

まずは、Raspberry Pi OSをインストールしたSDカードを、改めてMacにマウントします。すると/VolumesにbootというFAT32のボリュームが見えています。ここにおいたファイルは、Linux起動の際に然るべき場所にコピーされるようです。なのでこの場所に細工をすれば良いようです。まずはここにターミナルで移動して、sshという空のファイルを作っておきます。

% cd /Volumes/boot
% touch ssh

次に、ここにwpa_supplicant.confというテキストファイルを作ります。ここではviで作業しましたが、picoなどのわかりやすいエディタを使っても良いですし、テキストエディタやCotEditorなどを使っても良いです。

 % vi wpa_supplicant.conf

その内容を以下のようにしておきます。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="<SSID>"
    psk="<パスワード>"
}

SSIDとパスワードには、実際に使用しているWi-Fiベースステーションの値を入れます。Wi-Fiは2.4GHzにしか対応していないので、そちらの設定を書きます。

この設定ファイル、wpa_supplicant.confは、Raspberry Piが起動した後は、/etc/wpa_supplicantの中に移動されます。なので引き続きこれを変更して、設定変更可能です。パスワードを平文で書きたくない場合は、Raspberry Pi OSが起動した後で、 wpa_passphrase コマンドを実行して書き直しておくと良いようです。詳しくは引用元のサイトをご覧ください。

これだけの準備をしてから、このSDカードをRaspberry Pi Wに挿入して、起動します。すると、Wi-Fiに接続して、DHCPでアドレスを得て起動してくれます。IPアドレスが何番になったかは、DHCPサーバの記録を見ればわかりますが、raspberrypi.localというアドレスに接続することも可能です。macOSのターミナルから、以下のようにします。ユーザ名はpiで、初期パスワードはraspberryです。パスワードはpasswdコマンドですぐに変更しておくと良いです。

$ ssh pi@raspberrypi.local

これでめでたくRaspberry PiでLinuxが動きました。このあとは、raspi-configコマンドでいくつかの設定をしておきます。この先は、通常のRaspberry Piの設定なので、色々なサイトに解説があります。そちらを参考にしてください。

pi@raspberrypi:~ $ sudo rasps-config

raspi-configコマンドのメニューから、今回は、

  • piのパスワードの変更
  • マシンの名前(hostname)の変更
  • Localeをja_JP.UTF-8 UTF-8に設定
  • 無線LANの国設定をJP Japanに設定
  • file systemをSDカード容量いっぱいに拡張

を設定しました。

サーバとして使うなら、IPアドレスはDHCPからの取得よりも、固定IPにしておいた方が便利だと思います。まずは、ifconfigコマンドでWi-Fiデバイスの名前を調べます。wlan0という名前になっているはずです。次に、/etc/dhcpcd.confをテキストエディタで開いて、

pi@raspberrypi:~ $ sudo vi /etc/dhcpcd.conf

以下の4行を追加します。xxxの場所は固定したいアドレスにしておきます。

interface wlan0 
static ip_address=192.168.xxx.xxx/24
static routers=192.168.xxx.1
static domain_name_servers=192.168.xxx.1 

またapt-getコマンドで、パッケージ、サーバ、ファームウェアなどを最新にしておくと良いです。

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade
pi@raspberrypi:~ $ sudo apt-get dist-upgrade
pi@raspberrypi:~ $ sudo rpi-update
pi@raspberrypi:~ $ sudo reboot          # 再起動

Lチカする

Raspberry PiやArduinoに回路を繋いで動かそうとするときに、一番簡単なプログラムがLEDをチカチカ点滅させるプログラムです。「Lチカ」と呼ばれます。通常のプログラムなら、Hello World!を表示するような基本的なプログラムです。LチカとHello World!は、とりあえずこれが動くと安心する、後はなんでも作れる気になれる、という点で似ています。ということで第一回目はLチカで締めておきます。

Raspberry Piには多数の入出力ピンがありますが、今回は、端っこでわかりやすい39番と40番を使います。それぞれGNDとGPIO21です。ネット上のサンプルを見ると、GPIO21を使っている例が多くて、みなさん同じことを考えているのだと思いました。

(https://i.stack.imgur.com/から引用)

そこで、GPIO21とGNDの間に、電流制限用抵抗とLEDを直列に接続します。

ヘッダピンのないRaspberry Pi Zero Wなので、ブレッドボード用ケーブルを穴に挿してマスキングテープで仮止めしました。

Raspberry PiでLチカする方法はいくつもあり、適当に検索すれば色々な方法が見つかります。中でも、/sys/class/gpio/以下の擬似ファイルにアクセスするファイルIO経由の方式が一番簡単です。まずは、GPIO21を使用する準備をして、出力ポートに設定します。

pi@raspberrypi:~ $ echo 21 > /sys/class/gpio/export
pi@raspberrypi:~ $ echo out > /sys/class/gpio/gpio21/direction

この準備の後に、1または0を以下のようにechoすれば、LEDが点滅します。

pi@raspberrypi:~ $ echo 1 > /sys/class/gpio/gpio21/value
pi@raspberrypi:~ $ echo 0 > /sys/class/gpio/gpio21/value

1秒毎に点滅させるには以下のようなシェルスクリプトを書けば良いです。

#!/bin/sh
while true
do
	echo 1 > /sys/class/gpio/gpio21/value
	sleep 1
	echo 0 > /sys/class/gpio/gpio21/value
	sleep 1
done

シェルコマンドは、大抵のプログラムから発行できるので、このテクニックを使えばC言語でもPythonでも大体の開発環境からGPIOをコントロールできます。また、もっとスマートに制御するためのライブラリも、それぞれの言語環境用に用意されています。次回はLチカをさらに極めてみようと思います。

まとめ

ゆくゆくはHomeKit対応アクセサリとしてMac電源投入サーバを作ろうと考えて、Raspberry Pi Zero Wを設定しました。Wi-Fi搭載のLinuxサーバになる優れもので、スイッチサイエンスやAliExpressで手頃な価格で売られてます。LinuxをインストールしてLチカできるまでを確認しました。