ARDUINOでXYテーブルを作る。(2軸制御)

XYテーブル動作状況(動画)

 先ず、製作したXYテーブル動画です。
 ガイドとボールねじが一体化されているスライドガイドを入手することが出来たので、これまで何回か投稿している一軸スライドガイド(X軸)と一体化し、XYテーブルに改造しました。
 ARDUINO 相当品+CNC-SHIELD から、X軸はA4988ドライバー、Y軸はオリエンタルモーター製のDFC1507 ドライバーを使用し、制御しています。

 前の投稿でも紹介していますが、Gコード送信は、下のエクセルシートからシリアル通信で行っています。動画は“原点復帰”と“連続運転” の様子です。

Y軸パラメータ

 ARDUINOパラメータは次の様に設定しています。
 $22は原点復帰後に移動し、動作原点とする長さですが、Y軸ストロークを100mm 確保する為に短くしています。
 $1はY軸が1mm移動するに必要となるステップ数です。

 Y軸はモーター1回転当り6mm 移動するので、1mm 当りのステップ数は次の様になります。

 360 (度) ÷ 0.036 (度/STEP) ÷ 6 (mm) = 1667 (STEP/mm)

接続状況

 前の投稿とも重複しますので、接続配線は書略しますが、とりあえず接続状況写真を残しておきます。

円弧補間動作(G02,G03)

 下記は円弧補間のテスト動画です。中心座標(100,50)とし、半径10,30,50 mm の円軌道を順番に移動しています。

 円弧補間のGコードは、G02(CW回転), G03(CCW回転)となっています。
  指定形式は次の様になっています。現在位置( X0 , Y0 )を始点として、G02の次にある X,Y では、終点 位置( X1 , Y1 ) を指定します。I,J では、現在位置に対する円弧の中心位置( X0+I , Y0+J )を指定しています。
 整理すると、 現在位置( X0 , Y0 ) から 終点 位置( X1 , Y1 )まで 、( X0+I , Y0+J )を中心とする円弧軌道を指定します。

円弧補間テスト運転プログラム

 エクセルシート上で半径を指定すると、 中心座標(100,50)を固定とする Gコードを生成し、連続的に動作するテストプログラムを作成しました。

 プログラムコードは、以下の通りです。

'円弧補間
Private Sub CommandButton4_Click()
    Dim sht
    Dim res
    Dim cir_R, pos_X, pos_Y
    Dim G_CD As String
    Dim ln_CNT
   
    sht = ActiveSheet.Name
    
    Worksheets(sht).Range("E21:F30").ClearContents
    
    ln_CNT = 0
    
    Do
        cir_R = Trim(Worksheets(sht).Cells(21 + ln_CNT, 3).Value)
        pos_X = Trim(Worksheets(sht).Cells(21 + ln_CNT, 4).Value)
        pos_Y = 50
        
        If cir_R = "" Or pos_X = "" Then Exit Do
        
        G_CD = "G90G0X" & pos_X & "Y" & pos_Y
        Worksheets(sht).Cells(21 + ln_CNT, 5).Value = G_CD
        
        res = StartSerialComm(G_CD, "COM4")

        Do
            Sleep (500)
            DoEvents
        
            res = StartSerialComm("?", "COM4")
            If InStr(res, "Idle") Then
                Exit Do
            End If
        Loop
     
        G_CD = "G90G03X" & pos_X & "Y" & pos_Y & "I" & cir_R & "J0F1500"
        Worksheets(sht).Cells(21 + ln_CNT, 5).Value = G_CD
  
        res = StartSerialComm(G_CD, "COM4")

        Do
            Sleep (500)
            DoEvents    
            res = StartSerialComm("?", "COM4")
  
            If InStr(res, "Idle") Then
                Exit Do
            End If
        Loop
  
        Worksheets(sht).Cells(21 + ln_CNT, 6).Value = res

        DoEvents
        ln_CNT = ln_CNT + 1
        
        If ln_CNT >= 10 Then Exit Do
    Loop
    
    G_CD = "G90G0X0Y0"
           
    res = StartSerialComm(G_CD, "COM4")

    Do
            Sleep (500)
            DoEvents
            res = StartSerialComm("?", "COM4")
            If InStr(res, "Idle") Then
                Exit Do
            End If
    Loop
    
    MsgBox "連続運転完了(" & Trim(Str(ln_CNT)) & ")", vbOKOnly

End Sub

まとめ

 ちょっと感動しました。
 寄せ集めで作ったので、良い方でしょう。