飛行機のプロペラの企画、まだ続いていたのですね?
ムムム、今日はいつになく厳しいな。マイクロビットがもう一つあるので、無線で操作できるようにしてみたのだ。
その手があったか!興味がわいてきました!
では、さっそくいってみよう。
どんな改造を施したのか?
これまで作ってきたプロペラのプログラムでは、マイクロビットのボタンを押すとプロペラが動いたり止まったりしていた。
プロペラがゆっくり回ったり、速く回ったりしましたね。
今回は、もう一つ別のマイクロビットから操作できるようにしたのだ。
テレビのリモコンみたいな感じですか?
まさにリモコンだね。では、リモコン用のマイクロビットのボタンを押してごらん。
本当だ!プロペラが回ったぞ!!
いったいこれ、どうやってやったのですか?
マイクロビットの無線機能を使ったのデ~ス。
マイクロビットの無線機能
無線機能って、なんだか難しそうですね?話についていけるのだろうか?
最初は簡単なやつを試してみようと思う。まずは、やってみよう。
分かりました!で、どんなことをやるのですか?
マイクロビットを2つ用意して、片方を「リモコン」、もう一方を「表示器」となるようにプログラムをロードしておいた。「リモコン」で「Aボタン」を押してごらん。
「表示器」で「a」と表示されましたね!
次は「Bボタン」を押してごらん。
「b」と表示された!
いったいどんなプログラムを作ったんですか?すごくややこしいんじゃないですか?
「リモコン」のプログラム
いや、そんなことはないョ。初めに「リモコン」のプログラムを見てみよう。
- 1行目 import radio
- 2行目 from microbit import *
- 3行目
- 4行目 radio.on()
- 5行目
- 6行目 while True:
- 7行目 if button_a.get_presses():
- 8行目 radio.send(‘a’)
- 9行目 if button_b.get_presses():
- 10行目 radio.send(‘b’)
本当だ!思ったよりも短いですね。しかも、何か見覚えがあるような気が・・・
例えば、どんなところかな?
1行目の「import」は音楽を鳴らしたときに使いましたね。音楽のライブラリを組み込むやつでしたっけ?
その通り。「【マイクロビット入門】(10)マイクロビットの機能を使ってみよう。」の「音楽の演奏」で出てきたね。
今回は「import radio」なので、無線機能を組み込んでいる、ということですね?
- 1行目 import radio
- 2行目 from microbit import *
「while」とか「if」とかは、おなじみのやつですね。
- 6行目 while True:
- 7行目 if button_a.get_presses():
ウム。よく覚えていたね。
4行目の「radio.on()」は、もしかして無線機能をオンにする、ということですか?
- 4行目 radio.on()
その通りだ。まさに、読んで字のごとくだね。
8行目と10行目はボタンが押されたら「a」とか「b」を送信している、ということですか?
- 6行目 while True:
- 7行目 if button_a.get_presses():
- 8行目 radio.send(‘a’)
- 9行目 if button_b.get_presses():
- 10行目 radio.send(‘b’)
これも読んで字のごとくだね。なんだ、赤トマト君。自分で全部理解してしまったではないか!
オヒョ~
「表示器」のプログラム
でも、その分「表示器」のプログラムはややこしいのではないですか?
そうかな?では、実際に見てみよう。
- 1行目 import radio
- 2行目 from microbit import *
- 3行目
- 4行目 radio.on()
- 5行目
- 6行目 while True:
- 7行目 data = radio.receive()
- 8行目 if data == ‘a’:
- 9行目 display.show(‘a’)
- 10行目 if data == ‘b’:
- 11行目 radio.show(‘b’)
6行目までは「リモコン」のプログラムと同じですね。7行目の「receive()」で受信したものを取り出している、ということですか?
ィエース!リモコンで「Aボタン」や「Bボタン」が押されると、「’a’」や「’b’」が送られて、「表示器」のマイクロビットが受信する。すると、「receive()」で受信したものを取り出すことができるのだ。
あとは、LEDで表示する部分ですね。ややこしくなかったですね。
プロペラのプログラムを改造
無線機能の使い方が分かってきたところで、次はプロペラのプログラムの改造について説明しよう。
「リモコン」と「プロペラ」の両方の説明をするのですか?
「リモコン」は先ほど説明したものがそのまま使えるのだ。改造したのは、「回転数が徐々に遅くなって止まる」バージョンの「プロペラ」のプログラムなのだ。
【マイクロビット応用】プラモの飛行機のプロペラのプログラム:回転が徐々に遅くなって止まるバージョン
このプログラムでは、ボタンで操作していたのは覚えているね。
「aボタン」ではプロペラが動いて、「bボタン」では止まるのでしたね。
かなりおおざっぱだが、その通りだね。例として「停止」の状態のプログラムを見てみよう。
- 13行目 def StateStop():
- 14行目 nextState = STATE_STOP
- 15行目 display.show(‘S’)
- 16行目 pin1.write_analog(RPM_STOP)
- 17行目 pin13.write_digital(0)
- 18行目 while True:
- 19行目 if button_a.get_presses():
- 20行目 nextState = STATE_CELL_MOTOR
- 21行目 break
- 22行目 if button_b.get_presses():
- 23行目 nextState = STATE_STOP
- 24行目 return nextState
このプログラムの19行目~21行目で「aボタン」が押されるとプロペラが回りだすのだったね。
「セルモーター」でゆっくり回るのでしたね。
今回は、「aボタン」のほかに、「リモコン」の操作でもプロペラが動かないといけない。プログラムを見やすくするため、ボタンの操作やリモコンの操作を関数としてまとめることにした。
関数の作り方は前にやりましたね。
そこで、まずはこのプログラムを、次のように改造した。
- 13行目 def UserInput():
- 14行目 if button_a.get_presses():
- 15行目 return ‘a’
- 16行目 if button_b.get_presses():
- 17行目 return ‘b’
- 18行目 return ‘ ‘
- 19行目
- 20行目 def StateStop():
- 21行目 nextState = STATE_STOP
- 22行目 display.show(‘S’)
- 23行目 pin1.write_analog(RPM_STOP)
- 24行目 pin13.write_digital(0)
- 25行目 while True:
- 26行目 data = UserInput()
- 27行目 if data == ‘a’:
- 28行目 nextState = STATE_CELL_MOTOR
- 29行目 break
- 30行目 return nextState
む む む む む、随分長くなってしまいましたね。
13行目~18行目が新しく追加した関数だ。「aボタン」が押されると「’a’」を、「bボタン」が押されると「’b’」を返すようになっている。
な、な、なるほど・・・
何も押されていないときは「’a’」「’b’」以外のなにか、ここでは「’ ‘」すなわちスペースを返すようになっているのだ。
で、この関数はというと、26行目で呼び出されていますね?
- 25行目 while True:
- 26行目 data = UserInput()
- 27行目 if data == ‘a’:
- 28行目 nextState = STATE_CELL_MOTOR
- 29行目 break
- 30行目 return nextState
「aボタン」が押されていると、「’a’」が返ってくるので、次の27行目の「if文」が成り立つわけですね?
その通り!そしてあとは、元のプログラムと同じく「STATE_CELL_MOTOR」を返して、セルモーターの状態に動きが変わっていくのだ。
元のプログラムは以下に掲載していますよ。(新しいタブで開きます。)
【マイクロビット応用】[4] プラモの飛行機のプロペラ(3)回転が徐々に遅くなって止まるように改造
無線機能を追加
次は、ボタンの操作をまとめた関数に無線の機能を追加しマ~ス。
- 13行目 def UserInput():
- 14行目 if button_a.get_presses():
- 15行目 return ‘a’
- 16行目 if button_b.get_presses():
- 17行目 return ‘b’
- 18行目 return ‘ ‘
これを次のようにしマ~ス。
- 13行目 def UserInput():
- 14行目 data = radio.receive()
- 15行目 if data == ‘a’:
- 16行目 return ‘a’
- 17行目 if data == ‘b’:
- 18行目 return ‘b’
- 19行目 if button_a.get_presses():
- 20行目 return ‘a’
- 21行目 if button_b.get_presses():
- 22行目 return ‘b’
- 23行目 return ‘ ‘
14行目~18行目が追加されましたね。「表示器」の時と同じで、「radio.receive()」で「リモコンから送られてきたものを受け取っているのですね?
そうだね。そして、マイクロビットのLEDに表示する代わりに呼び出し元に「’a’」または「’b’」を返すようにしたのだ。
「リモコン」から送られてきたのが「’a’」なら「’a’」を、「’b’」なら「’b’」を返す、という訳ですね。
「停止」以外の状態の動作を行う関数も同様に改造しました。詳しくは、プログラム全体を見てね。(新しいタブで開きます。)
【マイクロビット応用】プラモの飛行機のプロペラのプログラム:無線バージョン
最初の設定も忘れずに。
これで完成ですか!
いや、まだこのままでは動かない。
えー、どうしてですか?
無線機能がONになっていないからなのだ。
あ、そうか。「radio.on()」とするのでしたっけ?
その通りだ。「リモコン」のプログラムで説明したやつだね。
- 79行目 state = STATE_STOP
- 80行目
- 81行目 pin14.write_digital(1)
- 82行目 pin1.write_analog(RPM_STOP)
- 83行目 pin12.write_digital(0)
- 84行目
- 85行目 radio.on()
- 86行目
- 87行目 while True:
プログラムの先頭で無線機能のライブラリ「radio」をインポートするのも忘れないでね。
- 1行目 import radio
- 2行目 from microbit import *
まとめ
まとめ行ってみよ~ゥ
- 無線のライブラリ「radio」をインポートすると、無線機能を使える。
- 送信は「radio.send( )」、受信は「radio.receive()」を使うことで行える。
- 「radio.on()」で無線機能をONすることを忘れずに。
今回のプログラムはこちらをご覧ください。(新しいタブで開きます。)
【マイクロビット応用】[5.1] プラモの飛行機のプロペラのプログラム:無線バージョン
次回はチャンネル指定など、もう少し無線に関する機能を追加してみます。
次回も見てね!
つづく
コメント