Arduino プログラム 回路 電子工作 高専3年生

【Arduino】マイコン制御入門④~アナログ入力と条件分岐~【電子工作】

プログラムでは状況によって処理内容を変えたい場合が度々発生します。

Arduinoではif文を使うと状況によって処理を変えることが出来ます。

今回はif文の使い方について学んでいきましょう。

前回はこちら

if文の基本

まずは条件が1つの場合のif文の書き方を説明します。

フローチャートは以下の通りです。

この際の書き方は以下の通りになります。

if(条件){
  条件を満たす場合の処理
}else{
  条件を満たさない場合の処理
}

ifの後の()の中に条件を入れます。

条件は以下のような比較演算子を使って記述します。

演算子意味意味
A==BAとBが等しいif(x==1)xが1
A!=BAtoBが異なるif(x!=1)xがでない
A>BAがBより大きいif(x>10)xが10より大きい
A<BAがBより小さいif(x>10)xが10より小さい
A>=BAがB以上if(y>=10)xが10以上
A<=BAがB以下if(y<=10)xが10以下

複数の条件を満たす場合のみ実行したいときは&&を使って記述できます。

if(x==1 && y ==1){
  xが1かつ、yが1の時の処理
}else{
  条件を満たさない場合の処理
}

複数の条件のうち、どれか一つを満たす場合に実行したいときは||を使います。

if(x==1 || y ==1){
  xが1か、yが1の時の処理
}else{
  条件を満たさない場合の処理
}

複数の条件を順に処理したいときは以下のように記述します。

if(条件){
  条件を満たす場合の処理
}else if(条件){
  条件を満たす場合の処理
}else{
  上記の条件を満たさない場合の処理
}

あくまで上から順に判断をしてゆき、条件が満たされた場合はほかの処理は実行されない点に注意してください。

アナログ入力

Arduino UNOには、6つのアナログ入力ポート(A0~A5)があり、外部のアナログ電圧をAD変換し、プログラム内に読み込むことができます。

アナログ入力は以下のプログラムで実行できます。

x = analogRead(3);

Arduino UNOは10ビットのAD変換回路が搭載されており、0.0から5.0Vの範囲の入力電圧を0から1023(=210-1)の整数値として取得することができます。

例えば、アナログ3番ポートに5.0Vの電圧を与えている状態で、「x=analogRead(3);」が実行されれば、変数xには1023が格納され、同ポートに0.0Vの電圧が与えられている状態でコードが実行されれば変数xには0が格納されます。

よって、analogReadを使用して取得できる値は次式により計算できます。

(入力電圧÷5.0)× 1023 = 入力電圧 × 204.6 (小数点以下切り捨て)

試しに可変抵抗を使ってアナログ入力の挙動を確認してみます。

回路を以下の図を参考につなぎます。

アナログ0番ポートに印加されている電圧を1秒おきに取得し、シリアル通信を使ってデータ送信するプログラムを次に示します。

#define SENSOR 0

void setup() {
  Serial.begin(9600);
}

void loop() {
  double vin = 5 * analogRead(SENSOR) / 1023.0;
  Serial.println(vin,2);
  delay(1000);
}

8行目:

double(ダブル)は浮動小数点型の変数型です。扱える範囲は3.4028235×1038から-3.4028235×1038までで4バイトのメモリを消費します。

  • 数値変換のための計算では「小数切捨て」が行われる整数同士の割り算に注意する必要があります。例えば、以下のいずれも適切な変換が行われません。
    • double vin = analogRead(SENSOR) / 1023 * 5;
    • double vin = 5 * analogRead(SENSOR) / 1023;
    • double vin = 5 / 1023  * analogRead(SENSOR);

9行目:

Serial.printlnの第2引数の「2」は、第1引数の数値の小数点2ケタまでを値として送信するという書式指定を行なってます。

例えば、「Serial.println(3.141,2);」とすれば送信される値は「3.14」となります(小数第3位が四捨五入され小数第2位までの数値が送信される)。

動作を確認してください。

以下のように可変抵抗のつまみを回すと印加される電圧が変わり、シリアルモニタに表示される数値も変化するはずです。

問題

・上記の例題を約1秒間に4回のデータを取得し、その平均値を送信するようなプログラムに書き換えてください。

・可変抵抗の回し具合を最大100、最小0として整数値を送信するプログラムを作成してください。

・検出値が一定値を超えたら、オンボードのLED(デジタル13番)を点灯させるようなプログラムを作成してください。

次回はこちら

Follow me!

-Arduino, プログラム, 回路, 電子工作, 高専3年生

PAGE TOP