読者です 読者をやめる 読者になる 読者になる

SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

PICで波動砲を打ってみる

波動砲(はどうほう)

波動砲(はどうほう)は、宇宙戦艦ヤマトに搭載されている、超強力な大砲です。(正式名称は「艦首波動砲」だそうです)
波動砲 - Wikipedia

そう、エネルギー充填中に、砲口がどんどん赤く明るくなって、120%充填が完了した後、「打て!」の号令でドカンと打つやつ(わかる人にしか伝わらない・・・)

今回は、この光る部分を、LEDで表現してみました。

回路

色々検索すると、タイマーとコンデンサーで調整された回路が、公開されていますが・・・コンデンサの容量とか考えるのが面倒なので、PICでプログラムしました。
f:id:furuya02:20150814084554p:plain
電源は、乾電池3本(4.5V)を想定しています。PICのデータシートによると、電源入力は4.0~5.5Vって事なので、レギュレータ(安定化)とか省略しちゃってます。
予熱(赤色LED)は、CCPによるPWMで表現し、白色LEDは、単純にデジタルポートでON/OFFしているだけです。
また、クロックも、4Mで充分なので、PIC内臓のものを使用しています。

※PIC16F819は、PIC16F84とかの定番じゃないため、公開されている情報等が少ないせいか、性能は、84より全然上なのに値段は安いというコスパ大なPICです。
f:id:furuya02:20150814084648p:plain

プロググラム

#include<16F819.h>

//INTRC_IO//内部クロックを使用してクロック用ピンをIOとして使用できるようにする設定
//「NOMCLR」を追加すると、「リセット端子を使用しない」設定となり、ICD2のMCLRを外さなくてもPICが動作する

#fuses INTRC_IO,NOPUT, NOWDT, NOLVP, NOBROWNOUT,NOPROTECT//,NOMCLR
#use delay(CLOCK=8000000)//4MHz

void main(void){
	int c=0;
	int duty=0;
	set_tris_b(0x80);

        //CCPの初期化 
        setup_timer_2(T2_DIV_BY_1,0xFF,1);
	setup_ccp1(CCP_PWM);

	// 赤色LEDをOFF(真っ暗)
        set_pwm1_duty(0);
	
	while(true){
                // 徐々に赤色LEDを明るくする
		for(duty=0;duty<0xFF;duty++){
			delay_ms(50);
			set_pwm1_duty(duty);
		}
                // 白色LEDをON
		output_high(PIN_A1);
		delay_ms(3000); // 3秒待機
                // 赤色・白色LED共にOFF
		set_pwm1_duty(0);
		output_low(PIN_A1);
		delay_ms(3000); // 3秒待機
	}
}

全プロジェクトは、こちらです。github.com

動作確認

動作確認している様子です。
f:id:furuya02:20150814083948j:plain
f:id:furuya02:20150814064136g:plain

やっぱり、波動砲青色LEDを足したほうが、いいかな・・・

色が違うとか、タイミングが変とか、色々ツッコミありそうですが、そこはPICなので、プログラムを変えたらOK!
後は、実装ですが・・・なんか、ここに来て、必要性を全く感じなくなって来てしまった・・・