Raspberry Pi Zero W

From misc notes
Jump to navigation Jump to search

Maker Faire Tokyo 2017 の KSY ブースでようやく手に入れた。ちゃんと技適マークが刻印されている。

いろいろメモメモ

(Raspbian Jessie Lite July 2017)

Etcher で書き込まないとハマる

Serial Console

秋月電子で FTDI の USB シリアル変換ケーブル(TTL-232R-3V3)を入手。

黒 GND <-> GND (6)
黄 RxD <-> TxD (8)
橙 TxD <-> RxD (10)

駄菓子菓子。これだけでは繋がらない。

firmware イメージをインストールした SD カードを PC/Mac でマウントして /boot/config.txt に追記。

もしくは、HDMI にモニター、USB にキーボード を繋げて(これがフツーか) /boot/config.txt に追記。
これをやりたく無いので Serial Console を活性させたいのだ。
enable_uart=1

おなじく Bluetooth を装備した Pi 3 はいろいろオマジナイがいるらしいが Zero W はこれだけで良い。

First Step

sudo raspi-config
1 Change User Password Change password for the default user
2 Hostname             Set the visible name for this Pi on a network
4 Localisation Options Set up language and regional settings to match your location
5 Interfacing Options  Configure connections to peripherals
必ず上記を確認して必要なら変更を行う。
ユーザ pi のパスワードは必ず変更する事
ホスト名は必要なら変更
ロケーション、特に I4 Change Wi-fi CountryJP にする事。技適に関わる。
CLI でのみ使うので、ロケールは ja_JP にはしたくない。とはいってもわざわざ en_US する必要も無いので 女王陛下に敬意を評して GB のままにしておく;)
Serial Console や SSH でしか触らないので keyboard layout は気にしない。
時刻は UTC ではしんどいのでローカルタイム JST-9 にする。もちろん hardware clock は UTC のまま。
インターフェースは必要な物を有効にする。たぶん SPI, I2C, {Serial は、すでに設定済みのはず} ぐらい。
github raspi-config

WiFi Settings

WPA2-PSK:AES

wpa_passphrase "YOUR_SSID" "YOUR_ACCESS_KEY"

sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

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

network={
    ssid="YOUR_SSID"
    psk=HASH(256-bit pre-shared WPA key generated by wpa_passphrase utility)
    scan_ssid=0
    proto=RSN
    key_mgmt=WPA-PSK
    pairwise=CCMP
    group=CCMP
}
電波法を遵守するために "country=JP" は忘れずに

wpa-supplicant が自動的に wlan0 を UP する。もし UP しなければ下記のコマンドを使う

sudo wpa_cli reconfigure

OS Settings

パッケージの更新

sudo apt-get update
sudo apt-get upgrade

どうも ssh host key が不審なので、再生成する

sudo rm /etc/ssh/ssh_host_* && sudo dpkg-reconfigure openssh-server

起動されているサービスを確認する

systemctl list-unit-files | fgrep enabled
systemctl | fgrep running

systemd のログを確認

sudo journalctl --no-pager

オプショナル: unstable, testing kernel への更新

sudo rpi-update
github rpi-update
https://github.com/raspberrypi/firmware

オプショナル: 必要なら他のパッケージを削除しながらインストール済みパッケージの候補バージョンをインストール

sudo apt-get dist-upgrade

いったん再起動

sudo shutdown -r now

おまけ : (ネットワークが無い環境で)最低限の初期設定をコマンドラインで実行するには

passwd
echo "Asia/Tokyo" | sudo tee /etc/timezone
sudo dpkg-reconfigure --frontend noninteractive tzdata
sudo systemctl restart rsyslog
sudo systemctl restart cron
sudo sed -i --follow-symlinks "s/^country=.*/country=JP/g" /etc/wpa_supplicant/wpa_supplicant.conf
sudo rm /etc/ssh/ssh_host_* && sudo dpkg-reconfigure openssh-server
sudo shutdown -r now

UART

Zero W の UART は BROADCOM BCM2835 SoC に実装されている PL011 と mini-UART がある。

PL011 は ARM core 実装の UART。 mini-UART は低スループットの第2番目の UART という位置付け。

The Raspberry Pi UARTs
uart-pl011 (PL011)
bcm2835-aux-uart (mini UART)

Over Clock

bcm2835-cpufreq: min=700000 max=1000000
pi@raspberrypi:/boot $ vcgencmd measure_clock arm
frequency(45)=700000000

Zero W で Over Clock が出来るか試してみた。raspi-config では "This Pi cannot be overclocked." と弾かれる。

/boot/config.txt で

arm_freq=1000

としてみたが変化なし。 Zero W では Over Clock はできないっぽい。

おおぉ

pi@raspberrypi:~ $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
1000000
  |
pi@raspberrypi:~ $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
700000

なるほど 動的に変更してるようだ。

デフォルトが

arm_freq=1000

だった。

config.txt - Overclocking options
force_turbo=1

にしたら常時 1GHz になるとおもわれるが無駄なので標準のままにする。逆に arm_freq_min を下げてもいいぐらいだ。

Devise Tree

Devise Tree を動的に変更するツールがある (Dynamic Device Tree)

dtoverlay
dtparam
詳しくは これ の下の方を読む

とはいえ動的更新せずに /boot/config.txt に書くのが良い。

dtparam=i2c_arm=on
dtparam=spi=on
enable_uart=1
これだけは /boot/config.txt に書いておく。
/boot/overlays/README も確認する
memo : dtoverlay=i2c-rtc,ds1307

raspi-config は /boot/config.txt を書き換えつつ、現状の設定を Dynamic に書き換えている。

reboot したら Dynamic な設定は消え、 /boot/config.txt にしたがい設定される。
どーも modprobe i2c_dev で書き換えた /etc/modules は消えないようだ

I2C

sudo apt-get install i2c-tools
MAKEDEV のエラーは無視してよい /dev/i2c-1 がすでにあるはず。


CPU Temperature

cat /sys/class/thermal/thermal_zone0/temp
vcgencmd measure_temp

Node.js

sudo apt-get install build-essential libncurses5-dev gawk git subversion libssl-dev gettext unzip zlib1g-dev file python
./configure --dest-cpu=arm --dest-os=linux --without-snapshot --shared-zlib --with-intl=none --with-arm-fpu=vfp --prefix=/usr

むちゃくちゃ時間かかるので、https://nodejs.org/ja/download/ の Linux Binaries (ARM) ARMv6 を /opt 配下に展開しよう。

cd /opt
sudo wget https://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-armv6l.tar.xz
sudo tar xfJ node-v10.16.0-linux-armv6l.tar.xz
sudo chown -R root: node-v10.16.0-linux-armv6l
sudo ln -s /opt/node-v10.16.0-linux-armv6l /opt/node
sudo ln -s /opt/node/bin/* /usr/bin/
sudo ln -s /opt/node/include/* /usr/include/
sudo ln -s /opt/node/lib/* /usr/lib/


n とか nvm とか使うのが良いそうだ

sudo npm install -g --unsafe-perm homebridge
sudo npm install -g homebridge-cmdswitch2
sudo npm install -g --unsafe-perm homebridge-config-ui-x

libavahi-compat-libdnssd-devは不要になった。(node.js module が mdns から bonjour-hap に変わった)

n

n list
n lts
systemctl stop homebridge
n prune
systemctl start homebridge

HomeBridge with iOS11

Not working with IOS11
  • Upgrade homebridge to newest version: npm install -g homebridge
  • Stop homebridge service
  • rm -rf ~/.homebridge/persist
  • rm -rf ~/.homebridge/accessories
  • Under ~/.homebridge/config.json, change your "username": "11:22:33:44:55:66" to something else
  • Start homebridge service
  • Delete homebridge accessory from home app
  • Add homebridge accessory to home app and enter pin etc


HomeBridge, HomeKit, Home Hub, Apple TV

Multicast 攻撃で、自宅のホームルータが死ぬ。ルータ再起動で復活はする。Apple AirMac にするのがよさそう。原因がうっすら判明。

IGMP 系が関連ありそうなので調べた結果、家の環境では、IGMP querier (IGMP クエリア機能) を投げる機器がないのが問題らしい。

https://bitbucket.org/marc_culler/querierd/

この設定で様子を見る。今の所問題なし。解決といっていい。


あとは

net.ipv4.icmp_echo_ignore_broadcasts=0

これは必要らしい。

セキュリティ的には DoS の可能性があるのだが許容した。


Home.app で頻繁に "Apple TVが応答しません。" がでる

Raspiで wlan0 のパワーセービング機能をオフになっていることを確認。

sudo iw wlan0 set power_save off
brcmfmac: power management disabled
boot 時にメッセージが出ていたらOK


結局、いろいろ考察した結果、Apple TV の Home hub と iCloud のコネクションが落ちているのが原因ぽいので、デバイスの状態を iCloud に通知すればイケるかもしれないで、(ダミーの) device の状態を変化させて定期的に送信する処理を homebridge-cmdswitch2 の polling 機能で実装した。 以前よりはマシになった(気がする)が、やはり「応答しません」は出る。

        {
            "name": "DUMMY-STATUS",
            "on_cmd": "/bin/true",
            "off_cmd": "/bin/true",
            "state_cmd": "/usr/local/bin/status-toggle.sh",
            "polling": true,
            "interval": 600
        }


ステータスをトグルさせて返すスクリプト (/usr/local/bin/status-toggle.sh)

#!/bin/bash

LOCKFILE=/tmp/status-toggle.lock
STATUSFILE=/tmp/status-toggle.dat

(
    flock -n 201 || exit 1

    status=$((`cat ${STATUSFILE}`==0))
    echo ${status} > ${STATUSFILE}
    exit ${status}

) 201>"${LOCKFILE}"

"Apple TVが応答しません。" の場合に mDNS でサービスをブラウズしたら、IP address が IPv6 を返していた。これが怪しい。当面定期的の AppleTV の IP に IPv4 アドレスで定期的に arp + icmp を送って様子みる。

"Apple TVが応答しません。" 問題は解決不能として諦める。


Raspberry Pi 3 B+ に変えて、有線接続にしたら解消しました。まーそーだろーなー

disable IPv6

業界的にはよろしくないが、IPv6 を殺した。インターネットの接続先プロバイダーが IPv4 Only なので...

/boot/cmdline.txt に追加

ipv6.disable=1

パラノイアならw

/etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.wlan0.disable_ipv6=1

/etc/modprobe.d/ipv6.conf

alias net-pf-10 off
alias ipv6 off
options ipv6 disable_ipv6=1
blacklist ipv6

irMagician

irMagician 買うぞ!。。。買った :)

irMagicianをSiriから使う | 大宮技研 合同会社
raspberry piとirMagicianを使って赤外線で家電を操作
iOS10「ホーム」アプリと「Raspberry Pi + irMagician」でお手軽家電操作。
irMagician + Raspberry Pi + HomeKitで家電を遠隔&音声制御する - YSNHatenaBlog
小型赤外線(IR)リモコン irMagician ファースト・インプレッション
Siriさんに電気をつけてもらう。 - ポンダッドの日記
赤外線リモコンデータ | 大宮技研 合同会社
赤外線リモコン irMagician を組み立てました - まりぱらおーぐ

ダイキンのエアコンの操作は単純には成功しなかった。(リモコン型番 ARC446A3)

Raspberry Piでエアコンを操作できる赤外線リモコンを作った
ここ↑が一番役にたった。
1) “bit 0”×5回+ストップ信号+ギャップスペース
2) リーダー信号+データ信号(64bit)+ストップ信号+ギャップスペース
3) リーダー信号+データ信号(64bit)+ストップ信号+ギャップスペース
4) リーダー信号+データ信号(152bit)+ストップ信号

どうも 2, 3 のストップ信号のあとの長いギャップ(赤外線を照射していない部分)が正しくキャプチャーできていないようだ。その部分を修正したら動くようになる。


どうもキャプチャーで桁あふれか変換ミスをしてるっぽい。いろいろ調べた結果 unsigned char に収まらないのが原因。オーバーフローしてもエラーとして扱っていないのでわからないのも問題。


K (Set Post scaler) を 255 に設定してから キャプチャー すれば ダイキン エアコン の問題点はクリアできた。


■家電協フォーマット■

HomeKit の Home Hub としての Apple TV が欲しくなってきた...

https://github.com/zasf/IRdaikinARC466
IR Daikin: decodificare protocolli infrarossi complessi. | McMajan
フォーマットがわかってきたので発見できた情報


homebridge-cmd 等で呼び出す場合は、ちゃんと排他処理しましょう。

次は homebridge-cmdswitch2 というのを試そう。

homebridge-cmdswitch2 の方が出来が良いので書き換えた。

FileBeat

Golang のパッケージがあるぞ。

本家スタティックリンク版発見

https://beats-nightlies.s3.amazonaws.com/index.html?prefix=jenkins/filebeat/
filebeat-linux-arm がそれだが、完全に HEAD の build だった
INFO Setup Beat: filebeat; Version: 7.0.0-alpha1-git23d9fe6
動いてはいる ;)

memo

git clone https://github.com/tsg/go-daemon.git
cd go-daemon
make
mv god filebeat-god
dpkg-deb -x filebeat-5.5.1-amd64.deb ./
#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

ssh tunnel

python supervisord で管理する。

apt-get -y install supervisor

I2C RTC DS1307

手元に Adafruit の DS1307 Real Time Clock breakout board kit があったので、以下の手順で導入した。

Adding a Real Time Clock to Raspberry Pi

さっくり動いた。

[   11.054531] rtc-ds1307 1-0068: rtc core: registered ds1307 as rtc0
[   11.054577] rtc-ds1307 1-0068: 56 bytes nvram
pi@raspberrypi:~ $ sudo hwclock -D -r
hwclock from util-linux 2.25.2
Using the /dev interface to the clock.
Last drift adjustment done at 1502281575 seconds after 1969
Last calibration done at 1502281575 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
/dev/rtc does not have interrupt functions. Waiting in loop for time from /dev/rtc to change
...got clock tick
Time read from Hardware Clock: 2017/08/10 00:33:36
Hw clock time : 2017/08/10 00:33:36 = 1502325216 seconds since 1969
Thu 10 Aug 2017 09:33:36 JST  -0.290283 seconds

AirPlay

https://github.com/mikebrady/shairport-sync

AirPlay video streaming

https://osmc.tv/

iOS10 ではダメだそうだ (中古の AppleTV 買うか...)

HDMI & CEC

consoleblank=0
echo "scan" | cec-client -d 1 -s
http://www.cec-o-matic.com/
cec-client -m -d 8 -b -r

純正ケース問題

純正ケースをつかっていると、コネクター類が深くささらない。どうも掃除とかで意図せずうごかして HDMI-CEC の信号が突然来なくなる事象がふえたので、結局これを買った。(在庫切れかもしれず)

https://www.amazon.co.jp/Goliton%C2%AE-FPV-HDTV%E3%83%9E%E3%83%AB%E3%83%81%E3%82%AB%E3%83%A1%E3%83%A9%E7%A9%BA%E4%B8%AD%E6%92%AE%E5%BD%B1%E7%94%A8-20cm-%E3%83%95%E3%83%A9%E3%83%83%E3%83%88%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-%E4%B8%8A%E5%90%91%E3%81%8D-90%E5%BA%A6-FPV-Mini-FPC-%E5%A4%89%E6%8F%9B%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB/dp/B075GT2MGJ

この L 型コネクターはしっかりささる。ボッタクリの値段がついたのももあるので注意すること。千円前後ならOK

らずぱい怪談

誰もいない部屋のテレビがついた。しかも入力切替までしてラズパイの画面が出ていた...

hdmi_ignore_cec_init=1
この呪文を /boot/config.txt に書くと治るらしいwww

この機能があるなら、IR 経由でなくても homebridge で TV がコントロールできそうだ。

sudo apt-get install cec-utils

homebridge-cec-accessory, homebridge-cec, homebridge-platform-cec, homebridge-hdmi 等

cec-clientをhomebridgeから制御 - T-Saitoh's Diary
homebridge-cec-accessory
これを使ってみる
メーカーにより使える機能に制限があるのでけっしてバラ色ではない。

Raspbian Jessie to Raspbian 9 Stretch

Raspbian Stretch has arrived for Raspberry Pi

なぬ。メジャーバージョンアップだ。すでにラズパイの download page も新しいのを推してる

Raspbian GNU/Linux upgrade from Jessie to Raspbian Stretch 9
第4章 Debian 8 (jessie) からのアップグレード


/etc/network/interfaces

--- interfaces.dpkg-old	2017-07-05 19:55:26.182496782 +0900
+++ interfaces	2017-09-01 22:30:58.645695819 +0900
@@ -5,16 +5,3 @@
 
 # Include files from /etc/network/interfaces.d:
 source-directory /etc/network/interfaces.d
-
-auto lo
-iface lo inet loopback
-
-iface eth0 inet manual
-
-allow-hotplug wlan0
-iface wlan0 inet manual
-    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
-
-allow-hotplug wlan1
-iface wlan1 inet manual
-    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

かといって /etc/network/interfaces.d/ には何もない。