micro:bit 機能を分割してプログラムするという考え方

2020年12月28日

この記事で説明すること

micro:bitでボタンを押した時に走るプログラムは世間一般的には 割り込み と言われる動作になります。この記事ではそんな割り込みに関するプログラムの作成方法や機能分担の考え方について説明したいと思います。

今までは実際に動作を見てもらってからその説明を行っていましたが、実は皆さんは 割り込み を、割り込みと知らずに使ってきていると思いますので、最初に割り込みの説明を行い、その後、実際の例題を見ながら割り込みとそのプログラムの作成方法について考えていきたいと思います。

割り込みについて

micro:bit のプログラムは通常、電源が入った時点で1度だけ「最初に」のパーツ内のプログラムを実行し、その後は「ずっと」のパーツに含まれるプログラムを繰り返します。その事は皆さんも今までのプログラムの中で理解されていることかと思います。

ではその割り込みとは…それは以下の記事で出てきたボタンが押された時の動作です。

プログラムの世界でいう 割り込み というのはざっくり言ってしまうと何かをトリガにプログラムされた動作を行うことを言います。上記の記事の例ではボタンが押されたことをトリガに、ボタンが押された時にプログラムが実行されること、これが割り込みの動作です。

あるプログラムを考えてみよう

・最初はLEDに '0’ が表示されます

・Aボタンを押すとLEDに表示されている数字が +1されます。

・Bボタンを押すとLEDに表示されていると数字が -1されます。

あなたならこのプログラムをどのように設計していきますか?

実際に、文字通りプログラムを作ってみると以下のようになるかと思います。

このプログラムを実際に micro:bit にダウンロードして動作を確認すると記載した仕様通りに動作することが確認出来ると思います。つまり、このプログラムは何も間違っていません。

この記事で伝えたい内容は、割り込みに関するプログラムの作成方法や機能分担の考え方です。考えて頂きたいのはこのプログラムが機能分担という観点で考えた時に正しいのかどうかです。

元々の仕様はこちらです。

・最初はLEDに '0’ が表示されます

・Aボタンを押すとLEDに表示されている数字が +1されます。

・Bボタンを押すとLEDに表示されていると数字が -1されます。

ここで、この仕様を以下のように読み替えることは出来ますか?

・最初に"count"を '0’ にする

・ずっと “count" をLEDに表示する。

・Aボタンを押すと “count" を +1をする

・Bボタンを押すと “count" を -1をする。

これを micro:bit のプログラムにすると以下のようになります。

どうでしょう?一見ではあまり違いがないように見えるかもしれません。では、一つ想像してみて下さい。一つ前のプラグラムで

AボタンとBボタン、これがそれぞれほぼ同時に押されたらLEDの表示はどうなりますか?

これぐらいシンプルなプログラムではあまり問題としては見えてきません。しかしボタンを押すという割り込みの処理で競合する可能性のある処理を記載するべきではありません。これがもっと複雑なプログラムになってきた時に意図せぬ動作 = バグを作りこむ要因になり得ます。

もう少しわかりやすい例を以下に記載します。

こちらの例では、ボタンAを押した時、ボタンBを押した時の動作としてLEDに何が表示されるのが正しいのでしょうか?

一見、ボタンAを押した時に笑顔のLED、ボタンBを押した時に悲しい顔のLEDが表示されるのが正しく見えますが、「ずっと」のパーツの中にはハートを表示するLEDが記載されています。

実際にこのプログラムを実行した場合は、ボタンAを押すと笑顔のLEDが表示されますし、ボタンBを押すと悲しい顔のLEDが表示されます。ただし、これが意図した動作なのかは第三者が見た時に判断が出来ません。これが問題なのです。

だから今後、この記事を読まれた方は文字通りにプログラムを実装するのではなく、必要に応じて機能を分担して機能実装することが重要になると考えて下さい。機能の分担というのは以下です。

・「最初だけ」"count"の値を '0’ にする

・「ずっと」の中で"count"をLEDに表示する

・「ボタンAが押された時」に"count"を +1する

「ボタンBが押された時」に"count"を -1する

画像に alt 属性が指定されていません。ファイル名: image-39-1024x617.png

今回のプログラムでミソとなるのは、LEDの表示することを「ずっと」のパーツの中のみで実現していることにあります。これなら誰が見てもプログラムを見れば、このプログラムの作成者が何を実現したかったかが一目瞭然ですね。

最後に少しだけ仕様と言う言葉について触れたいと思います。

仕様とは何か

仕様とは何かの製品・システムについて、満たすべき機能を記載したものです。これを網羅的に記載したドキュメントを一般的に仕様書と言いますが、私の会社では「仕様書を見れば、誰でも同じものが作れる」というモノになります。

一般的なモノつくり・設計ではこの仕様書のデキが、製品のデキを決めます。仕様が正しく読み取れなければプログラムは正しく作れません。だから仕様書というのは、誰が見ても同じものが作れるものでなければなりません。

ここまでがこの記事の読者に伝えたかった内容となります。

少し概念的な話になり伝わり辛い部分もあったと思いますので、何か不明点や疑問点がありましたらお気軽に問い合わせください。