Arduino編
その3 LEDをデジタルピン出力で明滅させてみる
前章ではArduinoの電源端子から電気を貰い、ブレッドボード上のLEDを点ける単純な実験回路を組んでみました。同じ事は乾電池でもできるので、Arduinoらしさはまだそこにありません。本章ではいよいよArduinoにプログラムを流し込んで、LEDを点滅させる実験をしてみます。わくわく(^-^)
@ SDKをダウンロードして環境構築
Arduinoにプログラムを流すには、プログラムを書くためのPCが必要です。PC上でプログラムを書き、それをArduinoが認識できる形式に変換(コンパイル)して、ArduinoにUSB経由で流します。これを行うにはPCに専用の環境(IDE)を作る必要があります。
作成環境であるSDKはArduinoの本家HPからダウンロードできます(Download the Arduino Software)。ここの中腹辺りにある「Arduino IDE」からお使いのOSに対応したIDEをダウンロードしてインストールして下さい。インストールする際に「Installation Option」でInstall USB Driverにチェックがあるのを確認して下さい。このドライバが無いとプログラムを流し込めません。インストール中にArduino USB Driverのインストール確認のウィンドウが出た場合は入れて下さい。
インストールが終わったら、ArduinoをPCに繋ぎます。Windowsの場合ドライバの検索が始まり、先程入れたUSB Driverが認識されるはずです。これでセットアップは完了です。
A IDEを起動&サンプルコードを読んでみる
IDEはデフォルトであればC:\Program Files\Arduinoに展開されています。その中のarduino.exeを起動です。すると次のようなウィンドウが開きます:
シンプル〜
さて、では早速プログラムを組んでみます。今回の目的はLED一つを点滅させる事です。間隔は…0.5秒置きくらいかな。で…どうやって組むのかな(^-^;;;。まずはプログラムの組み方そのものを知らないと始まりませんね。
お!本家HPにLearningがあるじゃないの。で、Getting started(最初からやってみよう)もあるじゃないの。よしよし。開発環境はWindowsなのでWindowsのリンクをクリック。すると、まぁ手取り足とり手順を教えてくれています(^-^)。今ドライバとIDE環境までは入れてしまいましたので、手順6番の「Open the blink example」から始めてみましょう。
「Open the LED blink example sketch(LED点滅サンプルを開いてみよう)」、おぉ、そのまんまなサンプルがSDKのフォルダのexamples/1.Basics/Blinkにあるとあります。あ、しかももっと簡単に開けるようです。IDEのウィンドウのメニューから[ファイル]→[スケッチの例]→[01Basics]→[Blink]で該当サンプルが新しいウィンドウで開きます。
Blinkサンプルは大変に短い物でしたので、そのまま掲載(コメント日本語化)します:
Blinkサンプル /*
Blink
LEDを1秒間点灯し、次の1秒間は消灯するを繰り返します。
このサンプルコードはパブリックドメインです。
*/
// 13番ピンにLEDが接続されているとして名前を与えます
int led = 13;
// setup関数はリセットボタンを押した時に一度だけ呼ばれます
void setup() {
// デジタルピンをアウトプットとして初期化します
pinMode( led, OUTPUT );
}
// loop関数は永遠に回り続けます
void loop() {
// LEDを点灯 ( HIGHは電圧レベル )
digitalWrite( led, HIGH );
// 1秒待つ
delay(1000);
// 電圧をLOWにする事でLEDを消灯
digitalWrite(led, LOW);
// 1秒待つ
delay(1000);
}
解説がいらないくらい簡単です(^-^;。コードは限りなくC言語ライクなので楽々ですね。
いくつかポイントがあるようです。まず、。変数はグローバル領域に設定できる。上の例では「led」というグローバル変数が定義されています。
setup関数はArduino基板が初期化される時(リセットボタンが押された時)に1度だけ呼ばれる関数です。関数内ではpinMode関数で「どのピンを入出力に使うか」を規定しています。本家HPには関数リファレンスが用意されいます。また、IDE内の関数部分で右クリックをするとメニューが開き「リファレンスで検索」を選択すると直接リファレンスを参照する事もできるようです。便利〜(^-^)/:
pinMode関数 pinMode( pin, mode );
pinはデジタルピンの番号を指定します。
modeには以下のフラグを指定できるようです:
フラグ 意味 INPUT ピンを入力端子として設定する INPUT_PULLUP ピンをプルアップ入力端子として設定する OUTPUT ピンを出力端子として設定する
プルアップというのは入力端子の意味を逆にするという事です。通常入力端子に電圧をかけるとONになりますが、INPUT_PULLUPを指定すると電圧をかけていない状態がONになります。入力がある時にだけスイッチをOFFにしておきたい場合に指定します。
loop関数は初期化後に永遠にグルグルと回り続ける(呼ばれ続ける)関数のようです。ゲームループ関数と同じですね。サンプルではここでLEDの点滅をさせるスイッチングをしています。まず、digitalWrite関数を使ってピンの状況を変更しています:
digitalWrite関数 digitalWrite( pin, value );
pinはデジタルピンの番号を指定します。
valueには以下のフラグを指定します:
フラグ 意味 HIGH スイッチをONにする LOW スイッチをOFFにする
サンプルでは13番ピンにLEDが刺さっている前提なので、pinに13番(led)、valueにHIGHを指定して点灯指示しています。
次にdelay関数。これは引数のミリ秒だけ待つ関数です。正しくは指定ミリ秒だけプログラムが止まります:
delay関数 delay( ms );
msには待ちたいミリ秒数を整数で指定します。
という事で、サンプルでピンに対して命令を与える方法を学べました。一先ず、このサンプルをそのままArduinoに流し込んでみます。
B Arduinoにプログラムを流し込む
出来たプログラムをArduinoに流し込む最初の手順は「基板の選択」です。どの基板を対象としているかをIDEに教えてあげる必要があります。これはメニューの[ツール]→[マイコンボード]から[Arduino Uno]を選びます。これは接続している基板の型番によって変わる所ですね。
次に[ツール]→[シリアルポート]でArduinoの基盤が刺さっているCOMポートを確認します。私の環境だとCOM3になっていましたが、これも環境によって変わりそうです。
ハードウェアのセッティングをチェックしたら、次はコードのチェックです。これはメニューの下にあるチェックマークボタン(検証)でコンパイルができます。ポチっと押すとコンパイルが始まって、次のようなメッセージが出力されました:
ほう、このコードで1KBある(^-^;;;。
コンパイルして問題無さそうなら、右矢印のボタン(マイコンボードに書き込む)を押すと、USB経由でプログラムがArduino基板に転送されます。…お、押してみるべ!
ほ!はい、COM3です。了解をクリックしましょう。お、すると、コンパイルが始まり、次にArduino基板のTX、RXという小さなLEDがチカチカっと点滅しました:
どうやら、これで転送が完了したようです。不思議な感じ(^-^;。
C 動いているかテストだ!
さて、これでプログラムがちゃんと動いているなら、RESETボタンを押すと13番ピンに「ON→OFF→ON」という電圧の出力が起きているはずです。
前章で作成したLED点滅の回路がそのまま流用できます。前章ではArduinoのPowerをそのまま使いましたが、今回はそれを13番ピンに差し込みます。すると…:
お〜〜点滅してる〜、楽しい(^-^)。という事で、無事にプログラムが動いているのを確認できました。
D 点滅間隔を変えてみる
一応今回の目標は達成できたのですが、ただサンプルを動かしただけでは寂しいので、少しだけ改造してみます。点滅間隔を三三七拍子にしてみます。
1拍を0.4秒くらいとしましょう。点灯は0.2秒、待ちも0.2秒かな。これは1拍を表す関数を作れば潰しがききます。ピン番号は8番とかに変えてみます:
int led = 8;
void setup() {
pinMode( led, OUTPUT );
}
void note( int n ) {
for ( int i = 0; i < n; i++ ) {
digitalWrite( led, HIGH ); // ON
delay( 200 );
digitalWrite( led, LOW ); // OFF
delay( 200 );
}
}
void rest() {
delay( 400 );
}
void loop() {
note( 3 );
rest();
note( 3 );
rest();
note( 7 );
rest();
}
これをArduinoに流し込んでみました:
ははは(^-^)。何だか愛おしいです。先のサンプルと違いちゃんと8番ピンが出力になっているのがわかります。
とても簡単なプログラムでデジタルピンに対してON/OFF命令を送る事ができました。小さな一歩ですが、少なくともこれで「制御」が出来ている訳ですからウキウキしない訳がありません(^-^)。で、次に何をするか考えてみたのですが、Arduinoにはアナログピンもありました。これはどうやって使うのか?次章で検討してみる事にします。