この記事はUEC Advent Calendar 2025の23日目の記事となります。
前日はえぐちさんによるゴリゴリ技術系の記事が出る予定でした。 あれ、まだ書かれていない…?
UECアドベントカレンダーにはその2も生えています。
その2の前日の記事はクリーパーさんの「NewTek NDI PTZ1 を買ってみた」です。
このオタクは一般のご家庭には到底ないであろう機材を普通に持っていたりするので、ある意味怖いです。
こんにちは、へるくんです。普段は研究室で研究以外のことを色々やっています。本当は研究したほうがいいです。
今回は、研究室の入退室マグネットの改造を現在進行形で行っている話をします。
研究室の入退室マグネットとは?
研究室の入退室マグネットとは、研究室のドアに取り付られている、現在の在室状況を指し示すマグネットのことです。
私の研究室には
- 在室
- 学内
- すぐ戻る
- 外出
- しばらく居ません
- 帰宅
の6種類のマグネットが用意されており、研究室のメンバーは自分の在室状況に応じてこれらのマグネットを動かしてドアに貼り付けています。
改造の動機
さて、私は研究とは別でなでエッグというペットロボットの開発も行っています。
これは3人で行っているプロジェクトであり、東3号館7階のオープンラボというところで集まって開発を行っています。 ここで発生するのが、研究室のある西10号館とオープンラボのある東3号館の行き来です。
最初は研究室に戻ってくるつもりで、在室状況を「学内」にしてからオープンラボに向かっていました。 しかし、オープンラボでの作業が長引いて21時〜22時くらいにまでなると、研究室に戻るのが面倒になります。帰宅方向は調布駅方面なので、研究室に戻らずそのまま帰宅したいのです。 しかし、在室状況を「帰宅」に戻すために一度研究室に戻る必要があり、これが非常に厄介でした。
この問題を解決する方法として考えられるのは、あらかじめ在室状況を「帰宅」にしてからオープンラボに向かうことです。これで解決ですね。
問題が解決したので、これで世界は平和になりました。めでたしめでたし…。
…
…
…
ものづくりやりたすぎ!!!
ということで、学内のどの場所でも在室状況を変更できるようにします。目的
大きく分けて2つの目的があります。
- 研究室の外から在室状況を変更できるようにする
- 光らせる
一つ目の目的はさっきから説明している通りです。 研究室の外から在室状況を変更できるようにすることで、オープンラボでの作業が長引いても、研究室に戻らずに在室状況を「帰宅」に変更できるようにします。
あと、せっかく改造するので、光らせたいですね。光らせるのはオタクのロマンです、きっと。
ハードウェアの構成
現状検討中のハードウェアの構成は以下の通りです。
ざっくりと説明します。
- 8×8のLEDマトリクス6個: 在室状況を表示するために使用します。各在室状況に対応して光ります。
- HT16K33A: 16×8のLEDマトリクスを制御するためのドライバICです。I2Cでマイコンと接続します。これ一つで8×8のLEDマトリクス2個を制御できます。いいね。
- Raspberry Pi Zero 2 W: マイコン兼サーバです。在室状況の変更を受け取ったり、LEDマトリクスを制御したりします。Webサーバを立てて、在室状況の変更を受け取る予定です。
ただ、いくつかボツにした案もあります。
ボツ案1は、ESP32マイコンをラズパイとドライバICの間に挟む案です。ESP32マイコンはWi-Fiを搭載しているものもあるので、Wi-Fi経由で在室状況の変更を受け取ることができます。しかし、余計な無線通信を増やしたくなかったので、ボツにしました。
ボツ案2は、ESP32マイコンだけで完結させる案です。ラズパイを使うのは割とオーバースペックなので、実はこれがかなり理想的とされています。 しかし、ESP32マイコンにWebサーバを立てるための知識が私にはありませんでした(Moddableを使用すればいけるらしいです)。これを機に勉強するのもありですが、それをするなら流石に研究をしろ(12月なので卒研追い込み時期です)ということで、今回はラズパイを使うことにしました。
ソフトウェアなどの構成
ソフトウェアの構成は今の所こんな感じです。(一応図に起こしましたが間違っている可能性もあります、許して)
制御
HT16K33Aの制御にはPythonを使います。pigpioというライブラリを使用すればi2c通信ができるはず…。
フレームワーク
今の所FastAPIにしようかなぁといった感じです。これは、LED制御をPythonで行う予定なので、WebもそのままPythonで書くかーというノリで検討しています。とはいえ、今回の用途に対してFastAPIはちょっと冗長ですね。LED制御をPythonで行うというのが理由なら普通にFlaskでもいいと思いますが、将来の拡張性を考えるとFastAPIかなーといった感じです。まあ、今は拡張する予定がなくとも、今後どうするかはわかりませんからね。
あ、フロントエンドもFastAPIでやる予定です。
え、FastAPIはフロント向けではないよねって思う人しかいないと思いますが、シンプルなUIで十分と考えているのでFastAPIで無理やり作っても特に困らないだろうと思っています。ReactとかVueとかあるけど、今回の用途に対して過剰性能すぎます (腰のあるhtml手打ちはしないんですかと言いたそうなそこの君、一旦黙って)。
もっと機能を盛り込みたくなったらちゃんとしたフロントエンドのフレームワークを導入するかもしれません。
ここまで色々書きましたが、本当にこのフレームワーク構成でいいのか疑心暗鬼です。 もっと最適なフレームワークがあれば教えてください(切実)。
ネットワーク
公開範囲は研究室のLAN内と私個人のTailnet内に限定する予定です。研究室のLANに関しては、せっかく作ったのでラボの人には遊んでほしいからです。Tailnetに関しては、私が外出先から在室状況を変更できるようにするためです。もっといい方法があるかもですが、ネットワーク周りの知識があまりないので、とりあえずTailnetによるVPN接続で対応しようと思っています。余計なことをしてセキュリティホールを作るのは避けたいので…。
HT16K33Aのテスト
HT16K33Aがちゃんと動くかどうかを確認します。そこら辺に転がっていたラズパイpicoを用意して、ブレットボード上でテストを行いました。
が、配線がだるすぎる!!!
AnodeとCathodeを逆に繋いでしまい、なかなか光らなくて焦りましたが、無事に動作確認ができました。やったね。もう2度とこんな面倒なジャンパワイヤー配線はしたくないです。
ラズパイZero 2 Wの環境構築
1. ラズパイZero 2 W本体のセットアップ
ラズパイZero 2 Wのセットアップを行います。 OSはDebian 13ベースのRaspberry Pi OSを使用します。 Raspberry Pi Imagerを使用して、microSDカードにRaspberry Pi OSをインストールすると大体は終わり。基本これだけなので便利ですね。
これだけで終わるのは面白くないですね。 ラズパイにloginした際に表示されるメッセージをカスタマイズしましょう。 研究室で使用するので、弊研究室のマスコット的キャラクター(?)である「うにょーら」のアスキーアートを表示することにします(かわいくて好き)。
@@@@@ @@ @ @@ @ @@@@@ / / / . ーーー=- /_ / \ / ー. / ⚫︎ \/ ⚫︎ \ \/\/ \アスキーアート作るの大変でした…(1時間以上かかった)。
ここにfigletというコマンドでアスキー文字を生成&アスキーアートの横に追加し、さらにlolcatというコマンドで虹色にします(この2つのコマンドはkat0hくんに教えてもらいました、感謝)。
いい感じですね。これのためにラズパイにしたと言っても過言ではない…。
2. GPIOのセットアップ
HT16K33AはI2Cで接続するので、I2Cを有効化します。
sudo raspi-configを実行し、Interface Options -> I2C -> Yesの順に選択すればOKです。これも簡単。
pythonでI2Cを使うためのライブラリとして、pigpioを使用します。しかし、Debian 13になってからはsudo apt install pigpioを叩いてもインストールできなくなってしまいました…。仕方がないので、ソースコードからビルドしてインストールする遠回りをすることにしました。
wget https://github.com/joan2937/pigpio/archive/master.zipunzip master.zipcd pigpio-mastermakeこれでおしまい。あとは、pigpioデーモンを起動しておきましょう。
sudo ldconfigsudo pigpiodldconfigを実行することで、ライブラリのキャッシュを更新できるらしいです。pigpioデーモンを起動する際にpigpiod: error while loading shared libraries: libpigpio.so.1: cannot open shared object file: No such file or directoryというエラーが出てしまったのでGeminiくんに聞いたら、ldconfigを実行すれば解決すると教えてもらいました。
3. python環境のセットアップ
みんな大好きであろうuv pythonを使用します。uvのセットアップは公式ドキュメントを見なさい!
回路設計&基板設計
さて、ここまでできたら、次は回路設計と基板設計です。 KiCadを使用して設計を行います。kiCadの使い方はなでエッグチームの2人に教えてもらいました。感謝!
今回は、マトリクスLED&HT16K33Aの部分と、ラズパイZero 2 Wの部分の基板を分けて設計します。
1. マトリクスLED&HT16K33A基板
こいつは、8×8のマトリクスLEDを2個とHT16K33Aを1個搭載する基板です。 線を繋ぐ場所を間違えないようにに注意しながら設計します。
いい感じの回路ですね。 これを基板に落とし込みます。
うーん、配線がやばいですね。基板のサイズに制約がある(縦20mm、横80mm)関係上、配線がかなりタイトになっています。 残念ながら私は熟練のKiCadユーザーではないので、自動配線を使用しました。手動でやると時間がかかりすぎるので…。 ちなみに、マトリクスLEDで隠れる予定の真ん中のネジ穴2つは、磁石を取り付けるための穴です。これでドアに貼り付けることができます。
また、両側のピンヘッダは複数基板を繋げられるようにするためのものです。HT16K33AのI2Cアドレスさえ変えれば複数基板を繋げられるので拡張性があるうえに、基板発注のコストも抑えられます。20mm240mmの基板を発注すると高くつくので、この基板を3枚繋げた60mm80mmの形で発注します。
こいつの基板はビアを多用しているので、友人の基板と一緒にJLCPCBに発注する予定です(友人の分と一緒に発注することで送料を分担できます)。 配線にミスがないことを祈るばかり…。
2. ラズパイZero 2 W基板
こっちは既存のラズパイボードを乗せるだけなので簡単です。やることはラズパイのSDA、SCL、5V、GNDをLED基板に繋ぐだけ。 ただ、ラズパイZero 2 Wのボードに乗っている電源供給端子はmicro Bしかないので、別途type cの電源ポートを用意します。時代はtype c!!!
うーん、単純!電通大のピクトラボにある基盤加工機で作成予定です。
ちなみに、基板同士の接続に基板対基板コネクタは使わないのかい?というツッコミが入りそうですが、使いません。理由は単純で、私が存在を知らなかったからです…(後から教えてもらいました)。次こんなことをする機会があれば使ってみたいですね。
今後の予定
本当は23日までに完成を間に合わせたかったのですが、研究をはじめとする色々なタスクが忙しく、ここまでしかできていません。無念…。
とりあえず基板が届いたらはんだ付けを行い、動作確認を行う必要があります。
そのあとはソフトウェア部分を本格的に実装する段階に入りたいですね。
あとは、簡易的なケースを3Dプリンタで作成したいですね。まだどんな感じにするか何も考えていませんが…。
おわりに
12月ですし、こんなことする暇があるなら研究を進めるべきですが、たまにはこういう変なこともやりたいですよね。
あと、こんなことを勝手にやっても普通に許されるうちの研究室に感謝です。いい研究室だ…。
明日はいずりなさんの記事になります。