バネ下重量の軽量化で「乗り心地」は良くなるのか試してみた

バネ下重量の軽量化で「乗り心地」は良くなるのか?

個人的な回答は

  改善したい「乗り心地」の定義次第です。

元も子もありませんが、私は以下の通り「改善した」と感じています。

実際に試したクルマ

概要

  • 0-100km/h 4.9秒 のそこそこスポーティなモデル
  • 足回りはやや硬め(ダンピングコントロールなし)
  • 走行距離 20,000km程度(各所のあたりつけ済み)
  • MCBやボディ補強パーツ類を装着済み

改善したかった「乗り心地」

以下のような場所を走行した際に生じる「不快な重い突き上げ」を改善したい。

  • 駐車場に設置された「バンプ
  • 私有地から公道に出る際の段差
  • 高速道路の劣化した大きな繋ぎ目や凸凹

下腹部にドスンと面で打撃を受けるような、重い突き上げを改善したいという感じです。

試したこと

以下をそれぞれの効果がわかるように日を空けて実施しました。

  1. 鍛造ホイールに交換
  2. 前輪ディスクローターの交換
  3. 後輪ディスクローターの交換

コストを抑えるためにディスクローターは個人輸入しています。

1. 鍛造ホイールに交換

ホイール1本あたりの重さは以下の通り。

純正ホイール: 11.00 kg
鍛造ホイール: 8.65 kg

1本あたり 2.35kg * 4本 で合計 9.4kg の軽量化。

タイヤはそのまま組み替え。空気圧は同じに。

効果

  • 重い突き上げは劇的に改善
  • 直進安定性などに悪影響は感じず
  • ロードノイズもさしたる変化なし

「もっと早く交換しておけばよかった」と思うくらい良いことずくめでした。

厳密に測定するとロードノイズは増えているかもしれませんが、突き上げの改善レベルに比べれば「誤差」や「慣れ」の範囲内といったところです。

劇的な改善効果がありつつ、さしたるデメリットも感じなかったことで「もっと軽量化したらどうなるかな?」という気持ちが湧いてきました。

2. 前輪ディスクローターの交換

ローター1枚あたりの重さは以下の通り。

純正ローター: 10.75 kg
軽量ローター: 9.80 kg

1枚あたり 0.95kg * 2枚 で合計 1.9kg の軽量化。

メーカー純正2ピースフローティングドリルドローター。イギリスから輸入。

効果

  • ホイール交換に比べると体感は少ないが前輪の突き上げは更に改善
  • 悪影響は感じず
  • 後輪が気になるようになった(前輪との対比で)

こちらも基本良いことずくめなのですが、前輪側が良くなっただけに後輪側の突き上げに意識が向くようになりました。

3. 後輪ディスクローターの交換

ローター1枚あたりの重さは以下の通り。

純正ローター:  6.85 kg
軽量ローター: 5.95 kg

1枚あたり 0.90kg * 2枚 で合計 1.8kg の軽量化。

2ピースセミフローティングスロットローター。アメリカから輸入。DIY交換。

効果

  • ホイール交換に比べると体感は少ないが後輪の突き上げは更に改善
  • 悪影響は感じず
  • 前後バランスに満足できるようになった

こちらも良いことずくめの結果になりました。

結論

改善したい「乗り心地」が「不快な重い突き上げ」であった自車の場合は、バネ下重量の軽量化(合計 13.1kg)で劇的な改善を得られました。

その他の影響としては「路面の状況(うねり等)を少し拾いやすくなったかな?」と意識しながら運転すれば「そう思わなくもないが以前はどうだったかな?」という感覚です。

これについては、そこそこスポーティなモデルということもあって違和感もなく、総じてとても満足度の高い結果になりました。

最後に

この記事のインプレッションが自分の感覚に近いと感じましたので参考までに。

【Raspberry Pi 5】M.2 2230 NVMe SSD で起動してみた(内蔵Bluetoothが不安定になった)

Homebridge のために Raspberry Pi Zero 2W を利用していましたが、Raspberry Pi OS を 64bit版 Bookworm に更新したところ以下の問題が発生するようになりました。

面倒になったので環境を新調しました。オーバースペックですがこのタイミングなので Raspberry Pi 5 4GB を購入です。(当初は「4GBの方が8GBよりも速い」と言われていましたが、現在は対応が行われています)

Raspberry Pi Zero 2 W で使った 64bit版 Bookworm の microSD を入れるだけで問題なく起動し、上記の問題はもちろん解決しました。

ストレージベンチマーク

PiBenchmarks の結果は次のとおりです。

microSD

    Category           Test                 Result
HDParm          Disk Read               74.28 MB/sec
HDParm          Cached Disk Read        41.75 MB/sec
DD              Disk Write              40.2 MB/s
FIO             4k random read          4779 IOPS (19117 KB/s)
FIO             4k random write         712 IOPS (2849 KB/s)
IOZone          4k read                 20717 KB/s
IOZone          4k write                2740 KB/s
IOZone          4k random read          14833 KB/s
IOZone          4k random write         2757 KB/s

                        Score: 1777

USBメモリによる起動も試してみました。

USBメモリ

    Category           Test                 Result
HDParm          Disk Read               288.63 MB/sec
HDParm          Cached Disk Read        295.89 MB/sec
DD              Disk Write              238 MB/s
FIO             4k random read          6243 IOPS (24975 KB/s)
FIO             4k random write         11544 IOPS (46178 KB/s)
IOZone          4k read                 20608 KB/s
IOZone          4k write                29516 KB/s
IOZone          4k random read          15896 KB/s
IOZone          4k random write         24073 KB/s

                        Score: 7385

microSD に比べるとかなり速くなります。

SSDへの換装

ただ、せっかくの Raspberry Pi 5 なら PCIe 接続でSSDを使いたい。また、理由があって公式ケースに収めたい。(後述)

ということで結果はこうなりました。現時点では少し珍しい構成です。

ACE desgin studio PI-2230-SSD

PCIe to M.2 NVMe SSD 拡張ボードは ACE desgin studio の PI-2230-SSD です。

こちらの商品は以下のポストから見つけました。

しかし、この製品の利用者がまったく見つかりません。公式ケースに対応する/しそうな製品としてメジャーなのは Geekworm X1003 や Pineberry Pi HatDrive! Top あたりです。

エアフロー、デザイン、GPIO を塞がない点では PI-2230-SSD に惹かれますが、やっぱり利用者の情報は見つからず。どうしたものかと開発元のプロフィールを覗いてみると...

@ichirowo さんの安心感により購入に踏み切れました。(個人の感想です)

日本時間の3月5日午前に注文して翌日発送、3月11日に到着しました。日本国内の配送は佐川急便で大きな箱にしっかり梱包されていました。

アクティブクーラーに取り付けるネジとスペーサーは予備まで入っている親切さです。

WD SN740 NVMe SSD

取り付ける M.2 2230 NVMe SSD は WD SN740 を用意しました。メルカリで新品PC外しの 512GB を格安で入手できたためです。

Pimoroni NVMe Base による動作確認では 'Maybe' List に分類されていますが、詳細には "Our fresh unit worked well. YMMV." と記載されています。この分類のためか本製品も利用者の情報が見つかりませんでした。

まだ様子見の段階ですが(起動すれば)問題なく動いているように思います。(後述)

PCIe有効化

設定方法は公式資料のほか、いろいろなところで紹介されているため割愛します。

起動ディスクのコピー

Raspberry Pi OS Lite を利用しているので、よく紹介されるデスクトップ版の SD Card Copier による方法は使えません。

microSDUSBメモリSSD へのコピーには rpi-clone を利用しました。

オリジナル版は更新が止まっており、新しいOSのディレクトリ構造や NVMe SSD に対応していないため上記の fork を利用しています。

初期化からパーティション分割、コピーした以下のファイルに含まれる PARTUUID 文字列の書き換えまで対応してくれます。

/boot/firmware/cmdline.txt
/etc/fstab

SSDストレージベンチマーク

PCIe Gen 2.0

    Category           Test                 Result
HDParm          Disk Read               384.84 MB/sec
HDParm          Cached Disk Read        434.37 MB/sec
DD              Disk Write              317 MB/s
FIO             4k random read          110107 IOPS (440430 KB/s)
FIO             4k random write         80629 IOPS (322519 KB/s)
IOZone          4k read                 182538 KB/s
IOZone          4k write                169971 KB/s
IOZone          4k random read          76074 KB/s
IOZone          4k random write         186991 KB/s

                        Score: 40980

PCIe Gen 3.0

dtparam=pciex1_gen=3 を設定するとかなりスコアが向上します。

    Category           Test                 Result
HDParm          Disk Read               740.70 MB/sec
HDParm          Cached Disk Read        825.93 MB/sec
DD              Disk Write              526 MB/s
FIO             4k random read          211134 IOPS (844536 KB/s)
FIO             4k random write         84979 IOPS (339917 KB/s)
IOZone          4k read                 218940 KB/s
IOZone          4k write                223976 KB/s
IOZone          4k random read          86930 KB/s
IOZone          4k random write         272289 KB/s

                        Score: 57464

オーバークロックしていない Raspberry Pi 5 としては相当良いスコアです。

起動時の不具合(低頻度)

dtparam=pciex1_gen=3 の設定に関係なく、低頻度ではあるものの電源ONやリブート時に正常に起動しないことがありました。(通常 firmware が読み込まれるとファンの回転が止まるが、異常時は高速で回り続けるためすぐに分かる)

再現性が低く、拡張ボードのせいか、SSDとの相性によるものか、電源に起因するのか、などは不明のままですが正常起動時の動作等から拡張ボードが原因ではない気がします。

なお、電源は 5.1V 5A (27W) を利用しています。もしかしたら Geekworm X1003 のように GPIO からも電源を取っていたら安定するのかもしれませんが未確認です。

別のSSDを手配すれば切り分けも可能ですが、異常時には電源ボタンを押せば解決するため、そこまではしないつもりです。(そもそも滅多に再起動しないので)

EEPROM の更新により WD SN550 での起動不具合が改善された実績もあり、ソフトウェア起因であれば解決されるかもしれないことを期待して様子見したいと思います。

ケース加工

SSDの固定ネジが公式ケースの蓋に干渉したので、写真のように少しだけ加工しました。

公式ケースを使いたい理由

以前の記事でも Raspberry Pi から「SwitchBot ボット」を操作していることを書きましたが、金属ケースに入れるとボード内蔵Bluetoothの信号が減衰するためです。

ケースの影響を受けないように以下のBluetooth USB アダプタを過去にも試しましたが、その際はボード内蔵Bluetoothの方が(わずかに)応答が速く採用を見合わせていました。

公式ケースに蓋をしても温度は大丈夫?

有意な温度上昇は確認できず、いまのところ問題なさそうです。

SSDで起動したら内蔵Bluetoothが不安定になった

何を言っているか分からないと思いますが、ありのまま起こったことを書きます。

「SwitchBot ボット」の操作に利用しているスクリプトの実行時間を time コマンドにて計測すると共にスクリプト内の接続リトライ回数もログ出力しています。

USBメモリ起動時とSSD起動時のログを比べたところSSDの方が明らかに遅くなりました。上記のリトライ回数が不安定になるためです。さらに dtparam=pciex1_gen=3 を設定するとリトライ回数が増えることも分かりました。

PCIe接続を行うFPCケーブル端子のすぐ横に無線アンテナがあることが関係しているかもしれません。違うFPCケーブルにすれば改善する可能性もあるかもしれません。

ただ、上記のBluetooth USB アダプタを利用することにより完全に安定した状態となるため、これ以上の切り分けは実施せず内蔵Bluetoothをオフにすることにしました。

つまり、公式ケースにこだわる理由はなくなりました。

最後に

今回の事象は gatttool を使ったBluetooth接続時にリトライ回数が増えるという特殊な状況であるため、一般的なマウスやキーボードなどの常時接続では目に見える影響はないかもしれません。YMMV.

Aladdin X2 Plus を物理スイッチから操作してみた

こちらの記事の続きです。

物理スイッチとの連携方法

  1. スイッチ操作できる他製品の電源状態とオートメーションで連携する
  2. スマートホームに直接対応した物理スイッチを購入する
  3. Zigbee2MQTT でZigbee物理スイッチをスマートホーム連携する

 

1. スイッチ操作できる他製品の電源状態とオートメーションで連携する

 難易度:易 ★☆☆ 難
 洗練度:低 ★☆☆ 高
 コスト:安 ★☆☆ 高(IKEAハブ環境がある場合)

最も手軽でコストの掛からない手段として、IKEAのスマートコンセントを物理スイッチで操作し、その電源状態に連動して Nature Remo が動くようにオートメーションを作成する方法です。当初は家にあった機材でこの方法を採用していました。

欠点

 ・コンセントと Aladdin の状態が一致しないと動かない(無駄な操作)
 ・コンセントがひとつ占有される
 ・ON / OFF の2系統しか制御できない

 

2. スマートホームに直接対応した物理スイッチを購入する

 難易度:★☆☆ 〜 ★★★(電気工事の有無による)
 洗練度:★★☆ 〜 ★★★
 コスト:★★☆ 〜 ★★★

国内正規販売されているスマートホーム向けの物理スイッチを用いる方法です。

以前は Eve の製品も販売されていたような気がします。

欠点

 ・コスト高め
 ・対応する製品が限られる
 ・情報が少ない

 

3. Zigbee2MQTT でZigbee物理スイッチをスマートホーム連携する

 難易度:★★☆ 〜 ★★★
 洗練度:★★★
 コスト:★☆☆(Homebridge 環境がある場合)

Homebridge の運用ができる方なら難易度は高くありませんが、こちらも情報が少なめで準備は少し手間が掛かるかもしれません。

これを用いるとIKEAの物理スイッチであれば長押しを含めた5つの操作に対応できます。

欠点

 ・環境構築が必要
 ・情報が少ない

 

赤外線リモコンコード(更新版)

Aladdin X2 Plus の仕様なのですが、前回の赤外線リモコンコードを用いて「常夜灯ON」の状態から「ライトON」の操作をしても何も変化がありません。この状態から照明を点灯させるためには「ライトOFF → ON」の操作をするか「ライト切り替え」の操作をするしかありません。Aladdin の考えでは常夜灯も照明の1つであるということかと思いますが、一般的な感覚では違和感があります。

仕方がないので「ライトOFF → ON」を連続実行する赤外線コードも用意しました。

(x) ライトOFF → ON

{"format":"us","freq":38,"data":[9008,4506,553,567,521,605,528,592,570,542,548,605,515,605,517,603,564,1670,546,1726,546,1687,521,1720,519,1724,532,1707,566,1699,515,1725,540,579,541,579,534,1705,575,1685,553,567,521,1724,547,567,541,585,573,568,521,1724,547,566,547,580,534,1705,573,565,547,1697,517,1723,549,1685,540,27033,8977,4540,549,567,553,566,553,567,540,588,570,567,555,565,552,567,553,1687,566,1677,575,1684,523,1723,547,1687,544,1698,538,1706,570,1687,521,603,516,1723,516,603,539,1703,541,1723,547,567,546,579,526,594,562,562,536,606,546,1687,521,605,528,592,571,1663,547,1726,546,1685,553,1687,540]}

Amazon Echo (Alexa) などから操作する際はこちらの赤外線リモコンコードを利用しています。遅延を感じることもなく意図した動作をしてくれます。

homebridge-nremo はコマンドの連続実行が可能なので "command_order" の設定を下記のように変更しています。

{
	"name": "子供部屋照明",
	"accessory": "NatureRemo",
	"host": "xxx.xxx.xxx.xxx",
	"path": "/messages",
	"delayBefore": 0,
	"delayAfter": 0,
	"timeout": 2000,
	"retry_interval": 500,
	"retry": 3,
	"on": {"format":"us","freq":38,"data":[8977,4540,549,567,553,566,553,567,540,588,570,567,555,565,552,567,553,1687,566,1677,575,1684,523,1723,547,1687,544,1698,538,1706,570,1687,521,603,516,1723,516,603,539,1703,541,1723,547,567,546,579,526,594,562,562,536,606,546,1687,521,605,528,592,571,1663,547,1726,546,1685,553,1687,540]},
	"off": {"format":"us","freq":38,"data":[9008,4506,553,567,521,605,528,592,570,542,548,605,515,605,517,603,564,1670,546,1726,546,1687,521,1720,519,1724,532,1707,566,1699,515,1725,540,579,541,579,534,1705,575,1685,553,567,521,1724,547,567,541,585,573,568,521,1724,547,566,547,580,534,1705,573,565,547,1697,517,1723,549,1685,540]},
	"command_order": [{ "on": ["off","on"] },{ "off": ["off"] }]
},
{
	"name": "常夜灯",
	"accessory": "NatureRemo",
	"host": "xxx.xxx.xxx.xxx",
	"path": "/messages",
	"delayBefore": 0,
	"delayAfter": 0,
	"timeout": 2000,
	"retry_interval": 500,
	"retry": 3,
	"on": {"format":"us","freq":38,"data":[8985,4505,575,542,583,567,544,579,549,566,555,565,568,560,541,605,538,1698,549,1686,534,1709,543,1701,565,1696,519,1720,519,1724,530,1708,541,583,538,1723,549,567,521,603,532,1711,539,1701,564,582,546,567,521,605,530,590,541,1724,515,1725,546,567,547,579,532,1707,541,1724,547,1687,540]},
	"off": {"format":"us","freq":38,"data":[9008,4506,553,567,521,605,528,592,570,542,548,605,515,605,517,603,564,1670,546,1726,546,1687,521,1720,519,1724,532,1707,566,1699,515,1725,540,579,541,579,534,1705,575,1685,553,567,521,1724,547,567,541,585,573,568,521,1724,547,566,547,580,534,1705,573,565,547,1697,517,1723,549,1685,540]},
	"command_order": [{ "on": ["on"] },{ "off": ["off"] }]
},
{
	"name": "プロジェクター",
	"accessory": "NatureRemo",
	"host": "xxx.xxx.xxx.xxx",
	"path": "/messages",
	"delayBefore": 0,
	"delayAfter": 0,
	"timeout": 2000,
	"retry_interval": 500,
	"retry": 3,
	"on": {"format":"us","freq":38,"data":[8966,4534,562,561,537,605,540,579,549,567,534,594,571,568,553,567,547,1699,515,1724,532,1707,543,1722,551,1686,521,1725,540,1699,536,1708,572,567,553,1686,521,605,516,1723,536,588,541,605,547,565,555,1685,547,581,566,548,548,1724,516,603,541,1699,517,1723,570,1665,581,565,555,1685,540]},
	"off": {"format":"us","freq":38,"data":[9011,4506,553,567,521,605,515,605,531,591,564,579,549,567,520,603,517,1725,536,1704,574,1687,520,1723,551,1685,555,1685,542,1706,541,1725,546,567,521,1725,515,1725,536,1702,543,603,517,607,539,581,515,1725,536,588,538,603,517,603,517,602,543,1697,541,1703,541,1725,515,605,541,1698,540]},
	"command_order": [{ "on": ["on"] },{ "off": ["off"] }]
},
{
	"name": "子供部屋照明切替",
	"accessory": "NatureRemo",
	"host": "xxx.xxx.xxx.xxx",
	"path": "/messages",
	"delayBefore": 0,
	"delayAfter": 0,
	"timeout": 2000,
	"retry_interval": 500,
	"retry": 3,
	"on": {"format":"us","freq":38,"data":[8957,4545,530,594,570,570,520,605,515,605,541,579,530,593,569,568,548,1697,540,1699,551,1688,538,1709,541,1725,515,1725,514,1726,516,1723,560,565,572,565,555,1687,521,605,515,605,536,1703,545,1720,519,1725,546,1687,547,1698,539,585,539,1724,542,1702,546,568,552,567,543,588,570,567,540]},
	"off": {"format":"us","freq":38,"data":[8957,4545,530,594,570,570,520,605,515,605,541,579,530,593,569,568,548,1697,540,1699,551,1688,538,1709,541,1725,515,1725,514,1726,516,1723,560,565,572,565,555,1687,521,605,515,605,536,1703,545,1720,519,1725,546,1687,547,1698,539,585,539,1724,542,1702,546,568,552,567,543,588,570,567,540]},
	"command_order": [{ "on": ["on"] },{ "off": ["off"] }]
}

物理スイッチを複数用意して照明のほかプロジェクターのON/OFFも操作できるようにしました。これで Aladdin X2 Plus のスマートホーム対応は一旦完成です。

Aladdin X2 Plus の赤外線リモコンコードを調べて Nature Remo から操作してみた

我が家では IKEA の電球やプラグを中心にスマートホームを実現しています。操作は主にIKEAの物理スイッチのほか Amazon Echo (Alexa) への音声入力と、Appleホームアプリ (HomeKit) に設定したアクセサリを iPhone / iPadウィジェットに配置したショートカットから行っています。

先日、子供部屋の照明をIKEAのスマート電球から Aladdin X2 Plus に交換したのですが、スマートホーム対応していない同製品をこれまで通り物理スイッチや音声アシスタント、各種デバイスから操作できるようにしていきます。そのために必要な赤外線リモコンコードを調べました。

前提として Aladdin 付属のリモコンで操作した場合にはスマートホームアプリに表示される電源状態が本体の状態と一致しなくなるのはどうしようもないということで(物理スイッチと音声、ウィジェットからの操作であればアプリ上の電源状態を目にすることもないため)そこは全く気にせず、これまで通り「違和感なく」操作できることを目標にしています。

「違和感なく」の定義

  • 気になるほどの遅延がない
  • 意図した操作と逆の動きにならない
  • アプリと本体の電源状態を一致させないと動かないなどの無駄がない

赤外線リモコン検討

赤外線リモコンは元々 Nature Remo mini 2 を別の部屋で利用しており Homebridge からAppleホームアプリにも連携していて、今回やりたいことが実現出来そうなため Nature Remo を採用することにしました。

2023年7月に Nature Remo nano というエントリーモデルが発売されシリーズで初めて Matter にも(条件付きですが)対応しているものの、残念ながら「Nature Remo nano は Local API 非対応*1で遅延が気になったため実際に試してみました。

ちなみに Nature Remo nano はめちゃくちゃ小さいです。

Nature Remo Cloud API と Local API の比較

以下の2パターンでAppleホームアプリから扇風機を操作して遅延の比較をしました。

  1. Nature Remo nano   : Nature Remoアプリから Matter 連携 (Cloud API)
  2. Nature Remo mini 2 : homebridge-nremo からアクセサリ追加 (Local API)

結果は想定通りと言えますが Local API では操作した瞬間に動く感覚が得られるのに対して、Cloud API はどうしてもワンテンポ遅れる感じがあります。時間にすると約1秒前後で十分使える印象ですが、回線やサーバの状況次第では更に遅延する/動かなくなることもあり得るため、今回は Local API を利用することにしました。

とはいえ、Matter 連携は非常に簡単に設定できますし Homebridge なども不要で遅延も最小限のため、これからスマートホーム化を進める人にとっては非常によい選択肢になりそうです。

赤外線リモコンコード

Aladdin X2 Plus に付属のリモコンは以下のボタン構成です。

このうち赤外線でコントロールしているのは以下の3つになります。

 (2) プロジェクター電源ボタン
 (5) ライト切り替えボタン
 (6) ライトオンオフボタン

このような、ひとつのボタンでオンオフを切り替える方式は違和感のない操作には最大の敵になりえますが、幸いなことに付属のリモコンにボタンがないだけで以下の個別操作に対応していることは事前に調べがついていました。

 (a) プロジェクターON
 (b) プロジェクターOFF
 (c) 常夜灯ON
 (d) ライトON
 (e) ライトOFF

8種類の赤外線リモコンコード

私の環境で実際に動作を確認した赤外線リモコンコードは下記の通りです。

(2) プロジェクター電源ボタン

{"format":"us","freq":38,"data":[8982,4537,571,554,545,591,571,554,545,592,539,594,569,554,545,594,569,1684,571,1695,541,1725,536,1725,562,1699,562,1700,570,1685,545,1723,564,569,537,1725,536,1725,570,1683,577,1684,579,1685,545,1723,538,1722,541,1721,539,595,536,593,538,594,537,592,539,594,569,554,546,593,538,590,539,39755,8978,2303,540]}

(5) ライト切り替えボタン

{"format":"us","freq":38,"data":[8957,4545,530,594,570,570,520,605,515,605,541,579,530,593,569,568,548,1697,540,1699,551,1688,538,1709,541,1725,515,1725,514,1726,516,1723,560,565,572,565,555,1687,521,605,515,605,536,1703,545,1720,519,1725,546,1687,547,1698,539,585,539,1724,542,1702,546,568,552,567,543,588,570,567,540]}

(6) ライトオンオフボタン

{"format":"us","freq":38,"data":[9012,4499,570,568,538,594,568,554,570,568,570,554,576,554,571,567,538,1722,573,1685,546,1720,573,1683,547,1722,570,1686,570,1698,570,1684,547,591,563,1697,564,569,570,553,571,570,536,1724,538,1722,572,1683,579,1684,546,592,538,1722,540,1725,538,1721,564,568,538,594,536,592,572,554,576,39715,8986,2301,540]}

(a) プロジェクターON

{"format":"us","freq":38,"data":[8966,4534,562,561,537,605,540,579,549,567,534,594,571,568,553,567,547,1699,515,1724,532,1707,543,1722,551,1686,521,1725,540,1699,536,1708,572,567,553,1686,521,605,516,1723,536,588,541,605,547,565,555,1685,547,581,566,548,548,1724,516,603,541,1699,517,1723,570,1665,581,565,555,1685,540]}

(b) プロジェクターOFF

{"format":"us","freq":38,"data":[9011,4506,553,567,521,605,515,605,531,591,564,579,549,567,520,603,517,1725,536,1704,574,1687,520,1723,551,1685,555,1685,542,1706,541,1725,546,567,521,1725,515,1725,536,1702,543,603,517,607,539,581,515,1725,536,588,538,603,517,603,517,602,543,1697,541,1703,541,1725,515,605,541,1698,540]}

(c) 常夜灯ON

{"format":"us","freq":38,"data":[8985,4505,575,542,583,567,544,579,549,566,555,565,568,560,541,605,538,1698,549,1686,534,1709,543,1701,565,1696,519,1720,519,1724,530,1708,541,583,538,1723,549,567,521,603,532,1711,539,1701,564,582,546,567,521,605,530,590,541,1724,515,1725,546,567,547,579,532,1707,541,1724,547,1687,540]}

(d) ライトON

{"format":"us","freq":38,"data":[8977,4540,549,567,553,566,553,567,540,588,570,567,555,565,552,567,553,1687,566,1677,575,1684,523,1723,547,1687,544,1698,538,1706,570,1687,521,603,516,1723,516,603,539,1703,541,1723,547,567,546,579,526,594,562,562,536,606,546,1687,521,605,528,592,571,1663,547,1726,546,1685,553,1687,540]}

(e) ライトOFF

{"format":"us","freq":38,"data":[9008,4506,553,567,521,605,528,592,570,542,548,605,515,605,517,603,564,1670,546,1726,546,1687,521,1720,519,1724,532,1707,566,1699,515,1725,540,579,541,579,534,1705,575,1685,553,567,521,1724,547,567,541,585,573,568,521,1724,547,566,547,580,534,1705,573,565,547,1697,517,1723,549,1685,540]} 

Homebridge への設定

homebridge-nremo を用いて下記のように設定しています。

{
	"name": "子供部屋照明",
	"accessory": "NatureRemo",
	"host": "xxx.xxx.xxx.xxx",
	"path": "/messages",
	"delayBefore": 0,
	"delayAfter": 0,
	"timeout": 2000,
	"retry_interval": 500,
	"retry": 3,
	"on": {"format":"us","freq":38,"data":[8977,4540,549,567,553,566,553,567,540,588,570,567,555,565,552,567,553,1687,566,1677,575,1684,523,1723,547,1687,544,1698,538,1706,570,1687,521,603,516,1723,516,603,539,1703,541,1723,547,567,546,579,526,594,562,562,536,606,546,1687,521,605,528,592,571,1663,547,1726,546,1685,553,1687,540]},
	"off": {"format":"us","freq":38,"data":[9008,4506,553,567,521,605,528,592,570,542,548,605,515,605,517,603,564,1670,546,1726,546,1687,521,1720,519,1724,532,1707,566,1699,515,1725,540,579,541,579,534,1705,575,1685,553,567,521,1724,547,567,541,585,573,568,521,1724,547,566,547,580,534,1705,573,565,547,1697,517,1723,549,1685,540]},
	"command_order": [{ "on": ["on"] },{ "off": ["off"] }]
},
{
	"name": "常夜灯",
	"accessory": "NatureRemo",
	"host": "xxx.xxx.xxx.xxx",
	"path": "/messages",
	"delayBefore": 0,
	"delayAfter": 0,
	"timeout": 2000,
	"retry_interval": 500,
	"retry": 3,
	"on": {"format":"us","freq":38,"data":[8985,4505,575,542,583,567,544,579,549,566,555,565,568,560,541,605,538,1698,549,1686,534,1709,543,1701,565,1696,519,1720,519,1724,530,1708,541,583,538,1723,549,567,521,603,532,1711,539,1701,564,582,546,567,521,605,530,590,541,1724,515,1725,546,567,547,579,532,1707,541,1724,547,1687,540]},
	"off": {"format":"us","freq":38,"data":[9008,4506,553,567,521,605,528,592,570,542,548,605,515,605,517,603,564,1670,546,1726,546,1687,521,1720,519,1724,532,1707,566,1699,515,1725,540,579,541,579,534,1705,575,1685,553,567,521,1724,547,567,541,585,573,568,521,1724,547,566,547,580,534,1705,573,565,547,1697,517,1723,549,1685,540]},
	"command_order": [{ "on": ["on"] },{ "off": ["off"] }]
},
{
	"name": "プロジェクター",
	"accessory": "NatureRemo",
	"host": "xxx.xxx.xxx.xxx",
	"path": "/messages",
	"delayBefore": 0,
	"delayAfter": 0,
	"timeout": 2000,
	"retry_interval": 500,
	"retry": 3,
	"on": {"format":"us","freq":38,"data":[8966,4534,562,561,537,605,540,579,549,567,534,594,571,568,553,567,547,1699,515,1724,532,1707,543,1722,551,1686,521,1725,540,1699,536,1708,572,567,553,1686,521,605,516,1723,536,588,541,605,547,565,555,1685,547,581,566,548,548,1724,516,603,541,1699,517,1723,570,1665,581,565,555,1685,540]},
	"off": {"format":"us","freq":38,"data":[9011,4506,553,567,521,605,515,605,531,591,564,579,549,567,520,603,517,1725,536,1704,574,1687,520,1723,551,1685,555,1685,542,1706,541,1725,546,567,521,1725,515,1725,536,1702,543,603,517,607,539,581,515,1725,536,588,538,603,517,603,517,602,543,1697,541,1703,541,1725,515,605,541,1698,540]},
	"command_order": [{ "on": ["on"] },{ "off": ["off"] }]
}

(追記)現在は下記のように設定を変更して運用中です。

最後に

付属のリモコンにボタンがない個別操作の赤外線リモコンコードが見つからなかったので誰かのお役に立てば幸いです。

【M5Stack】荷物の置き配を検知してみた

世帯数の多い集合住宅にお住まいの方なら「あるある」だと思いますが、オートロック前のインターホンで宅配業者の方より「順番に伺います!」と言われてから荷物が自宅へ届くまでに結構時間が掛かることがあります。

我が家では以下のステッカーで玄関先への置き配をお願いしているのですが「もう届いてるかな?」を能動的に確認しなくても済むようにシステム化してみました。

以下の続編的なお話です。

どうやって検知しよう?

市販品では「超音波センサ」や「重量センサ」を用いる例もいくつかみられたのですが、荷物が置かれる場所のばらつきや共用部にセンサ付きの台などを常設できないことから、今回は壁面に取り付けたカメラで検知する方式としました。

M5Stackシリーズの ESP32 PSRAM Timer Camera F (OV3660) を使用します。

概要

Raspberry Pi より右側が今回の制作部分です。(Zero 2 W になりました)

まずインターホンが鳴った際に比較元となる玄関先の画像を取得します。(処理 a, b)

一定時間内に取得された有効な比較元が存在する場合は定期的に玄関先の画像を取得し、差分を数値化して閾値を超えていたら画像付きで通知を行います。(処理 1-5)

通知完了後に画像はすべて削除します。あわせて、通知後n分間は再実行しないといった制御のためのロックファイルを生成するなど細かい処理も行っています。

画像の切り抜きや比較には ImageMagick を使っています。 (convert, compare)

作業中の様子

カメラは真下に向けて設置しており、顔が撮影されないようにしています。

(まったく使っていなかった)表札部分を照らす既設のE17電球ソケットから下記製品を利用してUSBアダプタ用の電源を取得しました。

Timer Camera F での処理

ソースコードはこちらです。

GitHub - georz/arduino_delivery_notification

HTTPリクエストを受けて画像を返すだけの簡単な処理のみ実装しています。

カメラの画質は意図的に XGA (1024x768) に留めています。解像度が高すぎない方が ImageMagick (compare) による画像比較の結果が良かったためです。

通知

こんな感じで送られてきます。

開発中に困ったこと

Wi-Fi接続が不安定な問題に大いに悩まされました。いろいろ調べたところ以下の記事に辿り着き大変助かりました。

ESP32と5V IOのUSB UARTデバイスによるWifi問題まとめ

設計上の問題で、電源の品質(電圧)に大きく影響を受けるようです。

(前回購入した ATOM Lite では同じ電源を使っても問題が起きないこと、ファームウェア更新で対応可能なことから、製造時期などにより違いがあるかもしれません)

今回購入したデバイスでは MacBook のUSB端子および Apple, Anker 製のUSBアダプタから給電される5V電源において全く使い物にならない状態でした。上記で紹介されている対策版のファームウェアを書き込もうにも、手元にWindowsマシンがありません。

それでは結局どうしたのかというと...

ダイソーで買ってきた300円のUSBアダプタで嘘のように解決しました!

低電圧。こんなに嬉しいことはない。このアダプタでスマートフォンを充電したいとは思いませんが。

謝辞

上記のWi-Fi接続問題に関連しスイッチサイエンスさんには迅速かつ多大なるサポートをいただきました。改めてお礼申し上げます。ありがとうございました。

最後に

私が勤める会社ではエンジニアを募集しています。よかったら覗いていってください。

【M5Stack】インターホンの呼び出しを検知してみた

仕事で自室にいるとインターホンの呼出音に気付かないことがあり対策したお話です。

インターホンの親機はLDKに設置されています。音量を上げてしまえば良いのですが、音量を上げるとリビングではうるさく感じたり、近くで0歳児が寝ることもあるので音量を上げずに解決したいという前提です。

みんなどうしてる?

光センサ方式

通電検知方式

インターホン呼出時の画面点灯を光センサで検知する事例の方が多く見つかりましたが、スピーカー等への通電を検知している事例も見つかりました。

画面点灯では呼出時以外も検知してしまうため今回はスピーカーへの通電を検知する方式を採用、M5Stackシリーズの ATOM Lite を使用します。

ATOM Lite

ATOM Lite

  • スイッチサイエンス
Amazon

概要

ATOM Lite では通電のセンシングとHTTPリクエストを行う処理のみとし、後続の処理は Homebridge のために自宅で動かしている Raspberry Pi で行うことにしました。

Arduino IDE の環境に比べると Linux 環境の方が便利なライブラリや参考事例も豊富で、あとから処理を変更する際にもSSH経由で対応できるためです。

通知だけできれば良かったのですが、せっかくなので「SwitchBot ボット」にも連携してボタンを押せるようにしました。

作業中の様子

※既設の電線は着脱せず、SP+ / SP- 端子に耐火・耐熱電線を新規に接続します。

ATOM Lite での処理

ソースコードはこちらです。

GitHub - georz/arduino_bell_notification

Wi-Fi接続のリトライに5回連続で失敗したらソフトウェアリセットする処理が入れてあるくらいで、センシングとHTTPリクエストだけのシンプルな内容です。

HTTPレスポンスで次回センシングまでのディレイ(遅延時間)を返すことで、呼出音が鳴り続けている際の次回通知までの間隔を簡単に調整できるようにしています。

Raspberry Pi で利用したスクリプト

  1. GitHub - OpenWonderLabs/python-host: The python code running on Raspberry Pi or other Linux based boards to control SwitchBot.
  2. GitHub - thorsten-gehrig/alexa-remote-control: control Amazon Alexa from command Line (set volume, select station from tunein or pandora)

1.のSwitchBot公式スクリプトが私の環境では動作しなかったものの、下記の記事を参考にして無事動かすことができました。

ラズパイをハブとしてアレクサからSwitchBotを操作する - Qiita

2.のスクリプトでは下記のように作成したAlexaの定型アクションを呼び出しています。

alexa_remote_control.sh -d "EchoShow5" -e "automation:インターホン通知"
sleep 1
alexa_remote_control.sh -d "EchoSpot" -e "automation:インターホン通知"

バイス名にスペースが含まれると動かないので気を付ける必要があります。sleepを入れているのは複数台に連続して実行するとエラーになることがあるためです。

定型アクションの設定は毎回取得する処理となっていたため、この処理をスキップすることで約0.7秒ほど通知までの時間が早くなりました。

その他 curl で Slack などにも通知しています。
可能なものはバックグラウンドで並列実行することにより遅延を抑えています。

最後に

今回の内容に限っては「電気工事士法施行令 第一条 第四号に規定する軽微な工事」であるため電気工事士の資格は不要ですが、無資格者が100Vの電線を着脱するなどの作業を行うと法令違反になりますのでご注意ください。

窓をふさいでデジタルな窓をつけてみた【設置作業編】

f:id:georz:20210525193044j:plain
f:id:georz:20210525193055j:plain

なんということでしょう!

内廊下に面し光が差し込ない、常に閉じていた窓が生まれ変わったではありませんか!

 

というわけで "Atmoph Window 2" の設置レポートになります。

 

Atmoph Window 2 ってなに?

Atmoph Window 2は、インターネットに繋がり世界中の風景を見ることができる、窓の形をしたスマートディスプレイです。壁やデスクに置くだけで、美しい4Kで撮影された繊細で美しい風景と臨場感あふれるサウンドで、一瞬にしてその場にいるかのような気分になれます。でも、ただのスマートディスプレイではありません。さらに進化した、窓型スマートウィンドウです。(公式HPより)

 

導入に至る背景

  • リモートワーク主体となり、1日のうちかなりの時間をこの部屋で過ごす
  • 部屋に窓はあるけれど、内廊下に面しており光が差し込まず開けることもなかった
  • 机と窓枠の高さがぴったりで出窓のように使えるため、カーテンを掛けたくなかった
  • カーテンがないとリモート会議で背景に真っ暗な窓が映り込み殺風景だった
  • Star Wars モデルが発売されるという記事を見てしまった
  • 窓枠の横幅がパノラマ配置にピッタリのサイズだった

 

設置の下準備

まず、窓枠の内寸を測りホームセンターで1枚板の木材をカットしてもらいます。今回は厚さ9mmのベニヤ板を使いました。

下側は写真のように段差があるため、ベニヤ板がネジのある段にハマるようにします。

同じく下側の左右端にはプラスチックのパーツがあるため、これを避けるためノコギリで切り欠きを作ります。右側は電源コードを通すため左側よりも数mmだけ大きくします。

f:id:georz:20210525191911j:plain
f:id:georz:20210525191237j:plain

 

加工が終わったらベニヤ板に壁紙を貼ります。私はこちらの生のりつきを使いました。

 

しっかり乾かしてから、窓枠にはめてみるとこんな感じになります。

f:id:georz:20210307185722j:plain
f:id:georz:20210307191007j:plain

板は立てかけた状態でも倒れてきませんが、地震等に備えつっぱり棒で固定しています。視界に入らないため、ひとまずこれで良しとしました。

この状態で2ヶ月ほど、注文した "Atmoph Window 2" が届くのを待ちました。

 

Atmoph Window 2 の設置

製品が届いたら、まずは公式の手順を参考に壁掛け用のフックを取り付けます。

私は事前に以下の商品を購入しておきました。 

 

今回はベニヤ板に取り付けるため付属の石こうピンは使わずネジで取り付けを行います。

フックの穴は約3.1mmでしたので、M3のネジを使います。

f:id:georz:20210525195529j:plain

 

フックを取り付けたら "Atmoph Window 2" を掛けて、左下角にあたる位置が分かるよう写真のようにマスキングテープで印をつけておきます。

f:id:georz:20210515160010j:plain

 

次に電源を通す穴をあけます。穴の大きさとあける位置は写真のように求めました。

f:id:georz:20210515160708j:plain
f:id:georz:20210515162149j:plain

ACアダプタのコネクタが最も太いところで12mm程度でしたので、以下のような15mmの座ぐりドリルを用意しました。(デジタルノギスは電池切れです)

リリーフ(RELIFE) 座ぐりドリル 15mm 26388
 

 

マスキングテープを起点に測った位置へ印を付け、15mmの穴をあけて準備完了です。

f:id:georz:20210525223639j:plain
f:id:georz:20210525223645j:plain

 

なお、本体に付属するACアダプタからコンセントへのケーブルは長すぎるため、事前に以下の短いケーブルを用意しておきました。

アイネックス AC電源ケーブル 極細ストレートタイプ 0.5m ACP-05S-BK
 

 

ACアダプタは窓とベニヤ板の隙間に余裕をもって収まります。(仮組み時の様子)

f:id:georz:20210521161544j:plain
f:id:georz:20210521161845j:plain

 

"Atmoph Window 2" を壁掛けする直前の状態はコチラです。

f:id:georz:20210525221505j:plain

 

なお、右下から引き込んでいる電源タップのケーブルは、このように物を配置することで完全に見えなくなります。

f:id:georz:20210525223756j:plain
f:id:georz:20210525223800j:plain

 

完成

f:id:georz:20210525224905j:plain

配線を完全に隠すことで、より一層の "窓感" が得られます。

今回はここまで。