【マイクロビット応用】[8.1]キッチンタイマーのプログラム:追加した回路の確認用プログラム

マイクロビット

 マイクロビットに追加した、押しボタンスイッチ回路とLEDの動きを確かめるためのプログラムについて説明するのだ。

 本文と一緒に見てね。

【マイクロビット応用】[8] キッチンタイマー(2)スイッチとLEDを追加、プログラムの動きを考える、ポケプラ「ゲンガー」の製作

動作環境

 追加した回路は下図のような回路なのだ。0ピンに押しボタンスイッチ回路が、1ピンと2ピンにLEDが接続されている。

 この回路をブレッドボードを使って作成し、マイクロビットにワニ口わにぐちクリップで接続したのだ。

 LEDにはポケプラ「ゲンガー」の目の部品を改造したものをかぶせて、「ゲンガー」の目が光る状態を再現したのでしたね。

プログラムの解説

 マイクロビットのaボタン、bボタンと、追加した押しボタンスイッチによって右目、左目、両目が光るプログラムを作成したのだ。

ボタンゲンガーの目マイクロビットのLED表示
aボタンゲンガーの右目のLEDが点灯する。「a」と表示される。
bボタンゲンガーの左目のLEDが点灯する。「b」と表示される。
追加した押しボタンスイッチゲンガーの両目のLEDが点灯する。「c」と表示される。

 以前製作した「飛行機のプロペラ」の無線バージョンでは、ボタン操作の部分を別関数にまとめましたね。

【マイクロビット応用】[5] プラモの飛行機のプロペラ(4)無線で操作できるように改造

 その通り、よく覚えていたね。今回も同様に、ボタン操作の部分を「UserInput()」という名前の関数にまとめた。

  • 行目 def UserInput():
  • 行目  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()」を使っていますね。何がどう違うのですか?

(今回のプログラム)

  • 行目 def UserInput():
  • 行目  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」になるように回路を作ったからなのだ。

ボタンが押されていないときは3Vで「True」
ボタンが押されると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つのプログラムにしたものを掲載します。

  • 行目 from microbit import *
  • 2行目 
  • 行目 def UserInput():
  • 行目  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の時にどうして電流が流れないのか、とか・・・

 うむ、それはだな・・・

 そもそも、電流って、どういうことなんですか?

 そう来たか・・・回路について、もう少し詳しく解説する必要があるね。

 ハイ、よろしくお願いします。

つづく

コメント

タイトルとURLをコピーしました