はじめに
Arduinoとタクトスイッチ(入力)、LED(出力)を使って簡単な足し算ができる計算機を作ってみました。
完成した計算機はこんな感じです。2進数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 |
(論理回路エディタを用いて作成)
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 |
(論理回路エディタを用いて作成)
Arduino言語でコードにしてみるとこのようになります。
OR(論理和)
int OR(int a,int b){
int c = a or b;
return c;
}
NOT(否定)
入力が0であれば反対の1を出力し、入力が1であれば反対の0を出力します。
入力 | 出力 |
---|---|
0 | 1 |
1 | 0 |
(論理回路エディタを用いて作成)
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 |
(論理回路エディタを用いて作成)
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の位の出力となります。
(論理回路エディタを用いて作成)
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
投稿者の人気記事
-
K
さんが
2020/04/30
に
編集
をしました。
(メッセージ: 初版)
-
K
さんが
2020/05/02
に
編集
をしました。
ログインしてコメントを投稿する