次の記事モーターを回せるようになったので、プラモの飛行機のプロペラを回すプログラムを作ってみたよ。(動画を貼る予定だったのだが、うまく貼れませんでした。高速回転この飛行機、エンジンがむき出しでプロペラの色も塗られていませんね。飛行機は製作中なのである。これ、どうやってやったのですか?それが今回の内容なのだ。呼び出し元に戻った後は・・・Bボタンが押されたときはどうなる?まとめプロペラの動きまず初めに、どのボタンを押すとプロペラがどのように動くかを説明しよう。ボタンを押して動かす、という訳ですね。プロペラが止まっている状態で「Aボタン」を押すと、プロペラがゆっくり回る。Aボタンを押すと・・・プロペラがゆっくり回る。?エンジンが始動する前にプロペラがセルモーターで回っている状態を表しているのだ。セルモーター?ですか??例えば、車のエンジンをかけるときはどんな音がするかな?「ギュイギュイギュイバウゥ~~ン!」その「ギュイギュイギュイ」の部分がセルモーターで、「バウゥ~~ン!」の部分がエンジンで動いている状態なのだ。次はエンジンで動いている状態になるのですね?その通り。一度「Aボタン」を押すと、エンジン始動、ということで、プロペラが速く回るのだ。一度Aボタンを押すと・・・プロペラが早く回る。「Bボタン」はどう使うのですか?「Bボタン」を押すと停止するようになっている。分かったかな?Bボタンを押すと・・・プロペラが止まる。イエ~スどんなプログラムを作ったのか?次はプログラムですか?その通り!ただ、今回作ったプログラムは、これまで見てきたものより長い。?トマトの僕にも理解できるのかなぁ?心配するな。実際のプログラムを見る前に、おおざっぱな動きを説明しよう。説明についてきてくれよ。頑張ります!まず、先ほど説明したプロペラの動きには、3つの種類があることは分かるかな?止まっているのと、セルモーターでゆっくり回っているやつ、エンジンで速く回っているやつですね?その通りだ。それぞれの動きをしているときに、マイクロビットのボタンが押されると、別の動きに変化する、ということは分かるかな?ゆっくり回っているセルモーターのときに「Aボタン」が押されると、プロペラが速く回るエンジンの状態になる、ということですか?その通りだ!止まっている状態(停止の状態)、セルモーターの状態、エンジンの状態をまとめてみるとこうなる。プロペラが止まっている。セルモーターの状態になる。プロペラがゆっくり回っている。エンジンの状態になる。プロペラが速く回っている。今回作ったプログラムでは、ボタンによりこれらの状態が切り替わるようになっているのだ。なんと!で、それは一体どういうことなのでしょうか???状態が切り替わる、とは?では、プロペラの状態の切り替わりについて説明しよう。この絵を見てくれたまえ。なんだかややこしそうな絵ですね。この絵の中に丸く囲った部分が3つあるのは分かるかな?「停止の状態」、「セルモーターの状態」、「エンジンの状態」と書かれているやつですか?そのとぉ~り!そして、「停止の状態」の丸の左上に「電源オン」と書かれており、そこから矢印が伸びているだろう。コレはどういうことなんですか?これは、マイクロビットの電源がオンされると、プロペラが止まった状態となることを表しているのだ。・・・では、矢印と「Aボタン」とか、「Bボタン」とか書かれているのが、ボタンで状態が変わるということを表している・・とか?よくわかったな!その通りだぞ!えぇっ、本当ですか!ビックリ仰天ですよ!これをプログラムにするには?実際にプログラムを作るときのポイントは、以下の2つだ。プロペラの状態を切り替える。ボタンが押されるのを待つ。プログラムにたどり着いたぞ。マイクロビットがそれぞれの状態を区別できるように番号を付ける。2番号はこの通りでなくても構わないが、各状態に別の番号を割り当ててくれたまえ。同じ番号だと、マイクロビットが区別できない、ということですね。我々も後で分からなくならないようにするため、これらの番号を変数に入れておこう。2「STATE」というのはどういうことですか?「STATE」とは「状態」という意味の英語だ。変数名なので、自分たちで決めればよいのだ。番号を変数に入れておかなくてもよいのですか?もちろんだ。どの番号をどの状態に割り当てたかをしっかり覚えておかないといけなくなるのだ。分かりやすい変数名にしておくのが良さどうですね。次に、今はどの状態なのかを格納しておくため、「state」という名前の変数を用意する。STATE_STOP「state」には、「STATE_STOP」を入れておくのですか?イェース。電源をオンした時はプロペラを停止させておくので、「state」には「STATE_STOP」を入れておく。電源を入れたとたんにプロペラが回ったら、ビックリしちゃいますしね。それぞれの状態の動きは、「関数」にまとめておくことにする。関数については、以下を見て思い出してくれたまえ。【プログラミング入門】(7)関数ってなんだろう【プログラミング入門】(8)関数を作ってみよう。それぞれの状態の関数の名前は、下のように決めたのだ。これも自分たちで決めることができるのだ。StateEngineいろいろと決まってきましたね。【プログラミング入門】(6)ループをぐるぐる回してみよう。状態を切り替える部分は、この無限ループの中に組み込んである。StateStop()57行目以降が無限ループの部分だ。58行目、60行目、62行目により、変数「state」の中身に応じてそれぞれの状態の関数が呼び出されるようになっている。「state」に「STATE_STOP」が入っているので、「StateStop」が呼び出されるのですね?ほかの関数はどのようにして呼び出されるのですか?それを理解するには、「StateStop」の中身を見る必要がある。「StateStop」は、次のような動作をするように作られている。ボタンが押されるのを待つ。Aボタンが押されたら、「次はセルモーターである」ということを知らせる。「関数」の中で、ボタンが押されるのを待つのですか?そうなのだ。そのために、「関数」の中にもループを組み込んであるのだ。nextStateええと、「関数」は、「def」で始まるのでしたね。思い出してきたようだね。12行目は、「nextState」という変数を用意している。この変数は、22行目で関数の呼び出し元に返す「お知らせ」の役割をする。「次はセルモーターだよ」というのを知らせるのですね?ウイ。次の14行目と15行目でモーターを止めている。あ、これは前にやったやつだ。16行目から21行目までが、ボタンが押されるのを待っている部分だ。16行目の無限ループにより、17行目から21行目が繰り返されるのだ。nextState「Aボタン」が押されると、17行目の「if」文の条件が成り立つ。うむむむ・・・18行目で「nextState」に「STATE_CELL_MOTOR」が格納される。19行目の「break」で無限ループから抜けて22行目に移るのだ。「StateStop」は63行目で呼び出されている。StateStop()」となっている。この「=」のおかげで、「StateStop」から戻ってくるときの「お知らせ」が「state」に格納されるのだ。なんと!・・・無限ループなので、そのあと57行目に戻るのでしたね・・・そうなのだ、この時には「state」には「STATE_CELL_MOTOR」が格納されている。StateCellMotor()そうだ!58行目の「if」文により「StateCellMotor」が呼び出されるのだ!ウッシャーァ!Bボタンが押されたときはどうなる?ところで、「StateStop」で、「Bボタン」が押された場合はどうなるのですか?プロペラの動きは止まったままだ。プロペラが止まっている。セルモーターの状態になる。nextState20行目の「if」文の条件が成り立ち、21行目が実行される。「nextState」の中身はもともと「STATE_STOP」ですね。何も変わらないのでは?その通り。実質的には、何も変わらない。「プロペラは停止したまま」となるのだ。この部分は無くてもよいのですか?そうとも言い切れないのだ。ややこしい説明が続いたので、続きは次回説明することにしようと思う。残り2つの関数「StateCellMotor」と「StateEngine」も次回ですね。複数の状態を切り替えることで、マイクロビットにつないだものにいろいろな動きをさせられる。それぞれの状態の中に無限ループを組み込み、ボタンなどの操作を待つようにする。今回作ったプログラムの全文は、以下の記事を見てね。(新しいタブで開きます。モーターを動かしてみよう。関連記事マイクロビット【マイクロビット入門】(4)マイクロビットに計算をさせてみよう。教育用マイコンボード「マイクロビット」のプログラミングを解説します。コンピューターは「計算機」です。マイクロビットももちろん計算できます。実際に計算を行わせる方法を説明します。パイソンの特徴の一つである、インデント(字下げ)の働きについても説明します。