マイクロビットに追加した、押しボタンスイッチ回路とLEDの動きを確かめるためのプログラムについて説明するのだ。
本文と一緒に見てね。
【マイクロビット応用】[8] キッチンタイマー(2)スイッチとLEDを追加、プログラムの動きを考える、ポケプラ「ゲンガー」の製作
動作環境
追加した回路は下図のような回路なのだ。0ピンに押しボタンスイッチ回路が、1ピンと2ピンにLEDが接続されている。
この回路をブレッドボードを使って作成し、マイクロビットにワニ口クリップで接続したのだ。
LEDにはポケプラ「ゲンガー」の目の部品を改造したものをかぶせて、「ゲンガー」の目が光る状態を再現したのでしたね。
プログラムの解説
マイクロビットのaボタン、bボタンと、追加した押しボタンスイッチによって右目、左目、両目が光るプログラムを作成したのだ。
ボタン | ゲンガーの目 | マイクロビットのLED表示 |
aボタン | ゲンガーの右目のLEDが点灯する。 | 「a」と表示される。 |
bボタン | ゲンガーの左目のLEDが点灯する。 | 「b」と表示される。 |
追加した押しボタンスイッチ | ゲンガーの両目のLEDが点灯する。 | 「c」と表示される。 |
以前製作した「飛行機のプロペラ」の無線バージョンでは、ボタン操作の部分を別関数にまとめましたね。
【マイクロビット応用】[5] プラモの飛行機のプロペラ(4)無線で操作できるように改造
その通り、よく覚えていたね。今回も同様に、ボタン操作の部分を「UserInput()」という名前の関数にまとめた。
- 3行目 def UserInput():
- 4行目 if button_a.is_pressed():
- 5行目 return ‘a’
- 6行目 if button_b.is_pressed():
- 7行目 return ‘b’
- 8行目 if pin0.read_digital() == 0:
- 9行目 return ‘c’
- 10行目 return ‘ ‘
4行目と6行目でaボタンかbボタンが押されたかどうかを確認しているっぽいのですが・・・
ウム。それでよいが、何か引っかかっているようだね。
ボタンのライブラリのget_presses()とis_pressed()の違い
以前製作した「飛行機のプロペラ」のプログラムでは、ボタンが押されたかどうかを調べるのに「 get_presses() 」という関数を使いましたが・・・
(飛行機のプロペラのプログラム)
- 6行目 while True:
- 7行目 if button_a.get_presses():
- 8行目 radio.send(‘a’)
- 9行目 if button_b.get_presses():
- 10行目 radio.send(‘b’)
今回は「is_pressed()」を使っていますね。何がどう違うのですか?
(今回のプログラム)
- 3行目 def UserInput():
- 4行目 if button_a.is_pressed():
- 5行目 return ‘a’
- 6行目 if button_b.is_pressed():
- 7行目 return ‘b’
良いところに気が付いたね!これまでは、押された瞬間に反応するため、「get_presses()」を使用した。この関数はボタンが押された後、呼び出されると、「True」を返す。
フムフム。「True」と「False」については、以前やりましたね。
【マイクロビット入門】(5)それって本当?それとも嘘?(TrueとFalseについて)
そして、一度「Ture」を返すと、その次に呼び出されたときは「False」を返すのだ。ボタンが押され続けていても、ボタンが離されても、どちらの場合も「False」だ。
押された瞬間だけ「True」になるイメージですね!
一方、「is_pressed()」は、押されている間はずーっと「True」、離されると「False」となるのだ。
ということは・・・
「get_presses()」 を使った場合は、ボタンが押された瞬間だけ目が光るが、「is_pressed()」を使った場合はボタンを押している間ずーっと目が光り続ける、ということなのだ。
今回は、ボタンが押されている間はずーっと目が光り続けるのですね。
ウム。その方が、動きを確かめやすいと思ったのだよ。
入出力ピンのライブラリの read_digital()
0ピンに追加した押しボタンスイッチが押されたかどうかは、「is_pressed()」ではなく「read_digital()」で調べるのですか?
そうなのだ。0ピン自体はボタンではなく、入出力ピンなので、別のライブラリが用意されているのだ。
しかも、「read_digital()」が0の時に反応するようになっているようですが・・・
- 8行目 if pin0.read_digital() == 0:
- 9行目 return ‘c’
これは、ボタンが押されたときにピン0が0V、すなわち「False」になるように回路を作ったからなのだ。
そういえば、電池を長持ちさせるためにそうしたのでしたね。
その通りだ。回路に合わせてプログラムを作らないといけないのだョ。
write_digital()でピンをON/OFFしてLEDを点灯/消灯させる。
12行目以降の無限ループの中で、先ほど説明した関数「UserInput()」が呼び出される。
この関数でどのボタンが押されたかを調べるのでしたね。
そして、押されたボタンに応じて目を光らせるのだ。例えば「aボタン」が押された場合は・・・
- 12行目 while True:
- 13行目 data = UserInput()
- 14行目 if data == ‘a’:
- 15行目 display.show(‘a’)
- 16行目 pin1.write_digital(1)
1ピンに接続されたLED、すなわち右目が光るのだ。
「write_digital(1)」とすることで1ピンが3Vとなり、LEDが光るのですね。
その通りだ。ちなみに何も押されていない場合は・・・
- 24行目 if data == ‘ ‘:
- 25行目 display.clear()
- 26行目 pin1.write_digital(0)
- 27行目 pin2.write_digital(0)
1ピン、2ピンの両方で「write_digital(0)」とすることで、両方のLEDを消灯させているのだ。
以前、マイクロビットの機能を使ったときにもやりましたね。(下の記事の中ほど、「 出力端子の例 」を見てね。)
【マイクロビット入門】(10)マイクロビットの機能を使ってみよう。
ソースコード全文
これらをまとめて1つのプログラムにしたものを掲載します。
- 1行目 from microbit import *
- 2行目
- 3行目 def UserInput():
- 4行目 if button_a.is_pressed():
- 5行目 return ‘a’
- 6行目 if button_b.is_pressed():
- 7行目 return ‘b’
- 8行目 if pin0.read_digital() == 0:
- 9行目 return ‘c’
- 10行目 return ‘ ‘
- 11行目
- 12行目 while True:
- 13行目 data = UserInput()
- 14行目 if data == ‘a’:
- 15行目 display.show(‘a’)
- 16行目 pin1.write_digital(1)
- 17行目 if data == ‘b’:
- 18行目 display.show(‘b’)
- 19行目 pin2.write_digital(1)
- 20行目 if data == ‘c’:
- 21行目 display.show(‘c’)
- 22行目 pin1.write_digital(1)
- 23行目 pin2.write_digital(1)
- 24行目 if data == ‘ ‘:
- 25行目 display.clear()
- 26行目 pin1.write_digital(0)
- 27行目 pin2.write_digital(0)
ところで、前回の内容について、後で考えてみたら、よく分からなくなってしまっているんですよ。
ムムムム、それはまずいね。どこが分からないのかな?
押しボタンスイッチ回路のところで、ボタンがOFFの時にどうして電流が流れないのか、とか・・・
うむ、それはだな・・・
そもそも、電流って、どういうことなんですか?
そう来たか・・・回路について、もう少し詳しく解説する必要があるね。
ハイ、よろしくお願いします。
つづく
コメント