プログラミングに挑戦してみたいと思いつつ、なかなかその機会がやってこないというプログラミング未経験者や初心者のかたを対象として不定期で記事を書いていきます。
当方が頒布しているモールス信号シールドはボタンやボリュームなどの入力手段、LEDやブザーなどの出力手段を備えていて、プログラミング入門の教材として最適です。実際に、いくつかのプログラミング入門ワークショップで利用されています。
第1回はこういった組み込み系のプログラミング入門ではお決まりのLチカです。LEDの点灯をコントロールします。では、さっそく始めましょう。Arduinoの開発環境を準備する手順は「モールス信号シールドでC言語プログラミング入門 (準備編)」を確認してください。
はじめてのArduinoプログラミング
まず、デスクトップ上のアイコンをクリックしてArduinoの開発環境を起動します。そうすると次のようなウィンドウが表示されるはずです。赤枠で囲った部分へスケッチを書いていきます。Arduinoでは、プログラムのソースコードのことをスケッチと呼びます。
上記赤枠の部分へ、下記のスケッチを入力します。コピー&ペーストで大丈夫です。
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
マイコンボードへの書き込み
では、Arduino Unoへこのスケッチを書き込んでみましょう。書き込む前にちょっとした設定が必要です。メニューからツールを選択すると次のようなプルダウンメニューが現れます。
3箇所を図のように設定します。COMポートの番号はPCの環境によって異なりますので、実際にArduino Unoが接続されているポート番号を選択してください。
- ボード: “Arduino Uno”
- シリアルポート: “COM 10 (Arduino Uno)”
- 書込装置: “USBasp”
これでスケッチを書き込む準備ができました。図の赤丸部分をクリックしてマイコンボードへスケッチを書き込みます。メニューから、「スケッチ」→「マイコンボードへ書き込む」を選択するか、ショートカットキー操作「Ctrl+U」でも書き込めます。
動作の確認
ボードへの書き込みがうまく行けば、シールド上のLEDが1秒ごとにオンとオフを繰り返すようになっているはずです。コンピュータは繰り返し処理が得意です。停止命令があるまで素直に作業を続けてくれます。
どうしてさきほどのスケッチでLEDが点滅するのでしょうか。ここで、モールス信号シールドの回路図を見てみましょう。赤丸の箇所に注目すると、LEDはR1抵抗を介してArduino UnoのD13ピンに接続されていることが分かります。このLEDはD13ピンの電圧を5Vにすると点灯、0Vにすると消灯します。
コメントを活用する
もう一度、さきほどのスケッチを見てみましょう。今度はコメントを入れてあります。コメント自体はマイコンボードの動作に何ら影響しませんが、スケッチの説明や備忘録にもなりますので書いておいたほうが良いです。これで、スケッチとLEDの挙動の関係を理解できたでしょうか。
void setup() {
// ここに書いたスケッチは1度だけ実行される
pinMode(13, OUTPUT); // LEDが繋がっている13番ピンを出力モードに設定
}
void loop() {
// ここに書いたスケッチは何度でもループして実行される
digitalWrite(13, HIGH); // 13番ピンを5VにしてLEDを点灯
delay(1000); // その状態を保持する時間(ms)
digitalWrite(13, LOW); // 13番ピンを0VにしてLEDを消灯
delay(1000); // その状態を保持する時間(ms)
}
setup()関数の中に書いたスケッチはArduino Unoが起動した時にだけ1度実行されます。一方で、loop()関数の中に書いたスケッチはボードの電源が切れるまで繰り返し実行されます。
digitalWrite()関数でLEDの点灯または消灯の状態を制御しますが、delay()関数でそれぞれの状態をしばらくキープしています。その時間はms(ミリ秒)で指定します。こうして、シールド上のLEDが1秒ごとに周期的にオンとオフを繰り返していたわけです。
別の点灯パターンにしてみる
それでは、スケッチを少し修正してLEDの点灯パターンを変更してみましょう。航空機のストロボライト風に、ピカッ、ピカッ、と点滅周期に対してごく短い点灯を繰り返すにはどうしたらいいでしょうか。
下記のスケッチでは、LEDの点灯を保持する時間を10msとし、消灯を保持する時間を1250msとしてみました。
void setup() {
pinMode(13, OUTPUT); // LEDが繋がっている13番ピンを出力モードに設定
}
void loop() {
digitalWrite(13, HIGH); // 13番ピンを5VにしてLEDを点灯
delay(10); // その状態を保持する時間(ms)
digitalWrite(13, LOW); // 13番ピンを0VにしてLEDを消灯
delay(1250); // その状態を保持する時間(ms)
}
好みの時間を指定して挙動の変化を確認してみてください。
- LEDをゆっくり点滅させるには?
- 点滅周期はどこまで速くできる?
人の目の時間分解能は約50msから100ms程度とされていて、この時間よりも短い光の点滅は、連続点灯しているように知覚されてしまいます。2つあるdelay()関数の引数をいずれも13(つまり、約26ms周期)にすると連続した点灯に見えるはずです。蛍光灯は50~60Hzの正弦波ですから17~20ms周期で点滅していることになります。
定数を使ってスケッチを修正してみる
さて、さきほどのスケッチの中でLEDのピン番号13を指定する箇所が3つありました。ボードの設計変更でピン番号が変更になったらどうでしょう。巨大なスケッチになってくると、修正が必要になる箇所が何十も何百もあるかもしれません。そこで、便利なのが「定数」です。これは、スケッチの中で内容が変化することが無い値です。それでは、定数を使ってスケッチを書き直してみます。
#define LED_PIN 13
const int duration_on = 10;
const int duration_off = 1250;
void setup() {
pinMode(LED_PIN, OUTPUT); // LEDが繋がっている13番ピンを出力モードに設定
}
void loop() {
digitalWrite(LED_PIN, HIGH); // 13番ピンを5VにしてLEDを点灯
delay(duration_on); // その状態を保持する時間(ms)
digitalWrite(LED_PIN, LOW); // 13番ピンを0VにしてLEDを消灯
delay(duration_off); // その状態を保持する時間(ms)
}
1行目のdefine文、これはマクロ定数と呼ばれ、一般的には大文字で定義します。以降、スケッチ内で「LED_PIN」は13を意味するようになります。また、2~3行目の文はconst定数を使った場合です。定数名と値を代入演算子「=」でつないで定義します。オン区間duration_onを10、オフ区間duration_offを1250で初期化しています。constを付けない場合は変数となり、スケッチ内で値を代入できるようになります。変数については別の機会に解説します。
defineマクロ定数とconst定数はそれぞれ、表記のルールが異なります。いずれも、スケッチを実行する前に定義した本来の数に置き換えられえます。
スケッチ記述のポイント
ここで、スケッチを記述する時に注意するポイントをまとめます。
- 半角英数字と半角記号、半角スペースで書く。
- コメントを除き、全角英数字や全角文字、全角スペースは使用できない。
- 英数字の大文字 ‘A’ と小文字 ‘a’ は区別される。
- 文はセミコロン ; で終わる。
- カッコ ( と ) や { と } は対応付けてセットで使う。
最後に、モールス信号シールドの機能に戻す方法を説明します。モールス信号シールドArduino UNO用にあるスケッチサンプルをArduino Unoへ書き込めば元に戻すことができます。