I2Cによる群制御
I2Cによる群制御
群制御
I2Cの利用例として、3枚のI2Cボードを制御して、蛍型の発光表示を行う例を紹介します(製作、プログラムは伊藤 彩)。
目的
1枚の基板で3個のLEDをPWM点灯します。PWM点灯により、蛍のような明滅を行います。この基板3枚用いて合計9個のLEDの点滅を制御します。
回路構成
フルカラーLED
フルカラーLEDでは発光がきついので、ティッシュでくるみ、さらに、梱包用の「プチプチ」で包みました。
これを、植え込みや木にかけて配置します。
スレーブ回路
(A6,A7,A3)、(A3,A1,A0)、(B2,B3,B5) で、フルカラーLEDのRGB端子を制御しています。他に I2C の制御端子(SCL,SDA)、ICSP によるプログラム端子、の接続が必要です。B0 につけたLEDはプログラムの監視用で、I2Cによる割り込みがあると点灯します。
マスタ回路
マスターの回路 I2C と焦電センサーを接続します。 I2C のマスター側には、I2Cのラインをプルアップする抵抗が必要です。
焦電センサーは、NAPIONを利用しました。GND端子は金属ケースに接続されています。これは、アンプが組み込まれた赤外線のセンサーで、人体などが発生する赤外線の変化を捕捉して、0.1mA 程度の電流を流してくれます。これをトランジスタで受けて電圧に返還し、A0端子で読み取ります。電流は0.5〜2秒程度続きますから、これを検知すると、追加の発光を行います。
電源
フルカラーLEDが3.5V以上の電圧と1個当り最大50mA程度の電流を食べますから、2次電池 4本 を電源とします。2次電池 は SANYO の NiH型の eneloop を利用しました。これは、メモリー効果問題を解消しかつ保存期間が長い(自己放電が少ない)優秀な電池です。容量1本で2000mAHあります。これは、平均1Aの電流を2時間流せる容量です(電圧は1.2Vです)。
プログラム
I2Cのアドレスとコマンド
3枚のボードは別々のアドレス(0x60,0x62,0x64)を割り当てています。このアドレスは、ハードではなく、スレーブのソフトで定めています。
#use I2c(slave,sda=PIN_B1,scl=PIN_B4,address=0x64,force_hw)
I2C では、1バイトのフラグ(整数値)を送っています。この値により、同時に発光するLEDのグループを定めています。
マスタープログラム
各ボードに発光パターンを送り、暫く休止することを繰り返します。ここのプログラムで、発光するLEDが決定されます。各LEDの発光パターンは各ボードの 発光パターンを定める配列で定まります。
全体のソースは
こちら
にあります。
スレーブプログラム
基本的には、蛍型発光の手法を利用しています。PWMのループの中で9種類の発光を制御しています。発赤と緑の光のパターンは RG[]で、青のパターンは B[] で独立に定めています。配列の値を変えることで、微妙な色の変化を設定できます。
各時刻で、発光させるグループは I2C の割り込み処理(ssp_interupt ()Iから渡される Flag の値で定まります。
全体のソースは
こちら
にあります。
課題・改善点
発光パターンを送る
マスタから発光パターンを I2C で送信可能にすると、スレーブのプログラムの変更なしにLEDの発光パターンを変更できます。
途中で発光パターンを変更すると、より変化のある発光を実現できます。
発光周期
発光パターンだけでなく発光の周期(長さ)も変更可能です。
センサー
現在のプログラム(回路)では、検知した場合とそうでない場合の差が余りありません。通常はひっそりと発光し、人が近づくとにぎやかに(?)発光するのが目的でした。赤外線だけでなく、音(音声や拍手)を検知すると良いかもしれません。