めぐり娘

 

■エンコーダー 10進数を2進数に変換

「エンコーダー」を試してみます。

Z0 〜 Z7 のいずれか一つ、つまり 0 から 7 までの 10 進数を入力とします。出力は A0 〜 A2 の 3桁の 2 進数です。

 

真理値表

入力 出力
Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 A2 A1 A0
0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0 1
0 0 0 0 0 1 0 0 0 1 0
0 0 0 0 1 0 0 0 0 1 1
0 0 0 1 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 1 0 1
0 1 0 0 0 0 0 0 1 1 0
1 0 0 0 0 0 0 0 1 1 1

 

論理式で表すと

A0 = Z1 + Z3 + Z5 + Z7

A1 = Z2 + Z3 + Z6 + Z7

A2 = Z4 + Z5 + Z6 + Z7

 

論理回路図で表すと


エンコーダー論理回路図

 

4 入力 OR ゲートでいいんだけど、シンボルが 2 入力しかなかった (^_^;) ので 2 入力 OR ゲートを 3 個組み合わせました。

fOR( A , B , C , D ) = fOR( fOR( A , B ) , fOR( C , D ) )

 

参考:「Hatada's Home Page」

 

 

これを実際に組んでみましょう。

入力はボリュームで変化させる 0 〜 5V の電圧です。それを Arduino で 0〜 7 の 10 進数に A/D 変換し、数値に応じた出力 pin (Z0 〜 Z7) を HIGH に制御します。マトリクスから OR ゲートを介して 2 進数 (A0 〜 A2) に変換、対応した LED を点灯させることにしました。

 

回路図です。


エンコーダー回路図

 

OR ゲートと言ってもダイオードだけです (^_^;) トランジスタで LED を駆動しています。

 

スケッチです。

void setup() {
  for(int i=2; i<10; i++) {
    pinMode(i,OUTPUT);
  }
  Serial.begin(115200);
}

 

void loop() {
  int sensorValue = analogRead(A0);
  delay(50);

 

  int voltage = sensorValue * (8.0/1024.0);
  Serial.println(voltage);

 

  for(int i=0; i<8; i++) {
    if(i==voltage) {
      digitalWrite(i+2, HIGH);
    } else {
      digitalWrite(i+2, LOW);
    }
  }

 

}

 

シリアルポートに出力しているのは 10 進数 0 〜 7 の出力チェック用です。なくてもいいです。

 

ブレッドボードです。


ブレッドボード

 

上の半固定ボリュームを 0 から上げていくと、3 つの LED が「000」から「111」の 2 進数に応じて点灯します。

 


コメント
コメントする








   
この記事のトラックバックURL
トラックバック

■calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
2425262728  
<< February 2019 >>

■search this site.

■recommend

毎日貯まるポイントサイト ECナビ

■recommend





■Twitter

■recommend

■recommend

■selected entries

■categories

■archives

■recent comment

■recent trackback

■links

■profile

■others

■mobile

qrcode

■powered

無料ブログ作成サービス JUGEM