趣味工作：時計作り

お久しぶりです。デバイスソリューション部 XRチームの茨木です。

趣味はものづくりです。問われればそう答える事が多いですが、言葉の定義が広くてピンとこないでしょうか？ 実際、広義のとおりで、大型家具の建造から料理までも含みます。職業としてのソフトウェア開発などもその中の一部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/11283f21-aaac-2175-8596-175e2ff96caf.png)

本記事は、そんな人間が時計を作ってみたというお話で、[NEXTSCAPE Advent Calendar 2024](https://qiita.com/advent-calendar/2024/nextscape) の23日目の記事です。

# はじまり
普段、最もよく見ている時計はなんですか？ タスクバー右の小っさいやつ？ アレクサ？ 壁掛けアナログ盤？ 腕時計？ スマートフォン？
これら全部、今ココにある物を並べてみたわけですが、どれも要求への満足度が低いのです。要求とは、瞬時に見れて日付・時刻・曜日が常に読み取れること。

欲しいものが提供されていないなら、作っちゃえばいい！ ということで...

# 電子工作
まずは時計の表示部を作ります。

### 主要部品
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/f745abe9-0882-4a77-e335-63f1a1e4830f.png)
時計用の7セグメントLEDと、その制御ICでは定番らしいTM1637です。

### 部品のテスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/a3100783-bb97-8911-ff40-70befd8e3a39.png)
軽くICとLEDの動作実験をして感触を掴みます。各部品のデータシートから読み取った配線方法が正しいか等を確認する段階。
ブレットボードでは配線がカオスですが、これでも本実装から見れば半分程度ですね。

### 回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/b750d708-f040-6588-109b-0e224ee9647f.png)
7セグメントLEDやICの感触が掴めたら、KiCad で回路図を描きます。

### アートワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/132b16c6-a5d9-0326-182d-36141181955f.png)
プリント基板の実体デザインです。実物のサイズ感を考えながらレイアウトしていきます。

### 実体化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/0c16def9-5682-b980-aab1-4c412ab63239.png)
プリント基板の製造サービスに製造してもらいます。最小ロットの5枚で、今回は送料込み5000円しなかったくらいの金額です。（何かしらの割引きクーポンを使ったかも...）

基板は2枚2層構造で、IC側とディスプレイ側にわかれます。最終的な筐体サイズをコンパクトにするための設計ですが、こういう割り付け製造は割増料金が掛かります。ただの時計のくせに贅沢ですね。

あとはこれに部品をハンダ付けしていくだけです。


# プログラム開発
実装は .NET 8.0 C# でいきます。
- TM1637の制御は[ライブラリ](https://learn.microsoft.com/ja-jp/dotnet/api/iot.device.tm1637.tm1637?view=iot-dotnet-latest)があり、扱うのは簡単です。
- カレンダーや時計の文字を生成する部分は小分けに実装して [Generic Host](https://learn.microsoft.com/ja-jp/dotnet/core/extensions/generic-host) でホスティングします。各々、非同期で好き勝手に表示データ生成します。時計の「：」の点滅をスムーズに見せるために、ミリ秒単位で働きます。
- ディスプレイコントローラー部分で表示内容をバッファリングしながら、余分な描画処理(ICとの通信)を省きます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/b0b004ec-c72c-06ca-802f-7bfddabfce27.png)
図には描ききれませんが、この他にもオブジェクト指向デザインやら、高級言語の非同期ライブラリやらをふんだんに盛り込んだ実装になりました。ただの時計のくせに贅沢ですね。
> 直接は関係ないかもしれませんが、Azure DevOps でのビルド→デバイスへのプログラムデプロイを行うシステムも作ってあります。

# 3Dプリント（ケース製作）
生基板で実用するわけにもいきません。ケースも作ります。
### モデリング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/975fa76e-0afb-d9f5-9eb8-082dc75d9170.png)
使い慣れた Blender でモデル作り。FreeCAD とかも使えるようになりたい。

### プリント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/325e462d-5218-0055-739c-6b8d7a48515e.png)
3Dプリンターで実体化して基板を載せた状態。

### 最前面のスモークパネル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/2dcd8f6a-a9a9-f9bf-abc9-ec17ca45c8b8.png)
上の写真は基板そのままの状態で、素子やハンダ付け端子が丸見え。
下の写真はパネルを装着した状態。パネルは「塩ビ板(0.5mm厚)」「自動車ウインドウ用のスモークフィルム」で出来ています。


# その他
### 制御コンピューター
- Raspberry Pi Zero 2 W
- OS は Raspberry Pi OS Lite

写真には出てくるものの、言及していませんでした。3300円くらいが定価でしょうか。更にSDカードが1000円くらい。ただの時計のくせに贅沢ですね。
でもつまりこれは Wi-Fi 時計と言われているもので、時刻同期は全自動で完璧です！（←自分では何も作ってない）

### 曜日表現
瞬時に読み取れるという要件には、曜日も含んでいました。
曜日はカレンダー下のLEDで表現していて、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/bd255f68-c5d7-9df4-ed8e-972758dde064.png)

# おわりに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218556/39da183b-9dc4-971f-3576-2cb916a39407.png)

電子工作・ソフトウェア開発・3Dプリンターあたりの技術を集めた趣味工作で、時計を作る事ができました。PCモニターの上か下かに置いておけるサイズ感に仕上げました。

基板上のスペースとICのLED制御能力が空いていたので、それを埋めるようにLEDを載せてあります。使用目的のない余計な実装で、記事内の写真ではオレンジ色に光ってるあたり、時計部の下の並びがそれです。プログラム次第でいくらでも制御できますし、なんとこの時計はインターネットのデータにもアクセス可能です。何かしらのアラートを行う、天候を表現してみる、休祝日の表現をしてみる、などなど自由に作り込めます。「ただの時計」の枠を越えられるでしょう、、、けど、もうこれで要件は満たしてるんだよなぁ...