24章:3次元パソコン制御ルータ加工機の製作(3)制御編

    作成2015.05.11


  1. 3次元パソコン制御ルータ加工機制御回路図
     3次元パソコン制御ルータ加工機制御回路図を以下に示します。

    *ユニポーラ ステッピングモーター PF42T−96C4をトランジスタアレイ(7chダーリントンシンクドライバ)TD62003APGで駆動します。
    *圧力センサーFSR400 SHORTの抵抗値変化を抵抗分圧し、2回路入汎用オペアンプ(フェアチャイルド製)LM358Nで電圧フォロアします。

     トランジスタアレイ(7chダーリントンシンクドライバ)TD62003APGの仕様詳細は24-1.pdfを参照願います。
    [24-1.pdf]をダウンロードする。

     2回路入汎用オペアンプ(フェアチャイルド製)LM358Nの仕様詳細は24-2.pdfを参照願います。
    [24-2.pdf]をダウンロードする。


  2. 3次元パソコン制御ルータ加工機制御回路外観
     3次元パソコン制御ルータ加工機制御回路外観を以下に示します。



  3. 評価プログラム
     まずは下記の「41-24.zip」ファイルをダウンロードしてください。
    [41-24.zip]をダウンロードする。

    解凍するとフォルダー内にUMy-CDC-BasicフォルダーとVB2010 Simple CDC Demoフォルダーがあります。

    (1)UMy-CDC-Basicフォルダー
    *My-CDC-Basic.Xがソースプログラムです。
    *「XC8」用です。

    (2)VB2010 Simple CDC Demoフォルダー
    *VB2010 Simple CDC Demo.slnがソースプログラムです。
    *ドット文字用CDC.exeがWindows用実行ファイルです。(ダブルクリックで起動します。)
    *2.bmpが彫刻ビットマップファイルサンプルです。
    *Windows用です。

    (3)注意事項
    *上記プログラムはPIC18F4553用です。


  4. 操作方法
    4.1 USB接続
    (1)PIC18F4553にプログラムを書込みます。
    (2)USBを接続し、ドット文字用CDC.exeを起動します。
    (3)COMを「COM7」にセットして、「Conect」ボタンを押します。


    4.2 圧力センサーの検出値の取得
    (1)Send Dataに「AD#」を設定して「Send Data」ボタンを押します。
    (2)圧力センサーの検出値を受信します。


    4.3 DCモータのON/OFF
    (1)DCモータのONの場合、Send Dataに「DC#1#」を設定して「Send Data」ボタンを押します。
    (2)DCモータのONの場合、Send Dataに「DC#0#」を設定して「Send Data」ボタンを押します。(1以外はOFFとなります。)
    (3)受信データはありません。


    4.4 XYZステージの相対値移動
    (1)XYY方向とも0.5mmプラス方向に相対移動する場合、Send Dataに「MR#96#96#96#」を設定して「Send Data」ボタンを押します。
    (2)移動後の絶対座標を受信します。
    (3)Send Dataに「MR#-96#-96#-96#」を設定するとマイナス方向に移動します。
    *プラス・マイナスの方向はバーニア目盛の方向と一致させました。


    4.5 XYZステージの絶対値移動
    (1)XYY方向とも原点する場合、Send Dataに「MA#0#0#0#」を設定して「Send Data」ボタンを押します。
    (2)移動後の絶対座標を受信します。
    (3)Send Dataに「MA#-96#-96#-96#」を設定するとX=-0.5mm,Y=-0.5mm,Z=0.5mmに移動します。
    *プラス・マイナスの方向はバーニア目盛の方向と一致させました。


    *以上が基本コマンドの全てです。
    *パソコン側から、以上の基本コマンドを送信して、3次元パソコン制御ルータ加工機を制御することになります。
    *具体的な制御は、加工物の材質、形状、加工形状等に依存するため、目的に応じた最適化が必要です。
    *XYZステージはバックラッシュがあるため、位置決めの際一方向から追い込む必要があります。
    *加工後のXYZ移動は、XYZ同時に行うと引っかかる場合があり、XYZの移動順序も最適化する必要があります。
    *加工速度は加工物の材質に依存します。
    *ダイヤモンドピットはガラスや石のように硬くて脆い素材に適するようです。
    *ダイヤモンドピットの加工速度は、一般的には遅く、ダイヤモンドピットの加工速度に応じた位置の制御が必要となります。
    *パソコン側の制御ソフトは目的に応じて、最適化が必要となります。

    4.6 Zサーチ
     加工実行前に加工物表面のZ位置を自動計測します。
    (1)加工物をおいて、「Zサーチ」ボタンを押すと加工物表面のZ位置を自動計測します。

    *上の結果は加工物表面のZ位置が1940(パルス)であることを意味します。

    4.7 加工実行
     加工実行の前にZサーチを実行する必要があります。
    (1)「加工実行」ボタンを押すとオープンファイルダイアログが表示されますので「2.bmp」を開きます。
    (2)加工が実行されます。

    *上記の受信データにおいて、iがX方向座標、jがY方向座標、gZ0が加工物表面のZ位置を示しています。

    4.8 t2mmSUS430板に加工された文字
     t2mmSUS430板には以下の文字が確認できます。


    4.9 加工面高さデータの保存
     加工面高さデータを保存できます。
    (1)「計測保存」ボタンを押すと保存ファイルダイアログが表示されますので、ファイル名と場所を指定して保存します。
    *Y座標が上下で反転します。
    *加工無しの座標は高さが0となります
    1960198019801980
    2000000
    0200000
    0020000
    0001980
    2000001980
    0200019800


  5. My-CDC-Basic.Xプログラムコードのポイント
    *MPLAB_X_IDE_v2.25とPIC18F4553マイコンの復習、3章:サンプルプログラムのファイル 構造の変更とカスタマイズをベースに修正しました。
    (1)グローバル変数
    system.hに定義しました。
    void InitInterTimer0 (void);
    #define _XTAL_FREQ  48000000             //__delay_ms
    unsigned char gCT=0;//Timer0割込みカウンタ
    unsigned char fDC=0;//DCモータON-OFFフラグ
    
    short gX0=0,gY0=0,gZ0=0;//現在座標
    short gX1=0,gY1=0,gZ1=0;//目標座標
    unsigned char CHxy[4] = { 0x08,0x04,0x02,0x01};//XY1相励磁パターン
    unsigned char CHz[4] = { 0x01,0x02,0x04,0x08};//Z1相励磁パターン
    unsigned char MCx=0,MCy=0,MCz=0;//XVZ移動中フラグ
    unsigned char fOutM=0;//XVZ移動完了報告フラグ
    
    (2)タイマ0割込み設定関数と割込み処理関数
    *当初、DCモータのPWM制御のため、使用しました。
    *3.3V電圧レギュレータに変更したため、あまり意味がありません。
    
    (3)AD変換処理関数
    *app_device_cdc_basic.cとapp_device_cdc_basic.hに定義しました。
    *AD変換を行います。
    unsigned short ADC0()
    {
        unsigned short result;
        long X;
    
        ADCON0bits.GO = 0;              // Stop AD conversion
        __delay_us( 100 );
        ADCON0bits.CHS = 0b0000; //Analog Channel Select bits=Channel 0 (AN0)
        __delay_us( 100 );
        ADCON0bits.GO = 1;              // Start AD conversion
        while(ADCON0bits.NOT_DONE);     // Wait for conversion
        result=ADRESH*256+ADRESL;
        return result;
    }
    
    (4)USB受信処理関数
    *app_device_cdc_basic.cとapp_device_cdc_basic.hに定義しました。
    *USB受信処理を行います。
    void MyCDCBasicTasks()
    {
        if( USBUSARTIsTxTrfReady() == true)
        {
            uint8_t i,j,k;
            uint8_t numBytesRead;
            unsigned char FIN[5][20];
    
            double X1,X2,X3;
            uint8_t I1,I2,I3;
    
            numBytesRead = getsUSBUSART(readBuffer, sizeof(readBuffer));
    
            if(numBytesRead > 0)
            {
                j=0;k=0;
                for(i=0;i5){j=4;}
                        k=0;
                    }
                    else
                    {
                        FIN[j][k]=readBuffer[i];
                        k++;if(k>20){k=19;}
                    }
                }
                int TEST=1;
                if(FIN[0][0]=='A' && FIN[0][1]=='A' && FIN[0][2]==0)
                {
                    X1=atof((const char *)FIN[1]);
                    X2=atof((const char *)FIN[2]);
                    X3=X1+X2;
    
                    sprintf(writeBuffer,"%.2f + %.2f = %.2f\r\n",X1,X2,X3);
                    numBytesRead = strlen(writeBuffer);
                    putUSBUSART(writeBuffer,numBytesRead);
                    TEST=2;
                }
    
                if(FIN[0][0]=='D' && FIN[0][1]=='C' && FIN[0][2]==0)
                {
                    I1=atoi((const char *)FIN[1]);
                    if(I1==1)
                    {
                        fDC=1;
                    }
                    else
                    {
                        fDC=0;
                    }
                }
    
                if(FIN[0][0]=='A' && FIN[0][1]=='D' && FIN[0][2]==0)
                {
                    sprintf(writeBuffer,"AD\t%d\r\n",ADC0());
                    numBytesRead = strlen(writeBuffer);
                    putUSBUSART(writeBuffer,numBytesRead);
                }
    
                if(FIN[0][0]=='M' && FIN[0][1]=='R' && FIN[0][2]==0)
                {
                    gX1=gX0+atoi((const char *)FIN[1]);
                    //gX1=100;
                    gY1=gY0+atoi((const char *)FIN[2]);
                    gZ1=gZ0+atoi((const char *)FIN[3]);
                }
    
                if(FIN[0][0]=='M' && FIN[0][1]=='A' && FIN[0][2]==0)
                {
                    gX1=atoi((const char *)FIN[1]);
                    gY1=atoi((const char *)FIN[2]);
                    gZ1=atoi((const char *)FIN[3]);
                    if(gX1==gX0 && gY1==gY0 && gZ1==gZ0){fOutM=2;}
                }
    
            }
            else
            {
                if(fOutM==2)
                {
                    sprintf(writeBuffer,"MC\t%d\t%d\t%d\r\n",gX0,gY0,gZ0);
                    numBytesRead = strlen(writeBuffer);
                    putUSBUSART(writeBuffer,numBytesRead);
                    fOutM=0;
                }
    
            }
        }
        CDCTxService();
    }
    


  6. Windowsプログラムのポイント
    *VB2010 Simple CDC Demoをベースに作成しました。
    *Private Sub Timer1_Tick関数を1ms毎に呼び出し、シーケンスサブルーチンを実行する方式にしました。
    *シーケンス進行条件を満足するとシーケンスNoが変更され、次のシーケンスが実行されます。
    *反省になりますが、シーケンスNoを10番ごとに設定するのが良かったと思います。
    *シーケンスNoを1番ごとにすると、シーケンスの追加が面倒になります。(シーケンスNoの統一性がなくなってしまいました。)
    *Windowsプログラムは目的により、プログラムの最適化が不可欠となります。


  7. 制御編まとめ
    (1)3次元パソコン制御ルータ加工機の製作はかなり大変で時間がかかってしまいました。
    (2)最初の難関はΦ3のSUS430丸棒を加工して、M3送りネジの製作でした。
    (3)Φ3のSUS430丸棒のダイス加工はかなり大変でてこずりました。
    (4)第二の難関はDC電源の統一化でした。DC12VとDC3Vの電源を用意すれば問題はなかったのですが、DC12V、5Aに統一しました。
    (5)DCモータのPWM制御がうまくいけばよかったのですが、電流の大きいDCモータのPWM制御は、マイコンやUSB通信の誤動作が発生し、結果的にDCモータを破損してしまいました。
    (6)電圧レギュレータを十分大きな放熱板に固定する方式にしました。
    (7)マイコンのプログラムは、必要なコマンドが限られており、比較的簡単でした。
    (8)反面、Windowsプログラムは、最適なコマンド順序決定が難しく、てこずりました。
    (9)位置決め時の一方向送りや、加工後Z方向ににげてからのXY移動等、Windowsプログラムで決定されます。
    (10)Windowsプログラムに関しては完全なものではなく、目的に応じて修正が必要となります。




25章:AE-USBPIC44基板間のシリアル通信USART(非同期)に行く。

トップページに戻る。