Arduinoでよく使われるデータ型
Arduino言語(C/C++をベースとしたもの)における「型」(データ型)は、変数がどのような種類のデータを保持するかを定義するものです。型はデータのサイズや取り扱い方を決定し、プログラムの動作やメモリ使用量に影響を与えます。
- 基本データ型
- 配列 (array)
- 文字列型
- ポインタ
- 構造体(struct)
- 列挙型(enum)
基本データ型
基本データ型でどれを使用すれば良いのか、3点のポイントを抑えておきましょう。
- メモリ節約:小さな値には
byte
やboolean
を使う - 符号の有無:負の値が必要なら
int
、不要ならunsigned int
- 精度と速度のバランス:
float
は便利だが計算コストが高い
データ型 | サイズ(バイト) | 説明 | 使用例 |
---|---|---|---|
boolean (bool) | 1 | true または false を保持。 | スイッチの状態(ON/OFF)など。 |
char | 1 | 1文字(-128〜127の整数)。ASCII文字を格納。 | ‘A’, ‘1’ など。 |
byte | 1 | 0〜255の整数。 | 小さな数値(例:ピンの状態)。 |
int | 2(Uno等)/4(Due等) | 整数(-32,768〜32,767)。 | センサーの値やカウンタ。 |
unsigned int | 2(Uno等)/4(Due等) | 0〜65,535の整数。 | 非負の数値(例:時間)。 |
long | 4 | 整数(-2,147,483,648〜2,147,483,647)。 | 大きな数値。 |
unsigned long | 4 | 0〜4,294,967,295の整数。 | ミリ秒カウンタ(millis())。 |
float | 4 | 小数を含む数値(約6-7桁の精度)。 | 温度、距離など。 |
double | 4(Uno等ではfloatと同じ) | 高精度浮動小数点数(Due等で8バイト)。 | 高度な計算(注)。 |
short
も符号付き整数型ですが、int
と同じサイズであるため、同一視される場合が多いです。byte
とunsigned char
はどちらも0から255までの符号なし8ビット整数を表し、ほぼ同義です。word
は0から65535までの符号なし16ビット整数を表します。
- 他のソースから double を含むコードを流用する場合、ATmegaベースのArduinoボードでは期待される精度が得られない可能性があるため、コードの精度要件を確認することが推奨されます。
配列 (array)
配列は同じ型のデータを複数格納する型で、インデックス番号でアクセスされる変数の集合です。
- 定義例: int numbers[5] = {1, 2, 3, 4, 5};
- サイズは固定で、インデックスは0から始まる。
- 使用例: 複数のセンサー値やピンの状態を管理。
文字列型
Arduinoでは文字列を2通りの方法で扱えます。
- char 配列 + null終端文字
- String クラス
型 | 説明 | 使用例 |
---|---|---|
char[] | 文字の配列(C言語スタイルの文字列)。末尾に\0(ヌル文字)が必要。 | char text[6] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}; char text[] = “Hello”; |
String | ArduinoのStringクラス。動的な文字列操作が可能だが、メモリを多く消費。 | String message = “Hello, World!”; |
注意: Stringは便利だが、メモリ断片化のリスクがあるため、小型マイコンではchar[]が推奨される場合もあります。
ポインタ
C/C++由来の機能で、変数のメモリアドレスを扱う。
ポインタは、ある変数の内容が格納されているメモリアドレスを格納する変数です。ポインタに入れるものはデータではなくデータのアドレスになります。
(*) 間接参照演算子間接参照(dereferencing) は、ポインタを使う際に特有の機能です。 アスタリスク(*)演算子は、ポインタが指すアドレスに格納されている値を取得するために使われます。
- 例: int* ptr;(int型のポインタ)
- Arduinoではセンサーやメモリ管理で使用される。
構造体(struct)
複数のデータ型をまとめて1つの型として定義。
センサーの値や設定情報など、複数の関連データを1つのまとまりとして管理したいときに非常に役立ちます。
- 例:
struct SensorData {
int value;
float temperature;
};
SensorData data = {100, 25.5};
void setup() {
Serial.begin(9600);
Serial.println(data.value); // 100
Serial.println(data.temperature); // 25.5
}
列挙型(enum)
定数を名前付きの数定数のグループとして定義。
意味のある名前を整数値に割り当てるためによく使われます。特に、状態管理やモード切り替え、識別子の明示化に役立ちます。
- 例1:モード切り替え(Mode Selection)
enum Mode {ON, OFF, BLINK}; // ON==0, OFF==1, BLINK==2
Mode ledMode = ON;
- 例2:状態管理(State Machine)
enum State { IDLE, RUNNING, ERROR };
State currentState = IDLE;
void loop() {
switch (currentState) {
case IDLE:
// 待機中の処理
break;
case RUNNING:
// 実行中の処理
break;
case ERROR:
// エラー処理
break;
}
}
- 例3:ピンやセンサの識別
enum SensorID { TEMP_SENSOR, LIGHT_SENSOR, HUMIDITY_SENSOR };
値を明示的指定することもできます。
enum Level {
LOW = 10,
MEDIUM = 20,
HIGH = 30
};
型修飾子
型修飾子(type qualifiers)は、変数の性質や動作を制御するために使われます。以下は代表的な修飾子とその使い方です。
修飾子 | 意味・用途 | 使用例 |
---|---|---|
const | 値を変更できない定数として扱う。読み取り専用。 | const int ledPin = 13; |
volatile | 値が予期せず変更される可能性があることを示す(割り込み処理などで使用)。 | volatile int state = LOW; |
static | 関数内で宣言しても値を保持し続ける。スコープは限定されるが寿命は永続。 | static int counter = 0; |
型のサイズと注意点
- データ型のサイズはマイコン依存であり、Arduinoボードによってサイズが異なる(例: intはUnoで2バイト、Dueで4バイト)。
- メモリ制約が厳しいため、適切な型を選ぶ(例: 小さな値ならbyteを使用)。
- floatやdoubleは計算精度や速度に注意。
データ型 | Uno(ATmega328P) | Due (ARM Cortex-M3) | 備考 |
---|---|---|---|
int | 2バイト(16ビット) | 4バイト(32ビット) | 範囲が異なる |
unsigned int | 2バイト | 4バイト | 範囲が異なる |
long | 4バイト | 4バイト | 同じ |
float | 4バイト(単精度) | 4バイト(単精度) | 精度は同じ |
double | 4バイト(Unoではfloatと同じ) | 8バイト(倍精度) | 精度が異なる |
実例
上記で説明したデータ型の記述例となります。
int ledPin = 13; // ピンの番号 float temperature = 25.5; // 温度 char message[] = "Hello"; // 文字列 boolean isOn = true; // 状態 void setup() { pinMode(ledPin, OUTPUT); } void loop() { if (isOn) { digitalWrite(ledPin, HIGH); } }
参考
ネット上にはたくさんのArduino言語についての情報がありますが、詳細はArduino公式リファレンスがありますのでこれから学習を始める方は参照してみると良いです。電子工作本としては物足りませんが、正統派のArduino言語のリファレンスマニュアル本としてはこちらがお勧めです。
コメント