13章:マイクロサーボ SG90の応用(4)ソフト編

    作成2015.01.27

  1. フルカラーLED の購入先と価格
    (1)購入先:秋月電子通商
    (2)品名:イルミネーション・フルカラーLED 5mm 丸型 OSTB5131A−ID 10個入
    (3)価格:¥550
    *単なるかざりとしてつけてみました!!


  2. イルミネーション・フルカラーLED 5mm 丸型 OSTB5131A−IDの仕様
     仕様詳細は13-1.pdfを参照願います。
    [13-1.pdf]をダウンロードする。


  3. 動くおもちゃ回路図
     動くおもちゃ回路図を以下に示します。

    *電源回路は省略しました。
    *DC5V電源が500mAですと容量不足となります。(1000μFコンデンサをつけてもだめでした。)
    *DC5V2Aの電源ですと正常に動作します。
    *3.3V電源は低損失CMOS三端子レギュレータ 3.3V150mA XC6202P332TBと1μFコンデンサを使用しました。
    *SG90-2からSG90-8の電源とGNDは記載を省略しました。
    *アナログ端子とUSBは使用しません。


  4. 赤外線受信関係のプログラムコード
    *アナログ入力もUSBも使用しないため、基本設定は標準的なものとなります。
    (1)関数宣言
    void InitInterTimer0 (void);でタイマー0の初期設定をおこないます。

    (2)グローバル変数宣言
    unsigned short gB=0,gC=0,gT=0;
    *ひとつ前のタイミングでRB0=1の時にgB=1、RB0=0の時にgB=0となります。
    *gCはRB0が0→1に変化してからのタイマーカウンタです。
    *gTはRB0が1→0に変化した時のタイマーカウンタ値を記録します。
    *gTの値が信号パルス幅に比例した値となります。

    (3)void main (void)での呼び出し
    // タイマ0割込み設定関数の呼び出し
    InitInterTimer0();
    // 割込み全体の許可
    GIE = 1;

    (4)タイマ0割込み設定関数
    // タイマ0割込み設定関数
    void InitInterTimer0 (void)
    {
    	// クロック源を内部クロックに設定
    	T0CS = 0;
    	// プリスケーラをタイマ0に割り当て
    	PSA = 0;
    	// プリスケーラ値を64に設定
    	T0CONbits.T0PS0 = 1;//PIC18F4553
    	T0CONbits.T0PS1 = 0;//PIC18F4553
    	T0CONbits.T0PS2 = 1;//PIC18F4553
    	// TMR0レジスタをクリア
    	TMR0 = 0x0000;
    	// タイマ0割込みフラグをクリア
    	T0IF = 0;
    	// タイマ0割込みの許可
    	T0IE = 1;
    }
    

    (5)割込みサービスルーチン
    static void interrupt isr()
    {
            if(gB==1)
            {
                if(PORTBbits.RB0 == 1)
                {
                    gC++;gB=1;
                }
                else
                {
                    gT=gC;gB=0;
                }
            }
            else
            {
                if(PORTBbits.RB0 == 1)
                {
                    gC=0;gB=1;
                }
                else
                {
                    gC=0;gB=0;
                }
            }
    	// タイマ0割込みフラグをクリア
    	T0IF = 0;
    }
    


  5. マイクロサーボ SG90関係のプログラムコード
    (1)宣言
    #define _XTAL_FREQ 48000000 //__delay_msマイコンの動作周波数を設定します。48MHz

    void RUN1(void);//SW1で動作
    void RUN2(void);//SW2で動作
    void RUN3(void);//SW3で動作
    void RUN4(void);//SW4で動作

    (2)void main (void)での呼び出し
    以下のコードで原点復帰をさせます。
            for (  i = 0; i < 10; i++ )
            {
                 PORTDbits.RD0=1;
                 PORTDbits.RD1=1;
                 PORTDbits.RD2=1;
                 PORTDbits.RD3=1;
                 PORTDbits.RD4=1;
                 PORTDbits.RD5=1;
                 PORTDbits.RD6=1;
                 PORTDbits.RD7=1;
                __delay_ms( 1 );
                __delay_us( 500 );
                PORTDbits.RD0=0;
                PORTDbits.RD1=0;
                PORTDbits.RD2=0;
                PORTDbits.RD3=0;
                PORTDbits.RD4=0;
                PORTDbits.RD5=0;
                PORTDbits.RD6=0;
                PORTDbits.RD7=0;
                for (  j = 0; j < 2; j++ )__delay_ms( 10 );
            }
    

    以下のコードで動作を決定します。
    while(1)
    {
                //RUN1();
                if(gT > 0X0020 && gT < 0x0028)
                {
                     RUN1();
                    gT=0;
                }
                if(gT > 0X0010 && gT < 0X0015)
                {
                     RUN2();
                    gT=0;
                }
                if(gT > 0X0009  &&  gT < 0X000D)
                {
                     RUN3();
                    gT=0;
                }
                if(gT > 0X0001 && gT < 0X0006)
                {
                     RUN4();
                    gT=0;
                }
    }
    

    (1)SW1時の動作
    void RUN1(void)
    {
        int i;
    
        for (  i = 0; i < 20; i++ )
        {
            PORTDbits.RD3=1;
            PORTDbits.RD4=1;
            PORTDbits.RD5=1;
            __delay_ms( 1 );
            PORTDbits.RD3=0;
            __delay_ms( 1 );
            PORTDbits.RD4=0;
            PORTDbits.RD5=0;
            __delay_ms( 10 );
        }
        for (  i = 0; i < 30; i++ ){__delay_ms( 10 );}
    
        for (  i = 0; i < 20; i++ )
        {
            PORTDbits.RD0=1;
            PORTDbits.RD1=1;
            PORTDbits.RD2=1;
            __delay_ms( 1 );
            PORTDbits.RD0=0;
            PORTDbits.RD2=0;
            __delay_ms( 1 );
            PORTDbits.RD1=0;
            __delay_ms( 10 );
        }
    
        for (  i = 0; i < 20; i++ )
        {
            PORTDbits.RD3=1;
            PORTDbits.RD4=1;
            PORTDbits.RD5=1;
            __delay_ms( 1 );
            PORTDbits.RD4=0;
            PORTDbits.RD5=0;
            __delay_ms( 1 );
            PORTDbits.RD3=0;
            __delay_ms( 10 );
        }
        for (  i = 0; i < 30; i++ ){__delay_ms( 10 );}
    
        for (  i = 0; i < 20; i++ )
        {
            PORTDbits.RD0=1;
            PORTDbits.RD1=1;
            PORTDbits.RD2=1;
            __delay_ms( 1 );
            PORTDbits.RD1=0;
            __delay_ms( 1 );
            PORTDbits.RD0=0;
            PORTDbits.RD2=0;
            __delay_ms( 10 );
        }
    }
    


  6. 全体プログラム
     詳細は13-1.txtファイルを参照願います。
    [13-1.txt]をダウンロードする。


  7. ソフト編まとめ
    (1)動くおもちゃはUSB通信もアナログ入力も使用しないため、プログラム自体は比較的単純です。
    (2)マイコンとしては、低機能のマイコンでも十分に動作可能と思います。
    (3)マイクロサーボ SG90を同時に3個動作すると5V500mAの電源では容量不足となります。
    (4)乾電池では消耗が早く、交換がわずらわしくなります。
    (5)SG90を同時に3個以上動作するには5V2Aの電源が必要となります。
    (6)マイクロサーボ SG90の停止位置精度はおおざっぱで精密な制御にはむきません。
    (7)動きはおおざっぱのプログラムしました。
    (8)イルミネーション・フルカラーLED 5mm 丸型 OSTB5131A−IDは制御不要ですが、見た目はきれいです。




14章:7セグメントLED表示器に行く。

トップページに戻る。