HOME > 技術談話 > PIC® microcontroller > 複数LED制御
はじめに スタティック制御の復習 PWM制御の復習 ダイナミック制御の概要 複数のLEDを制御する手法
格子状(マトリクス)配置 マトリクス配置を利用したデバイス
サンプルプログラム(その1:メイン処理)
サンプルプログラム(その2:Complementary LED Drive)
複数のLEDを制御する際に利用するダイナミック制御について解説します。 なお、ダイナミック制御を習得する前にPWM制御を理解しておく必要があります。 こちらからリンク ダイナミック制御に対する言葉としてスタティック制御があります。 スタティック制御は1つの信号線(制御線)が1つのLEDに接続されています。信号線操作はLEDの状態に直接反映され、その状態は次に信号線が操作されるまで維持される「静的な制御」です。 一方、ダイナミック制御では、1つの信号線に対して複数個のLEDが接続され、信号線操作を組み合わせることで任意のLEDを制御します。ですが、任意のLED制御だけでは総てのLEDを制御できないので、信号線操作により制御対象LEDを変えつつ、繰り返し制御することで、あたかも総てのLEDを制御しているかの「様」に見せるPWM制御を応用した「動的な制御」です。 応用編その1: 10ポイントRGB LEDアレイ |
2010.04.08 新規作成(2010.03.02に対して全面変更) 2011.08.29 応用編の追記 |
▲ |
1つの出力ポートに1つのLEDが接続され、個々のLEDの点灯と消灯を独立して制御するのがスタティック制御です。 シンプルな制御方式で初級編で解説したLEDの制御は総てスタティック制御です。 図で示すと以下の様なイメージです。 |
左の回路図の場合では、出力ポートをHighで点灯、Lowで消灯します。 出力ポートの状態が維持されるのであればLEDの状態も維持されます。 3個のLEDは個別に制御できるだけでなく、総てのLEDを同時に点灯することができます。 |
この回路図における各LEDの制御は下表によります。任意のLEDに対する制御は他のLEDに影響を与えません。 |
LED | 制御内容 | PORT X | PORT Y | PORT Z | |
LED X | 点灯 | High | - | - | |
消灯 | Low | - | - | ||
LED Y | 点灯 | - | High | - | |
消灯 | - | Low | - | ||
LED Z | 点灯 | - | - | High | |
消灯 | - | - | Low |
2010.04.08 新規作成(2010.03.02に対して全面変更) |
▲ |
PWM制御は Pulse Width Modulation の略で、高速でオンとオフの時間を制御する方式です。 この制御方法をLEDに適用(つまり点滅制御)するとLEDの見掛け上の輝度を制御することができます。 LEDの点滅具合と見た目の明るさの関係のイメージを以下に示します(あくまでもイメージです)。 |
点滅の周期が長い場合は明らかに点滅(=明滅)している様に見えますが、約50ms以下で高速点滅した場合は明滅を通り越して輝度が低下したように見えます(個人差はあります)。 |
2010.04.08 新規作成(2010.03.02に対して全面変更) |
▲ |
ダイナミック制御はPWM制御の応用であると前述しましたが、PWM制御のオフ期間に制御対象外のLEDをPWM制御のオン期間にすることで複数のLEDが同時に点灯している様に見せます。 |
上図の場合、任意の時点で点灯するLEDは1個以下ですが、PWM制御を複数実行することで3個のLEDを同時制御している様に見せます。この時、輝度の「ばらつき」を無くす為にPWM制御のオン期間を揃える事がポイントです。 気付かれたと思いますが、ダイナミック制御を行うことで1つ1つのLEDの輝度は低下します。スタティック制御時に比べれば半分以下の輝度になると思います。オン期間を増やすことで輝度を上げることは可能ですが、周期に対して確保可能なオン期間には制限があり、オン期間を確保するために周期を伸ばすと「点滅(明滅)」が顕著になります。 輝度低下の対処方法としては、 ・LEDに流す電流値を増やす(電流制限抵抗の値を小さくする) … 注意:LEDの定格。 ・一度に制御可能なLEDの数を増やす(ダイナミック制御の単位を削減してオン期間を確保する)。 ・仕様としてのLED制御総数を減らす。 … これは難しい。 が挙げられます。 最後の案は別として、ハードウェアでの対応が必要となるので担当者間での相談が必要です。回路図やパターン図の修正を考えると電流制限抵抗の値を変えることが近道かと思います。 余談ですが…。 LEDの定格は10mA前後が多いと思います。ですがデータシートを見るとPWM制御をおこなう場合に限り定格値を超えることができる旨の記述があります。通常10mAの所を100mAとか。この時の動作周波数も合わせて記載されているのでご確認ください。なお、実装するダイナミック制御の動作周波数が異なる場合はLEDの製造元に問い合わせることが必要です。 PWM制御をあてにして定格値を超える実装を行った場合はマイコンの動作を停止しないでください。マイコンの動作を停止した瞬間にPWM制御も停止するのでLEDに流れる電流値は定格値を超えてしまいます。 |
2010.04.08 新規作成(2010.03.02に対して全面変更) |
▲ |
(1)出力ポートの多いマイコンを選択する 力技ですが確実です。必要な出力ポートに見合うPICマイコンを選択します。 出力ポートは1対1でた王するのでスタティック制御ができます。 |
ピン数が異なりますが、総てPICマイコンです。 上から順に、 ・PIC16F887 ・PIC16F886 ・PIC16F88 ・PIC12F683 出力ポートが増えることで制御が簡単になりますが、実装面積が増えること、価格が少しだけ上昇することは避けられません。 後述の外部デバイスを使う方法を検討するのであれば、1つのPICマイコンで済む方が配線の手間が減るので何かと有利です。また、PICマイコンの価格が上昇するものの部品代の合計金額が安い場合もあります。 |
(2)出力ポートを拡張する マイコンと接続可能な外部デバイスを利用します。スタティック制御もできます。 バス接続可能な入出力拡張デバイスもありますがPICマイコンでは利用困難なので、少ないピン数で制御可能なシフトレジスタを利用します。 |
CLOCKと共にDATAを1ビットずつ送出しシフトレジスタの出力ポートの内容を変更します。デバイスの種類によってはデイジーチェーン接続できる場合があります。 スタティック制御できますが、シフトレジスタという特性故、シフト過程のデータが別の出力ポートから出力されます。 |
セグメントLEDを利用する場合は専用のデバイス(4入力8出力)もあるので検討してみてはいかがでしょう? |
(3)格子状にLEDを配置する これぞダイナミック制御な手法です。ある任意時点で制御可能なLEDの数は限られますが、配置されたLEDに対してPWM制御を繰り返すことで、同時制御可能なLEDの数を見掛け上増やします。 LEDの数が多すぎる場合は格子状の配置と前述のシフトレジスタを組み合わせて実装する場合が多いです。 |
2010.04.09 新規作成(2010.03.02に対して全面変更) |
▲ |
(1)スタティック接続では… まず、スタティック接続では、出力ポート数=LED数になります。 |
LED Aは出力ポートXをLowで点灯、Highで消灯します。 LED Bは出力ポートYをHighで点灯、Lowで消灯します。 出力ポートはLEDに流れる電流に耐えられることが大前提です。マイコンの種類により流せる電流量が制限されます。そのような場合はトランジスタ等を使用して流せる電流量を増やしてください。 |
(2)接続先を出力ポートへ スタティック制御の構成を一歩進め、電源、グランド相当を出力ポートで代用する様に構成します。 |
出力ポートを2つ使用している割にはLEDを1個しか制御することができません。 出力ポートの組み合わせとLED表示の関係は以下の通りです。 |
出力ポートX | 出力ポートY | LEDの状態 | |
Low | Low | 消灯 | |
Low | High | 点灯 | |
High | Low | 消灯(LEDの耐圧に注意) | |
High | High | 消灯 |
LEDを逆向きに接続した場合はLEDの耐圧(逆電圧等で表現される)に注意してください。逆向きに過電圧を与えるとLEDの永久破壊を招きます。 |
(3)複数の制御をまとめる その1 今度は出力ポートを3つ使用します。 |
出力ポートを3つ使用している割にはLEDを2個しか制御することができません。 出力ポートZで流せる電流に余裕があれば2個のLEDを同時点灯することができます。 出力ポートの組み合わせとLED表示の関係は以下の通りです。 |
出力ポートX | 出力ポートY | 出力ポートZ | LED A の状態 | LED B の状態 | |
Low | Low | Low | 消灯 | 消灯 | |
Low | Low | High | 点灯(注:電流値) | 点灯(注:電流値) | |
Low | High | Low | 消灯 | 消灯(注:LED耐圧) | |
Low | High | High | 点灯 | 消灯 | |
High | Low | Low | 消灯(注:LED耐圧) | 消灯 | |
High | Low | High | 消灯 | 点灯 | |
High | High | Low | 消灯(注:LED耐圧) | 消灯(注:LED耐圧) | |
High | High | High | 消灯 | 消灯 |
(4)複数の制御をまとめる その2 今度は出力ポートを3つ使用することは同じですが、電流制限抵抗は1個です。 この構成では各LEDを(見掛け上)同時点灯させるためにダイナミック制御が必須です。 |
出力ポートを3つ使用している割にはLEDを2個しか制御することができません。 電流制限抵抗が1個のため、2個のLEDを同時点灯することは推奨されません(点灯数で輝度が変わる)。 出力ポートの組み合わせとLED表示の関係は以下の通りです。 |
出力ポートX | 出力ポートY | 出力ポートZ | LED A の状態 | LED B の状態 | |
Low | Low | Low | 消灯 | 消灯 | |
Low | Low | High | 設定禁止 | 設定禁止 | |
Low | High | Low | 消灯 | 消灯(注:LED耐圧) | |
Low | High | High | 点灯 | 消灯 | |
High | Low | Low | 消灯(注:LED耐圧) | 消灯 | |
High | Low | High | 消灯 | 点灯 | |
High | High | Low | 消灯(注:LED耐圧) | 消灯(注:LED耐圧) | |
High | High | High | 消灯 | 消灯 |
電流制限用の抵抗が1個なので異なる色のLEDを使用する場合は輝度がばらつく場合があります。この場合、プログラムで点灯比率を微妙に調整することで見た目の輝度を調整することは可能ですが… 避けたいです。 |
(5)マトリクス配置 ここまでは出力ポートの数に対して接続できるLEDの数が少ないケースです。出力ポート数以下のLEDが制御できるに過ぎません(一部例外はあります)。では、出力ポートの数を5つにしたらどうなるでしょうか? ここからが本番です。出力ポートを格子状に配置し、その交点にLEDを配置します。 |
出力ポートを5つ使用し、その総数を超える6個のLEDを制御します。ダイナミック制御は必須です。 電流制限用の抵抗の配置により、 ・LED AとD、BとE、CとFは同時点灯禁止 ・LED AとBとC、DとEとFは同時点灯可能 で制御します。 同時点灯を行う場合は出力ポートXnに流れる電流量に注意してください。 |
出力ポートの組み合わせとLED表示の関係は以下の通りです。 厳密には32通りの組み合わせがありますが、有意味な組み合わせのみ掲載しています。 |
X1 | X2 | Y1 | Y2 | Y3 | LED A | LED B | LED C | LED D | LED E | LED F | |
L | H | H | - | - | 点灯 | - | - | 消灯 | 消灯 | 消灯 | |
L | H | - | H | - | - | 点灯 | - | 消灯 | 消灯 | 消灯 | |
L | H | - | - | H | - | - | 点灯 | 消灯 | 消灯 | 消灯 | |
H | L | H | - | - | 消灯 | 消灯 | 消灯 | 点灯 | - | - | |
H | L | - | H | - | 消灯 | 消灯 | 消灯 | - | 点灯 | - | |
H | L | - | - | H | 消灯 | 消灯 | 消灯 | - | - | 点灯 | |
- | - | L | L | L | 消灯 | 消灯 | 消灯 | 消灯 | 消灯 | 消灯 |
出力ポートを5つ使用する場合、格子の構成は2×3になり、都合6個です。格子の構成を3×2にしてもかまいませんが同時点灯可能なLEDの数が異なります。また、ダイナミック制御での制御巡回数が異なることに注意します。 出力ポートを6つ使用する場合の格子の構成は、 ・4×2 … 8個 ・2×4 … 8個 ・3×3 … 9個 の3通りです。選択時の最優先事項はLEDの数になりますが、その次に優先するのは…同時点灯数、もしくは消費電力でしょうか? 消費電力を抑えるために同時点灯数を少なくした場合、ダイナミック制御の巡回周期が間延びするのでLEDの輝度が低下します。その為に電流制限抵抗を小さくして電流を多く流す…本末転倒というか、意味がなくなるので注意してください。 出力ポートを4つ使用する場合を飛ばしてしまいましたが…2×2=4。効果が見込めません orz |
2010.04.09 新規作成(2010.03.02に対して全面変更) |
▲ |
(1)デバイスあれこれ 市販されているデバイスの中にはダイナミック制御を前提とした製品があります。 以下に一例を載せますが一般的には「7セグメントLED」、「マトリクスLED」と呼ばれています。 |
7セグメントLEDは1桁で完結する応用機器は少なく、複数個を組み合わせて利用することが多いです。2桁、3桁のセグメントが組になっている種類もあり、配線量を削減することができます。 マトリクスLEDの多くは8×8の格子ですが、16×16の格子や各格子の中に異なる色のLEDが組み込まれた種類もあります。 異なる色…。同時に発光すると光の三原色の組み合わせで複数の色を表現できます。赤と緑のLEDであればオレンジを、赤、青、緑のLEDであればフルカラーを表現することができます。 写真右上は1桁に17セグメントが組み込まれています。 |
これらのデバイスを選択する際の注意点は「アノードコモン」、「カソードコモン」です。LED端子のどちら側を共通端子とするかの違いがあります。 |
7セグメントLEDでは出力ポートとの接続、プログラムからの制御手法により適切な種類を選択します。 マトリクスLEDでは…種類の違いを聞きません。が、デバイス自体が正方形なのでデバイスの向きを間違えると表示内容が180度回転、または表示しない(壊れる)場合があるので注意してください。 |
何れの場合でも、1つの電流制限抵抗に対して複数の同時点灯するLEDを接続することは避けてください。前述しましたが同時点灯数が変わると輝度が変化します。 |
(2)7セグメントLED 電卓やデジタル時計で目にすることが多いデバイスで数字の「8」の形状を基本としたLEDです。 7セグメントと言いながら…実はピリオドを含めると8セグメントなんですが…細かい所は気にしないで下さい。 各セグメントLEDの点灯組み合わせにより数字を表現します。数字は良いのですが…英字は難しいです。 |
各セグメントLEDには番号、もしくは英字が割りつけられています。そして複数個のLEDを点灯することで英数字を表現します。 数字の「1」 … b,cを点灯 数字の「3」 … a,b,c,d,gを点灯 数字の「8」 … a,b,c,d,e,f,gを点灯 |
1組の数字の場合は最低9本の端子が必要です。この場合はスタティック制御が可能です。 2組の数字の場合は18本の端子が必要ですが、デバイスによっては2組を1つのデバイスに内蔵して都合10本の端子で済む場合があります(前述の写真左上)。が、この場合はダイナミック制御が必須です。 |
斜め線を補った17セグメントLEDと呼ばれるデバイス(前述の写真右上)もありますが、ピン数が一気に増えます。 |
(3)マトリクスLED 電車の行き先表示やお店の看板等の電光表示板で使用されることが多く、文字や図形を表示することができます。 小さなものは8×8、大きなものになると32×32。個々のLEDの中に複数の色のLEDを組み込んだマトリクスLEDもあります。制御手法はダイナミック制御が前提になります。 マトリクスLEDは縦方向の並びをCOL、横方向の並びをROWと称し、番号が割りつけられています(図左)。 この番号の並びとデバイス背面の端子の並びは必ずしも一致していないのが悩ましい点です。 任意のLEDを点灯する場合は、COL、ROWの一方を単数選択、他方を0個以上の複数選択とします(図中央)。 仮にCOL、ROW共に複数選択を行った場合は電流が足りなくてLEDの輝度が低下します(図右)。 制御の際は必ず一方を単数選択し、電流制限抵抗は複数選択側に接続してください。 |
マトリクスLED選択時はデバイス内部配線におけるLEDの向きに注意してください。2種類のデバイスが製品化されていることがあります。 |
2010.04.12 新規作成(2010.03.02に対して全面変更) |
▲ |
(1)テーマ 割り込みを使用しないダイナミック制御のサンプルプログラムです。 マイコンにはPIC12F683を使用し、スタティック制御とダイナミック制御の表示具合の違いを目で見て確認します。 LEDはLED0/LED1/LED2を使用し、 ・LED0はスタティック制御 … 点灯継続 ・LED1/LED2はダイナミック制御 … 制御周期は32768us、点灯比率は50% します。見掛け上は総てのLEDが点灯している状態です。 今回はスイッチを使用します。 ・SW0 … オン状態でダイナミック制御を停止 プログラムを実行するとLEDは以下の様に制御される予定です(SW0はオフ状態)。 |
(2)回路図、部品の配置 毎度おなじみ、初級編で利用した回路を使用します。マイコンはPIC12F683です。 ブレッドボード上のLEDは左からLED0/LED1/LED2、スイッチは左からSW0/SW1の順番で配置します。 注意:今回はSW0を使用します。SW1の実装は任意です。 |
X1はGND、Y1は3.0Vを接続します。 |
(3)プログラム本体 サンプルプログラムを公開します … Test_Dyn0101.zip 2010.04.20 こちらを利用してください。 開発環境は MPLAB IDE V8.40 と HI-TECH C V9.70 を利用しています。 HI-TECH C v9.70 で作成されたプログラムを v9.81 以降のコンパイラで再コンパイルする際の注意点 → 開発環境による修正 2011/03/09 |
(4)少しだけ解説 サンプルプログラムを見ると非常に単純な構造です。タイムアウトの度に出力データを更新しているだけです。 「スタティック接続されているのに、わざわざダイナミック制御しなくても…」 と思われる方もいると思います。 ですが、ダイナミック制御によりLEDの点灯時間が削減され、装置全体の消費電流を低く抑えることができます。 電池駆動の装置ではダイナミック制御を利用すると電池寿命の延命を図ることができるので、方法論として覚えておくと何かとお得です。 さて。プログラムの構造はPWM制御のページで解説した内容と同等です。 タイムアウト直後に出力データを更新。続いて次回出力用のデータを作成する。という手順です。 PWM制御に関してはこちら(新しいページが開きます) メイン処理の処理時間が安定して確保できない場合は表示を行う処理を割り込みに移動することを勧めます。 今回は同等機能を実現する「割り込みを利用したサンプルプログラム」を略しますが、方法論はPWM制御のページで解説しています。ご参考まで。 |
(5)動作結果 すこし「ちらつき」が気になる動作結果でした。人間の目でも約32ms周期の制御を確認できるようです。 サンプルプログラムを改造すると8通りの制御周期を実験することができるので試してみてはいかがでしょう? Projectフォルダの中(サンプル)に8通りのパターンを用意してありますのでご利用ください。 約16ms周期以下の制御であれば「ちらつき」は気になりません。ただし、静止状態に限ります。 |
左からLED0/1/2の並びです。少しだけLED1/2が輝度が低くなっています。 写真撮影中はSW0をオフしていますが、SW0をオンするとダイナミック制御が停止します。結果としてLED1/2はスタティック制御扱いになり輝度が上昇してLED0と同等の輝度になります。 LED1/2のどちらが点灯扱いになるかは運次第です。 |
PWM制御の時と同様、ブレッドボードを振ってみました。制御周期が遅いので肉眼でも良く見えます。 |
向きが変わって上からLED0/1/2の並びです。 撮影タイミングを合わせるのが難しいのですが、右から左に振った(移動した)時の映像になります。 うまい具合にテーマの波形が反映されています。 ズルはしていない事の証明になりました(笑 |
約32ms制御周期では「ちらつき」が気になる、約16ms制御周期では気にならない旨を前述しました。 一般論ですがダイナミック制御で「ちらつき」が気になる場合は制御周期を短くすれば解決します。ですが、単位時間当たりのダイナミック制御の処理が増えるということは、それだけ他の処理が圧迫されてしまいます。PWM制御の解説でも触れましたが「さじかげん」が微妙です。 約16ms制御周期で大丈夫か?と言われると判断が難しいですが、対象物が静止しているのであれば大丈夫です。 ですが、実験すると良くわかるのですが、約16ms制御周期では振ると「ちらつき」が見えてしまいます。 電車の車体側面に行先表示がマトリクスLEDで表示されています。もし制御周期が遅いとどうなるでしょう?右側面と左側面で挙動が違うと思うのですが、表示される文字が間延びしたり縮んだりするはずです。けど、そのように見えないところを見ると、相当早い周期で巡回している、もしくはスタティック制御していると予想されます。 そろそろ回路図を変えたくなりました。次回はダイナミック制御らしい構成でサンプルを載せたいと思います。 |
2010.04.14 新規作成 |
▲ |
■サンプルプログラム(その2:Complementary LED Drive)
(1)はじめに ネタ元はMicrochip Technology Inc.のアプリケーションノートです。 Complementary LED Drive(TB029) 見つからない場合は本国サイトで「Design」→「Application Note & Software」。「LED」で検索するとヒットします。 この方法を利用した場合、ポートの数を n とし、 n * (n - 1) 個のLEDを制御することができます。 さて、この方法が利用できるのは ・動作中に入力と出力を切り替えることができる汎用入出力ポートであること。 ・ポートに流せる電流だけでLEDを駆動できること。 ・入力ポートに切り替えた場合、ポートの属性がCMOS以外であること。 … これは気分的に自分で追加 という条件が付きます。 今回の方式は多くのPICマイコンで実現できますが、他社製を含め高機能マイコンでは流せる電流量の関係で利用不可なので注意してください。 この方法に限らず、出力ポート数以上のLEDを制御する方法も存在します。呼び名は様々ですが、 ・Chipiplexing方式 ・Charlieplexing方式 ・フロートビット方式 等があります。各方式をクリックすると新しいウィンドウで検索結果が表示されます。 ただ…少々トリッキーな方法なので業務利用は…。ハードウェア担当者と相談してください(汗 |
(2)テーマ 割り込みを利用し、出力ポートの数以上のLEDを制御するサンプルプログラムです。 今回もPIC12F683を再び利用します。そして3つの出力ポートを利用して6個のLEDをダイナミック制御します。 点灯ルールは、約1秒ごとに6個のLEDの表示パターンを切り替えます。見掛け上の同時点灯数の最大は6個ですが、ある一瞬では1個のLEDしか点灯していないので、いかにも「ダイナミック制御」らしい制御です。 LEDの点灯イメージは以下の様になります。 |
(3)回路図、部品の配置 今回もPIC12F683を使用するものの回路図は変更されています。 抵抗値の合計は従来と同じですが、LEDの前後で分割配置するために、個々の値は半分になります。 LEDの接続方法に特徴があります。制御の仕方、どうしましょう? 解答は後述します。 |
X1はGND、Y1は3.0Vを接続します。 |
ブレッドボード上のLEDは左から右に向かってLED0、LED1…LED5になります。 LEDの脚の長い方がアノードです。配置上、アノードとカソードの向きが交互になっているので注意してください。 |
(4)プログラム本体 サンプルプログラムを公開します … Test_Dyn0201.zip (前述の将来的な課題は解消しています) 開発環境は MPLAB IDE V8.40 と HI-TECH C V9.70 を利用しています。 HI-TECH C v9.70 で作成されたプログラムを v9.81 以降のコンパイラで再コンパイルする際の注意点 → 開発環境による修正 2011/03/09 |
(5)LEDの点灯方法 制御が少々面倒ですが、 ・ポートからポートに電流を流してLEDは点灯する。 ・LEDはダイオードの一種で逆向きには電流が流れない。 ・制御対象外のポートは入力ポートにする。 以上の条件をPICマイコンに設定することで任意のLEDを点灯することができます。 任意のLEDを点灯させる場合の制御マトリクスを以下に載せます。 |
SEG | PORT | LED0 | LED1 | LED2 | LED3 | LED4 | LED5 | |
SEG 0 | GP0 | 出力 H | 出力 L | 入力 | 入力 | 出力 H | 出力 L | |
SEG 1 | GP1 | 出力 L | 出力 H | 出力 H | 出力 L | 入力 | 入力 | |
SEG 2 | GP2 | 入力 | 入力 | 出力 L | 出力 H | 出力 L | 出力 H |
ページを前後しなくてもいいようにLEDの部分だけ掲載。 |
1組のポートを出力HL状態、その他を入力ポートに設定することで任意のLEDを点灯することができます。 総てのLEDを消灯させたい場合…総ての出力ポートを出力Lにすれば十分です。 1つのLEDだけを点灯する場合は設定して終了なのですが、複数のLEDを同時点灯している様に見せるためにはダイナミック制御が必要です。今回は6個のLEDを利用しているのでLED0、LED1…LED5と順番に点灯制御しています。サンプルプログラムでは点灯時間が約2msなので、全体の巡回に約24ms要しています。点灯比率は 1/6 です。 ところで、LED0を点灯した場合、非常に僅かですがLED3が点灯します。LED1の時はLED5が。LED2の時はLED4が。どうやら入力ポートから出力Lに向かって電流が流れるようです。今回利用したLEDが小電流高輝度タイプなのでお使いのLEDによっては見ることができないかもしれません。 参考までに今回利用した(これまでもそうですが)LEDは、秋月電子通商さんから購入したものです。 ・赤色LED 3mm OSDR3133A 500mcd 30°100個入(OSDR3133A)、I-00562、100個入りで350円 LED単独実測になりますが、電源3.0V、200Ω接続時にIf6.02mA、Iv1.80Vでした。 |
(6)制御手法 ダイナミック処理を行う過程で発生する情報は大きく分けて、 ・表示イメージ … 見た目の情報 ・制御イメージ … ハードウェア依存の情報 があります。 処理の方法によっては表示イメージと制御イメージが同一の場合もありますが、ここでは分けて考えます。 表示イメージは何らかの事象を元に生成される表示すべき情報です。 今回の場合はLED0~LED5の計6個のLEDを制御しますが、各LEDを制御するための元情報を表示イメージのLSBから順番に割りつけています。場所が1対1で対応するので見易いです。 制御イメージは表示イメージに基づき生成されるハードウェア依存、かつダイナミック制御用の情報です。 ダイナミック制御の場合は定周期で入出力ポートの設定を書き換える必要があります。通常は今回表示している内容と次回表示する内容が異なります。 |
表示イメージの生成タイミングは事象発生タイミングに等しくなります。時間としては…長めです。 制御イメージの生成タイミングはいつでしょう?大きく2通り考えてみました。 その1:入出力ポートを設定するタイミングで必要とする制御イメージを生成する。 定周期制御のたびに制御イメージが作成されるので、情報に変化がない場合は処理時間が増えます。処理が増えるのでスタックに関しては要注意です。反面、制御イメージのバッファが不要でメモリを節約することができます。 その2:表示イメージが生成されるタイミングで制御イメージを生成する。 表示イメージが更新されるタイミングで制御イメージを生成します。定周期制御では参照のみとなり処理時間は最小です。反面、制御イメージをバッファに確保する必要があります。 キャッシュの考え方を適用した第3案も検討できますが、表示イメージが更新された事を定周期制御に通知する必要があります。これは意外と面倒です。 結局のところ、制御イメージを保持するバッファが確保可能であるか否か、処理時間が満足するかで手法を選択するしかなさそうです。 今回のサンプルでは後者(その2)の手法を採用しています。 なお、メイン処理と割り込み処理の双方で制御イメージをアクセスするので要所で割り込み禁止をしています。 |
(7)動作結果 ブレッドボードを振るとチラツキがありますが、静止状態であれば同時点灯は問題ありません。 |
左からLED0、LED1…LED5の並びです。 同時点灯しているタイミングを狙いましたが、カメラのシャッター速度との兼ね合いで「ムラ」が見えるかもしれません。 理想を言えば動画状態で掲載したいのですが… 次回の課題ということで御容赦。 |
2010.04.22 新規作成 |
▲ |