\ Amazon プライム感謝祭 10/19(土)~10/20/(日) /

Arduino 入門 番外編 19 【bit関数 まとめ】

arduino-extra-edition-19-00 Arduino番外編
記事に広告(アフィリエイト広告)が含まれています。
スポンサーリンク

Arduino 入門
番外編 19
【bit関数 まとめ】

こんにちは管理人のomoroyaです。

arduino 入門 番外編はarduinoの基本的なことを解説している記事です。

 

本記事は、Arduinoで使用するbit関数についてです。

入門編では、8bitシフトレジスタの制御で使用した関数。

この関数、覚えておくと便利な関数です。

 

bit関数はbitを操作する関数です。

例えば、2進数でb10000001(10進で129)という数値があったとします。

例えば、3bit目を1にしたい。
※本記事では8bitは0bit~7bitの8個として表現します。
b10000001 → b10001001

また、指定したbitを読み出したいなどなどが簡単にできます。

 

どんなときに使うのか?

そのままですが、bitを簡単に操作したいときに使います。

実際の使い道は、Lesson 20Lesson 21 をご確認ください。

 

管理人はプログラマーの専門家というわけではありません。

気が向いたときにテキストを開き、ネットを調べ自己学習。

管理人にとってはブログ記事が自己学習のノートです。

書くことによって頭の中が整理できる。

何よりも、忘れたときに見返せるってのが良い。

 

arduino自身のこと、スケッチ(コード、プログラム)を少しづつ理解して行きましょう。

いやいや、arduinoを早速始めたいんだ!というかたは下記の入門編からお読みください。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。

 

Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)

 

 

スポンサーリンク

bit関数 基本解説

まずは基本的なことを復習。

繰り返しになりますが、「bitを操作する」ための関数です。

本記事のbit表現は下記とします。

(MSB)10000001(LSB) ← 2進数8bit
LSB:0bit目と表現
MSB:7bit目と表現

 

Wikipedia LSB
最下位ビット(さいかいビット、least significant bitLSBと略記)は、コンピュータにおいて二進数で最も小さな値を意味するビット位置のことである。LSBは右端ビットとも言われる。十進数に当てはめれば、「一の位」に相当する。

Wikipedia MSB
最上位ビット(さいじょういビット、most significant bitまたはhigh-order bitMSBと略記)は、コンピュータにおいて二進数で最も大きな値を意味するビット位置のことである。MSBは左端ビットとも言われる。

 

 

コマンド 説明
bitRead(x,n) 指定したビットの読み取り。
x:読み取る対象となる数
n:読み取るビットの位置
右端(LSB)から数えて何ビット目か。
戻り値:0、1

変数xの1bit目を読み出す。
bitRead(x,1);
bitWrite(x,n,b) 指定したビットへの書き込み。
x:書き込む対象となる数
n:書き込むビットの位置
右端(LSB)から数えて何ビット目か。
b:書き込むビット値(0、1)
戻り値:なし

変数xの1bit目に1を書き込む。
bitRead(x,1,1);
bitSet(x,n) 指定したビットをセットします。
セットする値は1です。
x:対象となる数
n:セットするビットの位置
右端(LSB)から数えて何ビット目か。
戻り値:なし

変数xの1ビット目を1にする。
bitSet(x,1);
bitClear 指定したビットをクリアします。
セットする値は0です。
x:対象となる数
n:クリアするビットの位置
右端(LSB)から数えて何ビット目か。
戻り値:なし

変数xの2ビット目を0にする。
bitClear(x,1);
bit(n) 指定したビットを1にしたときの値を計算。
n:値を知りたいbit
戻り値:知りたい値

変数xの1ビット目の値を知る。
下記の場合、10進数の場合2という戻り値を得られます。
bit(1);

 

bit関数 サンプルスケッチ

シリアルモニタに操作したいbitを入力、bit関数で操作した値をシリアルモニタに出力するスケッチです。

bit関数を一通り表現してみました。

bit関数の動作の理解の助けになるかと考えます。

 

スケッチに通信用の関数を使いますので念のため説明をのせておきます。

関数 説明
Serial.begin(speed) シリアル通信のデータ転送レートをbpsを指定します。
bpsはビット/秒。
speed:転送レート
転送レートは下記が指定可能です。
300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200
戻り値:なし
Serial.available() シリアルポートにデータがあるかどうかの確認をする。
戻り値:シリアルバッファにあるデータのバイト数
Serial.read() 受信データの読み込み。
戻り値:
読み込み可能なデータの最初の1バイトを返す。
-1の場合はデータなし。
Serial.print(data,format) ASCIIテキストでシリアルポートにデータを出力する。
data:出力する値
format:基数または有効桁数(BIN,DEC・・・など)
戻り値:送信したバイト数
Serial.println(data,format) データの末尾に改行を入れて送信。
Serial.print()と同じフォーマットが使えます。

 

下記が、bit関数をシリアルモニタで確認するためのサンプルスケッチです。

//番外編 19 bit操作関数
//bit操作関数をシリアルモニタで理解するサンプルスケッチ
//https://omoroya.com/

byte val_b = B10000001; //bit_valをbyte型としてb00000000で定義
int result;

void setup() 
{
  Serial.begin(9600);                        //シリアル通信のデータ転送レート設定しポート開放
  Serial.print("set 8bit = ");               //表示
  Serial.println(val_b , BIN);               //セットしたbitを表示
  Serial.println("Enter Bit Number 0 to 7"); //表示
}

void loop() 
{
  
  if (Serial.available() > 0 )        //受信したデータが存在した場合以下を実行
  {
    
    char val_c = Serial.read();       //char文字として受信データの読み込み

    //char文字'0'以上、'7'以下でbit選択
    if (val_c >= '0' && val_c <= '7')
    {
      int val_n = val_c - '0';        //char文字0を引いて数値0-7に変換
      Serial.print("Operation the "); //表示
      Serial.print(val_n);            //指定したbitを表示
      Serial.println(" bit");         //表示
      Serial.println("");             //改行

      Serial.println("bitWrite 1 write");   //表示
      bitWrite(val_b , val_n , 1); //指定したbitに1を書き込む
      Serial.println(val_b , BIN);          //書き込んだ内容を2進表示
      Serial.println(val_b , DEC);          //書き込んだ内容を10進表示
      Serial.println("");                   //改行

      Serial.println("bitWrite 0 write");   //表示
      bitWrite(val_b , val_n , 0); //指定したbitに0を書き込む
      Serial.println(val_b , BIN);          //書き込んだ内容を2進表示
      Serial.println(val_b , DEC);          //書き込んだ内容を10進表示
      Serial.println("");                   //改行

      Serial.println("bitSet 1 write");     //表示
      bitSet(val_b , val_n);                //指定したbitに1を書き込む
      Serial.println(val_b , BIN);          //書き込んだ内容を2進表示
      Serial.println(val_b , DEC);          //書き込んだ内容を10進表示
      Serial.println("");                   //改行

      Serial.println("bitRead");            //表示
      result = bitRead(val_b , val_n);      //指定したbitを読み出す
      Serial.println(result);               //指定したbitの値を表示
      Serial.println("");                   //改行

      Serial.println("bit");                //表示
      result = bit(val_n);                  //指定したbitを1にした時の値を計算
      Serial.println(result , BIN);         //計算結果の2進表示
      Serial.println(result , DEC);         //計算結果の10進表示
      Serial.println("");                   //改行

      Serial.println("bitClear");           //表示
      bitClear(val_b , val_n);              //指定したbitをクリア(0)
      Serial.println(val_b , BIN);          //クリアした内容の2進表示
      Serial.println(val_b , DEC);          //クリアした内容の10進表示
      Serial.println("");                   //改行
    }
  }
}

 

bit関数 サンプルスケッチ 実行結果

「ツール」 ⇒ 「シリアルモニタ」 を開きます。

0~7の数値を入力してリターンもしくは送信ボタンを押せば結果が表示されます。

5を入力した場合、5bit目がbit関数で操作されます。

デフォルトの数値はb10000001としています。

適当に変更して、色々と試してみるとさらに理解が深まります。

 

下図がシリアルモニタの実行結果。

シリアルモニタは「改行なし」を選択してください。

改行なしを選択しないと改行も入力値として認識してしまいます。

 

下図は5を入力して、5bit目をbit関数で操作した結果です。

arduino-extra-edition-19-01

 

bit関数が機能しているのがわかりましたでしょうか。

 

まとめ

Arduino 入門 番外編 19 【bit関数 まとめ】

いかがだったでしょうか?

 

おそらく、色んな場面で出くわす関数ではと考えます。

まずは、基本を理解して応用してみましょう。

 

次回の「番外編 20」は【shiftOut関数 まとめ】です。

Arduino 入門 番外編 20 【shiftOut関数 まとめ】
本記事は、Arduinoで使用するshiftOut関数についてです。この関数も入門者には、わかりずらい関数。shiftOut関数は1byte分のデータを1bitずつシフトアウトする関数です。クロック出力ピンから8クロックが出力され、そのクロ…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編Arduino入門編2で使用しているUNOはAmazonにて購入可能です。

Arduino入門編では互換品を使用。

Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)

 

Amazonでお得に買う方法

Amazonでお得に購入するならAmazon MastercardAmazonギフト券がおすすめです。

時期により異なりますが、様々なキャンペーンを実施しています。

\Amazonギフト券/
Amazonギフトカード キャンペーン

Amazon Mastercard お申込み
Amazon Mastercard 申し込み 

 

いずれの場合もプライム会員である方がお得!!

\Amazon Prime 30日間の無料会員を試す/
無料会員登録 

 

 

コメント

タイトルとURLをコピーしました