ゆるりとものづくり

ゆるりとものづくり

夢見るおっさんの工作記録

78K0でサーボをコントロール

【映像切り替え機のボタンを外部からInternet経由で押したい】という要望に応えるべく、四苦八苦しています(笑)   色々な思惑や思い込みを経て、結局RC用のサーボをコントロールして、その動きで押させる事にしました。
角度や動作時間を調整することでボタンも優しく押せると思います。 まぁね、ゴタゴタと御託を並べましたけど、結局自作ロボットの稼働部動力源としてもメジャーなサーボが結局は便利ってことで(笑)

ってことで、いきなりですが、これが動作動画です。

制御ソフトウェアとしては、USBシリアルからキャラクタ1文字のコマンドを受け取って、指定されたサーボを動かすようにしています。 今見ると、PWM部分が300カウントで作られていたりちょっと変なのですが、まぁそれなりに動きました(笑) ソースは↓

#pragma sfr

pragma DI

pragma EI

include "trgbios.h" // トラ技BIOSのサービスルーチンを呼び出すのに必要

include

unsigned short ledCount; unsigned char ledPWM0; unsigned char ledPWM1; unsigned char ledSpeedUp;

void intsrv_tim(void) { // PWMをソフトウェアで実現 if(ledCount < ledPWM0) { P1.0 = 1; // ON } else { P1.0 = 0; // OFF } if(ledCount < ledPWM1) { P1.1 = 1; // ON } else { P1.1 = 0; // OFF }

ledCount++;
if( ledCount &gt; 300 )
    ledCount = 0;

// タイマー割り込みフラグをクリア
IF0H.6 = 0;

}

void main() // メイン { unsigned short i; unsigned char standAlone = 0; unsigned char ramMode = 0; unsigned char biosExists = 0; unsigned char first = 1; char str[64];

PM1.0  = 0;
PM1.1  = 0;

ledSpeedUp = 0;

if((unsigned short)main &gt;= 0xf000) // プログラムの開始番地を調べる
{
    // RAM領域で実効しているならばBIOSから起動している
    ramMode = 1;
    biosExists = 1;
}
if((trg_getstatus(NULL) &amp; 0x10) == 0) // Connected
{
    // 既に接続しているならばBIOSから起動している
    biosExists = 1;
}

ledCount = 0;

if(!biosExists)
{
    trg_usbopen();
}

ledPWM0 = 12;
ledPWM1 = 12;
trg_regintsrv(TRG_INTID_BSITM000,intsrv_tim); // 割り込みハンドラ登録

PRM00 = 1;
CR000 = 399;  // 割り込み周期 0.1ms
TMC00 = 0x0C;   // カウント開始
MK0H.6 = 0;     // TM000割り込み許可

while(1)
{
    if((trg_getstatus(NULL) &amp; 0x10) == 0) // Connected
    {
        unsigned short j;
        unsigned char c;

        ledSpeedUp = 0;
        if(first)
        {
            for(j = 0; j &lt; 10000 ; j++) {} // この時間待ちは必須

            trg_puts("Timer Sample Version 1.4 ");
            if(!biosExists)
            {
                trg_puts("Standalone , ");
            }

            if(ramMode)
            {
                trg_puts("RAMn");
            }
            else
            {
                trg_puts("ROMn");
            }
            first = 0;
        }

        if(trg_getrecvcount())
        {
            c = trg_getc();
            if( c == 'a' )
            {
                ledPWM0 -= 1;
            }
            if( c == 'b' )
            {
                ledPWM0 = 15;
            }
            if( c == 'c' )
            {
                ledPWM0 += 1;
            }
            if( c == 'v' )
            {
                ledPWM0 = 12;
            }
            if( c == 'n' )
            {
                ledPWM0 = 19;
            }
            if( c == 'f' )
            {
                ledPWM1 = 12;
            }
            if( c == 'h' )
            {
                ledPWM1 = 19;
            }
        }       
    }
    else
    {
        ledSpeedUp = 1;
    }
}

P1.0 = 0;
P1.1 = 0;
TMC00 = 0x00;   // カウント停止
MK0H.6 = 1;     // TM000割り込みマスク

}

コマンドとしてはa/b/cがそれぞれ順転・センタリング・反転で、v/nでサーボ1を規定角度に動かしたり戻したりします。
f/hでサーボ2が同様の動作を行います。 外部からのコントロールについては、Windows環境にApache+PHP環境を構築して、このモジュール(PHP Serial)を入れる事で実装しました。
(Internet経由のコントロールについては、外部公開用WEBサーバとVPNで繋いで叩かせる仕組み) この仕組みの実験動画はこちら↓

  と、ここまで作ってクライアントに見せに行ったのですが、そこで衝撃の報告を受けます。
「あ、あれさ、スイッチャーの会社に聞いたら、保守用のリモートデスクトップのIDとPWを発行してもらえたんだよね」
「だから、外からはそれで切り替えをコントロールするから、もうボタンを押す機械作らなくていいよ」

・・・まさかの開発中止!

まぁ、楽しかったからそれで良しとします。結構勉強にもなったしね(^^)