NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino IDEの使い方(プログラム編)

イメージ 1
 以前ブログにArduino IDE Arduino UNOの使い方に関する全体的な流れを紹介致しました。
 今回はArduino IDEで行う具体的なプログラミング方法についてご紹介します。Lチカのプログラム(スケッチとも言います)を例に、3つ(宣言・設定・処理)に分けて説明します。 

1.宣言

 プログラム内で使う変数(数字等を一時保管する場所)にどの様なものが入るかをconst関数でArduino UNOに教えます。
 
1.1 宣言のプログラム記入例

//宣言
const int LED=13;                     //LEDを接続するArduinoのピン番号を設定する
const long i=0;                          //LEDのON・OFF時間を決める変数

 
 
1.2 変数に使う型
 参考に変数の型を表1に示します。
 
表1:Arduino IDEで使う変数の型一覧
変数の型 格納するデータ
boolean TrueまたはFalse
char -128~127までの整数
unsigned char 0~255までの整数
byte 0~255までの整数
int -32768~32767までの整数
unsigned int 0~65535までの整数
word 0~65535までの整数
long -2147483648~2147483647までの整数
unsigned long 0~4294967295までの整数
float -3.4028235E+38~3.4028235E+38
double -3.4028235E+38~3.4028235E+38
 
1.3 宣言しないと・・・
 エラーが出ます。表1の様な一覧を見て適切な変数の型を宣言しましょう。

2.設定

 Arduino UNOは「○○の準備をして」とお願い(命令)しないと働いてくれません。
 今回はLEDを点滅させたいので、Arduino UNOの13番ピンを出力として使う事をArduino UNOに命令します
出力(OUTPUT)ときたら、入力(INPUT)も設定出来ます。

2.1 初期設定プログラム記入

//設定
void setup() {                              //一回だけ実行する
  pinMode(LED, OUTPUT);           //LEDを接続した13番ピンを出力用に設定する
}

 上に書かれた 「void setup(){」  から  「}」 の間はArduino UNOが起動後に1度だけ実行する部分です。この部分は「setup」と書かれている通り、主にArduino UNOに初期設定を行う際に使います。
 初期設定は一度行えば良いので、無限ループ処理内に初期設定を書いて動きますが、なるべく「setup」内に書いた方が良いです。
 
2.2 初期設定が無いと・・・
 コンパイル(Arduino IDE言語からArduino UNOが理解できる機械語への翻訳)時にエラーは出ませんが、LEDは光りませんので気を付けましょう。

3. 処理

 Arduino IDEは、他の代表的なVisual BasicC言語等のプログラミング言語(なんでも御座れ系)に比べるとフィジカルコンピューティング(マイコンにより制御されたセンサーや動力源により人と意思疎通する事)に特化したシンプルな言語です。 「特化した」と、「シンプル」は重要で、フィジカルコンピューティングに関しては、初心者が始める際の敷居の低さと、上級者も納得の奥深さを持っています。

3.1 ループ処理プログラムの記入例

//処理
void loop() {                              //{}内を無限ループで実行する
  for(i=0;i<3000;i++){               //iが0から1ずつ増加し{}内を3000回繰り返す
    if (i <= 1500){                       //もしiが1500以下なら{}内を実行する
        digitalWrite(LED, HIGH);     //LEDが接続された13番ピンをHIGH(5V)にする
        delayMicroseconds(i);         //iμs(iマイクロ秒)LEDを点灯した状態で止める
        digitalWrite(LED, LOW);      //LEDが接続された13番ピンをLOW(0V)にする
        delayMicroseconds(1500-i); //(1500-i)μs LEDを消灯した状態で止める
    }
    else{                                     //もしiが1500を超えたら以下の{}内を実行する
        digitalWrite(LED, HIGH);     //LEDが接続された13番ピンをHIGH(5V)にする
        delayMicroseconds(3000-i); //(3000-i)μs LEDを点灯した状態で止める
        digitalWrite(LED, LOW);      //LEDが接続された13番ピンをLOW(0V)にする
        delayMicroseconds(i-1500); //(i-1500)μs LEDを消灯した状態で止める
    }
  }
}

 Arduino UNOでこのプログラムを動かすと、LEDが消えている状態から1.5秒掛けて最大まで明るく点灯し、その後1.5秒掛けて消える動作が無限ループで繰り返されます。感じとしてはLEDがホタルの様に優しく光ります。

3.2主要な関数
 「for関数」と「if関数」はプログラムの真髄と言える関数です。この2つを覚えておけば大体なんとかなっちゃいます。

3.2.1 for関数
 for関数の中身は以下の通りです。試しにこのプログラムを実行すると、LEDが2秒周期で3回点滅し、その後3秒間消灯します。

void setup() {                        //一回だけ実行する
  pinMode(13, OUTPUT);       //LEDを接続した13番ピンを出力用に設定する
}
void loop() {                          //{}内を無限ループで実行する
  for(int i=0;i<3;i++){              //iが0から1ずつ増加し{}内を3回繰り返す
        digitalWrite(13, HIGH);  //LEDが接続された13番ピンをHIGH(5V)にする
        delay(1000);                //1000ms(1秒)LEDを点灯した状態で止める
        digitalWrite(13, LOW);  //LEDが接続された13番ピンをLOW(0V)にする
        delay(1000);                //1秒LEDを消灯した状態で止める
  }
 delay(3000);                       //for関数終了後3秒LEDを消灯した状態で止める
}
 

for(int i=0;i<3;i++){」~「}」の間をループするのがfor関数です。
細かく説明すると、
「int i=0」は、iの変数の型はint(表1参照)で初めはi=0からスタートせよ。
「i<3」は、この条件式が成り立つ時は{}内を実行せよ。
「i++」は戻って来たらiを+1増加させよ。
と言う意味です。

3.2.2 if関数
 if関数の中身は以下の通りです。試しにこのプログラムを実行すると、LEDが2秒周期でランダムに点滅したり、しなかったりします。

void setup() {                        //一回だけ実行する
  pinMode(13, OUTPUT);       //LEDを接続した13番ピンを出力用に設定する
}
void loop() {                          //{}内を無限ループで実行する
    int i=random (100);          //iに0~100の間で発生させた乱数を代入する。
    if (i <= 50){                       //もしiが50以下なら{}内を実行する
        digitalWrite(13, HIGH);  //LEDが接続された13番ピンをHIGH(5V)にする
        delay(1000);                //1000ms(1秒)LEDを点灯した状態で止める
    }
    else{                                //もしiが50を越えたら以下の{}内を実行する
        digitalWrite(13, LOW);  //LEDが接続された13番ピンをLOW(0V)にする
        delay(1000);                //1秒LEDを消灯した状態で止める
    }
}

 
if (i <= 50){」~「} else{」~ 「}」条件式が成り立てばその後の{}内を実行し、成り立たなければelse後の{}内を実行するのがif関数です。
細かく説明すると、
i <= 50」は条件式で、iが50以下であれば直後の{}内を実行せよ。
「else」は、iが50以下でなかったらelse直後の{}内を実行せよ
と言う意味です。

3.3 各種演算子
 コンピューターは足し算・引き算(演算子)の他に色々できます。Arduino IDEで使われる主な演算子を表2~4に示します。
 
表2:代入演算子 ※変数に値を代入する 
演算子 説明
A = B AにBを代入する
 
表3:算術演算子 ※足したり引いたりする 
演算子 説明
A + B AとBの足し算
A - B AとBの引き算
pow(A , B) AのB乗
A * B AとBの掛け算
A / B AとBの割り算(変数の型をfloat等にする)
A / B AをBで割った整数(変数の型をint等にする)
A % B AをBで割った余り(変数の型をfloat等にする)
 
表4:比較演算子 値を比較する
演算子 説明
A == B AとBは等しい
A != B AとBは等しくない
A < B AはB未満
A > B AはBを超える
A <= B AはB以下
A >= B AはB以上
 
  表2~4は良く使う演算子です。はじめは見ながら使って、そのうち見なくとも覚えてしまいますのではじめからがんばって覚える必要は特にないです。
 3.の内容を理解すれば、Arduino UNO等を利用した電子工作が自由自在に出来る様になります。

4. 使用したスケッチ

 下記プログラムをArduino UNOに書き込めば13番ピンのLEDがホタルの様に優しく光ります。

 

/*
   LEDで蛍の光を再現!
   2016.03.19作成
   NOBのArduino日記!
*/
const int LED = 13;               //LEDを接続するArduinoのピン番号を設定する
long i = 0;                       //LEDのON・OFF時間を決める変数

void setup() {                    //起動時に一回だけ実行する
  pinMode(LED, OUTPUT);           //LEDを接続した13番ピンを出力用に設定する
}

void loop() {
  for (int i = 0; i < 3000; i++) {//iが0から1ずつ増加し{}内を3000回繰り返す
    if (i <= 1500) {              //もしiが1500以下なら{}内を実行する
      digitalWrite(LED, HIGH);    //LEDが接続された13番ピンをHIGH(5V)にする
      delayMicroseconds(i);       //iμs(iマイクロ秒)LEDを点灯した状態で止める
      digitalWrite(LED, LOW);     //LEDが接続された13番ピンをLOW(0V)にする
      delayMicroseconds(1500 - i);//(1500-i)μs LEDを消灯した状態で止める
    } else {                      //もしiが1500を超えたら以下の{}内を実行する
      digitalWrite(LED, HIGH);    //LEDが接続された13番ピンをHIGH(5V)にする
      delayMicroseconds(3000 - i);//(3000-i)μs LEDを点灯した状態で止める
      digitalWrite(LED, LOW);     //LEDが接続された13番ピンをLOW(0V)にする
      delayMicroseconds(i - 1500);//(i-1500)μs LEDを消灯した状態で止める
    }
  }
}
イメージ 1
図1:プログラム例

 

5. まとめ

 Arduinoは初級者の敷居を下げる為、上記に示した便利な機能が用意されているので一見難しそうなマイコンを簡単に制御できてしまうのがうれしい所です。
 マイコンの性能もお遊び程度には十分なので楽しく遊べます。
 中級者になったらArduino Duo IC単体をArduino化すると言う選択肢もあります。プログラム言語は同じなので覚えなおす必要も無く、そのままステップアップ出来て良いですね。
 上級者の方はLチカ専用LSIを設計されるそうです。意味が分かりま天才ですね!
LED点滅用のLSIを作ってLチカをやってみた

※再度チャレンジされたそうです↓
懲りずに再度、LED点滅用のLSIをつくってLチカをやってみた
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【ArduinoIDE reference】目次に戻る