タイマーの時間を計測する方法を検討します。
タイマー機能を追加
前回までのスケッチで、スイッチを押すと、LEDを1秒に1回光らせる動作を実現することができました。
でもこれってタイマーではないですよね。スイッチを押すとLEDはずーっと点滅を続けます。タイマーというからには、3分とか5分など、時間を計測する必要があります。そこで、今回からタイマーらしく時間を計測する機能を追加していきます。
時間を計測するには
時間を計測するにはどうすればいいでしょうか。
スイッチを押すとLEDが1秒に1回点滅を開始するので、点滅を開始してから何回点滅したかを数えれば時間計測ができますよね。では、例えば3分タイマーにしたい場合は点滅を何回数えればいいでしょうか。
LEDは1秒に1回点滅します。1分は60秒なので1分間に60回点滅します。ということは3分では60回 x 3で180回です。3分という時間を計測するには、LEDの点滅回数を数えて180回になったらストップすればいいわけです。
でも180回を数えるというのは、スケッチではどのように書けばいいのでしょうか。
数を数えるには
皆さんは、数を数える場合どうしてますか? 例えば5回数えてください、と言われた場合、5回をどのように数えてるんでしょうか。
「どのように数えてるか?」と突然聞かれても「どのように、って、、、、、数を数えてるんです」ということ以上のことは答えられないのではないでしょうか。
例えば、LEDの点滅を5回数える場合、皆さんは頭の中でこんなことをしているんです。
例えばLEDの点滅を5回数えるという場合、当たり前のように5回数えることができていますが、頭の中では以下の手段を使って数を数えているわけです。
- 今までのLEDの点滅回数を記憶しておく(開始時の点滅回数は0回)
- LEDが光ったら点滅回数に1を足す
- 点滅回数が5回になるまで(1)と(2)を繰り返す
この(1)から(3)の手段をよくみてみると、実は今まで習得した命令が含まれています。
(2)の点滅回数に1を足す、というのは第16回の記事で習得した算術演算子が使えます。1を足す場合、スケッチで「+ 1」と書けば(2)の手段は実現できそうです。
また、(3)は第22回で習得したwhile構文そのものです。while構文は「ある式が成立している間、命令を繰り返す」という動作でした。(3)は「点滅回数が5回になるまでの間、(1)と(2)を繰り返す」という動作ですので、(3)はwhile構文で実現できそうです。
ただ(1)の点滅回数を記憶しておく、という方法はまだ習得していません。今回の記事では、点滅回数のような数字を記録しておく方法を習得して、LEDの点滅回数を数えるスケッチを作成します。
数字を記憶するイメージ
ここで、C/C++言語で数字を記憶する方法を細かく説明すると急に難しくなってしまいますので、最初にイメージをつかんでおきましょう。
C/C++言語では、数字を記憶しておくためのメモ用紙のようなものがある、とイメージしてください。こんな感じです。
人間は頭の中で数字を記憶しますが、コンピュータはこのようなメモ用紙に記録します。このメモ用紙は、私たちがよく使うメモ用紙とは性質がちょっと、というかかなり違います。このメモ用紙は以下の性質を持っています。
- 何度でも書き直しができる
- メモ用紙にはタイプがいくつかあり、それぞれのタイプで書ける数字の範囲が異なる
- メモ用紙のタイトルが必要
- メモ用紙を使うとき、「メモ用紙を用意してください。タイプは〇〇で、タイトルは□□□にしてください」とスケッチに書く必要がある
それぞれの内容を簡単に説明します。
1. 何度でも書き直しができる
普段使うメモ用紙と同じように、何度でも書き直しができます。ただし、普通のメモ用紙のように消しゴムで消して白紙にすることはできません。必ず何かの数字を書く必要があります。何だか不思議なメモ用紙ですね。
2. メモ用紙にはタイプがいくつかあり、それぞれのタイプで書ける数字の範囲が異なる
このメモ用紙にはたくさんのタイプがあります。「タイプ」というのは具体的にはメモ用紙のサイズで、それぞれのタイプで書ける数字の範囲が異なっているんです。
例えば一番小さいサイズのメモ用紙は、以下のように0から255までの数字を書くことができます。
また、この範囲の数字では足りないということであれば、大きいサイズのメモ用紙もあります。このメモ用紙は0から4,294,967,295まで書くことができます。
C/C++言語ではなぜこのようにいくつかのタイプのメモ用紙があるんでしょうか。こんなにたくさんのタイプを用意するのは面倒なので、一番大きいサイズのメモ用紙が1種類あればいいような気もします。この理由についてはあとで明らかにします。
3. メモ用紙のタイトルが必要
今までの説明では単にメモ用紙に数字を書いていましたが、実はメモ用紙には必ずタイトルが必要なんです。
というのは、メモ用紙は複数使うことができます。また、メモ用紙の数字は何度でも書き直しができる、と説明しました。メモ用紙の数字を書き直すとき、どのタイトルのメモ用紙の数字を書き直すかを指定する必要があるため、メモ用紙にタイトルが必要になります。
なお、タイトルに使用できる文字は大文字、小文字のアルファベット、数字と一部の記号だけです。上の例は、メモ用紙のタイトルが「count」という名称で、「189」という数字が記録してあります。
4. メモ用紙を使うとき、「メモ用紙を用意してください。タイプは〇〇で、タイトルは□□□にしてください」とスケッチに書く必要がある」
メモ用紙を使うときは、前もって「このサイズのメモ用紙を、タイトルは〇〇で用意してください」とスケッチに書く必要があります。
スケッチに「0〜255まで書けるメモ用紙を、countというタイトルで用意してください」と書くと、先ほどのようなメモ用紙を用意してくれます。
これを書かないで勝手にメモ用紙を使おうとすると、例のごとくArduino IDEに怒られますので注意が必要です。
C/C++言語の数字を記録する方法のイメージはだいたいこんな感じです。この性質をしっかりと頭に入れて、実際のC/C++言語での書き方を習得していきましょう。
変数と型
C/C++言語を含めどのプログラミング言語にも、先ほど説明した数字を記録するメモ用紙のようなものがあります。このメモ用紙のことを「変数」(へんすう)と呼んでいます。
メモ用紙は何度でも書き直しができますよね。このように何度でも変えることのできる数、ということで「変数」と覚えましょう(数学でも「変数」が出てきますが、プログラミングでも数学の変数と同じ意味で使用しています)。
また、先ほどの説明でメモ用紙にはいくつかタイプがある、と説明しました。このタイプのことを「型」(かた)と呼んでいます。変数の型によって記録することのできる数字の範囲が異なります(メモ用紙のタイプによって、書くことのできる数字の範囲が異なる、と言い換えるとわかりやすいでしょうか)。
それでは、C/C++言語の変数にはどのような型があるか確認しましょう。
扱える数字の範囲は小さい順に「char」型、「int」型、「long」型です。また、「unsigned」はプラスの整数のみ、「unsigned」が付いていない型はプラスとマイナスの数字を扱うことができます。「signed」は日本語で「符号付き」という意味があります。「un」は否定を意味するので、「unsigned」は「符号なしの」という意味で、「プラスマイナスの符号が扱えない」という意味合いになります。
なんだか急に難しい単語が出てきました。また、書ける数字の範囲もずいぶんと中途半端ですよね。このような状況ですので、さすがにこれは覚える必要はありません。「変数の型がある」という理解をしておけば大丈夫です。
ところで、この表の下の注意書きになんだか怪しいことが書いてあります。
実は「int型」は、コンピュータの種類によって数字の範囲が「0〜65536」か「0〜4294967295」のどちらかで、コンピュータの構造によって異なります。
スケッチに「int型」が使われていると、どちらの範囲か不明確になってしまいますよね。そこで最近のスケッチでは、より明確な型を使割れることが多くなってきました。スケッチでは以下の型の名前も使用できます。
こちらもちょっと覚えづらいかもしれませんが、名前に規則がありますので確認しておきましょう。最初に「u」が付いている型は符号なしの型です。「unsigned」(符号なしの)の「u」の意味です。次の「int」は全ての方に共通で「integer」、日本語では「整数」という意味です。次の数字は「8」「16」「32」がありますが、小、中、大、というかSサイズ、Mサイズ、Lサイズというような感じでメモ用紙の大きさを意味しています。最後の「_t」は「type」、日本語では「型(タイプ)」の意味になります。
こちらの型の名前は
「符号なしか符号付きか」+「int」+「サイズ」+「_t」
という構成になっていますので、比較的覚えやすいと思います。
こちらの型はArduinoに限らず全てのコンピュータで同じ数字の範囲になります。この入門シリーズでは、数字の範囲を明確にするためにこちらの型の名前を使用します。ただ、最初に説明した「char型」などの型の名前もまだ多く見られますので、どちらも認識できるようにしておいてください。
変数の宣言
コンピュータの中には、数字を記録しておくためのメモ用紙のようなものがあり、その特徴として「(2)メモ用紙にはタイプがいくつかあり、それぞれのタイプで書ける数字の範囲が異なる」というものがありました。実際には「変数に型がある」という説明をしました。
他には、「(3)メモ用紙のタイトルが必要」で「(4)メモ用紙を使うとき、『メモ用紙を用意してください。タイプは〇〇で、タイトルは□□□にしてください』とスケッチに書く必要がある」という特徴があります。
変数の型(メモ用紙のタイプ)がわかりましたので、次のこの(3)と(4)の2つの特徴について、スケッチではどのようになるか説明します。
キッチンタイマーのスケッチでは、メモ用紙を使用してLEDの点滅回数を数えていきます。数を数える、カウントするので、メモ用紙のタイトルは「count」(カウント)にします。
最初は3分タイマーを作ろうと思います。3分は180秒ですので、変数の型は0〜255まで扱うことのできる「uint8_t」にします。
実際のスケッチでは、以下のような変数を用意することになります。
今まで「メモ用紙のタイトル」と表現していましたが、実際には「変数の名前」または「変数名」と呼びます。キッチンタイマーのスケッチで時間を計測するために、「uint8_t型で変数名がcountの変数」を使用します。
スケッチでこの変数を使用する場合、「(4)メモ用紙を使うとき、『メモ用紙を用意してください。タイプは〇〇で、タイトルは□□□にしてください』とスケッチに書く必要がある」で説明した通り、変数を使います、ってスケッチに書く必要があります。このように、変数を使いますよ、と書くことを「変数を宣言する」と呼んでいます。「宣言する」なんてなんだか大げさですよね。
スケッチでは、変数の宣言を以下のように書きます。
例えば、uint8_t型のcountという名前の変数を宣言する場合は、スケッチに以下のように書きます。
uint8_t count;
これで「0〜255までの数字が書ける『count』というタイトルのメモ用紙」が使えるようになります。今後は「uint8_t型の名前がcountの変数」などと表現しますので、変数、変数名、変数型という言葉に慣れておきましょう。
ところで、メモ用紙の特徴として「(1)何度でも書き直しができる」という項目があり、その説明で「必ず何かの数字を書く必要がある」と説明しました。でも先ほどの「uint8_t count;」変数宣言では、特に何か数字を指定することはしませんでしたが、Arduinoボードの内部ではどのようなメモ用紙が用意されるのでしょうか。
このように「uint8_t count;」と宣言すると、適当な数字が書かれたメモ用紙が用意されます。uint8_t型の変数は0〜255までの数字を記録できますので、0〜255のどれかの数字が書かれています。ただ、ほとんどのケースでは0が記録された変数が用意れます。なんだか変数ってちょっと不思議ですが、なんとか使いこなしていきましょう。
次回の記事では、宣言して使用できるようになった変数をどのように使ってタイマーの時間計測をするか考えます。
更新履歴
日付 | 内容 |
---|---|
2019.8.25 | 新規投稿 |
2021.8.24 | 新サイトデザイン対応 |