Arduino言語のI/O命令について
Arduino言語は、C/C++をベースにしたプログラミング言語で、Arduinoボードの入出力(I/O)操作を簡単に行えるように設計されています。I/O命令は、LED、センサー、モーターなどの外部デバイスを制御したり、データを読み取ったりするために使用されます。
1. ピンの設定に関する命令
Arduinoボードのピンを入力または出力として設定するための基本的な命令です。
- pinMode(pin, mode)
- 機能: 指定したピンを入力モードまたは出力モードに設定します。
- 引数:
pin
: ピンの番号(例: 13)mode
:INPUT
(入力)、OUTPUT
(出力)、またはINPUT_PULLUP
(内部プルアップ抵抗を使用した入力)
- 例:
void setup() {
pinMode(13, OUTPUT); // ピン13を出力モードに設定
pinMode(2, INPUT); // ピン2を入力モードに設定
} - 用途: LEDを点灯させる場合は
OUTPUT
、ボタンやセンサーの状態を読み取る場合はINPUT
を使用。
注意: INPUT_PULLUP
は、ピンに内部プルアップ抵抗を有効にし、外部抵抗なしでボタンの状態を安定して読み取る場合に便利です。
2. デジタルI/O命令
デジタルピンの状態を操作または読み取るための命令です。
- digitalWrite(pin, value)
- 機能: 指定したピンにデジタル信号(
HIGH
またはLOW
)を書き込みます。 - 引数:
pin
: ピンの番号value
:HIGH
(高電圧、通常5Vまたは3.3V)またはLOW
(低電圧、0V)
- 例:
void loop() {
digitalWrite(13, HIGH); // ピン13をHIGHに設定(LED点灯)
delay(1000); // 1秒待つ
digitalWrite(13, LOW); // ピン13をLOWに設定(LED消灯)
delay(1000); // 1秒待つ
} - 用途: LEDの点灯/消灯、モーターのオン/オフなど。
- 機能: 指定したピンにデジタル信号(
- digitalRead(pin)
- 機能: 指定したピンのデジタル状態(
HIGH
またはLOW
)を読み取ります。 - 引数:
pin
: ピンの番号
- 戻り値:
HIGH
またはLOW
- 例:
void loop() {
int buttonState = digitalRead(2); // ピン2の状態を読み取る
if (buttonState == HIGH) {
digitalWrite(13, HIGH); // ボタンが押されたらLEDを点灯
} else {
digitalWrite(13, LOW); // ボタンが押されていなければLEDを消灯
}
} - 用途: ボタンやスイッチの状態を検出。
- 機能: 指定したピンのデジタル状態(
3. アナログI/O命令
アナログ信号を扱うための命令で、主にアナログ入力ピン(A0~A5など)やPWM(パルス幅変調)出力に使用されます。
- analogRead(pin)
- 機能: 指定したアナログピンの値を読み取ります(0~1023の範囲で10ビットの分解能)。
- 引数:
pin
: アナログピンの番号(例: A0)
- 戻り値: 0~1023の整数(電圧0V~5Vに対応)
- 例:
void loop() {
int sensorValue = analogRead(A0); // A0ピンのアナログ値を読み取る
Serial.println(sensorValue); // シリアルモニタに値を表示
delay(500);
} - 用途: ポテンショメータ、温度センサー、光センサーなどのアナログ信号の読み取り。
- analogWrite(pin, value)
- 機能: 指定したピンにPWM信号を出力します(0~255の範囲で制御)。
- 引数:
pin
: PWM対応ピンの番号(例: 3, 5, 6, 9, 10, 11)value
: 0(0%デューティ比)~255(100%デューティ比)
- 例:
void loop() {
analogWrite(9, 128); // ピン9に50%のデューティ比でPWM出力
delay(1000);
analogWrite(9, 255); // ピン9に100%のデューティ比でPWM出力
delay(1000);
} - 用途: LEDの明るさ制御、モーターの速度制御など。
注意: analogWrite
はPWM対応ピンでのみ使用可能です。また、実際にはアナログ電圧ではなく、パルス幅変調による擬似アナログ信号を出力します。
4. 拡張I/O命令
より高度なI/O操作を行うための命令です。
- tone(pin, frequency, [duration])
- 機能: 指定したピンに指定した周波数の矩形波を生成します(ブザーやスピーカーの制御に使用)。
- 引数:
pin
: 出力ピンの番号frequency
: 周波数(Hz)duration
: 持続時間(ミリ秒、オプション)
- 例:
void setup() {
tone(8, 440, 1000); // ピン8で440Hzの音を1秒間再生
} - 用途: ブザーやスピーカーで音を鳴らす。
- noTone(pin)
- 機能:
tone()
による矩形波の生成を停止します。 - 例:
noTone(8); // ピン8の音を停止
- 機能:
- pulseIn(pin, value, [timeout])
- 機能: 指定したピンでパルスの長さ(
HIGH
またはLOW
)をマイクロ秒単位で測定します。 - 引数:
pin
: ピンの番号value
: 測定する状態(HIGH
またはLOW
)timeout
: 測定のタイムアウト時間(マイクロ秒、オプション)
- 例:
long duration = pulseIn(7, HIGH); // ピン7のHIGHパルスの長さを測定
- 用途: 超音波センサー(HC-SR04など)のパルス幅測定。
- 機能: 指定したピンでパルスの長さ(
- shiftIn(dataPin, clockPin, bitOrder)
- 機能: シフトレジスタから1バイトのデータをビット単位で読み込みます。
- 用途: シリアル通信でデータを読み込む(例: シフトレジスタICの使用)。
- shiftOut(dataPin, clockPin, bitOrder, value)
- 機能: 1バイトのデータをビット単位でシフトレジスタに出力します。
- 用途: 複数のLEDやディスプレイの制御。
5. シリアル通信関連のI/O命令
Arduinoはシリアルポート(通常はUSB経由)を使ってPCや他のデバイスと通信できます。
- Serial.begin(speed)
- 機能: シリアル通信を開始し、通信速度(ボーレート)を設定します。
- 例:
void setup() {
Serial.begin(9600); // シリアル通信を9600bpsで開始
}
- Serial.print(val, [format]) / Serial.println(val, [format])
- 機能: シリアルポートにデータを送信します。
println
は改行を追加。 - 例:
void loop() {
Serial.println("Hello, Arduino!"); // シリアルモニタにメッセージを表示
delay(1000);
}
- 機能: シリアルポートにデータを送信します。
- Serial.read()
- 機能: シリアルポートから1バイトのデータを読み取ります。
- 例:
void loop() {
if (Serial.available() > 0) {
char data = Serial.read(); // シリアルデータ読み取り
Serial.println(data); // 受信したデータを表示
}
}
6. その他のポイント
- ライブラリの活用: Arduinoの標準ライブラリ(例:
Servo
、Wire
(I2C)、SPI
)を使うことで、複雑なハードウェア制御を簡素化できます。 - 割り込み:
attachInterrupt()
を使用して、ピンの状態変化を即座に検出できます。attachInterrupt(digitalPinToInterrupt(2), interruptFunction, CHANGE);
- Arduino言語の特徴: C/C++を簡略化した初心者向けの言語ですが、C/C++のフル機能も使用可能です。
7. サンプルプログラム
ボタンの状態を読み取り、押されたらLEDを点灯し、シリアルモニタに状態を表示する例です。
const int buttonPin = 2; // ボタンピンの番号 const int ledPin = 13; // LEDピンの番号 void setup() { pinMode(buttonPin, INPUT_PULLUP); // ボタンピンを入力(プルアップ)に設定 pinMode(ledPin, OUTPUT); // LEDピンを出力に設定 Serial.begin(9600); // シリアル通信を開始 } void loop() { int buttonState = digitalRead(buttonPin); // ボタンの状態を読み取る if (buttonState == LOW) { // ボタンが押された(LOW) digitalWrite(ledPin, HIGH); // LEDを点灯 Serial.println("Button pressed!"); } else { digitalWrite(ledPin, LOW); // LEDを消灯 Serial.println("Button released."); } delay(100); // 少し待つ(デバウンス対策) }
おわりに
これまで粛々とArduino公式リファレンスやAIの力を借りて整理をしてきましたが、まだまだ理解できてない点も多くあることを実感しました。何度も繰り返し学習して理解を深めたいと思います。
コメント