mbedで作る1桁へぇボタンの作り方
へぇボタンできた! 音は後付ですw pic.twitter.com/0IcVLCicIv
— カイバ (@kaiba) 2016年7月23日
1桁のへぇボタンを作りました。音は後付なので実際は鳴りませんが、へぇ音は心のなかで鳴らせば良いのですよ。
会社のIoT部の題材でもありますので、資料として残しておきます。
部員には非プログラマが多いので、コードは短さより、わかりやすさを重視しています。
部品
- LPC1114(mbed)
- 7セグメントLED(アノードコモン)
- よくわからずに買ってしまったのですが、カソードコモンの方が直感的だったかも。
- 抵抗 220Ω
- ボタン(モーメンタリ)
- 押している間だけスイッチがONになるやつです。
- 導線(LANケーブルを剥いたものが硬さが丁度いいし、手に入れるもの簡単で個人的にオススメ)
作り方
Lチカ
なんといっても最初はLEDチカチカ。通称Lチカ。
device plusさんの記事が大変わかりやすい。
カソードコモンの場合は光らせたい場所に電流を流す、という制御で直感的でわかりやすいのですが、アノードコモンの場合は、電流が流れるのをせき止めておき、光らせたい時にせき止めを解除するイメージです。
デジタル出力でHIGHを出力しておくと、電位差がないため電流は流れず、LOWを出力しておくと、電位差が生まれて電流が流れます。
LEDに3.3Vをかけ、dp1に抵抗を挟んでLEDの適当なピンに挿して、一箇所Lチカします。
0(false)を出力すると光ります(アノードコモンだとここが直感的ではないですね)。
ピン番号は公式のドキュメントに書かれています。
</p> <h1>include "mbed.h"</h1> <p>DigitalOut segA(dp1);</p> <p>int main() { bool val = true; while(1) { val = !val; segA = val; wait(0.5); } }
これができれば7こ光らせるのも同じですね。
差し替えて7箇所光るのを確認しておくとよいです。
0〜9のパターンを関数にして、カウントアップさせてみました。
</p> <h1>include "mbed.h"</h1> <p>DigitalOut segA(dp1); DigitalOut segB(dp2); DigitalOut segC(dp4); DigitalOut segD(dp5); DigitalOut segE(dp6); DigitalOut segF(dp9); DigitalOut segG(dp10);</p> <p>void clear() { segA = segB = segC = segD = segE = segF = segG = 1; } void show0() { segA = segB = segC = segD = segE = segF = 0; } void show1() { segB = segC = 0; } void show2() { segA = segB = segD = segE = segG = 0; } void show3() { segA = segB = segC = segD = segG = 0; } void show4() { segB = segC = segF = segG = 0; } void show5() { segA = segC = segD = segF = segG = 0; } void show6() { segA = segC = segD = segE = segF = segG = 0; } void show7() { segA = segB = segC = 0; } void show8() { segA = segB = segC = segD = segE = segF = segG = 0; } void show9() { segA = segB = segC = segD = segF = segG = 0; } void show(int digit) { clear(); switch(digit) { case 0: show0();break; case 1: show1();break; case 2: show2();break; case 3: show3();break; case 4: show4();break; case 5: show5();break; case 6: show6();break; case 7: show7();break; case 8: show8();break; case 9: show9();break; } }</p> <p>int main() { int digit = 0; while(1) { if (digit > 9) { digit = 0; } show(digit++); wait(0.5); } }
ボタンを押してカウントアップする
3.3Vとdp13の間にスイッチを挟み、スイッチを押した時だけdp13がHIGHになるようにします。
スイッチの動きはテスターで抵抗を測るとよいです(通電すると0Ωになる)。
無限ループでボタンが押される(HIGHになる)のを待ち、HIGHになったらループを抜けるようにします。
DigitalIn buttonPress(dp13); // 中略 int main() { int digit = 0; show(0);</p> <pre><code>while(1) { while(!buttonPress) { if (buttonPress) break; } digit++; if (digit &gt; 9) { digit = 9; } show(digit); wait(0.2f); } </code></pre> <p>}
へぇボタンなのでmaxまでいったらそれ以上反応しません。
最終コードはgistにのせておきました。