ハードウェアからサーバ・アプリまでワンストップで開発

クリスマスが近くなりました。

何度か「教会のアドベントろうそく」の話をして来ました。

NeoPixelの配線

技術閑話(第5回) Arduinoを見直してみる

今年は活躍させようと設定したのですが...

 

背景

この時期のキリスト教会には、「アドベントクランツ」とゆーものが登場します。うちの教会ですと、

こんな感じになるのですが、アドベントの時にクリスマス(12月25日)が近付く度にろうそくの火が増えるとゆー、そーゆー飾りです。

本来ろうそくでやるものですが、当然に火事とかの危険がありますから、他の方法を使うことになります。私がこの教会に来た頃には、こんなネオン管を使ったものがありました。

このネオン管を拡大すると、こんな感じのものです。

今は売ってないのですが、昔はこういった「何かの形をした電極のあるネオン管」というものがありました。私も祖母の葬式の時に見た覚えがあります。うまく動作していると、ろうそくの炎のようなチラつきがあります。発光部分が動くんですね。

これが最近は売っていません。前に「職人がいなくなったので作れなくなった」という話を聞いたことがあるのですが、今はこういったことをやりたければLEDでやれば済むので、結局いらなくなったのでしょうね。時代的にしょうがありません。

このネオン管の光り方はいろいろ不安定なもので、放電管ですから宇宙線とか太陽放射線というようなものの影響を受けますし、ちょっとした振動でも影響を受けます。もちろん電灯線電圧の影響も受けます。逆にそれでろうそくのような「ゆらめき」が表現できるわけです。そういったとてもアナログなものでした。そして、弊教会のメカはとてもアナログで、点灯している数を変えるために、この口金を緩めたりしておりました。アナログですね。そんなことで、いろんなことに問題がありました。緩め方が足りなくて、消えてるはずのが点いたりとか。

コロナ前くらいに、この「ゆらめき」がほぼなくなってしまいました。太陽黒点の極小期に当たりますから、そのせいかも知れません。それ以外にも理由があるのかも知れません。

蛇足ですが、太陽黒点数が多い時は太陽活動が激しい時です。これは約11年周期で増えたり減ったりします。今周期は来年あたりに極大が来ますが、「コロナ前」はかなり少ない時期です。

そんなわけで、いろいろ思い通りになってくれないことや、昔のメカであること、あれやこれやあったので一時「LEDろうそく」で代替されていました。それはそれで悪くなかったのですが、これも結構原始的なやり方でコントロールしていたので「もうちょっと何とかならぬか」と思って作ることにしました。

実装

詳しい話は

NeoPixelの配線

の方に書いています。

ESP32とNexPixelをつないだだけです。電源はUSBから。実際には、裸のモジュールではなくて、手元で余っていたDevKitです。当初はJar-Gardenの試作の時に不要になった基板を使っていたのですが、さすがにそれはエンドユーザ(って教会の人ですが)が使うものではないと思うので、あらためてちゃんとしたものにしたわけです。

これはちょうど旧フリスクケースに入るので、ストックしてあるケースを加工して入れてあります。

ソフトウェアについても前に書いたようになっていて、仕様は

  • Wi-Fi接続してNTPで時刻取得する
  • 「今」が点灯時刻であれば、点灯するべきろうそくの本数を計算する
  • 決定されたろうそくの本数に従い、NeoPixelをろうそくっぽく点灯させる

ということになっています。なお、「点灯時刻」は弊教会の礼拝時間に合わせて、8:55〜13:00となっています。

去年作りましたが、いい感じに点灯していました。タイミングも点灯時間もいい感じです。

実際

去年はいい感じに点灯していたので、今年も設置しました。

ところが、私がいないとうまく点灯してくれません。初日は全点灯になった上に、「ゆらめき」もありませんでした。私が最初からやり直すと、ちゃんと決まった動作をしてくれます。

あれこれ調べたところ、USBケーブルが安物だったせいで、ちゃんと挿さってなかったようです。誰かが触れたり揺れたりすると、その度に電源断を起こし、その時に結構な確率でWi-Fiを取り損ねていたようです。Wi-Fi取りそこねるとフェイルセーフとして全点灯になっています。不要なろうそくを倒してしまえば見えませんから、それで何とかなるわけです。

アドベント第2週の時に散々文句言われることになりました。

問題点の整理

ヒアリングしてみると、結構な問題がありました。

  • 動作が不安定不確実
    これはUSBケーブルの交換で解決しました
  • 定時以外に点灯しない
    それが仕様なんで当然なんですが、たとえば「午後の集会にも点灯したい」という希望には応えられません
  • 本当にちゃんと動くか不安
    年4日しか動かないので、動作するかどうわからないし、定時があるので事前確認とか難しい

結局のところ「自動的にアドベントの日曜日に合わせてLEDを点灯する」ということ自体が、あまり嬉しい動作でないということになってしまいました。

一番いけないのは、「本当にちゃんと動くのか」ということについて、明確な答えが出せないことです。決まった時にしか見掛けの動作をしませんから(待っている間も止まっているわけじゃないですよね)、客観的に動作していることがわかるのは正常動作しているはずの時間しかないということで、事前に確認ができません

これが利用頻度の高い機器であるなら、そこまで不安にはなりません。だとえば、「毎朝9時に点灯して18時には消灯する」というような動作であれば、すぐに不具合にも気がつきます。また、それだけ使用頻度が高ければ、もうちょっとマジメに設計して動作状況を外からわかるための機能を作りますが、年に4回しか使わない機器にそこまでやる気は起きません。必要なのはわかるんですが、やりたくないのです。これは仕事じゃなくて遊戯の一つですから、「正しさ」のために多大な工数をかけるわけには行きません。とは言え「実用品」として作ったので、利用者が否定的なのは困ります。

滅多に動かないという意味だと、「防災無線」とかは本来災害時しか動作しないものですが、平時には「良い子は帰る時間になりました」みたいな放送が流れます。これは動作確認等も兼ねている運用です。このように平時にも動かしておけば、不具合があってもわかりやすいわけです。

同じように塔の十字架についているLEDのように、毎日動作しているものであればこういった自動化は問題ありませんでした。不具合があっても「じゃあ今度の日曜日にでも直します」とか言っておけばいいわけです。アドベントろうそくのように「今動かないと存在意味がない」となると、いろいろ厄介が起きます。

問題の解決

結局、いろいろ面倒臭いということもあって、点灯制御を手動ですることにしました。

最初は、「いっそLEDもろうそくLEDにしてしまって、手元の箱にスイッチを4つつける」ことを考えました。

これはこれで間違いはないのですが、スイッチを4個買いに行くのもダルいし(土曜日の電気街には行きたくない)、せっかくLEDの点滅あたりはちゃんと作ったわけなので、

元の装置にタクトスイッチを追加して、押した回数で点灯するろうそくの本数を指示する

ことにしました。1回ボタンを押せば1本、3回ボタンを押せば3本です。5回押すと消えて、また1回から... ちょっと前まであった天井吊りの蛍光灯みたいな動作です。

電源つないでいれば、いつでもこの操作はできます。試しに点灯本数を変更するのも自在です。

「今日点灯するべき本数」は操作する人が把握していなければなりませんが、よほどのことがない限り間違いはありません。

まぁ実はもっとも今年はその「よほどのこと」で、12月24日が日曜日なので「12月24日はいくつ点灯するのだ?」という話があります。これの「雑な正解」は「12月24日はまだクリスマスではなくアドベント第4週だから4本」です。その辺のことは、アドベント前に周知がありますから、実際には間違いません。

ということで、アドベントろうそくの本数は操作する人が把握するということで、面倒臭いこと解消しました。

実はこのエントリ書いてから、「そう言えばネオン管の時にスイッチつけようと言って買って来たのがあったわ」ってこと思い出しました。完全に手遅れw

まとめ

元々の「自動的にアドベントろうそくの本数を計算し、規定された時刻に点灯消灯する」ということ、それ自体の仕様には間違いがあったわけではありません

とは言え、これを実現してしまうと、前述のような厄介が発生してしまいます。この問題は「滅多に発生しない事象」を自動化する時の問題とだいたい同じです。

新人の頃、「滅多に起きない事象の自動化」については、2つの派があると言われました。それは、

  • 滅多に起きないからこそ間違いを防ぐために自動化するべき
  • 滅多に起きないことは下手に自動化すると間違いの元である

真逆の主張です。

主張だけ見ていれば真逆なんですが、ゴールは同じで「滅多に起きないことでも事故を起こさないための方針」です。一見背反する2つの主張ですが、他の様々な要素が絡んで来ると結局同じことの主張になったり妥協点があったりします。アドベントクランツの例で言えば、「間違いは起きない」はずのことなので、「間違い」については考慮する必要はなくなります。

今回の例で言えば、

  • 滅多に起きないことは検証が難しい
  • 滅多に起きないことの自動化は時として不安要素となる
  • 滅多に起きないことを手動で起こせることはいろいろ改善となる

という教訓があります。自動化というものを考えるためには、こういったこと配慮する必要があるとゆー、当たり前の話です。

ろうそくの本数計算、実はエッジケースを含めての検証とか面倒だったりしたんですが、「顧客の本当に欲しかったもの」は実は「手動で点灯本数が制御されるLEDろうそく」だったということです。

と、ここで終わりそうな話なんですが、実はまだ続きがあります

と言うのも、

そもそもこの機器は必要だったのか?

ということです。

私は何の疑問もなく「元々あったのがいろいろ不具合があるので新しい技術を使ってちゃんとさせよう」と思って作ったのですが、こういった「年に4回しか使わない専用機器」が果して必要だったのかという問題があります。

と言うのも、これは単なる「ろうそく」に過ぎませんから、「ちゃんとスイッチのついたLEDろうそく」を買って来て使えば良かったのではないかと。そうすれば、どれかが壊れてしまっても、買いに行けば良いだけです。

「機器」を作ってしまえばメンテナンスの問題が発生するわけですが、市販品を使えばその部分が簡単になるのです。この「機器」は結局私がメンテナンスしなければならないわけですが、いつまでも私がそれが出来るとは限りません。個々の部品は汎用品ですが、「修理」と「作り直し」は同じようなことになってしまいます。運用上好ましくありません。

とか考えると、

「顧客の本当に欲しかったもの」は
「手動で点灯本数が制御されるLEDろうそく」

だったわけですが、

「顧客に本当に必要だったもの」は
「スイッチのついたLEDろうそく」

だと言えます。つまり「欲しい」と「必要」は必ずしもイコールではないということですね。

ということもあったので、関係者には「今回は要求をまっとうするものに作り直しましたが、これが壊れたら潔く普通のLEDろうそくにして下さい」と言っておきました。

たかが「アドベントろうそく」なんですが、今さらいろんなことを再勉強させられたなと思いました。

最近のエントリー

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル

LED行燈の試作(1)

エントリを書くこと