無線制御調光器のこと 調光回路のソフトウェアのおはなし
こちらの続き。
今回は、調光制御のソフトウェア部分のはなし。
前段
前回もちらっと解説していますが、制御の流れをざっくり説明すると
- AC電源のゼロクロスポイントでArduino pro mini の2pin(INT pin)にトリガが入る
- ↑の外部割込みで各フォトトライアックをOFFする。(4~7 pin を Lowに)
- 外部割込み後、一定時間経過後にフォトトライアックをONにする。
という流れになっています。
フォトトライアックをONにするタイミングを制御するためのデータは、親機から送られる調光制御データを無線経由でTWE-Lite子機で受け取って、そこからUART経由でArduinoで受けて、最終的にArduino内でタイミング設定のデータに変換して使用する感じになってます。
ここら辺詳しくは次回(以降?)の通信編で解説しようかと。
コード
今回、Arduinoのコードについてはこんな感じで組みました。
※マジックナンバーばっかりだが急いでたんだ。見なかったことにしてくれ。。。
詳細はそれぞれ以下のように。
外部割り込み部
外部割込み部でやってるのは
- 前述のとおりINT2 pin の立ち下がりで割込みを受ける
- 割込みハンドラ内で、各種設定の初期化、各出力ピンをLOWに(トライアックOFF)。
をしている感じです。
コードにするとこんなかんじ。
void intZeroCross(void) { for (int i = 0; i < PARAM_SIZE; i++) { param[i].nowTim = 0; param[i].isRun = true; digitalWrite(param[i].ctrlPin, LOW); } }
タイマ割り込み部
タイマはus刻みで設定できるTimerOneライブラリを使用。
500usに1回割込みさせるTickとして使っています。
で、処理の概要は以下
- もし、各出力ポートに紐づいたカウンタがランニング中だった場合、時間カウント用変数を加算
- さらに加算後に設定値を超えた場合、出力をHIGHに(トライアックON)、ランニングフラグをfalse
- 最後にタイマを再スタートさせる
コードにするとこんなかんじ
void tick500us(void) { digitalWrite(DEBUG_PIN_0, HIGH); for (int i = 0; i < PARAM_SIZE; i++) { if (param[i].isRun) { param[i].nowTim++; if (param[i].nowTim >= param[i].waitTim) { param[i].isRun = false; digitalWrite(param[i].ctrlPin, HIGH); } } } Timer1.restart(); digitalWrite(DEBUG_PIN_0, LOW); }
(デバッグ出力は気にしないでね!)
基本的に500usごとにカウントしているので、1 / 50Hz / 2(半波分) / 500us = 20 で最大20段階の光量調整になります。
親機からの調光制御のデータは0~255でくるので実はだいぶ丸めちゃっているのですが、まああんまり細かくても人間の目にはわからないんじゃないですかね。っていうアバウトな感じでやっています。
(ここらへん調光の仕組みをロジック回路でまるっと作ればもっと精度よくなると思うんだけど、今回はマイコンでの簡易制御だからまあこんなもんかなという感じです。機会あったらやるかも?)
ただし、実はこれだけではちゃんと動かないのです。。。
理由は以下。
TimerOneライブラリのフラグクリア部について
じつは上述のコードでうまく動かなくてずっと悩んでたんですが、TimerOneライブラリの中身を見て理由が判明。
void TimerOne::start() // AR addition, renamed by Lex to reflect it's actual role { (中略) // TIFR1 = 0xff; // AR - Clear interrupt flags // TIMSK1 = _BV(TOIE1); // sets the timer overflow interrupt enable bit }
割り込みフラグのクリア処理がコメントアウトされてますけど!?
ちょっと理由は定かじゃないのですが、タイマをスタートさせる関数で割り込みフラグをクリアしてないんですよね。 というか、そのためのコードが意図的にコメントアウトされているのです。 そりゃ2回目以降のタイマ割り込みが入らないわけですよ。。。
(時間なくあんまり真面目にライブラリ全体を見てないのでもしかしたら何らかの理由があるのかもしれませんが。。。)
なので今回はそこのコメントアウトを外したライブラリを作って使用しています。
以下で一応公開。
皆様もTimerOneライブラリを使用するときはお気をつけください。。。
締め
ということで今回はここまで。 次回は通信編?
追記
続き書きました!
無線制御調光器のこと 調光回路のハードウェアのおはなし
こちらの続き。
調光回路はうまいことAC電源の波形にあわせて制御してあげなければいけません。
今回はそこら辺の話。
前段
単純に電球をON/OFFするだけならリレーやSSRを使うだけで比較的簡単に制御できます。
が、今回調光までやりたかったので制御部分がちょっと複雑になってます。
どういうことかというと、電球の動力となるAC電源は50Hzで波打っているわけです。
だから単純にPWM制御(高速にON/OFFしつつONの幅を変えることで見た目上の明るさを変える制御)するだけだと、AC波形の山のどの部分でONしたかによって明るさが変わってしまうのです。
なので、AC波形がプラスマイナス反転するタイミング(ゼロクロス)をトリガーにしてタイミングを測ってON/OFFする必要が出てきます。
回路
、、、などと難しいことを書いてはみましたが、こういうことに関しては先人の知恵をお借りするのが一番!
ということでこちらのサイトを大いに参考にさせていただきました!
制御方法についてもかなり詳しく解説されているのでとても勉強になります!
簡単に制御のポイントを説明すると
- トランスで降圧したAC波形を両方向フォトカプラに通してゼロクロス検出(フォトダイオードの立ち上がり電圧以下ではフォトトランジスタがONにならないのを利用)
- 上記トリガ波形をマイコンの割込み端子で受ける
- 割込み後一定時間後にフォトトライアックをONにする(どのくらい時間経過したかで明るさが決まる)
- 次のゼロクロス点付近でフォトトライアックが自動でOFFになる
- これらを繰り返す
という感じ。
でこれをもとに作ったのがこちらの回路です。
ほんとはちゃんと回路図エディタで作り直そうと思ったんだけど、めんどくさくなったので手書きのままです。。。 だれか、使いやすい回路図エディタあったら教えて!!!
さてポイントとしては、
という感じでしょうか。
ちなみに今回、スナバレスのトライアックを使っているのでスナバ回路も省略できました! (スナバ回路っていうのはトライアックの出力のON/OFFで発生する急激なサージから保護する回路ダヨ!)
TWE-Lite について
TWE-Liteというのは東京コスモス電機が製造販売しているZigBee無線モジュールです。
超小型IEEE802.15.4/ZigBee無線モジュール TWE-Lite(トワイライト) - TOCOS-WIRELESS.COM
なぜ数あるZigBeeモジュールの中からこれを選んでいるか。
それは、ひとえに簡単だからです!
買った時点で親機と子機をミラーリングするためのファームウェアがすでに入っているので、親機につないだボタンを押したら子機につないだモーターが動く、みたいなことが3秒くらいでできてしまいます!
また、もう少し細かいことをやろうと思ったら子機の各IOやI2Cピンを親機にUART経由でコマンドを送ってあげるだけで制御できるのです!もちろん無線で!
TWE-Liteのすばらしさについては(余力があれば)そのうち別記事でまとめますが、ホントおすすめです。 これのおかげでちょっとしたプロトタイピングなら最近Arduinoすら使わずに作ってしまっています。TWE-Lite、恐ろしい子!
Arduino Pro mini と TWE-Lite の通信について
当初、I2Cで通信させようと画策してたのですが、Arduino Pro mini の I2C 用のピンが変な位置にあるので断念。。。 代わりに今回はUARTで接続しています。
通信については
[PC]<--UART-->[TWE-Lite 親]<--ZigBee-->[TWE-Lite 子]<--UART-->[Arduino Pro mini]
という感じで、結局さっきTWE-Liteをあれだけ褒めちぎったくせに結局まあ普通のZigBeeモジュールと変わらない使い方になっちゃってますが。。。 気にしない方向で。
とりあえず盛りだくさんになりそうなので今回はこの辺で。
次回は、Arduino側のソフトウェアの解説をば。
あ、もう少し詳しく説明して!とか要望あったらコメントくださいね。
それでわ。
追記
続き書きました
無線制御調光器のこと システム概要
こちらの記事の続き poipoides.hatenablog.com
とりあえずまずは無線制御で調光した話。
前段
こんな感じで、たくさんの電球をタイミング合わせて調光制御しております。
今回実は調光器自体をフルスクラッチで自作するという、それはもう完全に面倒くさいことをやっております。
というのも、今回電球を30個ほど制御することになってまして、すべて市販のDMXディマーを使おうとすると高くついちゃうんですね。
しかも、DMXだと配線辛いなあとか制御用PCも数が限られてていろいろ兼用でやらなきゃだからラクに制御したいなあとかうんにゃらかんにゃら、、、
などと言いつつ、結局は作ってみたかったからやりました。はい。
誰しもさ、AC100V制御への憧れ、あるじゃない?
大人の階段、昇りたいじゃない?
本題
今回のシステム構成は以下の感じです。
基本的にはメインPC1台で映像出力、音声出力、調光出力、ボタン入力を捌いています。
調光出力とボタン入力は無線(ZigBee)経由です。
調光器はこんな感じ。
1台で4本分の電球をコントロールできるよう作りました。
で、こちらがボタン
このボタンはなにかというと、パーティーのまん中あたりで点灯式なるイベントを行いまして。ゲストがこのボタンを押すと、照明演出が始まるという仕掛けになっています。
とりあえず概要はこの辺で。 次回は調光回路をもう少し掘り下げて解説したいと思います!
追記
続き書きました
結婚パーティーのためにいろいろつくってみた話
さて、まともなブログ記事1件目がこんな感じで完全手前味噌なのですが、先日結婚パーティーなるものを開催しました!
いろいろな人に来ていただいて楽しい会になったのですが、ココではパーティー自体ではなく、そこで使った「技術」の話をしたいと思っております。
前段
結婚・挙式自体は実は昨年中に済ませてはいたのですが、夫婦2人だけのこじんまりとした挙式だったので別途友人を呼んだパーティーをやりたいね、などと話をしていまして。
で、
せっかくパーティーをやるのであれば普通のじゃつまらないし、なにかしら自分達のパーソナリティが出るものにしたいなと。
で、
私、一応エンジニア。奥さん、一応デザイナー。 ということなのでいろいろ自分たちでつくってみよう!という方向になったのでした。
実際なにをしたのか?
結果的には大きく分けて2つのアトラクション(?)を作って会場で使うことに。
- 照明を無線でピカピカさせるヤツ
- プリクラ的なアプリとその写真を会場に共有するヤツ
(ほんとはもっと壮大な仕組みをいろいろ考えていたのですが…完全に時間がなかった。。。)
実際の様子がこんな感じ。
とりあえずまずはこのへんで
それぞれの詳しい内容についてはこれから解説記事を書いていこうかと。 結構長くなりそうな予感です。
まずは一旦この辺で。。。
追記
続き書きました
ブログをはじめてみようとおもう。
いろいろと、個人的にいそがしいヤマを超えたので、 そろそろと技術ブログ的なことをはじめてみようと思う。
あきたら放置するかも。
そのうち、Qiitaとかに移っているかも。
まあとりあえずは、はてなで頑張ってみよう。 あきるまで、は。