Arduino 言語は、「C言語」と「C++」をベースにして作られています。初心者でも扱いやすいように、便利な関数やライブラリが用意されているので、短いコードで動かすことができます。
Arduino の公式サイトに言語のリファレンスがまとめてありますが、英語で記載されています。
公式サイトは次のリンクからアクセスできます。
公式サイトで言語の切り替えはできるものの、英語・ドイツ語・ポルトガル語のみ対応していて、残念ながら日本語は対応外です。
そこで、この記事では Arduino 言語のリファレンスについて日本語でまとめてみました。Arduino を利用される方は、ぜひ参考にしてみて下さい。
データ型
Arduino で使用できるデータ型は次の通りです。データ型は多数存在しますが、実質同じ型がいくつか存在しますので注意しましょう。
データ型 | 説明 |
bool | 真(true)または偽(false)のどちらかの値を持つ型である |
byte | 0から255までの8bit(1byte)の数値を格納する型である |
char | 1文字のデータを8bit(1byte)に格納する型である |
dobule | 32bit(4byte)の倍精度浮動小数点を格納する型である |
float | 32bit(4byte)の浮動小数点を格納する型である |
int | 16bit(2byte)の符号付の整数を格納する型である |
long | 32bit(4byte)の符号付の整数を格納する型である |
short | 16bit(2byte)の符号付の整数を格納する型である(intと同じ) |
unsigned char | 8bit(1byte)の符号無しの整数を格納する型である |
unsigned int | 16bit(2byte)の符号無しの整数を格納する型である |
unsigned long | 32bit(4byte)の符号無しの整数を格納する型である |
word | 16bit(2byte)の符号無しの整数を格納する型である(unsigned intと同じ) |
bool
bool(ブール)型は、真(true)または偽(false)のどちらかの値を持つ型です。boolean型も同じです。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):8bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:0, 1
[jin-fusen2 text=”使い方の例”]
bool a = true;
bool b = false;
byte
byte(バイト)型は、0から255までの8bit(1byte)の数値を格納する型です。unsigned char型と同じです。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):8bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:0 ~ 255
[jin_icon_check color=”#e9546b” size=”14px”]整数型(符号なし整数)
[jin-fusen2 text=”使い方の例”]
byte b = 36;
char
char型は、1文字のデータを8bit(1byte)に格納する型です。
char型で文字を格納するには、文字の両端を一重引用符で囲みます。文字を直接指定するか、ASCII(アスキー)コードで割り当てられた数値を指定します。
複数の文字(文字列)を格納するには、char型の配列を使います。配列の宣言は配列数を明示してもいいですし、配列数を明示しなくてもいいです。
配列を文字として扱う場合は終端が明確になるように、終端文字として ‘\0’ が必要になります。この終端文字は、Arduino のコンパイラが自動的に処理してくれるので必ずしも記述する必要はありません。ただし、配列の宣言で配列数を明示する場合は「文字列の数」と「終端文字1文字」を足した数以上を指定しなければなりません。
(参考:ASCIIコード表)
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):8bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:-128 ~ 127
[jin_icon_check color=”#e9546b” size=”14px”]文字列型
[jin-fusen2 text=”使い方の例”]
// 1文字
char c1 = 'A';
char c2 = 65; // ASCIIコード表でAを10進数に変換すると、65になる
// 文字列
char s1[ ] = "uno"; // 配列数を明示しない
char s2[4] = "uno"; // 配列数を明示する
char s3[4] = {'u', 'n', 'o'}; // 初期化リストを使って1文字ずつ書くことができる
char s4[4] = {'u', 'n', 'o', '\0'}; // 初期化リストを使って終端文字を書くことができる
// 文字列の配列
char* sList[] = {
"uno1", "uno2", "uno3", "uno4"
};
dobule
32bit(4byte)の浮動小数点を格納する型です。float型と同じです。
Arduino Dueでは、64bit(8byte)の浮動小数点を格納することができます。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):32bit (64bit)
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:3.4028235E+38~-3.4028235E+38
[jin_icon_check color=”#e9546b” size=”14px”]浮動小数型
[jin-fusen2 text=”使い方の例”]
double d = 3.14;
float
32bit(4byte)の浮動小数点を格納する型です。整数よりも分解能が高い値を扱う時に使用します。浮動小数点は整数と比較して計算処理に時間がかかることになります。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):32bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:3.4028235E+38~-3.4028235E+38
[jin_icon_check color=”#e9546b” size=”14px”]浮動小数型
[jin-fusen2 text=”使い方の例”]
float f = 3.14;
int
16bit(2byte)の符号付の整数を格納する型です。多数ある型の中でも頻繁に利用される型です。
Arduino Due や SAMDベースのボードでは、32bit(4byte)の浮動小数点を格納することができます。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):16bit(32bit)
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:-32,768~32,767 (-2,147,483,648~2,147,483,647)
[jin_icon_check color=”#e9546b” size=”14px”]整数型
[jin-fusen2 text=”使い方の例”]
int i = 20;
long
32bit(4byte)の符号付の整数を格納する型です。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):32bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:2,147,483,648~2,147,483,647
[jin_icon_check color=”#e9546b” size=”14px”]整数型
[jin-fusen2 text=”使い方の例”]
long l = 20;
short
16bit(2byte)の符号付の整数を格納する型です。int型と同じです。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):16bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:-32,768~32,767
[jin_icon_check color=”#e9546b” size=”14px”]整数型
[jin-fusen2 text=”使い方の例”]
short s = 20;
unsigned char
8bit(1byte)の符号無しの整数を格納する型です。byte型と同じです。
コーディングルールに従って、byte型かunsigned char型のどちらを使用するようにしましょう。公式サイトではbyte型を優先するように記載があります。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):8bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:0~255
[jin_icon_check color=”#e9546b” size=”14px”]文字列型
[jin-fusen2 text=”使い方の例”]
unsigned char uc = 240;
unsigned int
16bit(2byte)の符号無しの整数を格納する型です。int型とは違い、0から65,535までの正の数しか格納ができません。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):16bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:0~65,535
[jin_icon_check color=”#e9546b” size=”14px”]整数型
[jin-fusen2 text=”使い方の例”]
unsigned int ui = 240;
unsigned long
32bit(4byte)の符号無しの整数を格納する型です。long型とは違い、0から4,294,967,295までの正の数しか格納ができません。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):32bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:0~4,294,967,295
[jin_icon_check color=”#e9546b” size=”14px”]整数型
[jin-fusen2 text=”使い方の例”]
unsigned long ul = 240;
word
16bit(2byte)の符号無しの整数を格納する型です。unsigned int型と同じです。
[jin_icon_check color=”#e9546b” size=”14px”]サイズ(bit数):16bit
[jin_icon_check color=”#e9546b” size=”14px”]入力範囲:0~65,535
[jin_icon_check color=”#e9546b” size=”14px”]整数型
[jin-fusen2 text=”使い方の例”]
word w = 240;
演算子
Arduino で使用できる演算子の種類は次の通りです。
算術演算子
この演算子は計算するために使用します。加減乗除以外に除算した時の余りを返す演算子があります。
算術演算子 | 説明 |
+ | 2つの値を加算する |
– | 2つの値を減算する |
* | 2つの値を乗算する |
/ | 2つの値を除算する |
% | 2つの整数を除算した時の余りを返す |
= | 右辺の値を左辺の変数に格納する |
[jin-fusen2 text=”使い方の例”]
//加算
int a = 5 + 1; //aには6が代入される
//減算
int b = 5 - 1; //bには4が代入される
//乗算
int c = 5 * 1; //cには5が代入される
//除算
int d = 5 / 1; //dには5が代入される
//余り
int e = 5 / 2; //eには1が代入される
代入演算子
この演算子は計算するために使用します。左辺と右辺の値で計算して左辺に代入する演算子です。
算術演算子 | 説明 |
+= | 左辺と右辺を足した値を左辺に代入する |
-= | 左辺から右辺を引いた値を左辺に代入する |
*= | 左辺と右辺を掛けた値を左辺に代入する |
/= | 左辺を右辺で割った値を左辺に代入する |
%= | 左辺を右辺で割った余りを左辺に代入する |
[jin-fusen2 text=”使い方の例”]
//加算
int x = 5;
x += 1; //xは6になる
x = x + 1; //上の式と同じ
//減算
int x = 5;
x -= 1; //xは4になる
x = x - 1; //上の式と同じ
//乗算
int x = 5;
x *= 1; //xは5になる
x = x * 1; //上の式と同じ
//除算
int x = 5;
x /= 1; //xは5になる
x = x / 1; //上の式と同じ
//余り
int x = 5;
x %= 2; //xは1になる
x = x % 1; //上の式と同じ
比較演算子
右辺と左辺を比較して、比較した結果を真偽(true / false)で返す演算子です。
比較演算子には次の6種類があります。
比較演算子 | 例 | 説明 |
== | A == B | AとBが等しい場合は真 |
!= | A != B | AとBが等しくない場合は真 |
< | A < B | AがB未満の場合は真(AとBが等しい場合は偽) |
> | A > B | AがBを超える場合は真(AとBが等しい場合は偽) |
<= | A <= B | AがB以下の場合は真(AとBが等しい場合は真) |
>= | A >= B | AがB以上の場合は真(AとBが等しい場合は真) |
[jin-fusen2 text=”使い方の例”]
if (x == y)
{
// xとyが等しい
}
if (x != y)
{
// xとyは等しくない
}
if (x < y)
{
// xはyより小さい
}
if (x > y)
{
// xはyより大きい
}
if (x <= y)
{
// xはy以下である
}
if (x >= y)
{
// xはy以上である
}
論理演算子
複数の条件式を組み合わせて真偽(true / false)で返す演算子です。
論理演算子には次の3種類があります。
論理演算子 | 例 | 説明 |
&& | 式A && 式B | 式Aと式Bがともに真の場合は真になる |
|| | 式A || 式B | 式Aと式Bがの少なくとも1つが真の場合は真になる |
! | !式A | 式Aが真の場合は偽、偽の場合は真になる |
[jin-fusen2 text=”使い方の例”]
if (3 < x && x < 10)
{
// xは3より大きく、10より小さい
}
if (3 < x || x < 10)
{
// xは3より大きい、もしくはxは10より小さい
}
if (!(3 < x))
{
// xは3以下である
}
ビット演算子
整数型の数値に対してビット単位で演算を行うための演算子です。
ビットとは「0」と「1」で表現するコンピュータの最小単位の事です。このビットが8個集まると1byteになります。1byteあれば、0~255までの数値を表現することができます。
ビット演算子では、個々のビットに対して演算を行えます。ビット演算子には次の3種類があります。
論理演算子 | 例 | 説明 |
& | a & b | 両方のビットが1の場合、出力は1になる。それ以外の場合は0になる。 |
| | a | b | 両方もしくはどちらか片方が1の場合、出力は1になる。それ以外の場合は0になる。 |
^ | a ^ b | どちらか片方が1の場合、出力は1になる。それ以外の場合は0になる。 |
~ | a ~ b | 右辺の1つの値に対して各ビットを反対の値にする。 |
<< | a << b | 指定された数だけ左側へビットの値が移動する。 |
>> | a >> b | 指定された数だけ右側へビットの値が移動する。 |
&(AND)
2つの整数の間で演算が行われ、両方のビットが1の場合は結果が1になります。それ以外の場合は0になります。
8bitに対して&演算を行うと、8回の&演算が繰り返されます。
値1 … 00100011
値2 … 01000101
————————————————–
結果 … 00000001
[jin-fusen2 text=”使い方の例”]
int a = 33; // 2進数:0000000000100001
int b = 98; // 2進数:0000000001100010
int c = a & b; // 結果:0000000000100000 (10進数で32)
|(OR)
2つの整数の間で演算が行われ、両方のビットが1もしくはどちらか一方が1の場合は結果が1になります。それ以外の場合は0になります。
8bitに対して&演算を行うと、8回の&演算が繰り返されます。
値1 … 00100011
値2 … 01000101
————————————————–
結果 … 01100111
[jin-fusen2 text=”使い方の例”]
int a = 33; // 2進数:0000000000100001
int b = 98; // 2進数:0000000001100010
int c = a | b; // 結果:0000000001100011 (10進数で99)
^(XOR)
2つの整数の間で演算が行われ、どちらか一方が1の場合は結果が1になります。それ以外の場合は0になります。
8bitに対して&演算を行うと、8回の&演算が繰り返されます。
値1 … 00100011
値2 … 01000101
————————————————–
結果 … 01100110
[jin-fusen2 text=”使い方の例”]
int a = 33; // 2進数:0000000000100001
int b = 98; // 2進数:0000000001100010
int c = a ^ b; // 結果:0000000001000011 (10進数で67)
~(NOT)
右辺の1つの値に対して各ビットを反対の値にします。0の場合は結果が1になります。逆に1の場合は結果が0になります。
8bitに対して~演算を行うと、8回の~演算が繰り返されます。
値1 … 00100011
————————————————–
結果 … 11011100
[jin-fusen2 text=”使い方の例”]
int a = 33; // 2進数:0000000000100001
int b = ~a; // 結果:1111111111011110 (10進数で-34)
ここで補足説明です。int 型の最上位ビットは符号ビットになります。符号ビットが0の場合は正の整数として扱われます。符号ビットが1の場合は負の整数として扱われます。
このような正負の値のエンコーディングは「2の補数」と呼ばれます。
値 32767 … 0111111111111111
値 32766 … 0111111111111110
値 32765 … 0111111111111101
:
値 0 … 0000000000000000
:
値-32766 … 1000000000000010
値-32767 … 1000000000000001
値-32768 … 1000000000000000
<<(左シフト)
指定された数だけ左側へビットの値が移動します。
8bitに対して左へ3つシフトを行うと、シフトされた数だけ0が追加されて次のようになります。8bitからはみ出したビットは保持されることなく失われます。
値1 … 00100011
————————————————–
結果 … 00011000
[jin-fusen2 text=”使い方の例”]
int a = 33; // 2進数:0000000000100001
int b = a << 3; // 結果:0000001100011000 (10進数で792)
>>(右シフト)
指定された数だけ右側へビットの値が移動します。
8bitに対して右へ2つシフトを行うと、シフトされた数だけ0が追加されて次のようになります。8bitからはみ出したビットは保持されることなく失われます。
値1 … 00100011
————————————————–
結果 … 00001000
[jin-fusen2 text=”使い方の例”]
int a = 33; // 2進数:0000000000100001
int b = a >> 3; // 結果:0000000000000100 (10進数で4)
制御文
Arduino で使用できる制御文は次の通りです。
if(条件分岐)
if 文は条件式の真偽に応じて分岐します。2つの値の大小関係や、等しい・等しくない等の条件により処理を変える場合に使われます。
最初の if 文の条件式が成立しなかった場合に、if else 文を使って次の条件式を設定することができます。
[jin-fusen2 text=”使い方”]
// パターン1
if (条件A) {
// 条件Aが成立した場合に実行
}
// パターン2
if (条件A) {
// 条件Aが成立した場合に実行
}
else {
// 条件Aが不成立した場合に実行
}
// パターン3
if (条件A) {
// 条件Aが成立した場合に実行
}
else if (条件B) {
// 条件Aが不成立、条件Bが成立した場合に実行
}
else {
// 条件A、条件Bが不成立した場合に実行
}
for(繰り返し)
for 文は波括弧に囲まれた処理を繰り返し実行します。
for 文は「カウンタ初期値」「条件式」「カウンタの更新」を使って記述します。条件式が真(true)である限り、繰り返し処理が実行されます。
[jin-fusen2 text=”使い方”]
for (カウンタ初期値; 条件A; カウンタの更新) {
// 条件Aが成立する間、繰り返し実行
}
while(繰り返し)
while 文は波括弧に囲まれた処理を繰り返し実行します。
while 文は条件式が真(true)である限り、繰り返し処理が実行されます。条件式で使われる変数は、繰り返し処理内で変化するように記述します。
for 文は繰り返す回数がわかっている場合に便利な構文ですが、繰り返す回数がわからない場合には while 文を使うと便利です。
[jin-fusen2 text=”使い方”]
while (条件A) {
// 条件Aが成立する間、繰り返し実行
}
do while(繰り返し)
do while 文は波括弧に囲まれた処理を繰り返し実行します。while 文とは異なり、ループ処理を行った後に「条件式を満たすかどうか」を判定します。
do-while文は、while文と同じく、回数が明確に決まっていない繰り返し処理を行う場合に適しています。
[jin-fusen2 text=”使い方”]
do {
// 必ず1回実行した後、
// 条件Aが成立する間、繰り返し実行
} while (条件A);
switch(条件分岐)
switch 文は if 文と同じように条件を分岐する場合に使います。
switch() で指定された変数と一致する case の処理が実行されます。どの case にも一致しなかった時に実行したい処理は default に記述します。 default は省略することも可能です。
case の処理が実行されたら、break を使って switch 文からに抜け出すようにします。この break がないと続けて次の case が実行されてしまいます。
[jin-fusen2 text=”使い方”]
switch (対象の変数) {
case 変数1:
// 対象の変数が1の場合に実行
break;
case 変数2:
// 対象の変数が2の場合に実行
break;
case 変数3:
// 対象の変数が3の場合に実行
break;
default:
// 対象の変数が全て当てはまらない場合に実行
}
break
break 文は for 文や while 文、do while 文など繰り返し処理から抜け出す時に使います。
[jin-fusen2 text=”使い方の例”]
for (x = 0; x <= 255; x++) {
if (x == 200) {
break;
}
}
continue
continue 文は for 文や while 文、do while 文など繰り返し処理の途中で、処理をスキップしたい時に使います。break 文とは異なり、ループを止めることはありません。
[jin-fusen2 text=”使い方の例”]
for (x = 0; x <= 255; x++) {
if (x == 200) {
continue;
}
}
retuen
retuen は 関数の実行を中止して、呼び出し元の関数に処理を戻します。
[jin-fusen2 text=”使い方の例”]
for (x = 0; x <= 255; x++) {
if (x == 200) {
return;
}
}
標準関数
Arduino IDE や Arduino Web Editor では、Arduino 独自の標準関数が用意されています。
Digital I/O(デジタル入出力)
Arduino ボードのピンの入出力設定をしたり、デジタル信号の出力や入力を行うことができます。
関数 | 戻り値 | 説明 |
pinMode(pin, mode) | なし | 指定したピンのデジタル入出力のモードを切り替える。 |
void digitalWrite(pin, value) | なし | 指定したピンからデジタル信号を出力する。 |
int digitalRead(pin) | デジタル入力 | 指定したピンのデジタル信号の状態を確認する。 |
Analog I/O(アナログ入出力)
Arduino ボードのアナログ入力の基準電圧を設定したり、アナログ信号の出力や入力を行うことができます。
関数 | 戻り値 | 説明 |
void analogReference(type) | なし | アナログ入力の基準電圧を設定する。 |
int analogRead(pin) | なし | 指定したピンのアナログ入力の状態を確認する。 |
void analogWrite(pin, value) | デジタル入力 | 指定したピンからアナログ信号を出力する。 |
Advanced I/O(デジタル・アナログ入出力)
デジタル入出力やアナログ入出力の関数以外にも便利な関数が用意されています。
関数 | 戻り値 | 説明 |
shiftOut(dataPin, clockPin, bitOrder, value) | なし | 1バイト分のデータを1ビットずつ出力する。 |
shiftIn(dataPin, clockPin, bitOrder) | 1バイト分のデータ | 1ビットずつの入力データから1バイトのデータを取得する。 |
pulseIn(pin, value, timeout) | パルスの長さ | 指定したピンに入力されたパルスを検出する。 |
tone(pin, frequency) | なし | 指定した周波数の矩形波を生成する。 |
noTone(pin) | なし | tone()で開始された矩形波の生成を停止する。 |
Time(時間)
Time 関数はプログラム実行中に指定時間待機したり、経過時間を計測することができます。
関数 | 戻り値 | 説明 |
void delay(unsigned long ms) | なし | 指定した時間(ms)だけ待機する。 |
void delayMicroseconds(unsigned int us) | なし | 指定した時間(us)だけ待機する。 |
unsigned long millis(void) | 経過時間 | プログラムの実行から経過した時間(ms)を計測する。 |
unsigned long micros(void) | 経過時間 | プログラムの実行から経過した時間(us)を計測する。 |
Math(計算)
数値の比較、絶対値、べき乗、平方根などの計算をすることができます。
関数 | 戻り値 | 説明 |
min(x, y) | 最小値 | 2つの数値を比較して小さい値を算出する。 |
max(x, y) | 最大値 | 2つの数値を比較して大きい値を算出する。 |
abs(x) | 絶対値 | 絶対値を算出する。 |
constrain(x, a, b) | 経過時間 | 対象の数値がaからbの範囲内であれば、xを返し、範囲外であれば範囲の最小値または最大値を返す。 |
long map(long value, long fromLow, long fromHigh, long toLow, long toHigh) | 変換値 | 対象の値を元の範囲から別のの範囲に変換する。 |
double pow(float base, float exponent) | べき乗した値 | べき乗の計算をする。 |
double sqrt(x) | 平方根した値 | 平方根の計算をする。 |
sq(x) | 2乗した値 | 対象の値の2乗を計算する。 |
以上、最後まで読んで頂きありがとうございました。