micro:bit 割り込みと機能分担の考え方 — プログラム設計の基本

2026年6月2日

この記事で説明すること

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

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

割り込みについて

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

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

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

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

  • 最初は LED に '0’ が表示されます
  • A ボタンを押すと LED に表示されている数字が +1 されます
  • B ボタンを押すと LED に表示されている数字が -1 されます

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

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

ボタン押下で LED 表示を変えるプログラム(機能分担なし)

このプログラムを実際に 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 の表示はどうなりますか?

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

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

割り込みと「ずっと」ブロックで LED 表示が競合する例

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

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

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

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

  • 「最初だけ」"count" の値を '0’ にする
  • 「ずっと」の中で “count" を LED に表示する
  • 「ボタン A が押された時」に “count" を +1 する
  • 「ボタン B が押された時」に “count" を -1 する
機能分担を適用した完成プログラム

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

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

仕様とは何か

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

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

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