SSブログ

電動化 2 [デロリアン製作記]

今回は電動化の後編です^^
モーターを逆転させたり、正確な位置で停止させるのは手動では無理ですので、マイコンにお願いしちゃいます。
いきなりですが、回路図です。
飛行形態切替回路.jpg
簡単に回路の説明をさせて頂きますね。
一番右端にある2個のスイッチが、前回取り付けた停止位置を検出するためのスイッチです。
普段は4.7kΩの抵抗で5Vに繋げれていて、PICマイコンPIC12F1822のRA0とRA1の端子は5Vになっています。
スイッチがONになるとマイナスに繋がって、繋がっている端子が0Vになります。
ONの時に0になるので、ヘンテコな感じがしますが、この電圧の変化を検知すればスイッチのON/OFFがわかるワケですね。
DRV8835は、モータードライバICです。
内部にAB2つの制御回路が入っているので、AとBを繋いで1つの回路にして出力を上げています。
DRV8835には、IN1とIN2の二つのコントロール端子があって、それぞれの端子にどの様に5Vを加えるかによってモーターの動きを制御できます。
1(5V)と0(0V)にすれば正転、0と1にすれば逆転、1と1ならストップ、組み合わせ方でモーターを正転・逆転・ストップさせることが出来ます。
つまり、2本の端子にどう出力するかで、モーターを自在にコントロール出来るわけです。
プログラムの内容については、後で説明しますね。

制御回路を基板に組み立てました。
制御基板.jpg
右のソケットに、PIC12F1822マイコンをセットします。
左の緑色の基板がモータードライバIC、DRV8835です。
出来るだけ小さく組み立てました。

切替の操作スイッチは、シャーシに穴を開けてプッシュスイッチを取り付けています。
マニュアルSW.jpg
ボディー側の外観を壊したくなかったので、目立たないけど操作しやすい車体の下にスイッチを付けました。

基板を取り付け、モーターやリミットスイッチと接続します。
回路乗せた.jpg
モーターの下に潜り込むようなかたちで制御回路を配置しました。
もうこれでボンネットの中はパンパンです。

回転するネジに平行移動するナットを固定します。
ナット押さえ.jpg
六角形の穴にナットが収まっているので、それが外れないように前後からプラ板で挟む様に固定しました。
ここは大きな力が加わる部分ですので、しっかりと固定しています。

さて、ここからプログラムの説明です。
マイコンのプログラムは、こんな流れで動きます。
電源がONになると、マイコンは2つのリミットスイッチの状態を調べて、今が通常状態なのか、飛行状態なのか、モードをチェックします。
どちらのスイッチもOFFなら、動作の途中で電源が切られたと判断して、通常状態にします。
そして切替スイッチが押されるのを、ずーっと待ちます。
スイッチが押されたら、今通常状態なら飛行状態へ、飛行状態なら通常状態になるように、RA4端子とRA5端子に出力してDRV8835へ正転/逆転の指令を出し、リミットスイッチがONになるまでモーターを回転させます。
モードをセットして、また切替スイッチが押されるのをずーっと待ち続けます。

実際のプログラムです。
初期設定の部分は割愛しています。
#include 
//#include "stdlib.h"
#define _XTAL_FREQ 8000000

void toNOMAL(){         //通常状態(車輪収納)
        RA4=0;          //モーター逆転
        RA5=1;
        while(RA1==1){} //リミットスイッチONになるまでループ
        RA4=1;          //強制ブレーキ
        RA5=1;
        __delay_ms(100);
        RA4=0;          //モーターパワーオフ
        RA5=0;
}

void toFLY(){           //飛行状態(車輪展開)
        RA4=1;          //モーター正転
        RA5=0;
        while(RA0==1){} //リミットスイッチONになるまでループ
        RA4=1;          //強制ブレーキ
        RA5=1;
        __delay_ms(100);
        RA4=0;          //モーターパワーオフ
        RA5=0;
}

void main(void) {
    
    OSCCON = 0b01110010;	//内部クロック8MHz 4MHz 0b01101010 
    ANSELA = 0b00000000;	// アナログは使用しない
    TRISA = 0b00001011;		// RA0,1,3だけ入力に設定
    
    PORTA=0;			// 出力ピンの初期化(全てLOWにする)
    int mode=0;         //状態 0:通常 1:飛行
    RA2=0;          //状態信号 0:通常 1:飛行
    
    //起動時に状態をチェックする-----------------------------
    if(RA0==0){             //現在飛行状態
        mode=1;
        RA2=1;
    }
    if(RA1==0){             //現在通常状態
        mode=0;
        RA2=0;
    }
    if(RA0==1 && RA1==1){    //どちらもOFFなら通常状態に
        toNOMAL();          //変形中に電源切られたかも
        mode=0;
        RA2=0;
    }
    //切替スイッチが押されたらモード変更
    while(1){
        if(RA3==0){             //切替スイッチが押された
            if(mode==0){        //今、通常状態なら
                mode=1;
                RA2=1;
                toFLY();        //飛行状態へ
            }
            else{               //今、飛行状態と判断
                mode=0;
                RA2=0;
                toNOMAL();      //通常状態へ
            }
        }
    }							//End of while
}								//End of main


1~3 マイコンの初期設定部分です。動作周波数を8MHzにしています。
5   toNOMAL()という関数を宣言しました。
   モーターを逆転させて、通常走行状態にして戻るサブルーチンです。
6~7  RA4とRA5に逆転の信号をセットして、モーターを逆転させます。
8    RA1側のリミットスイッチがONになるまで待ちます。
9~10 RA4とRA5に強制ブレーキの信号をセットして、惰性で回ろうとする
    モーターに強制的にブレーキをかけます。
11  ブレーキが効くまで100ms待ちます。
12~13 モーターに電圧をかけたままでは焼けてしまいますから、OFFにします。

16~25 同様に、toFLY()という飛行状態にする関数も宣言しておきます。

27  ここからがプログラム本体です。
29  マイコンの動作周波数を8MHzにセットします。
30  端子は全てデジタルで使う宣言をします。
31  RA0,1,3 (7番、6番、4番)の端子を入力端子として使う宣言です。
33  端子を全て0にセットします。
34  modeという変数を宣言します。0は通常状態、1は飛行状態です。
35  RA2端子は、ほかのマイコンへmodeを知らせる信号を出力します。
   あとで車体裏の発光部分や車輪の発光をこの信号で制御します。

38~50 電源ONで、今の状態をチェックしてmodeをセットしています。
   リミットスイッチがどちらもOFFなら、通常状態に変形させます。

52  ここから 65 行まで永久ループで、プログラムはずっと終わりません。
53  切替スイッチが押されたら、64 行までのプログラムが実行されます。

54~58 今通常状態なら、modeを飛行状態にセットして、RA2端子を1にします。
    飛行状態にする関数 toFLY()を実行して、またループに戻ります。

59~63 今飛行状態なら、modeを通常状態にセットして、RA2端子を0にします。
    通常状態にする関数 toNOMAL() を実行して、またループに戻ります。

プログラムリストと説明を照らし合わせて読んで頂ければ、動作の仕組みをご理解いただけると思います。
回路とプログラムが非常に密接した関係であることがおわかり頂けると思います。
いやらしくて恐縮ですが、回路の仕組みやプログラムの内容は「電飾しましょっ!2 PIC編」や「電飾しましょっ!3Tips編」で詳しく解説していますので、興味のある方はぜひお求め下さい。

次回はまた作業がひと段落したら記事にします。
よろしくお願い致します!



コメント(4) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。