手積み麻雀を快適にするセンター・オブ・ジ・アースを作った

Published at 12/16/2025, 13:05:14
Last updated at 12/17/2025, 15:16:11

この記事は  理情 Advent Calendar 2025 および TSG Advent Calendar 2025 の 12/17 の記事です.

はじめに

みなさん,手積み麻雀はしていますか? 手積み麻雀は全大学生が行っているという統計があります (n=4) [要出典].ところが,手積み麻雀を行っていると,こんな場面がありますよね?

オーラス 1 本場,上家何点? 32,400 点? 自分は 27,100 点だよな… 引くと… あれ? 上家何点だっけ? もう一回教えて… 32,400 か… すると 32,400-27,100=6,300 か? いや,5,300 だから 1,000-2,000 は 1,100-2,100 で 5,400 点ひっくり返ってギリギリまくれるか? ん? 計算合ってる…? わからん…

…と,とにかく点棒状況がわからないですよね.(雀荘にあるような)自動卓なら手元に点数が出ていますし,じゃんたまや天鳳などのネト麻では点数が常に表示されていますよね.また,点差についても適当なボタンを押したりすれば表示され,オーラスの条件整理に役立ちます.

ところが手積み麻雀では点棒は物理的な点棒で管理します.なのでよほど記憶力が良くない限りは点数を他人に聞いて,自分の点数を数えて,差を自分で計算する必要があります.これは大変ですよね.ということで,じゃんたまにあるこれのようなものを手積み麻雀でも使えるようにしました.

image.png
じゃんたまの点数表示.クリックすると点差が表示される.

点棒移動を管理するソフトウェアに関しては こちら などですでに先行研究が存在しています.とても便利そうです.しかし,これには足りないものがあります… そう,ロマン です… やっぱり 7 セグがチカチカしているのがかっこいいです.ということでそういうものを作ってみました.

制作記

注意:私は電子工作の素人です.「とりあえず動けばいい」と思っているので色々不適切なところがあるかもしれませんが,温かい目で見守ってくださると幸いです.

部品選定

1.-10. は秋月電子です.

  1. [115998]4桁 2色7セグメントLED表示器 赤色・黄緑色 アノードコモン OSL40363-IRYG
  2. [105347]オプトサプライ10バーLEDアレイ 3色(緑5黄3赤2)タイプ
  3. [104290]10ポイント赤色バーLEDアレイOSX10201-R
  4. [104294]10ポイント青色バーLEDアレイOSX10201-B
  5. [112343]5バーLEDアレイ 黄緑4赤1
  6. [115330]16×8LEDマトリクスドライバー キースキャン機能付 HT16K33A
  7. [112774]Arduino Bootloader書込済(5V 16MHz仕様) ATmega328P
  8. [108671]クリスタル(水晶発振子) 16MHz
  9. [103647]タクトスイッチ(黒色)
  10. スライドスイッチ(秋月電子の 2 F で投げ売りされていたやつ)
  11. [105887]CdSセル(2MΩ)GL5537-1
  12. [100308]電池ボックス 単3×1本 ピン
  13. [111298]低損失表面実装型三端子レギュレーター 5V800mA NJM2845DL1-05
  14. 家に転がっていた謎のブザー
  15. ほか,適切なチップ抵抗・コンデンサ・ダイオードなど

1.-5. がロマンの本質です.LED をぴかぴかさせます.7 セグは 2 色のものにしてみました.2 色といっても赤と黄緑を同時に光らせればオレンジになるので実質 3 色です.点数のプラスマイナスとかで使いやすいな~ と思ってこれにしました.後にちょっと問題も生じますが…

これら LED を制御するのが 6. です.LED は 7 セグだけで 4 桁 * 2 色 * 8 セグメント(小数点も)* 4 個 で 256 個もあります.バー LED アレイも 50 個 LED があるので合計 300 個を超えます.これらをマイコンだけで制御するのは大変なのでこちらを使います.1 つの LED ドライバで 128 個の LED を制御できるので,3 つ使うことにします.I2C が使えるので 3 つ同時でも使いやすいです.LED のアノードコモンとカソードコモンには気を使う必要がありますが,後述します.また,キースキャン機能もあるのでタクトスイッチの管理もしてもらいます.ここでも事故を若干起こしましたが後述…

さらにこれらドライバなどを制御するのが 7. です.僕が最初に Arduino を触ったので,その流れで Arduino UNO に使われているマイコンである ATmega328P を使っています.色々なマイコンがあるみたいなので,調べて使ってみたいところです.動作に必要なので 8. も買っています.

9., 10. は入力です.かちかち.

11., 14. は普段一緒に麻雀を打つ人からの熱いリクエスト「リーチ棒をおいてリーチ音声が聞きたい」に応えたものです.CdS セルでリーチ棒がおかれたことを検出し,ブザーでリーチ音声を流します.

電源関連が 12., 13. です.5 V 電源が欲しく,また麻雀卓の中央に置くことからポータブルな電源が望ましかったです.Li-ion 電池などを使うことも考えましたが,手軽な乾電池になりました.1.5 V を 4 本直列接続し,それを三端子レギュレータで 5 V に落とします.

あとは LED の電流制限抵抗やパスコン,ドライバや三端子レギュレータが要求するコンデンサやダイオードなどを適当に揃えました.

実験

とりあえず部品を買ってきました.主に秋月電子です.東大のキャンパスから歩いていける距離なので非常に助かります.

まずはブレッドボードに仮組みしてドライバに慣れたり,LED の抵抗値を決めたりします.こんな感じでリーチ棒を作ったりしていました.なんとなく仕様等が決まってきたら基板を作っていきます.

基板

実は同じようなものを 1 回ユニバーサル基板(+スルーホールの部品)で作ろうとして,複雑すぎて断念した過去があります.今回はプリント基板を使うことにしました.プリント基板の制作は 2 回目です(1 回目の制作記もいずれこのブログに作りたいです).設計には KiCad を使いました.まずは Schematic Editor で配線の接続を行います.

image.png
Schematic Editor の様子.

ATmega328 などはデフォルトで部品が存在しますが,他の LED などの部品は存在しなかったので自分で作ります.Symbol Editor から作れます.

HT16K33 の情報が調べてもあまり出てこなかったので補足します.といってもデータシートにはすべて書いてあります.HT16K33 では写真のようにアノード 16 × カソード 8 で 128 個の LED を制御します.

image.png
HT16K33 の LED のつながり方.

今回はアノードコモンの 7 セグを使っています.アノードコモンでは 1 桁について,1 つのアノードと 8 つのカソードをうまく動かして制御します.つまりこの HT16K33 では一つの ROW に対応しています.ただし,I2C で通信する際,0x00 番地には COM 0 の ROW 0 から ROW 7 の情報を,0x01 番地には ROW 8 から ROW 15 の情報を,0x02 番地には COM 1 の ROW 0 から ROW 7 の情報を… と書き込んでいきます.つまり,ROW 0 につなげた 7 セグを制御する信号は,0x00, 0x02, ..., 0x0E 番地にまたがって(セグメントごとに)記述していくことになります.少々非直感的です.カソードコモンを使えば,同じ場所にある桁の赤と緑のカソードをさらに繋いでしまえばカソード×1,アノード×16 に対応することになるので,0x00 番地に 1 桁目の赤を,0x01 番地に 1 桁目の緑を,… と書き込めます.こちらのほうが良かったかもなと今になって思っています.ただここの出力部分は適当にラッパを書いてしまえばあとは触らないので,最初の苦労が増えるだけです.

また,HT16K33 にはキースキャン機能があります.適切にスイッチなどをつなげると,0x40-0x45 番地に読み取ったスイッチのデータを書き込んでくれます.これを読み出せば,マイコン側でスイッチを使う必要がないということです.1 つのドライバで最大 39 個のスイッチを管理できます.これだけあれば十分すぎるでしょう.

さて,データシートをよく読むとダイオードのつなげ方も指示されています.

image.png
スイッチを付けるときのダイオードのつなげ方.

最初(僕の英語力が低いばかりに…)"When pressing three or more times is assumed" の意味がわからなかったのですが,これは「3 個以上のボタンを同時押しする場合」ということみたいです.twice も 2 つ以上で同様です.前者の場合はダイオードを 1 つのスイッチに 1 つ設置する必要があります.後者の場合は 1 つの KS のラインに 1 つ設置すれば大丈夫です.どうしてなのかの理由がさらに下に続いているのですが,これだけ読んだ僕は「例え 3 つ以上同時押しする場合でも KS0 しか使わないならダイオードは 1 つで大丈夫だな!」と思いました.ところがこれはウソだったみたいで,内部の配線などがあるからか KS0 しか使わなくてもダイオードは 1 つのスイッチに 1 つ必要だったみたいです.これにより機能が制限されてしまったので,忘備録としてここに書き残しておきます.

配線が決まったら実際に基板上に配置していきます.PCB Editor を使います.ここが僕の電子工作初心者丸出しポイントですが,「こんなもんでもとりあえず動くんやで」を紹介するために PCB エディタの様子を貼ります.

image.png
PCB エディタの画面.

電気的につなげるだけだったら DRC (Design Rules Checker) が OK だったら多分大丈夫だと思います.ただこの基板は色々改善すべき点があると学科の人に教えてもらったので,次回以降のためにも書いておきます.

  • GND ベタをするべき.GND は各マイコンやドライバの電位の基準点なので,なるべく GND を広くして抵抗を減らし,電位を一定にする必要があるため.
  • 0.5 mm では 5V のラインが狭い.1 A につき 1 mm というのがあるが,あれはあくまで発熱しないための最低限なので無駄な抵抗を減らすためにもう少し広げたほうがいい.
  • コンデンサが遠く,配線も最適ではない.パスコンに関してはとにかく電力を要求する部品の近くにあることが正義なので,極限まで近づけないといけない.また電源周りについているコンデンサも,大きいループができるとそこでいろいろよくないらしい.なるべく電源周りのループは小さくするべき(PCB エディタ中左下青,大きい「2 GND」のあたり).
  • ビアを打つことはそんなに忌避しなくてもよい.等間隔でビアを打ったりもするらしい.

など,いろいろ教えてくれました(ありがとうございます).なんにせよつながりはしました.

Screenshot-1115.jpg
3D ビューアによる出力(表面).
image.png
3D ビューアによる出力(裏面).

完成したら,JLCPCB で発注します.プラグインを入れると簡単にガーバーファイルを作れました.こちら で紹介されています.麻雀卓の真ん中に置くという仕様上,全自動卓の真ん中にあるサイコロボックスのような大きさが必要です.そのため基盤のサイズは 140 mm 四方となっています.JLCPCB は 100 mm 四方以下の基板をとても安く作れるのですが,こればかりは仕方ないです.よくわからないクーポンなどを適用し,制作料が 4.50 USD,送料が 8.52 USD でした.日本円にして(当時)1,971 円でした.

9/26 16:38 に注文し,9/30 0:37 には届きました.わずか 3 日ほどで届いたのはすごいなぁという気持ちになります.ただ,基板が届いた頃には 3A の授業が始まってしまい,しばらく制作に手を付けられずにいました.

部品取付

ひたすらはんだ付けをします.チップは基本 1608 サイズだったので,大きくはないですが十分手ではんだ付けできます*1.とはいえスルーホールのはんだ付けにうつるととてもやりやすいなぁと感じました.また,バーアレイの LED が少し曲がってついてしまいました.一応マスキングテープで固定したつもりだったのですが… 取ろうにも取れなかったので諦めました.また,三端子レギュレータのはんだ付けが甘く,最初の方電源の調子が不安定でした.はんだ付けはちゃんとしましょう.

とはいえ全体的に見れば大きなトラブルなく完成まで行くことができました.きちんと光ってくれたときの喜びはひとしおです.

Screenshot-1117.jpg
部品取付が完成し,適当に光らせた基板.

ソフトウェアの作成

ハードが完成したらあとはソフトです.Arduino IDE を使って書きます.こんな機能を搭載している(予定)です:

  • 点数表示・点差表示
  • 局数・供託・本場・自風・親表示
  • 立直
  • 点数移動(1,300-2,600 などを選択することで供託・積み棒は自動計算)
  • サイコロ機能(開門位置決定)[未実装]
  • 場決め機能 [未実装]

リーチ棒を置くと「リーチ!」と言ってくれます.こちら の記事を参考にさせていただきました.

コードの中身は解説するほどのものでもないです.ステートマシンがひたすら動いています.

完成です!!!

感想

思ったより地下*2が明るかったので,LED が読みにくかったです.高輝度の LED ではなかったので,流れている電流の割には暗かったです.2 色にすることにこだわらず高輝度タイプの LED にしても良かったかもしれないです.また,LED の抵抗をもう少し小さくしても良かったかもしれないです.HT16K33 は Duty 比を調整できるので,暗くすることは容易です.とはいえ今からだと 32 個のチップ抵抗を取り付け直す必要があり,やりたくはない作業です… 一応緑と赤だと赤のほうが見やすいので,赤を基調とした配色に切り替えようかと思っています.

また,少ないボタンだけで操作するため使い方がかなり分かりにくいです.この辺はちゃんと説明書的なものを作る必要があります.

とはいえ全体としてはかなり満足の行くものが作れたと思います.もうしばらくの地下麻雀*3で活躍してもらいます.

IMG_20251205_164202257.jpg
実際に地下麻雀で使われている様子.
*1
学科の友人は「1608 は大きいよ,0804 まで余裕」など言っていましたが…
*2
理学部情報科学科の控室のこと.正確には理学部 7 号館の 015 教室.地下にあるので通称「地下」.
*3
たんに地下で行われている麻雀のこと.カイジの世界ではない.