ホーム < 電子工作やってみた


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にはアナログピンもありました。これはどうやって使うのか?次章で検討してみる事にします。