はじめに
Arduinoは、主にC/C++ベースのプログラミング言語を使用しており、その中で使用可能な論理式(論理演算子や条件式など)は、プログラムの制御構造や条件分岐、繰り返し処理などで重要な役割を果たします。論理式の種類、構文、具体例、使用場面を整理しました。
論理式とは
論理式は、条件や比較の結果を「真(true)」または「偽(false)」として評価する式です。Arduinoでは、これを利用してプログラムの流れを制御します。例えば、if
文やwhile
文の中で条件を指定する際に論理式が使われます。論理式は、比較演算子、論理演算子、ビット演算子などを組み合わせて構築されます。
Arduinoの論理式は以下のような要素で構成されます。
- 比較演算子:2つの値を比較して真偽を返す。
- 論理演算子:複数の条件を組み合わせて評価する。
- ビット演算子:ビット単位での論理操作を行う(必要に応じて論理式に組み込む)。
- その他の演算子:特定の条件を簡潔に記述するための演算子(例:三項演算子)。
比較演算子
比較演算子は、2つの値を比較して真(true)または偽(false)を返します。Arduinoで使用可能な比較演算子は以下の通りです:
演算子 | 意味 | 例 | 結果 |
---|---|---|---|
== | 等しい | a == b | aとbが等しい場合にtrue |
!= | 等しくない | a != b | aとbが異なる場合にtrue |
< | 小さい | a < b | aがbより小さい場合にtrue |
> | 大きい | a > b | aがbより大きい場合にtrue |
<= | 以下 | a <= b | aがb以下の場合にtrue |
>= | 以上 | a >= b | aがb以上の場合にtrue |
使用例
int sensorValue = analogRead(A0);
if (sensorValue > 500) {
digitalWrite(LED_BUILTIN, HIGH); // センサ値が500超ならLED点灯
}
この例では、sensorValue > 500が論理式で、値が500を超える場合にtrueを返し、LEDを点灯します。
論理演算子
論理演算子は、複数の条件(論理式)を組み合わせて評価します。Arduinoで使用可能な論理演算子は以下の3つです。
演算子 | 意味 | 例 | 結果 |
---|---|---|---|
&& | 論理積(AND) | a && b | aとbの両方がtrueの場合にtrue |
|| | 論理和(OR) | a || b | aとbのどちらかがtrueの場合にtrue |
! | 論理否定(NOT) | !a | aがfalseの場合にtrue 、逆も同様 |
使用例
int temp = 25;
int humidity = 70;
if (temp > 20 && humidity > 60) {
Serial.println("高温多湿です");
}
この例では、temp > 20 && humidity > 60が論理式で、温度が20℃を超え、かつ湿度が60%を超える場合にメッセージを出力します。
短絡評価
Arduinoの論理演算子は短絡評価を採用しています。たとえば、&&
では左辺がfalseの場合、右辺は評価されません。同様に、||
では左辺がtrueの場合、右辺は評価されません。これにより、プログラムの効率が向上します。
if (digitalRead(2) == HIGH || checkSensor()) {
// ピン2がHIGHならcheckSensor()は呼ばれない
}
ビット演算子
ビット演算子は、変数のビット単位での操作を行い、論理式に組み込む場合があります。Arduinoでよく使われるビット演算子は以下の通りです。
演算子 | 意味 | 例 | 結果 |
---|---|---|---|
& | ビットごとのAND | a & b | 対応するビットが両方1なら1 |
| | ビットごとのOR | a | b | 対応するビットの少なくともどちらかが1なら1 |
^ | ビットごとのXOR | a ^ b | 対応するビットが異なる場合に1 |
~ | ビットごとのNOT | ~a | ビットを反転(1を0に、0を1に) |
<< | 左シフト | a << n | ビットをnビット左にシフト(2倍、4倍…) |
>> | 右シフト | a >> n | ビットをnビット右にシフト(1/2、1/4…) |
使用例
ビット演算子は、ピンの状態をまとめて扱う場合や、フラグ管理に役立ちます。
byte flags = 0b00000000; // 8つのフラグ
if (digitalRead(2) == HIGH) {
flags |= 0b00000001; // 1番目のフラグを立てる
}
if (flags & 0b00000001) {
Serial.println("フラグ1が立っています");
}
この例では、flagsの最下位ビットを操作してフラグを管理しています。
- 論理演算子(
&&
,||
)と混同しないようにしましょう。 - ビット演算は整数型(
byte
,int
,unsigned long
など)に対して行います。 ~
(ビット反転)は符号付き整数に使うと予期しない結果になることがあるので注意。
三項演算子(条件演算子)
三項演算子は、簡単な条件分岐を1行で記述するのに便利です。構文は以下の通り。
条件式 ? 真の場合の値 : 偽の場合の値
使用例
int ledState = (digitalRead(2) == HIGH) ? HIGH : LOW;
digitalWrite(LED_BUILTIN, ledState);
この例では、ピン2がHIGHならledStateをHIGHに、そうでなければLOWに設定します。
論理式の応用例
以下は、Arduinoで論理式を活用した具体的なプログラム例です。
例1: センサー値に基づく制御
void loop() {
int lightLevel = analogRead(A0);
if (lightLevel < 300 || lightLevel > 700) {
digitalWrite(LED_BUILTIN, HIGH); // 明るすぎるか暗すぎる場合にLED点灯
} else {
digitalWrite(LED_BUILTIN, LOW);
}
delay(100);
}
この例では、光センサーの値が300未満または700を超える場合にLEDを点灯します。
例2: 複数の条件を組み合わせた制御
int button1 = 2;
int button2 = 3;
void loop() {
bool condition = (digitalRead(button1) == HIGH) && (digitalRead(button2) == HIGH);
if (condition) {
Serial.println("両方のボタンが押されています");
}
}
2つのボタンが同時に押された場合にメッセージを出力します。
例3: ビット演算子を使ったピンの一括制御
byte pinState = 0;
void loop() {
pinState = 0;
if (digitalRead(2) == HIGH) pinState |= 0b00000001;
if (digitalRead(3) == HIGH) pinState |= 0b00000010;
if (pinState == 0b00000011) {
digitalWrite(4, HIGH); // 両方のピンがHIGHなら出力
} else {
digitalWrite(4, LOW);
}
}
ピンの状態をビットで管理し、特定の条件で動作を制御します。
注意点
データ型の考慮:比較演算子を使用する際、データ型(int
、float
など)が一致しないと予期しない結果になる場合があります。必要に応じて型キャスト(型変換)を使用してください。
float temp = 25.5;
if ((int)temp == 25) { /* 処理 */ }
優先順位:論理演算子には優先順位があります(!
> &&
> ||
)。不明確な場合は括弧()を使って明確にしましょう。
ショートサーキット(短絡評価):短絡評価を活用して、不要な処理を避けるように設計すると効率的です。
ビット演算子の誤用:ビット演算子は論理演算子(&&
や||
)と混同しやすいので注意してください。
まとめ
Arduinoで使用できる論理式は、比較演算子(==
、!=
、<
、>
など)、論理演算子(&&
、||
、!
)、ビット演算子(&、|
、^
など)、および三項演算子で構成されます。これらを組み合わせることで、センサー値やピンの状態に基づく柔軟なプログラム制御が可能です。実際のプロジェクトでは、センサー入力や外部デバイスとの連携で論理式を多用するため、演算子の特性や優先順位を理解することが重要です。
Arduino言語の解説を中心にして電子工作向けのプログラミングを交えた入門書としては下記が分かりやすかったです。
コメント