先日、ふと気になって調査してしまった、コクピットドアでピカピカしている点滅、実際に作っててみました。アホですね。こんな事してるのは、おそらく世界中で自分だけかと思いますが、あといじれる部分がレーザー砲の塗装くらいしか残ってないんです。。。
でも、困難にぶち当たりつつもいちおう完成しましたので、ネタでアップです。
まずは、動画をご覧ください
すごくどうでもいい内容ですが、妙な達成感が。。。
調査パターンとLEDの対応
先日解析したパターンがこちら。※記載がEP.4になってました。EP.5に修正しました。(2016.2.11)
で、LEDが以下の通り対応しています。
これにファイバーを1本ずつ振り分ければ実現可能に。。。
しかし、課題はあります。
- どうやって12連ファイバーを埋めるのか
- エッチングパーツの形状は?(四角い穴が開いてるみたいだがサイズが不明)
- 本体のクリアランスが確保できるのか?
など。
先行組みさんの作例を頼りに、できるとこまでやってみるかな。
PICによる点滅回路の実現
今回使用したPICは、PIC12F886(何回も仕様を調べてて、型名覚えちゃいました。。)です。
データシートはこちらです。
高輝度LEDを使用すると、6個くらいで動作が不安定になった
先日大量購入したバルク品の高輝度LED、最初は調子よくホイホイ光らせてたんですが。。
7個目くらいから、しょんぼり点灯(点滅しない)や、点滅速度が不安定になるなど、挙動が怪しくなり、2個あったPICもそれぞれ動作に個体差が生じてきました。配線ミス、接触不良、プログラムミスなどを疑いハマる。。ギブか。。
ここまで来れば意地の世界。あきらめきれず、PICのデータシートとにらめっこしたりするも、時間だけが過ぎていく。。
徹夜しました(笑)
朝ごはんを食べてぼーっとしてたら、ふと1つのPICで扱える電流の合計が200mA程度だという記事を読んだことを思い出す。
これだ!!
高輝度LEDは1個につき、25~30mAを消費するので、明らかに定格オーバーでプログラムを動作させるパワー不足です。
一定電流を流せるCRD(定電流ダイオード)を使うテもありますが、手元にあるのが15mAで、これも、
15mA×12=180mA
となり、LEDだけで上限に近づいてしまう。
ホムセンで、高輝度じゃない一般的なLEDを購入して12個の点滅に成功
手元にあった、近くのホムセンで昔買ったLED(赤で、暗い)を使うことに決定。
急いで買いに行くと2袋(10個)しか在庫がない。。手持ちに3個あったので合計13個。失敗は許されない。
実はLEDって、10分の1位の電流を流しても、結構光ってくれます。
買ってきたLEDは、定格電流は25mAって書いてありますが。。
僅か2mAでも、この通り。
目立たないドアのランプの点滅なので、ギンギラ明るくする必要はありません。今回は、10mA程度でファイバーを通って光ってくれるのを確認したので、10mA位流れるように抵抗を計算。久しぶりにオームの法則を用いる^^;
(これまで3V直結か、CRDに頼りっきりになってたので)
これで、無事12個の同時制御ができました。
プログラムが冗長になってしまった
PICのプログラムの方ですが、今までは8pinのPICしか扱ってなかったので、28pinのPIC12F886のプログラミングには難儀しました。何せ、サンプルコードが少ない。
最低限の設定で、動作には成功しましたが、クロック数の解析がちゃんとできてなくて、2秒サイクルで点滅してるかは微妙です。パラメータを微調整して無理やり調整するか、ちゃんと調べるかしないといけない状態です。
以下が作製したプログラムのコードです。
configの部分とI/O Portの名称を手持ちのチップに合わせれば流用可能かと思います。
単純なパターンなので、本当は先日解析した0,1パターンを配列に格納してループさせればシンプルなプログラムになるんですが、無償版では配列のサポートが無いらしく(怒)、コンパイルで怒られたので非常に冗長なエレガンスでないコードになってしまいました。
悔しいので、配列の格納とループをする部分はコメントアウトして残しています。有償版を買わない限り使えませんし、実際に動かせてないのでちゃんと動くか不明ですが(泣)。。。。
ファルコン号 コクピットドアのランプ点滅プログラム
//******************************************************************************
// DeAgostini STARWARS Millennium Falcon
// Cockpit Backdoor LED Blink Pattern
// Auther : asenchu
// Date : 07/Feb/2016
//
// for PIC16F886
//******************************************************************************
// PIC16F886 Configuration Bit Settings
// 'C' source line config statements
#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG1
#pragma config FOSC = INTRC_CLKOUT// Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR21V // Brown-out Reset Selection bit (Brown-out Reset set to 2.1V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
#define _XTAL_FREQ 125000000
void main() {
GIE = 0; //割り込み無し
ANSEL = 0b00000000; // Digital I/O
TRISA = 0b00000000; // PORTAをすべて出力に割り当て
PORTA = 0b00000000; // PORTA出力ピン初期化
TRISC = 0b00000000; // PORTCをすべて出力に割り当て
PORTC = 0b00000000; // PORTC出力ピン初期化
// LED Blink Pattern
// 無料版は配列非対応
// int blink_ptn[12][19]=
// {
// {1,1,1,1,1,1,1,0,1,1,1,1},
// {0,1,0,1,1,1,0,0,0,0,1,0},
// {1,0,1,1,0,1,0,0,0,0,1,0},
// {1,0,1,1,0,1,1,0,0,0,1,0},
// {1,1,1,1,1,1,1,1,0,1,0,1},
// {0,1,0,1,1,1,1,1,0,1,1,0},
// {1,0,1,1,0,1,1,1,0,1,1,1},
// {1,1,1,1,1,0,1,0,1,1,1,1},
// {1,1,1,1,1,1,1,0,1,1,1,1},
// {0,1,0,1,1,1,0,0,0,0,1,0},
// {1,0,1,1,0,1,0,0,0,0,1,0},
// {1,1,1,1,1,0,1,1,0,1,0,1},
// {1,1,1,1,1,1,1,1,0,1,0,1},
// {1,0,1,1,0,1,1,1,0,1,1,0},
// {1,1,1,1,1,0,1,1,1,1,1,1},
// {1,1,1,1,1,1,1,1,1,1,1,1},
// {0,1,0,1,1,1,1,1,1,1,1,0},
// {1,0,1,1,0,1,1,1,1,1,1,0},
// {1,1,1,1,1,0,1,0,1,1,1,1}
// };
__delay_ms(50);
RA0=0;
RA1=0;
RA2=0;
RA3=0;
RA4=0;
RA5=0;
RC0=0;
RC1=0;
RC2=0;
RC3=0;
RC4=0;
RC5=0;
//無限ループ
while(1) {
// 無料版は配列非対応
// int cnt;
// for (cnt=0;cnt<19;cnt++){
// RA0=blink_ptn[cnt][ 0];
// RA1=blink_ptn[cnt][ 1];
// RA2=blink_ptn[cnt][ 2];
// RA3=blink_ptn[cnt][ 3];
// RA4=blink_ptn[cnt][ 4];
// RA5=blink_ptn[cnt][ 5];
// RC0=blink_ptn[cnt][ 6];
// RC1=blink_ptn[cnt][ 7];
// RC2=blink_ptn[cnt][ 8];
// RC3=blink_ptn[cnt][ 9];
// RC4=blink_ptn[cnt][10];
// RC5=blink_ptn[cnt][11];
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=1;
RC0=1;
RC1=0;
RC2=1;
RC3=1;
RC4=1;
RC5=1;
__delay_ms(3);
RA0=0;
RA1=1;
RA2=0;
RA3=1;
RA4=1;
RA5=1;
RC0=0;
RC1=0;
RC2=0;
RC3=0;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=0;
RA2=1;
RA3=1;
RA4=0;
RA5=1;
RC0=0;
RC1=0;
RC2=0;
RC3=0;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=0;
RA2=1;
RA3=1;
RA4=0;
RA5=1;
RC0=1;
RC1=0;
RC2=0;
RC3=0;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=1;
RC0=1;
RC1=1;
RC2=0;
RC3=1;
RC4=0;
RC5=1;
__delay_ms(3);
RA0=0;
RA1=1;
RA2=0;
RA3=1;
RA4=1;
RA5=1;
RC0=1;
RC1=1;
RC2=0;
RC3=1;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=0;
RA2=1;
RA3=1;
RA4=0;
RA5=1;
RC0=1;
RC1=1;
RC2=0;
RC3=1;
RC4=1;
RC5=1;
__delay_ms(3);
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=0;
RC0=1;
RC1=0;
RC2=1;
RC3=1;
RC4=1;
RC5=1;
__delay_ms(3);
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=1;
RC0=1;
RC1=0;
RC2=1;
RC3=1;
RC4=1;
RC5=1;
__delay_ms(3);
RA0=0;
RA1=1;
RA2=0;
RA3=1;
RA4=1;
RA5=1;
RC0=0;
RC1=0;
RC2=0;
RC3=0;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=0;
RA2=1;
RA3=1;
RA4=0;
RA5=1;
RC0=0;
RC1=0;
RC2=0;
RC3=0;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=0;
RC0=1;
RC1=1;
RC2=0;
RC3=1;
RC4=0;
RC5=1;
__delay_ms(3);
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=1;
RC0=1;
RC1=1;
RC2=0;
RC3=1;
RC4=0;
RC5=1;
__delay_ms(3);
RA0=1;
RA1=0;
RA2=1;
RA3=1;
RA4=0;
RA5=1;
RC0=1;
RC1=1;
RC2=0;
RC3=1;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=0;
RC0=1;
RC1=1;
RC2=1;
RC3=1;
RC4=1;
RC5=1;
__delay_ms(3);
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=1;
RC0=1;
RC1=1;
RC2=1;
RC3=1;
RC4=1;
RC5=1;
__delay_ms(3);
RA0=0;
RA1=1;
RA2=0;
RA3=1;
RA4=1;
RA5=1;
RC0=1;
RC1=1;
RC2=1;
RC3=1;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=0;
RA2=1;
RA3=1;
RA4=0;
RA5=1;
RC0=1;
RC1=1;
RC2=1;
RC3=1;
RC4=1;
RC5=0;
__delay_ms(3);
RA0=1;
RA1=1;
RA2=1;
RA3=1;
RA4=1;
RA5=0;
RC0=1;
RC1=0;
RC2=1;
RC3=1;
RC4=1;
RC5=1;
__delay_ms(3);
// }
}
}
その他注意点など
- プログラムは自由に使用していただいて結構ですが、生じた不具合、損害は関知しません。自己責任でお願いします。
- 出力ポートは、RA0~RA5、RC0~RC5です。(PORTBは使えず。。←調査未です)
- 実際に回路を作製する際は、チャタリング防止やプルアップORプルダウン、念のため
スパコンパスコンを入れる必要があると思います。今回は、無限ループ前に少しsleepさせてだまくらかしてます^^;; - 供給した電源はDC 5V、1A(iPhoneの充電器の仕様と同じ)です。電源については機会があればブログを作製します。
コメント
こんばんは。
ん~。
何が書いてあるのか、僕にさっぱり分かりません。
でも、僕にも分かる所が一ヶ所だけありました。
エッチングパーツの四角い穴のサイズですね!
2×1mmです!!
0.5mmの光ファイバーでも3×4列に並べるのは難しそうですが・・・。
>taraさん
こんばんは!
ありがとうございます。2×1mmですか。。0.25だと入りますね(笑)
エッチング使わずデカールだけ流用しようかな。
現物届いてから、じっくり考えます~。
こんばんは!
動画は意見しました〜!
PICでの制御お見事ですね。最後の「他にやることあるだろ。。」で笑ってしまいましたw
ただ、この情熱はとても素晴らしいと思います。
一旦気になったらどうしてもやらずには居られないという気持ちよく分かります。
私も同じ様な感じですから^^。
>6jiroさん
おはようございます!
>ただ、この情熱はとても素晴らしいと思います。
情熱の掛けどころが違う気がしますが、気になっちゃうのとネタ的なもんと、ここまで来たなら。。という感じです。
折しも、かずさんから回路配置情報が出たので、何とか画策してみようかと。
エッチングパーツの穴の寸法はキビしそうなので、デカールだけ利用して自作もありかなと思い始めています。。