お稽古

投稿日:

 7セグメントLEDのお稽古をする。意味のあるなしはどうだってよろしい。レッツゴー。

 私は古株ぶっているが、実は若い頃に7セグLEDを扱ったことがない。子供の頃の電子工作はもっぱらラジオなどのトランジスタ回路、長じてからは仕事関係で5極真空管やマイクロ波の発振管などを扱っていた。

 数値表示のためには、その頃の仕事関係では「ニキシー管」という数値表示のための真空管を扱っていた。これは放電管で、数字の形をした陰極が赤く光るものだ。

 そういうわけで、7セグLEDを知らないのである。いや、無論、当時から7セグメントLEDは世の中にあったが、私の職場が特殊だったのである。

 で、これが昨日秋月電子八潮店で買ってきた、1個60円の7セグLEDである。

IMG_3234
IMG_3236
OSL10561-IRA

 さて、まずは点灯からだ。データシートから、抵抗と電流っ。

 各素子I_F = 20mA, V_F = 2.1V……とあるから、V_0 = 5Vとして、

I_R = \frac{V_0 - V_F}{I_F} = \frac{5 - 2.1}{20mA} = 181.25\Omega

……まず、200Ωばかりつけておいてやればよいのだろう。この前買った集合抵抗の手持ち、8素子9ピンで330Ωのがあるから、それを付ければ多少暗いが10mA前後で光るだろう。

 さっそく、全点灯で光らせてみよう。単に電源をくれてやって、抵抗に結線するだけだ。

7セグLED全点灯
回路図

 光らせてみると、計算上の抵抗の倍近い抵抗値なのに、なかなかどうして、結構明るく光る。

IMG_3237
単純全点灯で光らせてみたところ

 次に、Arduinoをつないで、数字を表示させる。全点灯で電流を測ってみると67mAほど流れているので、電源はこのまま別建てのほうがいいだろう。

 アノードコモンのLEDであるから、カソード側で制御しなければならない。集合抵抗では一本づつ制御できないので、330Ωの電流制御抵抗をバラで8本とりつける。それぞれの足をArduinoのデジタル2ピンから9ピンまで取り付ける。

 スケッチをこう書く。点灯のパターンは配列に書くのが手早いだろう。

//
//  7segmentLED_1.ino
//    7セグメントLEDを1個動かす。
//    27.08.10(月) 1300~
//    佐藤俊夫
//
//    LED「OSL10561-IRA」
//    LED 1 -> Digital 2
//    LED 2 -> Digital 3
//    LED 4 -> Digital 4
//    LED 5 -> Digital 5
//    LED 6 -> Digital 9
//    LED 7 -> Digital 8
//    LED 9 -> Digital 7
//    LED10 -> Digital 6
//
void setup() {
  for(int i = 2; i <= 9; i++){
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for(int i = 0; i <= 9; i++){
    lighting(i);
    delay(1000);
  }
}

void lighting(int n){
  const int pat[10][8] = {
    { LOW,  LOW,  LOW, HIGH, HIGH,  LOW,  LOW,  LOW},  //  0
    {HIGH, HIGH,  LOW, HIGH, HIGH, HIGH, HIGH,  LOW},  //  1
    { LOW,  LOW, HIGH, HIGH,  LOW, HIGH,  LOW,  LOW},  //  2
    {HIGH,  LOW,  LOW, HIGH,  LOW, HIGH,  LOW,  LOW},  //  3
    {HIGH, HIGH,  LOW, HIGH,  LOW,  LOW, HIGH,  LOW},  //  4
    {HIGH,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW, HIGH},  //  5
    { LOW,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW, HIGH},  //  6
    {HIGH, HIGH,  LOW, HIGH, HIGH,  LOW,  LOW,  LOW},  //  7
    { LOW,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW,  LOW},  //  8
    {HIGH,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW,  LOW}   //  9
  };
  int i = 0;
  for(i = 0; i <= 7; i++){
    digitalWrite(i + 2, HIGH);
  }
  for(int i = 0; i <= 7; i++){
    digitalWrite(i + 2, pat[n][i]);
  }
}

 アノードコモンなので、論理は負論理だ。

 Arduinoとブレッドボードをこういうふうにする。

IMG_3238

 動かすと、ゆっくりカウントアップする。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください