とある大学生の勉強メモ

バカでもいいじゃない,子供でもいいじゃない.

麻雀 点棒自動計算器を制作

最近では主流となっている麻雀の点棒自動計算機を作ってみた備忘録を残す.
ロードセルを使った重さで計測する手法,抵抗値を計測する手法,磁気センサを用いた手法,ラズパイとカメラによる画像認識などを考えた末,
抵抗を使ったやり方が手軽でノイズに強く,精密な計算ができると考え,抵抗案を採用.
問題の骨子は並列に配置された抵抗を如何に計測するかと,計測した抵抗を如何にLEDで出力するかであろう.

環境
windows10
mbed LPC1768(https://os.mbed.com/)

ステップ1 点棒の数をカウントする機構

まず抵抗をマイコンで計測できなければ話にならない.
用いたマイコンはmbed LPC1768.
f:id:amakazeryu:20210216054624p:plain

抵抗値をマイコンで計測

まずテストとして適当にアナログピンp20を指定する.以下のコードで指定したピン20の電圧を計測する.

#include "mbed.h"
 
AnalogIn myInput(p20);
Serial pc(USBTX, USBRX);
 
int main() {
    while(1) {
        pc.printf("%f\n", myInput.read());//PCでシリアル出力
        wait(1);//1s待つ
    }
}

配線はこんな感じ.1MΩをp20と3.3V-Outに割り込ませて,p20の電圧を計測する.

f:id:amakazeryu:20210216065634p:plain

USBでPCと接続し,値をチェックする.
USBポートを使ったシリアル通信用のドライバを入れることを忘れないようにしよう.

mbed.org

tera termでシリアルの返り値を見ると,まあ取れているっぽいゾ.

f:id:amakazeryu:20210216070441p:plain

こちらの値が1になると,指定したpinはグラウンドに対して3.3Vの電圧を有することになる.

分圧で抵抗を求める回路の作成

マイコンは電圧計測を主に行えるため,分圧の式から抵抗xを求める.
回路図は以下の通り.

f:id:amakazeryu:20210216155738p:plain

回路から,抵抗にかかる電圧V_rは,V-outから出力された電圧V_oと,定格抵抗A[Ω]を用いて,

V_r = \dfrac{x}{x+A}*V_o

と求まる.
したがってpin20で計測される電圧V_p

V_p = V_o - V_r

となるであろう.xを可変抵抗とみなしたときV_pが0~1まで満遍なく散らばれば,より多くの本数の分類が可能となる.
手持ちの100k[Ω]を使って10本の本数のカウントを想定してみた.

f:id:amakazeryu:20210216163827p:plain

これでは不安という方には数値解析を行おう.
解析的に解かねばならないのは,0~0.01の範囲でもっとも増加幅の良いグラフf(x)= \dfrac{x}{x+a}のパラメータaを決定すればよい.
Grapesというソフトが無料で素晴らしい.パラメータaをいじいじして,よさそうなグラフを見つけよう.(定格抵抗aを0から1まで)

f:id:amakazeryu:20210217210800g:plain

おそらく100kを点棒に使う場合,定格抵抗は25k[Ω]が良さそうだ.無論総当たりで数値解も出せるわけだが,評価関数の用意などしなくてはならず,今回はそこまでやらん!

次回予告

それでは次に抵抗付き点棒を用意しどこまで本数を区別できるのかのテストをしてみる.
計測した電圧値はもちろんノイズの影響を受けてばらつく.その平均を取って,うまく抵抗本数を推定できるかが勝負だ.
あまりにノイズが厳しい場合,オペアンプなどの増幅回路を投入して,抵抗の変化に対して電圧が反応しやすいようにする必要がある.

入力側が終わればあとは7セグにいかに出力するかだ.