スイッチ2個とLED1個を用いて、論理ゲート(AND, OR, NOT, Ex-OR)の動作を実現します。
スイッチからの入力信号(ONが1, OFFが0)をArduinoのプログラムで判断し、論理ゲートに対応した出力としてLEDを点灯(HIGH)・消灯(LOW)します。
準備
インターネットにつながるパソコン、Arduino UNO、パソコンとArduinoを接続するUSBケーブル、プッシュボタン2個、抵抗 10 kΩ 2個、LED 1個、抵抗 330Ω 1個、ブレッドボード、ジャンパー線
回路作成
- ArduinoのGNDと5Vをそれぞれブレッドボードに接続します。
- LEDの足の長い方(アノード、正極)とArduinoの6番と接続します。
- LEDの足の短い方(カソード、負極)を330Ω抵抗に接続し、抵抗の反対側の足はGNDに接続します。
- スイッチ2個をブレッドボードに設置し、図のように配線します。スイッチの信号は4, 5ピンからArduinoに入力されます。
- 以下のプログラムとの対応を考えると、右図の右側のスイッチがスイッチ1, 左側のスイッチがスイッチ2に対応します。
プログラミング
Arduino IDEを起動し、以下のプログラムを作成し、Arduinoに転送しましょう。
コメントアウトしている部分を順番に解除して、実施してみましょう。下のプログラムをそのまま実施すると排他的論理和(Ex-OR)の論理に従いLEDが点灯します。シリアルモニタにそれぞれのボタンの状態が表示されますので確認しましょう。
const int PB_1 = 4; //スイッチ1
const int PB_2 = 5; //スイッチ2
const int LED = 6; // LED
int pb1_status = 0;
int pb2_status = 0;
int led_status = 0;
void setup() {
Serial.begin(9600);
pinMode(PB1, INPUT);
pinMode(PB2, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED,LOW);
}
void loop() {
// スイッチの状態を検出
pb1_status = digitalRead(PB_1);
pb2_status = digitalRead(PB_2);
/* この記号に囲まれている部分はコメントとしてみなされます*/
/* //AND
if ( pb1_status && pb2_status ) {
digitalWrite(LED,HIGH);
}else{
digitalWrite(LED,LOW);
}
//OR
if ( pb1_status || pb2_status ) {
digitalWrite(LED,HIGH);
}else{
digitalWrite(LED,LOW);
}
//NOT
if ( pb1_status ) {
delay(500); //チャタリング防止のための時間稼ぎ
led_status = !led_status;
digitalWrite(LED,led_status);
}
*/
//Ex-Or
delay(200);
if( (pb1_status && !pb2_status) || (!pb1_status && pb2_status)){
digitalWrite(LED,HIGH);
}else{
digitalWrite(LED,LOW);
}
Serial.print(pb1_status);
Serial.print(",");
Serial.println(pb2_status);
}