mbedで作る1桁へぇボタンの作り方

へぇボタンできた! 音は後付ですw pic.twitter.com/0IcVLCicIv

— カイバ (@kaiba) 2016年7月23日

1桁のへぇボタンを作りました。音は後付なので実際は鳴りませんが、へぇ音は心のなかで鳴らせば良いのですよ。
会社のIoT部の題材でもありますので、資料として残しておきます。
部員には非プログラマが多いので、コードは短さより、わかりやすさを重視しています。

\"IMG_5773\"

部品

  • 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 &quot;mbed.h&quot;</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 &quot;mbed.h&quot;</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 &gt; 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 &amp;gt; 9) {
        digit = 9;
    }
    show(digit);
    wait(0.2f);
}
</code></pre>

<p>}

へぇボタンなのでmaxまでいったらそれ以上反応しません。
最終コードはgistにのせておきました。