So-net無料ブログ作成

プログラミング [ガンダムヘッド 製作記]

今回は回路を繋いでプログラミングです。

PICには、たくさんの仕事をしてもらいます。
・発射スイッチの監視
  ・待っている間、一定時間で自動的に発射させる
・バルカン砲を発射したら、
  ・バルカンのLED点滅
  ・MP3プレーヤーの再生と停止

この中で、一番面倒なのは、MP3プレーヤーの制御です。
でも今回のプレーヤーは、PAUSEとREWボタンをコントロールすれば良いので、スイッチングは2個で済むから楽チン!と、思っていたらハマりました。
過去の経験では、MP3ブレーヤーのボタンは、真ん中の丸からマイナス(GND)につなげば、スイッチが押された動作をしていました。
ところが、今回のプレーヤーは、GNDに落としても動作してくれない時があり、安定しません。
どうやら、GNDにつなぐだけではなく、ボタンの接点をちゃんと繋がないとダメなプレーヤーでした。
見た目は以前使っていたブレーヤーとそっくりなのに、回路的にはかなり違うみたいです。
仕方が無いので、PICからトランジスタを使ってリレーを動かし、MP3プレーヤーのボタンを押させる事にしました。
GUNDAM HEAD PLUS VULCAN.jpg
RA0とRA1へ、トランジスタ2SC1815を繋いでいます。
たとえば、RA0=1; とプログラムすると、7番ピンのRA0に5Vが出てきて、2SC1815のBも5Vになります。
トランジスタは、Bに電流が流れるとCとEが繋がる動作(スイッチONと同じ)をします。
すると、5Vに繋がっていたリレーのコイルは、マイナスへと電気が流れる道が出来て、電磁石が働いてリレーがONになります。
リレーのコイルは電力を食うので、PICの出力では直接動かせないため、トランジスタでスイッチングしています。

他の部分も見てみましょう。
例えば、RA5=1; とプログラムすると、2番ピンのRA5に5Vが出てきて、保護抵抗330Ωを通ってLEDが点灯します。
RA5=0;とすると、LEDは消えます。

今度はスイッチを見てみましょう。
RA3は、4.7kΩの抵抗を介して5Vに繋がっていますね。
スイッチが押されていないと、RA3は1になっています。
押されるとマイナスに繋がって、RA3が0に変化します。
これをプログラムで検知します。
if(RA3==0){ スイッチON }

いかがでしょうか?
こんなふうに、パーツを組み合わせて、ソフトウェアと連携する感じで回路を作っていきます。
面白いと感じる方もいれば、面倒臭いと感じる方もおられるでしょうね^^

実際に製作した回路です。
実体配線.jpg
MP3プレーヤーのボタンから配線を引き伸ばし、リレー(黒い四角の箱)へと繋がっています。
リレーはPICでコントロールされるトランジスタ(基盤にある黒いカマボコ形)へと繋がっています。
この状態でテストを繰り返し、プログラムを調整したり、MP3ファイルを編集したりして、完成させました。

全てのパーツの高さを、出来るだけ低く製作していたので、100均のコレクションケースの底に収まりそうです。
ガンダムは接着しただけでは不安だったので、ビス止めしました。
ビス止め.jpg
発射スイッチ用の四角穴も開口しています。
レタリング.jpg
このスイッチはLEDを内蔵しているので、バルカン砲を発射している間は点灯する様にプログラムしました。

最終的に完成した、ベースの内部です。
ベース内部.jpg
スイッチを押したらバルカン砲が点滅する それだけならずっと簡単だったのですが、サウンドを付けようと思っただけで、こんなに大袈裟な回路になってしまいました。
色々とトラブルはありましたけど、とりあえず動いてくれたので良かったです^^

最後に、プログラムのソースも公開しちゃいます。
このままコピペ出来ますので、ご自由にお使い下さい。
今回は「電飾しましょっ!2 PIC編」では触れなかったタイマー割り込みという処理をしています。
これはPICに内蔵されたタイマー回路を使って、どんな処理をしていても一定の時間を検知できる仕組みで、今回は50秒のカウントダウンに使っています。
/* 	使用するキット名 GUNDAM_HEAD ガチャ
	日付 2019.01.22    
	PIC12F1822
	プログラマー どろぼうひげ
 スイッチ入力でバルカン発射
 同時にMP3プレーヤー再生、スイッチのLEDオン
 RA0 MP3 PAUSE
 RA1 MP3 REW
 RA2 SW LED
 RA3 SW INPUT
 RA4 VALCAN LEFT
 RA5 VALCAN RIGHT
*/

// PIC12F1822 Configration Bit Settings

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF      // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (Low-voltage programming enabled)

#include 
#include "stdlib.h"
#define _XTAL_FREQ 8000000

unsigned int byou =50;
int Count;

//50秒をカウントダウンする割り込み 
void interrupt intertimer(void){    
    if(TMR2IF == 1){                //タイマー2の割り込みか?
        Count++;                    //割り込み発生の回数をカウント
        TMR2IF = 0;                 //タイマー2割り込みフラグをリセット
        if(Count>=125){             //割り込み8ms×125回で約一秒
            Count=0;
            byou--;
        }
    }
}

void main(void) {

    OSCCON = 0b01110010;	//内部クロック8MHz 4MHz 0b01101010 
    ANSELA = 0b00000000;	// アナログは使用しない(すべてデジタルI/Oに割当てる)
    TRISA = 0b00001000;     // RA3だけ入力その他のピンは出力に割当てる(RA3は入力専用)

    T2CON = 0b00000111; //TMR2 POST 1:1 PRE 1:16
    PR2 = 249;          //タイマーカウント値設定
    TMR2 = 0;           //タイマー2の初期化
    TMR2IF = 0;         //タイマー2割り込みフラグ0
    TMR2IE = 1;         //タイマー2割り込みを許可
    PEIE = 1;           //周辺装置割り込み有効
    GIE = 1;            //全割り込みを許可
    
    PORTA=0;            // 出力ピンの初期化(全てLOWにする)
    char  i;
    
    //MP3 プレーヤーの立ち上がりが一定しないので、byou=1にして、1度だけ強制的に再生する
    __delay_ms(2000);    //MP3 PLAYER START UP WAIT
    byou=0;
    
    while(1){
    
        if(RA3 == 0 || byou == 0){     //スイッチが押されたか50秒経過

            RA2=1;              //スイッチのLED ON
                RA1=1;          //MP3 REW ON
                __delay_ms(300);
                RA1=0;
            
           for(i=0;i<16;i++){   // 16発撃つ
               RA4=1;           //バルカン発光
               RA5=1;
               __delay_ms(60);
               RA4=0;           //バルカン消灯
               RA5=0;
               __delay_ms(60);  //トータルで120ms
           }
           
            RA2=0;          //スイッチのLED OFF
            byou=50;        //経過時間リセット
                RA0=1;      //MP3 PAUSE ON
                __delay_ms(300);
                RA0=0;
        } 
    
    }   //end of while

}	//End of main


※36行目 は、#include <xc.h>(半角に書き直して下さい)です。

43~53行
タイマー割り込み処理の宣言部分です。
グローバル変数 byou が、1秒間隔でカウントダウンします。

61~67行
タイマーの設定です。
2つあるタイマーの、2を使いました。

72~74行
電源ONの際、MP3プレーヤーのPAUSEボタンを押して、一時停止状態にしたいのですが、電源ONの度、プレーヤーの立ち上がり時間が安定していなくて、ボタンを押すタイミングが判りません。
もう仕方ないので、初めに byou = 0 にして一度発砲させちゃう事にしました

76行
このwhile(1){
と101行の}の間がプログラム本体で、他はテンプレートと各種の設定をしているだけです。

78行
ここでRA3のスイッチが押されたかチェックしています。
50秒をカウントダウンしている変数、byouが0でも発射します。

81~83行
MP3ブレーヤーのREWボタンを押し、サウンドを再生開始します。
300ms(ミリセカンド)ボタンをONにしています。

85~92行
16回、バルカン砲のLEDを点滅させています。
この間、サウンドが再生されています。

86~98行
MP3プレーヤーのPAUSEボタンを押し、サウンドストップです。

出来るだけわかりやすく書き直したので、C言語に精通した方には「ぬるい」表記になっている部分もありますが、ご容赦下さいね^^

次回は最終回です。完成画像と動画をご紹介します^^

現在、2つのブログランキングへ参加しています。
1日1回、応援のワンクリックをぜひお願いしますm(__)m
人気ブログランキングへ にほんブログ村 その他趣味ブログ 模型へ


コメント(10) 

コメント 10

toshi

おおお!素晴らしい!
「電飾しましょっ!2」が出版されたことで、こうしたプログラムリストを共有することもできるようになりますね!早速パクらせて頂きますww
by toshi (2019-01-30 09:29) 

どろぼうひげ

toshi さん、こんばんは
ありがとうございます!
この記事を見て、少しでも興味を持ってもらえれば嬉しいです^^
プログラマーにとって、ソースコードを公開するのは、裸で街を歩くのと同じ位、恥ずかしいのですが!
by どろぼうひげ (2019-01-30 19:21) 

澪

(;^_^A(;^_^A(;^_^A(;^_^A(;^_^A解らん。

かなり昔、アニメージュの付録にガンダムの効果音を収録したソノシート!ってのがありましてね。
私まだ持ってます(;^_^A
確かビームライフルの射撃音も収録されてましたね。
by (2019-02-01 17:22) 

なお

こんばんは
先日、仲間のモデラーさんにPICの使い方導入編みたいなことをやったのですが、どろぼうひげさんのあのガンダムヘッドの回路とプログラムですよ~って、ブレッドボードに回路を再現して教材に使わせてもらいました。事後になりましたがありがとうございますm(_ _)m
わかりやすく説明しやすいこのプログラムソースと回路図を公開していただいてたので助かりました。ドロオフ参加者でPIC使いがたぶん二人増えます(^^)
by なお (2019-02-03 21:04) 

どろぼうひげ

澪 さん、こんばんは
それは貴重な音源ですね
大切にして下さいね~^^
by どろぼうひげ (2019-02-04 21:22) 

どろぼうひげ

なお さん、こんばんは
こんなポンコツプログラムでも、お役に立ってくれたなら嬉しいです!
思い切って、ソースコードを公開してよかったです。
PIC使いがどんどん増えてくれるといいなー^^
by どろぼうひげ (2019-02-04 21:29) 

週末ラ族

うわぁ〜私のような初心者には解説付きコード公開は大変ありがたいです!
動画とコードがあるととても解りやすいと思います。
お恥ずかしい気持ちも理解できますが是非布教活動を〜
感謝,感謝です!!!

by 週末ラ族 (2019-02-07 22:08) 

どろぼうひげ

週末ラ族さん、こんばんは
恐れ入ります^^
こんなヘッポコなコードでも、お役に立てるなら嬉しいです。
メッチャ恥ずかしいので、本当はもう公開したくないです^^
by どろぼうひげ (2019-02-07 22:48) 

とおる

こんばんは
プログラム早速コピーさせて頂きました。ありがとうございます。
まだまだ初心者なのでコピーするのが精一杯なのですが、プルアップの内部抵抗を使わないのは何か理由があるのでしょうか?
by とおる (2019-02-10 17:40) 

どろぼうひげ

とおる さん、こんばんは
ソース公開は、ものすごく恥ずかしいのですが、お役に立てた様で良かったです^^
プルアップの件ですが、PIC全てがプルアップ抵抗を内蔵しているわけではありません。
また、回路図からプルアップされていることが読み取れますので、レジスタで有効にして~なんてするより、仕組みが判りやすいためです。

by どろぼうひげ (2019-02-10 20:40) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。