前回予告した通り、今回はボタンを使ってマイクロビットの動きを変えてみるよ。
わーい、ボタンだ、わーい。楽しみだなぁ。
ボタンが押されたことを認識するには?
まずは、ボタンが押されたことを認識する必要がある。
ふむふむ。(わくわく)
そのためには、ボタンモジュールを使用する。
モジュール?・・・って、なんでしたっけ?
似たような機能の関数をまとめたものだな。今回使うのは、ボタンに関する関数をまとめたボタンモジュールを使うのだ。詳しくは、第7話「関数って何だろう」を参照してくれたまえ。
えーっと、第7話を読んでと。・・・思い出しました!モジュールですね!
思い出したかな。マイクロビットにはAボタンとBボタンの2つのボタンが取り付けられている。
したがって、モジュールもAボタン用とBボタン用が用意されている。
モジュール名 | 説明 | |
button_a | Aボタンに関する関数をまとめたモジュール | |
button_b | Bボタンに関する関数をまとめたモジュール |
モジュール名の後には「.」を付けるんでしたっけ?
よく覚えていたね。その通りだ!
で、関数名を記述するということでしたね?(第7話に書いてあったのさ。)
ボタンが押されていることを知るには、関数「get_presses()」を使う。この関数には引数はない。まずは、この関数「get_presses()」の動きを確認してみよう。
どうすればよいのですか?
サンプルプログラムを下のように改造してみてくれたまえ。スリープは短めに500ぐらいにしておいてくれたまえ。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目
- 5行目 while True:
- 6行目 display.scroll(button_a.get_presses)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(500)
出来ました。マイクロビットにロードすると、・・・あれ、エラーになっちゃうぞ!
関数の呼び出しでは、引数がなくてもカッコが必要だ。
- 5行目 while True:
- 6行目 display.scroll(button_a.get_presses())
- 7行目 display.show(Image.HEART)
- 8行目 sleep(500)
今度こそ出来ました!「Flasy」すると・・・「0」、ハートが表示されますね。
Aボタンを押すとどうなるかな?
「1」が表示されて、ハートが表示されて、「0」に戻りました。
Aボタンを押し続けるとどうなるかな?
やっぱり「1」が表示されて、ハートが表示されて、「0」に戻りますね。
つまり、関数「button_a.get_presses()」の戻り値を見れば、ボタンが押されたかどうかを認識することだ出来るということだね。
??戻り値????
関数「button_a.get_presses()」は、ボタンが押された瞬間をとらえて1を返し、それ以外の時は0を返す、ということなのだ。
関数が1を返す??どういうことなんですか?
関数の戻り値とは?
おっと、関数の戻り値については、まだ説明していなかったね。
いきなり知らない言葉が出てきて、びっくりですよ。
具体例で見てもらうと分かりやすいと思うが、関数は、計算結果などを呼び出し元に返すように作ることができるのだ。
ふむふむ。
例えば、以下のような関数を作ったとしよう。
- 5行目 def keisan(a,b):
- 6行目 kotae = a * b
- 7行目 return kotae
- 8行目
- 9行目 while True:
- 10行目 c = keisan(3,4)
- 11行目 display.scroll(c)
- 12行目 display.show(Image.HEART)
- 13行目 sleep(500)
動かしてみます。「12」と表示された後、ハートが表示されました。
このプログラムを解説しよう。5行目から7行目が関数「keisan」だ。
前回(第8話「関数を作ってみよう」)やったやつですね。引数が2つあるやつは、第7話「関数って何だろう」に出てきましたね。
そして、10行目が関数の呼び出しを行っている部分だ。
これも前回出てきましたね。
10行目でaに3が、bに4が入るので、6行目の「kotae = a × b」でkotaeの中身が12となるのは分かるね。
はい、何とか分かるような気がします。
そして、7行目で「return kotae」とすることで、関数の呼び出し部分の10行目に戻って、変数「C」に12が格納されるのだ。
そういうことなんですか。変数「C」の中身が12だから、11行目の「display.scroll(c)」で12が表示されるのですね。
変数については、第4話「マイクロビットに計算させてみよう」を参照してくれたまえ。
これまでやってきたことの積み重ねなのですね。
よく頑張ってここまでたどり着いたね。
で、関数「button_a.get_presses()」の場合は、ボタンが押されたことを「1」、押されていないことを「0」として返す、という訳なのだ。
なぁ~るほど。
ここで、注意しないといけないのは、ボタンを押されると「1」となるが、押し続けると「0」に戻ってしまうことなのだ。
さっき、押し続けると「0」に戻ってましたね。
押されていない状態から押された状態に変化したことを読み取っているのだね。
条件分岐で動作を切り替えよう。
では、いよいよAボタンにより表示内容を変更してみるぞ。
イエッサー!
Aボタンを押されたことにより、表示内容を変更するには、条件分岐を使えばよい。
条件何とかっていうやつ、前にあったような。そうだ、第5話「それって本当?それとも嘘?」だ!条件式ってやつが出ていましたね。
そう、その通り。第5話では、「while」文が条件式と組み合わせて使える、ということを説明した。
グルグル回るのでしたね。
今回は、新たに「if」文というものを使う。「if」の後ろに条件式を記述する。これが「True」の場合には、「if」に続くブロックが実行される。そして、「if」文は「:」で締める。
if [条件式]:
この条件式に「button_a.get_presses()」を記述すればよい・・・・・
あ!「button_a.get_presses()」が返すのは、「0」か「1」だ!
だめかぁ・・・
いや、ダメではないぞ!「True」は「1」で、「False」は「0」で置き換えることができるのだ。試しにさっきのプログラムで、9行目を「while 1」としてみてくれたまえ。
- 5行目 def keisan(a,b):
- 6行目 kotae = a * b
- 7行目 return kotae
- 8行目
- 9行目 while 1:
- 10行目 c = keisan(3,4)
- 11行目 display.scroll(c)
- 12行目 display.show(Image.HEART)
- 13行目 sleep(500)
本当だ。エラーにならずに動きますね。ああ、良かった。
では、ここで、前回のプログラムを思い出してくれたまえ。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目
- 5行目 def tomato(tane):
- 6行目 display.scroll(tane)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(2000)
- 9行目
- 10行目 while True:
- 11行目 tomato(’Honjitu ha seiten nari’)
このプログラムで、Aボタンが押された場合に表示を「Asu ha ame」とするにはどうすればいいか分かるかい?
そうですね、こうですか!(どうだ!!)
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目
- 5行目 def tomato(tane):
- 6行目 display.scroll(tane)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(2000)
- 9行目
- 10行目 while True:
- 11行目 tomato(’Honjitu ha seiten nari’)
- 12行目 if button_a.get_presses():
- 13行目 tomato(’Asu ha ame’)
では、動かしてみてごらん。
「Honjitu ha seiten nari」と表示されて、ハートが表示されて、・・・
Aボタンを押すと、ハートの次に「Asu ha ame」と表示されて、またハートが表示されて・・・
あれ、元に戻っちゃった!
「while true:」のループで回っているので、11行目に戻って「Honjitu ha seiten nari」が表示されてしまうのだね。
そうだった。ループで回っているんだった。
Aボタンを押されると、ずっと「Asu ha ame」と表示されるようにするには、どうすればよいかな?
うーん、ループで戻るから、ループから戻らないようにするのかなぁ?うーん、ワッカリマセーン!
表示内容を変数で保持してみよう。
こういう場合は変数を上手く使うとよい。
どういうことですか?
まず、変数を用意して、最初に表示する内容を入れておく。変数名は、「naiyou」としよう。記述する場所は、「while True:」の前だ。
こんな風でよいですか?
- 5行目 def tomato(tane):
- 6行目 display.scroll(tane)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(2000)
- 9行目
- 10行目 naiyou = ‘Honjitu ha seiten nari’
- 11行目
- 12行目 while True:
- 13行目 tomato(’Honjitu ha seiten nari’)
- 14行目 if button_a.get_presses():
- 15行目 tomato(’Asu ha ame’)
その通りだ。そして、13行目の関数「tomato」の引数を、変数「naiyou」とする。
こうですね。「naiyou」の内容が「’Honjitu ha seiten nari’」なので、置き換えられるわけですね。
- 11行目
- 12行目 while True:
- 13行目 tomato(naiyou)
- 14行目 if button_a.get_presses():
- 15行目 tomato(’Asu ha ame’)
最後に、15行目は関数「tomato」の呼び出しではなく、変数「naiyou」に「’Asu ha ame’」を格納する文とするのだ。
こうなるわけですか?
- 11行目
- 12行目 while True:
- 13行目 tomato(naiyou)
- 14行目 if button_a.get_presses():
- 15行目 naiyou = ’Asu ha ame’
動かしてみます!「Honjitu ha seiten nari」と表示されて、ハートが表示されて・・・
Aボタンを押すと「Asu ha ame」と表示されて、ハートが表示されて・・・
やった!また「Asu ha ame」と表示されたぞ!!
でも、「Honjitu ha seiten nari」に戻らなくなってしまいましたね。
Bボタンも使ってみよう。
このままでは、「Honjitu ha seiten nari」に戻らない。Bボタンで戻るようにしてみよう。
Bボタンが押されたら、変数「naiyou」の内容を「’Honjitu ha seiten nari’」に変えればよいのですね。やってみます。Bボタンだから、「button_b」を使って・・・
- 11行目
- 12行目 while True:
- 13行目 tomato(naiyou)
- 14行目 if button_a.get_presses():
- 15行目 naiyou = ’Asu ha ame’
- 16行目 if button_b.get_presses():
- 17行目 naiyou = ’Honjitu ha seiten nari’
分かってきたようだね。動かしてごらん。
Aボタンで「Asu ha ame」になって、・・・Bボタンで「Honjitu ha seiten nari」にもどった!やりました、青木鳥隊長!
ボタンの使い方が分かってきたようだね。次回は、マイクロビットに組み込まれている他の機能も試してみることにしよう。
次回は何をやるのかなぁ?
今回のまとめ
今回のまとめ、いってみよう。
- Aボタンが押されたことを確認するには、「button_a.get_presses()」関数を使う。
- Bボタンが押されたことを確認するには、「button_b.get_presses()」関数を使う。
- 関数は戻り値を持つことができる。計算結果などを戻り値で呼び出し元に渡すことができる。
- 「if」文により、条件分岐を行える。書式は、「if [条件式]:」である。条件式が「True」の場合に、これに続くブロックが実行される。
- 「True」は「1」で、「False」は「0」で置き換えられる。
今回作ったプログラムは2つです。1つ目は戻り値を持つ関数の例。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目
- 5行目 def keisan(a,b):
- 6行目 kotae = a * b
- 7行目 return kotae
- 8行目
- 9行目 while True:
- 10行目 c = keisan(3,4)
- 11行目 display.scroll(c)
- 12行目 display.show(Image.HEART)
- 13行目 sleep(500)
2つ目はボタンで表示を切り替える例。
- 1行目 #Add your Python code here. E. g.
- 2行目 from microbit import *
- 3行目
- 4行目
- 5行目 def tomato(tane):
- 6行目 display.scroll(tane)
- 7行目 display.show(Image.HEART)
- 8行目 sleep(2000)
- 9行目
- 10行目 naiyou = ‘Honjitu ha seiten nari’
- 11行目
- 12行目 while True:
- 13行目 tomato(naiyou)
- 14行目 if button_a.get_presses():
- 15行目 naiyou = ’Asu ha ame’
- 16行目 if button_b.get_presses():
- 17行目 naiyou = ’Honjitu ha seiten nari’
まったね~!
つづく
コメント