Kのアイコン画像
K 2020年04月30日作成 (2020年05月02日更新)
製作品 製作品 閲覧数 13127
K 2020年04月30日作成 (2020年05月02日更新) 製作品 製作品 閲覧数 13127

Arduino Unoで2bit加算器を作ってみた

はじめに

Arduinoとタクトスイッチ(入力)、LED(出力)を使って簡単な足し算ができる計算機を作ってみました。
完成した計算機はこんな感じです。2進数2bit同士の足し算をすることができます。

製作した2bit加算器

今回の投稿ではまず加算器を作る為に必要な論理回路、半加算器、全加算器について簡単に説明し、最終的にはArduinoを使って2bit加算器を実装するところまでやっていきたいと思います。

論理回路

コンピュータは様々な計算や処理を行いますが、それらの多くは論理演算によって実行されています。論理演算とは、「ある事柄が〇(つまり1)か×(つまり0)か」を判断する演算です。この論理演算を行う回路のことを論理回路と言います。ここでは基本的な3つの論理回路(AND, OR, NOT)と、加算器を作る為に必要なXOR回路の説明をしたいと思います。

AND(論理積)

2つの入力が共に1である時に1を返します。それ以外の時は0を返します。

入力a 入力b 出力
0 0 0
0 1 0
1 0 0
1 1 1

AND(論理積)
  (論理回路エディタを用いて作成)

Arduino言語でコードにしてみるとこのようになります。

AND(論理積)

int AND(int a,int b){ int c = a and b; return c; }

OR(論理和)

2つの入力の少なくともどちらか一方が1である時、1を返します。共に0である時は0を返します。

入力a 入力b 出力
0 0 0
0 1 1
1 0 1
1 1 1

OR(論理和)
  (論理回路エディタを用いて作成)

Arduino言語でコードにしてみるとこのようになります。

OR(論理和)

int OR(int a,int b){ int c = a or b; return c; }

NOT(否定)

入力が0であれば反対の1を出力し、入力が1であれば反対の0を出力します。

入力 出力
0 1
1 0

NOT(否定)
  (論理回路エディタを用いて作成)

Arduino言語でコードにしてみるとこのようになります。

NOT(否定)

int NOT(int a){ int b = not(a); return b; }

XOR(排他的論理和)

2つの入力が異なる時に1を返します。同じ時は0を返します。

入力a 入力b 出力
0 0 0
0 1 1
1 0 1
1 1 0

XOR(排他的論理和)
  (論理回路エディタを用いて作成)

Arduino言語でコードにしてみるとこのようになります。

XOR(排他的論理和)

int XOR(int a,int b){ int c = a^b; return c; }

半加算器

半加算器は、2進数1桁の足し算をする回路です。計算結果は1桁目をSで、2桁目をCで出力します。ちなみに、Sは英語で「合計」を表す「Sum」の頭文字で、Cは英語で「桁上がり」を表す「Carry」の頭文字です。

半加算器
  (論理回路エディタを用いて作成)

Arduino言語でコードにしてみるとこのようになります。

半加算器

//AND(論理積) int AND(int a,int b){ int c = a and b; return c; } //XOR(排他的論理和) int XOR(int a,int b){ int c = a^b; return c; } //半加算器 int HALF_ADDER(int a,int b,int *C,int *S){ *C = AND(a,b); *S = XOR(a,b); }

全加算器

2桁以上の2進数を足し算すると、2桁目以上の桁では、下の桁からの桁上がりを足さなければならない場合があります。このような、下の桁からの桁上がりを加算できる加算器を全加算器といいます。1桁目には桁上がりがないので半加算器を使い、2桁目以上の足し算には全加算器を使います。

全加算器
  (論理回路エディタを用いて作成)

Arduino言語でコードにしてみるとこのようになります。

全加算器

//AND(論理積) int AND(int a,int b){ int c = a and b; return c; } //OR(論理和) int OR(int a,int b){ int c = a or b; return c; } //XOR(排他的論理和) int XOR(int a,int b){ int c = a^b; return c; } //半加算器 int HALF_ADDER(int a,int b,int *C,int *S){ *C = AND(a,b); *S = XOR(a,b); } //全加算器 int FULL_ADDER(int a,int b,int c, int *C,int *S){ int half_adder_carry1,half_adder_sum1; int half_adder_carry2,half_adder_sum2; HALF_ADDER(a,b,&half_adder_carry1,&half_adder_sum1); HALF_ADDER(c,half_adder_sum1,&half_adder_carry2,&half_adder_sum2); *C = OR(half_adder_carry1,half_adder_carry2); *S = half_adder_sum2; }

2bit加算器

半加算器1つと全加算器1つを組み合わせることで2bit加算器ができます。2bit同士の2入力で最大3bitまでの出力をします。下の図ではS0が1の位、S1が2の位で、Cが最大の3の位の出力となります。

2bit加算器
  (論理回路エディタを用いて作成)

Arduino言語でコードにしてみるとこのようになります。

2bit加算器

//AND(論理積) int AND(int a,int b){ int c = a and b; return c; } //OR(論理和) int OR(int a,int b){ int c = a or b; return c; } //XOR(排他的論理和) int XOR(int a,int b){ int c = a^b; return c; } //半加算器 int HALF_ADDER(int a,int b,int *C,int *S){ *C = AND(a,b); *S = XOR(a,b); } //全加算器 int FULL_ADDER(int a,int b,int c, int *C,int *S){ int half_adder_carry1,half_adder_sum1; int half_adder_carry2,half_adder_sum2; HALF_ADDER(a,b,&half_adder_carry1,&half_adder_sum1); HALF_ADDER(c,half_adder_sum1,&half_adder_carry2,&half_adder_sum2); *C = OR(half_adder_carry1,half_adder_carry2); *S = half_adder_sum2; } //2進数2桁同士の足し算 int FULL_ADDER_2BIT(int a1,int a0,int b1,int b0,int *result_2,int *result_1,int *result_0){ int half_adder_carry,half_adder_sum; int full_adder_carry1,full_adder_sum1; HALF_ADDER(a0,b0,&half_adder_carry,&half_adder_sum); FULL_ADDER(a1,b1,half_adder_carry,&full_adder_carry1,&full_adder_sum1); *result_2 = full_adder_carry1; *result_1 = full_adder_sum1; *result_0 = half_adder_sum; }

Arduinoを使った2bit加算器

ここまで、論理回路から2bit加算器まで順番に解説をしてきました。それでは、この章ではいよいよArduinoで2bit加算器を実装してみたいと思います。

使用したもの

Arduino Uno R3
ジャンパワイヤ
ブレッドボード
赤色LED×3
10kΩ抵抗×7
タクトスイッチ×4

※上記は全て秋葉原にある秋月電子さんで購入することができます。筆者もそこで購入しました。

回路図

計算機の配線図です。配線図はFritzingを用いて作成しました。

計算機の配線図

それぞれのタクトスイッチはGNDにプルダウンしているので、スイッチが押されたときは「HIGH」、押されていないときは「LOW」がArduinoに入力されます。

プログラム

計算機のプログラムです。Arduinoの統合開発環境であるArduino IDEを用いて作成しました。
簡単にプログラムの説明をします。
まず最初に、タクトスイッチの入力データを受け取るデジタルI/Oピンと、使用するLEDのデジタルI/Oピンの番号を定数で宣言します。
setup()関数内ではタクトスイッチが接続されているデジタルI/Oピンをそれぞれ入力に設定し、LEDが接続されているデジタルI/Oピンをそれぞれ出力に設定します。
loop関数内ではそれぞれのタクトスイッチの入力を読み取り、自作したFULL_ADDER_2BIT関数で足し算を実行します。計算結果はdigitalWrite関数で出力されます。

制御プログラム

//入力a const int input_a0 = 4; //入力aの1桁目 const int input_a1 = 5; //入力aの2桁目 //入力b const int input_b0 = 6; //入力bの1桁目 const int input_b1 = 7; //入力bの2桁目 //出力 const int output_0 = 10; //出力の1桁目 const int output_1 = 11; //出力の2桁目 const int output_2 = 12; //出力の3桁目 void setup(){ //タクトスイッチが接続されているそれぞれのピンを入力に設定 pinMode(input_a0,INPUT); pinMode(input_a1,INPUT); pinMode(input_b0,INPUT); pinMode(input_b1,INPUT); //LEDが接続されているそれぞれのピンを出力に設定 pinMode(output_0,OUTPUT); pinMode(output_1,OUTPUT); pinMode(output_2,OUTPUT); } void loop(){ //それぞれのタクトスイッチから入力を受け取る int state_a0 = digitalRead(input_a0); int state_a1 = digitalRead(input_a1); int state_b0 = digitalRead(input_b0); int state_b1 = digitalRead(input_b1); int result_0,result_1,result_2; FULL_ADDER_2BIT(state_a1,state_a0,state_b1,state_b0,&result_2,&result_1,&result_0); //足し算をする関数を実行 //計算結果を出力 digitalWrite(output_0,result_0); digitalWrite(output_1,result_1); digitalWrite(output_2,result_2); } //AND(論理積) int AND(int a,int b){ int c = a and b; return c; } //OR(論理和) int OR(int a,int b){ int c = a or b; return c; } //XOR(排他的論理和) int XOR(int a,int b){ int c = a^b; return c; } //半加算器 int HALF_ADDER(int a,int b,int *C,int *S){ *C = AND(a,b); *S = XOR(a,b); } //全加算器 int FULL_ADDER(int a,int b,int c, int *C,int *S){ int half_adder_carry1,half_adder_sum1; int half_adder_carry2,half_adder_sum2; HALF_ADDER(a,b,&half_adder_carry1,&half_adder_sum1); HALF_ADDER(c,half_adder_sum1,&half_adder_carry2,&half_adder_sum2); *C = OR(half_adder_carry1,half_adder_carry2); *S = half_adder_sum2; } //2進数2桁同士の足し算 int FULL_ADDER_2BIT(int a1,int a0,int b1,int b0,int *result_2,int *result_1,int *result_0){ int half_adder_carry,half_adder_sum; int full_adder_carry1,full_adder_sum1; HALF_ADDER(a0,b0,&half_adder_carry,&half_adder_sum); FULL_ADDER(a1,b1,half_adder_carry,&full_adder_carry1,&full_adder_sum1); *result_2 = full_adder_carry1; *result_1 = full_adder_sum1; *result_0 = half_adder_sum; }

動かし方

プログラムの書き込みが成功したら、実際にタクトスイッチを押してみてください。計算結果がLEDで出力されると思います!

おわりに

今回Arduinoを使って簡単な足し算ができる計算機を作ってみました。
足し算などの複雑な処理が論理回路の組み合わせでできるなんて、本当にロマンがありますね!
今回学んだことを生かして、次はArduinoで簡単な引き算ができる計算機を作ってみたいと思います。
また、質問や疑問点、ここを直したほうがいいよ等有りましたら、コメントよろしくお願いします。

Author

Twitter ID : __kei0917

3
  • K さんが 2020/04/30 に 編集 をしました。 (メッセージ: 初版)
  • K さんが 2020/05/02 に 編集 をしました。
ログインしてコメントを投稿する