当記事では、ArduinoのBits and Bytes関数(ビット・バイト関数)の使い方について詳しく解説します。
Bits and Bytes関数を使うことによって、ビットやバイトの操作をすることができます。
なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。
Bits and Bytes関数(ビット・バイト関数)
関数 | 引数 | 戻り値 | 説明 |
---|---|---|---|
uint8_t lowByte(x) | x:対象の数値 | 下位Bitを返す | 下位Bitを取得 |
uint8_t highByte(x) | x:対象の数値 | 上位Bitを返す | 上位Bitを取得 |
boolean bitRead(x, n) | x:対象の数値 n:取得するBitの桁 |
取得Bitを返す | 指定Bitを取得 |
void bitWrite(x, n, b) | x:対象の数値 n:取得するBitの桁 b:指定値(0または1) |
なし | 特定の桁を変更した値を取得 |
void bitSet(x, n) | x:対象の数値 n:1にするBitの桁 |
なし | 特定の桁を1に変更した値を取得 |
void bitClear(x, n) | x:対象の数値 n:0にするBitの桁 |
なし | 特定の桁を0に変更した値を取得 |
bit(n) | n:指定Bitの桁 | 指定した桁のBitを1にした値を返す | 指定した桁のBitを1にした値を取得 |
lowByte()/下位Bitを取得
- 関数:uint8_t lowByte(x)
- 引数:x⇒対象の数値
- 戻り値:下位Bitを返す
lowByte()関数は、引数で指定した数値の下位Bitを戻り値として返します。
highByte()/上位Bitを取得
- 関数:uint8_t highByte(x)
- 引数:x⇒対象の数値
- 戻り値:上位Bitを返す
highByte()関数は、引数で指定した数値の上位Bitを戻り値として返します。
bitRead()/指定Bitを取得
- 関数:boolean bitRead(x, n)
- 引数:x⇒対象の数値
- :n⇒取得するBitの桁
- 戻り値:取得Bitを返す
bitRead()関数は、引数に対象の数値と取得するBitの桁を指定して、戻り値で取得Bitを返します。
bitWrite()/特定の桁を変更した値を取得
- 関数:void bitWrite(x, n, b)
- 引数:x⇒対象の数値
- :n⇒取得するBitの桁
- :b⇒指定値(0または1)
- 戻り値:なし
bitWrite()関数は、引数に指定した対象の数値を、引数で指定したBitの桁を0または1にした数値に変更します。
bitSet()/特定の桁を1に変更した値を取得
- 関数:void bitSet(x, n)
- 引数:x⇒対象の数値
- :n⇒1にするBitの桁
- 戻り値:なし
bitSet()関数は、引数に指定した対象の数値を、引数で指定したBitの桁を1にした数値に変更します。
bitClear()/特定の桁を0に変更した値を取得
- 関数:void bitClear(x, n)
- 引数:x⇒対象の数値
- :n⇒0にするBitの桁
- 戻り値:なし
bitClear()関数は、引数に指定した対象の数値を、引数で指定したBitの桁を0にした数値に変更します。
bit()/指定した桁のBitを1にした値を取得
- 関数:bit(n)
- 引数:n⇒指定Bitの桁
- 戻り値:指定した桁のBitを1にした値を返す
bit()関数は、引数で指定Bitの桁を指定して、戻り値として指定した桁のBitを1にした値を返します。
サンプルプログラム(サンプルスケッチ)
- Arduino Uno
- USBケーブル
- PC(プログラム書き込み・シリアルモニタ表示)
lowByte()/下位Bitを取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char low_byte;//「low_byte」をunsigned charで変数宣言
low_byte = lowByte(0xF3A1);//「0xF3A1」の下位ビットを取得してlow_byteに代入
Serial.print("LowByte:");//文字列「LowByte:」を送信
Serial.println(low_byte, HEX);//数字「low_byte」をHEXで送信、改行
delay(1000);//1秒待機(1000msec待機)
}
LowByte:A1
LowByte:A1
LowByte:A1
LowByte:A1
LowByte:A1
LowByte:A1
LowByte:A1
LowByte:A1
LowByte:A1
LowByte:A1
サンプルプログラムは、lowByte()関数の引数に0xF3A1を指定して、戻り値で下位Bitの0xA1を返します。
highByte()/上位Bitを取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char high_byte;//「high_byte」をunsigned charで変数宣言
high_byte = highByte(0xF3A1);//「0xF3A1」の上位ビットを取得してhigh_byteに代入
Serial.print("HighByte:");//文字列「HighByte:」を送信
Serial.println(high_byte, HEX);//数字「high_byte」をHEXで送信、改行
delay(1000);//1秒待機(1000msec待機)
}
HighByte:F3
HighByte:F3
HighByte:F3
HighByte:F3
HighByte:F3
HighByte:F3
HighByte:F3
HighByte:F3
HighByte:F3
HighByte:F3
サンプルプログラムは、highByte()関数の引数に0xF3A1を指定して、戻り値で上位Bitの0xF3を返します。
bitRead()/指定Bitを取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1, bit2;//「bit1」、「bit2」をunsigned charで変数宣言
bit1 = bitRead(0b0101, 0);//「0101」のLSBから1桁目を取得してbit1に代入
Serial.print("0101のLSBから1桁目:");//文字列「0101のLSBから1桁目:」を送信
Serial.println(bit1);//数字「bit1」を送信、改行
bit2 = bitRead(0b0101, 3);//「0101」のLSBから4桁目を取得してbit2に代入
Serial.print("0101のLSBから4桁目:");//文字列「0101のLSBから4桁目:」を送信
Serial.println(bit2);//数字「bit2」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
0101のLSBから1桁目:1
0101のLSBから4桁目:0
0101のLSBから1桁目:1
0101のLSBから4桁目:0
0101のLSBから1桁目:1
0101のLSBから4桁目:0
0101のLSBから1桁目:1
0101のLSBから4桁目:0
0101のLSBから1桁目:1
0101のLSBから4桁目:0
サンプルプログラムは、bitRead()関数で指定Bitを取得します。bit1は「0101」のLSBから1桁目「1」を取得、「0101」のLSBから4桁目「0」を取得します。
bitWrite()/特定の桁を変更した値を取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1=0b1101, bit2=0b1101;//「bit1」、「bit2」をunsigned charで変数宣言
bitWrite(bit1, 2, 0);//bit1「1101」のLSBから3桁目を「0」に変更
Serial.print("1101のLSBから3桁目を0に変更:");//文字列「1101のLSBから3桁目を0に変更:」を送信
Serial.println(bit1, BIN);//数字「bit1」を2進数で送信、改行
bitWrite(bit2, 1, 1);//bit2「1101」のLSBから2桁目を「1」に変更
Serial.print("1101のLSBから2桁目を1に変更:");//文字列「1101のLSBから2桁目を1に変更:」を送信
Serial.println(bit2, BIN);//数字「bit2」を2進数で送信、改行
delay(1000);//1秒待機(1000msec待機)
}
1101のLSBから3桁目を0に変更:1001
1101のLSBから2桁目を1に変更:1111
1101のLSBから3桁目を0に変更:1001
1101のLSBから2桁目を1に変更:1111
1101のLSBから3桁目を0に変更:1001
1101のLSBから2桁目を1に変更:1111
1101のLSBから3桁目を0に変更:1001
1101のLSBから2桁目を1に変更:1111
1101のLSBから3桁目を0に変更:1001
1101のLSBから2桁目を1に変更:1111
サンプルプログラムは、bitWrite()関数で特定の桁を変更した値を取得します。bit1は1101のLSBから3桁目を0に変更した値「1001」、bit2は1101のLSBから2桁目を1に変更した値「1111」をそれぞれ取得します。
bitSet()/特定の桁を1に変更した値を取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1=0b1101;//「bit1」をunsigned charで変数宣言
bitSet(bit1, 1);//bit1「1101」のLSBから2桁目を「1」に変更
Serial.print("1101のLSBから2桁目を1に変更:");//文字列「1101のLSBから2桁目を1に変更:」を送信
Serial.println(bit1, BIN);//数字「bit1」を2進数で送信、改行
delay(1000);//1秒待機(1000msec待機)
}
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
1101のLSBから2桁目を1に変更:1111
サンプルプログラムは、bitSet()関数で特定の桁を1に変更した値を取得します。bit1を、1101のLSBから2桁目を1に変更した値「1111」を取得します。
bitClear()/特定の桁を0に変更した値を取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1=0b1101;//「bit1」をunsigned charで変数宣言
bitClear(bit1, 2);//bit1「1101」のLSBから3桁目を「0」に変更
Serial.print("1101のLSBから3桁目を0に変更:");//文字列「1101のLSBから3桁目を0に変更:」を送信
Serial.println(bit1, BIN);//数字「bit1」を2進数で送信、改行
delay(1000);//1秒待機(1000msec待機)
}
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
1101のLSBから3桁目を0に変更:1001
サンプルプログラムは、bitClear()関数で特定の桁を0に変更した値を取得します。bit1を、1101のLSBから3桁目を0に変更した値「1001」を取得します。
bit()/指定した桁のBitを1にした値を取得
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char bit1, bit2;//「bit1」、「bit2」をunsigned charで変数宣言
bit1 = bit(0);//2進数でLSBから1桁目のBITを「1」にしてbit1に代入
Serial.print("LSBから1桁目のBitを1:");//文字列「LSBから1桁目のBitを1:」を送信
Serial.println(bit1, BIN);//数字「bit1」を2進数で送信、改行
bit2 = bit(4);//2進数でLSBから5桁目のBITを「1」にしてbit2に代入
Serial.print("LSBから5桁目のBitを1:");//文字列「LSBから5桁目のBitを1:」を送信
Serial.println(bit2, BIN);//数字「bit2」を2進数で送信、改行
delay(1000);//1秒待機(1000msec待機)
}
LSBから1桁目のBitを1:1
LSBから5桁目のBitを1:10000
LSBから1桁目のBitを1:1
LSBから5桁目のBitを1:10000
LSBから1桁目のBitを1:1
LSBから5桁目のBitを1:10000
LSBから1桁目のBitを1:1
LSBから5桁目のBitを1:10000
LSBから1桁目のBitを1:1
LSBから5桁目のBitを1:10000
サンプルプログラムは、bit()関数で指定した桁のBitを1にした値を取得します。bit1はLSBから1桁目のBitを1にした値「1」、bit2はLSBから5桁目のBitを1にした値「10000」をそれぞれ取得します。
おすすめのArduinoボードはどれ?
当記事『Arduino-Bits and Bytes関数(ビット・バイト関数)の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。
やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。
電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。
また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。
このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。