手元にないPCの電源スイッチを押すのがめんどくさい。VPNで自宅ネットワークに接続して、デスクトップPCの電源を入れたい。というような解決として、Wake on LAN を試行錯誤していたが、マザーボードの設定やWindowsの電源管理とかWoLの信号出すアプリとか、意外と面倒なので、いっそ物理電源ボタンを押す装置を作った方が早い気がしたので作ってみた。
前提
Raspberry Pi WHを常時起動しておく。
M/Bにつながっている電源スイッチを分岐させる
ちょっとした電子工作とスクリプト
PCやスマホからRaspiにログインしてスクリプトを実行させる環境
RasPiの用意
その辺にあるRasPi WHを使う。消費電力は1W以下なので、おそらく1年間電源を入れっぱなしにしても100–200円くらいにしかならない。OSはRaspberry Pi Imagerを使ってRaspberryh Pi OS Lite(32 bit)をいれた。本当は有線LANの方がいいのだろうが、面倒なので無線。 最低限の設定をして、アップデートをしておく。
$ cat push.sh
#!/bin/bash
/usr/bin/raspi-gpio set 17 op
/usr/bin/raspi-gpio set 17 pu
/usr/bin/raspi-gpio set 17 dl
/usr/bin/raspi-gpio set 17 dh
sleep 0.5
/usr/bin/raspi-gpio set 17 dl
$ cat /etc/apt/sources.list
deb http://ftp.jaist.ac.jp/raspbian/ buster main contrib non-free rpi
deb http://deb.debian.org/debian buster-backports main
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
# Uncomment the next line to enable packet forwarding for IPv6
net.ipv6.conf.all.forwarding=1
$ ifconfig wg0
wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1420
inet 192.168.1.1 netmask 255.255.255.0 destination 192.168.1.1
inet6 fd00:abcd:1::1 prefixlen 64 scopeid 0x0<global>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
RX packets 178459 bytes 143465460 (136.8 MiB)
RX errors 23 dropped 0 overruns 0 frame 23
TX packets 175183 bytes 173639084 (165.5 MiB)
TX errors 0 dropped 87 overruns 0 carrier 0 collisions 0
$ ip address show dev wg0
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.1.1/24 scope global wg0
valid_lft forever preferred_lft forever
inet6 fd00:abcd:1::1/64 scope global
valid_lft forever preferred_lft forever
$ ip route
default via 192.168.0.1 dev eth0 src 192.168.0.87 metric 202
192.168.1.0/24 dev wg0 proto kernel scope link src 192.168.1.1
192.168.0.0/24 dev eth0 proto dhcp scope link src 192.168.0.87 metric 202
$ ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2001:db8:abcd:abcd::/64 dev eth0 proto ra metric 202 pref medium
fd00:abcd::/64 dev eth0 metric 202 pref medium
fd00:abcd:1::/64 dev wg0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via fe80::aaaa:bbbb:cccc:dddd dev eth0 proto ra metric 202 pref medium
秋月電気で売っているGPS受信機キット 1PPS出力付き 「みちびき」3機受信対応を使いました。GPSモジュールに太陽誘電のGYSFDMAXBを使い、受信機にはMedia Tek のMT3339が使われているようです。この受信機でGPSのL1電波を受信して、NMEAのフォーマットでシリアル信号にして出してくれます。
Raspberry Pi のGPIOは2,4,6,8,10番ピンがうまい具合に、5V,GND,UART_TXD0,UART_RXD0,GPIO18と並んでいます。今回のGPSモジュールを順番につなげて、GPIO18を1PPSの入力に使えば、なんの工夫もなくフラットケーブルでちょうど繋げれます。
Raspberry Pi の準備
Raspberry Piのシリアルポート
Raspberry Pi (3とzero WなどのBluetoothがあるRasPi)のシリアルポート用に使う半導体は、PL011とmini UARTという回路で実装されています。Raspbian OSでは、シリアルポート(ttyS0)はデフォルトでオフになっていて使えないが内部的にはminiUARTにつながっています。一方PL011はBluetooth用に使っています。
/dev/serial0 (primary UART) -> /dev/ttyS0 -> mini UART (通常は有効化されていない) /dev/serial1 (secondary UART) -> /dev/ttyAMA0 -> PL011 -> bluetooth
ちなみにAMAとはarmのAMBAというアーキテクチャの略でAdvanced Microcontroller Bus Architectureのことらしい。この実装がPL011ということ。
mini UARTはGPUとコアクロックを共有しています。GPUのクロックは動的に変化するため、mini UARTをシリアルポートに使うとボーレートが変化してしまい、これでは外のデバイスからデータを取得するには不都合があります。一方PL011はGPUのクロックの影響を受けません。前述のとおり、PL011はBluetoothで使用中のため、次の3つのいずれかの方法を取る必要があります。 a) Bluetoothの運用を止めPL011をシリアルポート用に使う。 b) Bluetoothはmini UARTを使い、PL011をシリアルポート用に使う。 c) Bluetoothはそのままにして、mini UARTのクロックを固定して使う。 最後のc)の方法はmini UARTをシリアルポートとして使うには制限が多いので今後の事を考えて使わないことにします。取れる方法はa)かb)の二択になります。
気がついたら家にラズパイがゴロゴロ転がっていたので、一番古いRaspberry Pi model Bを使って、ペット用の監視カメラを作ることにした。ラズパイのバージョン1で、CPUは遅いしメモリも512MBしかないので、実用になるかどうかが心配。
# cat /proc/cpuinfo processor : 0 model name : ARMv6-compatible processor rev 7 (v6l) BogoMIPS : 697.95 Features : half thumb fastmult vfp edsp java tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xb76 CPU revision : 7 Hardware : BCM2835 Revision : 000d Serial : 0000000039ab319d
https://www.raspberrypi.org/downloads/raspbian/ からRASPBIAN STRETCH WITH DESKTOPをダウンロード。今回のダウンロードは2017-09-07-raspbian-stretch.zipというファイル。念のためにチェックサムを確認。
$ shasum -a 256 tmp/2017-09-07-raspbian-stretch.zip
a64d742bc525b548f0435581fac5876b50a4e9ba1d1cd6433358b4ab6c7a770b tmp/2017-09-07-raspbian-stretch.zip
SDカードを挿入し以下のコマンドでデバイス名を取得(今回は /dev/disk2)
$ diskutil list
(略)
/dev/disk2 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *8.1 GB disk2
1: Windows_FAT_32 boot 66.1 MB disk2s1
2: Linux 8.0 GB disk2s
普段は無線LANの運用をするので、以下はその設定。Raspberry Pi 2には無線インターフェイスはないので、USBアダプタを接続。あっさりとwlan0として認識した(/sbin/ifconfigで確認)。固定IPアドレスを設定する。場所は/etc/network/interfacesとなる。今回は以下の行を追加。
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.0.79
netmask 255.255.255.0
gateway 192.168.0.1
dns-domain mirahouse.jp
dns-nameservers 192.168.0.75
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
二酸化炭素濃度の数値はwebやスマホで見られるのですが、一手間かかるので電光表示板を作ることにしました。NetAtmoはAPIを公開していて、(一定の範囲内なら)好きなだけインターネット経由で測定値を取ってこれます。これをRaspberry Pi なんかで取得して7セグLEDで表示させています。
Raspberry Pi を使ったついでに、1000ppmを超えたときは警告をTwitterで通知するようにしています。さらに、うちで昼間は常時起動しているPCに読み上げソフトをインストールして、音声で警告も出してくれるようにしました。