【マイクロビット入門】(12)AボタンとBボタンの使い方

マイクロビット

 マイクロビットのAボタンやBボタンが押されたかどうかを調べるには、ボタンモジュールの関数「get_presses()」を使うということだったと思いますが・・・(以下をご覧ください。新しいタブで開きます。)

【マイクロビット入門】(9)ボタンで動きを変えてみよう。

 「is_pressed()」という関数も出てきましたね。他にもいろいろあるのですか?

 ウム、ボタンモジュールには、以下の三つの関数が用意されている。今回は、これらについて見ていこう。

関数名機能戻り値
is_pressed()この関数が呼び出された時点でボタンが押されているかどうかを返す。TrueまたはFalse
was_pressed()この関数が呼び出されるまでにボタンが押されたかどうかを返す。TrueまたはFalse
get_presses() この関数が呼び出されるまでにボタンが押された回数を返す。 回数

 ボタンが押されたことを調べるのに、三つも関数があるのですね。(なんだか、ややこしいなぁ)

簡単におさらい

 念のため、これまでの内容から必要な部分をおさらいしておこう。ボタンモジュールを覚えているかな?

 ボタンモジュールは、ボタンに関する関数をまとめたもので、Aボタン用とBボタン用があるのでしたね。

 ウム。その通りだ。

 で、関数「get_presses()」などを呼び出すときは、モジュール名と関数名を「.」でつないで・・・

button_a.get_presses()

 のように書けば良いのでしたね!

 そこまで覚えていれば大丈夫だ!では、本題に入ろう。

is_pressed()とwas_pressed()の違い

 初めに、「is_pressed()」と「was_pressed()」の違いを見てみよう。どちらの関数も、ボタンが押されている場合は「True」、押されていない場合は「False」を返す。

関数名機能戻り値
is_pressed()この関数が呼び出された時点でボタンが押されているかどうかを返す。 TrueまたはFalse
was_pressed()この関数が呼び出されるまでにボタンが押されたかどうかを返す。 TrueまたはFalse

 関数「was_pressed()」が呼び出される前にボタンが押されたことが、マイクロビットの中に記録されている。「was_pressed()」は、この記録された情報を返すのだ。

 一度ボタンが押されると、「was_pressed()」はずっとTrueを返し続けるのですか?

 いや、関数「was_pressed()」が呼び出されると、記録された情報が「ボタンが押されていない」にリセットされる。従って、その後ボタンが押されなければ、次に「was_pressed()」が呼び出されたときはFalseが返されるのだ。

 「is_pressed()」は、今ボタンが押されているかどうかで、「was_pressed()」は前にボタンが押されたかどうか、ということなのですね?どういう違いがあるのですか?

 では、実際にプログラムを作って確かめてみよう。まずは、「is_pressed()」の動きを見てみるぞ。

プログラム1

  • 1行目 from microbit import *
  • 行目 while True:
  • 3行目  if button_a.is_pressed():
  • 4行目   display.show(1)
  • 5行目  else:
  • 6行目   display.show(0)

 ボタンが押されていると1が表示されて、押されていないと0が表示されるのですね?

 その通りだ。動かしてみてごらん。

 「Flash」ボタンでマイクロビットに書き込んで・・・Aボタンを押すと1に、ボタンを離すと0になりますね!

ボタンを離すと0
ボタンを押している間は1

 押している間は1が表示され続けることを覚えていてくれたまえ。次は、「is_pressed()」を「was_pressed()」に変えてみよう。

プログラム2

  • 1行目 from microbit import *
  • 行目 while True:
  • 3行目  if button_a.was_pressed():
  • 4行目   display.show(1)
  • 5行目  else:
  • 6行目   display.show(0)

 このプログラムでは、Aボタンを押しても0のままですね。たまに押した瞬間に0がちらつくような気もしますが・・・

 一瞬だけ1になっているのだが、一瞬が短すぎるので見えないのだね。プログラムの最後にsleep(500)を追加してみよう。(インデントに注意してね。)

プログラム2A

  • 1行目 from microbit import *
  • 行目 while True:
  • 3行目  if button_a.was_pressed():
  • 4行目   display.show(1)
  • 5行目  else:
  • 6行目   display.show(0)
  • 7行目  sleep(500)

 おぉ、押した瞬間に1になってから、0に戻りましたね!

 「was_pressed()」は、ボタンが押されていない状態から押された状態に変化したことをとらえている。そのため、ボタンを押し続けると、関数「was_pressed()」が呼び出された後は「ボタンが押されていない」と判断されてしまうのだ。

 うーん、そうか! 一度ボタンを離してから押し直さないと、「押された」と記録されないのですね。

is_pressed()とwas_pressed()をdisplay.scroll()と組み合わせてみる。

 では、次に「is_pressed()」と「display.scroll()」を組み合わせてみよう。

 「display.scroll()」は文字などをスクロールして表示するのでしたね?

 そうなのだ。そして、文字などの表示開始から完了まで少し時間がかかるのがポイントだ。では、プログラムを見てみよう。

プログラム3

  • 1行目 from microbit import *
  • 2行目a = 0
  • 行目 while True:
  • 4行目  display.scroll(a)
  • 5行目  if button_a.is_pressed():
  • 6行目   a = a + 1

 2行目で変数「a」に0を入れておいて、ボタンが押されると6行目で1増えるのですね?

 変数「a」の値は4行目の「display.scroll(a)」によってマイクロビットの表示部に表示される。では、動かしてみてごらん?

 プログラムをマイクロビットに書き込んで、ボタンを押すっと、・・・アレ、いまいち反応が良くないですね?数字が増えたり増えなかったりします。

 数字がスクロールして表示されているときにボタンを押しても、増えないのではないかな?

 その通りですね。スクロールし終わったタイミングを狙って押すと増えますね。

 では、ボタンを押し続けるとどうなるかな?

 押している間は数字が増えていきますね!

 このプログラムは、ループの中で「display.scroll()」と「button_a.is_pressed()」が繰り返し呼び出されるのだ。

 3行目の「While True:」以降が無限ループになっていますからね。

 そして、「button_a.is_pressed()」が呼び出されているときにボタンが押されると、「True」が返されて、「if」文が成立する、という訳なのだ。

 では、このプログラムの「is_pressed()」を「was_pressed()」に書き換えるとどうなるかな?

プログラム4

  • 1行目 from microbit import *
  • 2行目a = 0
  • 行目 while True:
  • 4行目  display.scroll(a)
  • 5行目  if button_a.was_pressed():
  • 6行目   a = a + 1

 今度のプログラムは反応がいいですね!数字がスクロールしているときにボタンを押しても、ちゃんと数字が増えますね!

 関数「is_pressed()」では、この関数が呼び出されたときにボタンが押されていないと「True」を返さない。

 「関数が呼び出された時点でボタンが押されているかどうかを返す」とは、そういう意味なのですね。

 ところが、「was_pressed()」では数字がスクロールしている間に押されても「True」を返すから反応が良くなるのだ。

 な~るほど。

 では、ボタンを押したままにするとどうなるかな?

 数字が1だけ増えますね。ボタンを押し続けると、関数「was_pressed()」が呼び出された後は「ボタンが押されていない」と判断されてしまう、というのは、こういうことなのですね。

 ウム。分かってきたようだね!

get_presses()について

 残るは「get_presses()」だけですね!

関数名機能戻り値
is_pressed()この関数が呼び出された時点でボタンが押されているかどうかを返す。TrueまたはFalse
was_pressed()この関数が呼び出されるまでにボタンが押されたかどうかを返す。TrueまたはFalse
get_presses() この関数が呼び出されるまでにボタンが押された回数を返す。 回数

 どちらかといえば「was_pressed()」と似ているようですが、戻り値が違いますね?

 良いところに気が付いたね!では、実際のプログラムで試してみよう。下のようなプログラムを作ってみたョ。

プログラム5

  • 1行目 from microbit import *
  • 行目 while True:
  • 3行目  display.scroll(“press a button”)
  • 4行目  a = button_a.get_presses()
  • 5行目  if a > 0:
  • 6行目   display.scroll(a)

 3行目の「display.scroll()」で”press a button”という文を表示する。この文が表示されている間にAボタンが何回押されたかを6行目で表示するのだ。

 では、マイクロビットで動かしてみます。「Flash」ボタンで書き込んで・・・Aボタンを連打すればいいのですね。えい、えい・・・おぉ、10と表示されました!

 Aボタンを10回押すことができたネ。「get_presses()」という関数を使えば、ボタンが何回押されたかも分かるのだ。

 最初は、「どうしてボタンが押されたかどうかを調べる関数が三つもあるのだろう?」と思いましたが、使い分けることでいろいろな動きをするプログラムを作れるのですね!

今回のまとめ

 ボタンモジュールの三つの関数を使ってみました。

  1. is_pressed()は、関数が呼び出された時点でボタンが押されているかどうかを返す。
  2. was_pressed()は関数が呼ばれるまでにボタンが押されたかどうかを返す。
  3. get_pressed()は関数が呼ばれるまでにボタンが何回押されたかを返す。

 これらの動きを踏まえて、どちらかを使うかを選べばよいのだ。アイデア次第でいろいろなプログラムを作ることができるのだ。

 またね~

コメント

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