8pin のマイコンを使っていると、入出力のピン数が足りなくなることがよくある。AVR の Tiny85 で赤外線リモコンを作っていて、表示用に赤と緑の LED を付けようとしたら、残っている出力ピンが1本しかなかった。
1本の出力ピンは H, L, Hi-Z(AVR では入力ピンにして内蔵プルアップを無効にした状態)の3種類の状態にできるのだから、簡単に赤LED、緑LED、消灯の3種類を制御できそうなものだが、回路を作ろうとすると結構難しい。Charlieplexing という少ないピン数で多数の LED を駆動するテクニックがあるが、さすがにピンが1本だけではその手は使えない。
検索してみると、世界は広いもので、同じ問題で困っている人がいるらしく、下記の英文記事があった。
- http://www.edn.com/design/power-management/4324138/Single-port-pin-drives-dual-LED
- http://www.neufeld.newton.ks.us/electronics/?p=151
- http://www.batsocks.co.uk/readme/p_tut_led16.htm
- 消灯時(赤LED、緑LED の両方が消えているとき)にも常に電力を消費してしまう
- 結構な外付け部品が必要
という問題があって、電池駆動のちょっとした回路では使いにくい。
そこで、出力ピンの先に抵抗とコンデンサだけで作った HPF(ハイパスフィルタ)とLPF(ローパスフィルタ)を付け、それぞれの先にLEDを付けて、高周波のパルスを出力した時には LED1 が点灯, H を出力した時には LED2 が点灯,
一本の出力ピンだけで2色のLEDを駆動する, Vcc=3[V] |
PB1(pin6) が出力ピン。PB1 に 62.5kHz のパルスを出力すると LED1(赤) が、H を出力すると LED2(緑) が点灯する。L にすると両方消灯する。
LED1 を点灯: A-B 間の電位(62.5kHz、デューティー比 1/16, 電源 CR2032) |
LED2 を点灯: A-B 間の電位(H 出力, 電源 CR2032) |
外付け部品は抵抗2個とコンデンサ2個のみ。どちらの LED も光っていないときは電力を消費しない。これで完璧、と思ったが、やってみると意外と条件が厳しい。この RC回路のフィルタではパルスと直流をきれいに分離できず、片方だけを点灯させるつもりでも、消灯している方がわずかに光ってしまうことがある。また通常の矩形波で駆動すると、電源電圧によっては LED1(高周波で駆動する方) にかかる電圧が低くて光らない。
試行錯誤の結果、パルスは 62.5KHz, デューティー比 1/16~1/32 で、上の方に載せた回路図にある定数の部品を使うとよいことが分かった。下記はこのパルスを出力した時の B-C 間の電圧(= LED1 にかかる電圧)。
62.5KHz, デューティー比 1/16 出力時に LED1 にかかる電圧(B-C 間) |
このように、デューティー比を 1/2 でなく細いパルスにすると、LED1(高周波で駆動する方) にかかる電圧が上がってなんとか光るようになった。ただ目で見てもわからないが、間欠的にしか光っていないので、どうしても LED2(直流で駆動している方) よりも暗くなってしまう。対策としては LED2 の電流制限抵抗を大きくして暗くするなど。 LED1 に高輝度 LED を使う方法もあるが、そうすると LED2 の点灯開始時に LED1 が一瞬光るのが見えてしまうかもしれない。その場合はC2を2200pF に変更するとよい。
なんとかして 3個の LED の制御もできないだろうか。やはり難しいか。
【追記】
上記の 62.5kH のパルスとH連続の直流を 0.5[ms]周期(2kHz)で繰り返すと、2つの LED は同時に点灯しているように見える。 一番上の動画参照。