電子工作入門プログラミング入門-基礎1今回はスケッチを整理します。スケッチ長い前回、アラーム音をメロディーに変えたのはいいですが、スケッチがなんだかずいぶん長くなってしまいましたよね。最初の#defineが長くなっています。肝心のスケッチ本体であるsetup()やloop()がずいぶんと下の方に行ってしまい、スケッチを開くとしばらく#defineばかり、という状況です。今回の記事では、このなんとも長い#defineをなんとかしてみましょう。ヘッダ今まで作成したスケッチを見てみます。スケッチの構成を見ると、最初にコメント部分、次に#define部分、それらが終わるとsetup()とloop()になっています。Arduinoのスケッチに限らず、プログラム本体が始まるまでの部分を「ヘッダ」と呼んでいます。Arduinoの場合はsetup()が始まるまでの部分がヘッダになります。それにしても、前回追加した以下の音階の#define定義部分はなんだか無駄に長いですよね。邪魔なので、どこか目につかないところで定義してほしいって感じですよね。12」は青色LEDの接続端子番号を定義しています。将来、青色LEDの接続端子を変更した場合、この定義を変更すればスケッチ側の対応はすぐに終わります。10」はタイマー時間を定義しています。スケッチを作成している間はこのタイマー時間をいろいろ変更できるので#define定義してあるのは便利です。このように以前定義していた#defineは参照したり変更したりするのでスケッチのヘッダ部分に書いてある方が便利です。音階の#define定義って変更することもないですし、他のスケッチでも使うかもしれません。C/C++言語では、このような時のために便利な機能があります。最初に概要を説明します。ヘッダの外部ファイル化このように普段はそれほど参照しないし、他でも流用するようなヘッダ部分は、以下のように外部にファイル化して、そのファイルをスケッチで指定して取り込んでもらうにすれば便利ですよね。C/C++言語では、このような仕組みが用意されています。#include先ほどのようにヘッダ部分をファイル化したものを「ヘッダファイル」と呼んでいます。スケッチでヘッダファイルを取り込んでもらう場合、以下のように「#include」(インクルード)という命令を使用します。このようにヘッダファイルを取り込むことを「ヘッダファイルをインクルードする」と呼んでいます。このようにインクルードするファイル名の拡張子は通常「h」を使用します。hはheader(ヘッダ)のhです。先ほどの音階の#define部分をファイルにした場合、「onkai.h」などのファイル名にします。このファイルをスケッチで取り込む場合、スケッチの先頭部分に以下のように書きます。IDEは、この#includeを処理するときに、「onkai.h」というファイルをキッチンタイマーと同じフォルダに探しにいきます。このファイル名のファイルがあれば、そのファイルを取り込んで処理します。#includeはちょっとややこしいのですが、ファイル名をダブルクォーテーション(“)で囲んだ場合、そのスケッチと同じフォルダを探しにいきます。ヘッダファイルがスケッチとは違うフォルダにある場合、フォルダパスも含めて指定します。ヘッダファイルは自分で作成したもの以外にもArduinoIDEで最初から用意されているものを使用することもあります。>を使用してヘッダファイルを指定する方法は、基礎編のパート2で出てきます。そのときに#includeの役割についてさらに詳しく説明します。それでは、スケッチの音階#define部分をヘッダファイル化してインクルードするように変更します。音階のヘッダファイル化それでは音階#define部分をヘッダファイルにしてみます。キッチンタイマーのスケッチに新しくファイルを追加する場合、以下のようにウインドウ右上の三角ボタンをクリックします。三角ボタンをクリックすると以下のようにメニューが表示されますので、一番上の「新規タブ」を選択します。「新規タブ」を選択すると、ウインドウの下の方に新しいタブ名を入力する欄が表示されます。このタブ名のところに「onkai.h」と入力してOKボタンをクリックすると、新しくonkai.hというファイルが作成されます。それでは、元の「kitchen_timer」のスケッチから、音階の#define定義部分をコピーして新しく作成した「onkai.h」タブにコピーしましょう。この状態ですとまだ内容が保存されていませんので、ファイルメニューから保存を選択して保存します。元の「kitchen_timer」にある音階定義の部分は必要ありませんので削除します。これで音階の#define定義部分をヘッダファイルにできましたので、kitchen_timerのスケッチでこのファイルをインクルードします。インクルードは通常スケッチの最初の方に書きます。ここまでの作業で完成したスケッチを以下に示します。988スケッチができたらArduinoボードに送って動作を確認してみましょう。プリプロセッサ指示子ところで先ほど「#include命令」と説明しましたが、実はこれ「命令」ではないんです。#includeは「プリプロセッサ指示子」と呼ばれています。ここで今回のスケッチがどのように処理されてArduinoボードに送られているか、少し詳しくみてみます。IDEはスケッチをArduinoボードに送るときスケッチをArduinoボード用に変換しますが、その前にスケッチの中に#includeがあればその部分を#includeで指定したファイルの中身で置き換えます。IDEは、スケッチをArduinoボード用に変換する前に、スケッチの前処理をしているんです。この前処理は「プリプロセッサ」というツールが行なっています。「プリプロセッサ」は英語で「pre-processor」で、「pre」は「前」、「processor」は「処理」という意味です。#includeはプリプロセッサに指示をする文字ですので「プリプロセッサ指示子」と呼ばれています。「プリプロセッサ指令」などと呼ばれることもあります。実は#defineもプリプロセッサ指示子だったんです。ヘッダファイルところで、今回は音階の#define定義を「onkai.h」という別ファイルにしてkitchen_timerでイクルードしましたが、「kitchen_timer」のスケッチにはまだ#defineがたくさん残っていますよね。kitchen_timerに残っている#defineは変更することがあるのでこのままにしますが、一般的には#defineなどヘッダ部が長い場合、ヘッダファイルにすることが多いです。kitchen_timerのスケッチでは、#defineの部分を全てヘッダファイルに持っていき、kitchen_timerのスケッチにはsetup()とloop()を書くようにします。今回はkitchen_timerスケッチに#defineを書きますが、ネットで他の人が書いたスケッチでは、スケッチとは別にヘッダファイルにヘッダ部が書かれている場合もあります。その場合、原則的なルールがありますので説明します。プログラムの拡張子は、Arduinoスケッチの場合は「ino」、C言語の場合は「c」、C++言語の場合は「cpp」です。C言語の「sample.c」というプログラムファイルがある場合、このプログラムのヘッダファイルを作る場合は「sample.h」というようにプログラム名と同じ名前でヘッダファイルを作成します。今回のkitchen_timerスケッチのヘッダ部分をヘッダファイルにする場合は、ヘッダファイルのファイル名は「kitchen_timer.h」とします。スケッチをフォルダに入れる理由かなり前の記事になりますのですっかり忘れてしまっていると思いますが、第10回の記事で、LED_blinkというスケッチを作成したとき、スケッチのファイルはLED_blink.inoというファイル1つだけなのに、それをわざわざLED_blinkというフォルダに入れているのはなぜか、という疑問がありました。スケッチファイルは1つしかないので、わざわざフォルダに入れる必要はないのに、なんとも無駄なことをしているように見えました。今回の記事で作成したスケッチを開いた状態で、「スケッチ」メニューから「スケッチのフォルダを表示」を選択してみてください。このメニューを選択すると、kitchen_timerのスケッチが保存されているフォルダが表示されます。このフォルダの中身を見ると、「kitchen_timer.ino」というスケッチ本体と一緒に、今回の記事で作成したヘッダファイル「onkai.h」が保存されていますよね。いうことで、スケッチをフォルダで保存するのは、このようにスケッチ以外に関連するファイルが複数出てくるためなんです。今回は「onkai.h」というヘッダファイル1つを追加しただけですが、スケッチの規模が大きくなってくると、スケッチ自体を複数のファイルに分けたり、ヘッダファイルを複数使用したりというケースが出てきます。そのような時のためにファイルがバラバラにならないようにスケッチはフォルダで管理されています。