「数理科学U」 <テキスト1

 

1章 ロボット入門

 

§1 プログラムの基礎

今回作成するロボットは,ヴィストン株式会社のRobovie-MSです.このロボッ

トを動かすのに付属のアプリケーションはありますが,ここではプログラムを作

成して動かします.

 プログラムは,ExcelVBAVisual Basic for Applications)を使って行い

ます.

 

1.VBAの基本操作

     ツールバー(Visual Basic)の表示

ツールバーの「表示(V)」の中のツールバー(T)

より,Visual Basicにチェックを入れます.

角丸四角形吹き出し: Visual Basic Editorの起動 


     Visual Basic Editorの表示

ツールバー(Visual Basic)より,Visual Basic Editor

表示させます.

これに,ユーザーホームを追加

します.

オブジェクト名を「Robovie

Captionを「Robovie-MS」と

します.

これに,コマンドボタンを1個

付けます.このコマンドボタン

のオブジェクト名を「Command

Captionを「命令」とします.

また,シリアル通信のボタン

MSComm)も付けます.

 

 

     通信プログラム

VBAMSCOMMコントロールを使って,ロボットと通信をします.ここでの通信は,

RS-232Cというシリアルの通信規格を使います.

 

<問1> 通信規格RS-232Cについて,調べよ.

 

<例1>        通信プログラム

If MSComm1.PortOpen = False Then

    MSComm1.CommPort = 1                    COM番号

    MSComm1.Settings = 38400,N,8,1      ‘設定パラメータ

    MSComm1.PortOpen = True                 ‘ポートを開く

End If

 

 

       オブジェクトのメソッドとプロパティ

MSComm1のプロパティのPortOpenTrueにするとポートが開かれて通信

できる状態となる.

 

     サーボモータを動かす

Robovie-MSには,腕に6個,脚に10個,首に1個の

17個のサーボモータが入っています.

それらを動かすことによりロボットを動かします.

 

<例2>        サーボモータを動かすプログラム

 

MSComm1.Output =@0030:P1T0068:〜略〜:P1T00a5:: & Chr(10)

       MSComm1のプロパティのOutputに文字列を代入することにより

サーボモータを動かします.

@0030:」に続きP1T0068と入力すると第1サーボモータが,

回転します.( P1T00の部分は,必ず書くこと)

サーボモータは,コロン「:」で区切って指定します.

 

「数理科学U」 <テキスト2

2.VBAの基礎

     初期姿勢の設定

  Robovie-MSは最初に初期姿勢を設定し,そこからの差分としてサーボモータ

を回転させます.

初期値の取得は,Robovie-MSに付属のアプリケーションであるRobovieMaker

バージョン2を使い,このソフトでロボットの初期の姿勢を設定し,保存し

ます.保存ファイル名は,「def.ini」です.

 

 

 

 

 

 

 

 

     初期位置は,すべて127となっています.これに微調整値を加えたものが初期

姿勢となり,サーボモータはその位置に回転します.

 

     サーボモータの順番

軸番号は128まであるますが,実際に使っている軸番号は17個です.

 

 

     16進数への変換

Excelの関数として,10進数を16進数へ変換するDEC2HEX()という関数がありますが,

ツール(T)の中にある分析ツール(D)使える状態にしておく必要があります.

この16進数に変換した文字列をMSComm1.Outputに代入します.

代入する書式は,<例2>を参照してください.

 

     Excelのワークシートの活用

初期姿勢のデータやサーボモータを回転させる数値は,ワークシートに記述し,

プログラムでそれを取り扱います.

 

<例3>        ワークシートへの記述(シート名「Robovie」)

        ワークシートへ

初期位置と微調整値

       を十進数で入力し,

       それらを加えたもの

       を16進数に変換し

       ます.

 

     〔プログラム例〕

Sub Robovie()

         If MSComm1.PortOpen = False Then

           MSComm1.CommPort = 5                'COM番号

           MSComm1.Settings = "38400,N,8,1"    '設定パラメータ

           MSComm1.PortOpen = True             'ポートを開く

         End If

          s$ = "@0030": h$ = "P1T00"

               For k = 1 To 28

                 s$ = s$ & ":" & h$ & Sheets("Robovie").Cells(k + 1, 7)

               Next

               MSComm1.Output = s$ & Chr(10)

End Sub

 

 

<練習1> ワークシートへ微調整値を入力し,ロボットを初期状態の姿勢にさせよ.

 

「数理科学U」 <テキスト3

3.VBAによるモーションの作成

 ・モーションの作成

 初期姿勢が決まれば,次にその位置からの差分としてサーボモータを回転させます.

その値をExcelのワークシート「Motion」に入力します.

 その値をRobovie-MSに伝えて動かします.

 

<例4>        ワークシートへの記述(シート名「Motion」)

雲形吹き出し: ここへ回転させる数値を-128〜128の範囲で入力する.  

 

 

 

 

 

                    ※ 入力する数値に[初期位置]                       

                      と[微調整値]を加えて実際    

                      のサーボモータの回転値が

                      決まりますので,実際値が

                      0255 の範囲に収まって

いなければならないことに

注意する必要があります.

 

2年の復習> 4つのモーションをワークシート(「Motion」)へ入力して,

その値をワークシート(「Robovie」)の[移動値]のセルへ複写するプログラム例

     For m = 1 To 4

             For k = 2 To 29

                Sheets("Robovie").Cells(k, 5) = Sheets("Motion").Cells(k, m + 1)

             Next k

          Next m

 

 

・ロボットの動作をVBAで

      Robovie-MSは,一度に送れる動作が45までしかありません.それ以上の動作

をさせるには,Robovie-MSからRS-232Cを通じて,受け入れ状態にある返事を

受け取ってからでないと次の動作が送れません.これについては,次回で考え

ることにして,今回は4コマ動作をさせることにします.

 

<例5>         ロボットに4コマ動作をさせる

        ワークシート(「Motion」)に4つの動作を入力し,その動きをロボッ

トにさせる.

   〔プログラム例〕

Sub Robovie()

If MSComm1.PortOpen = False Then

MSComm1.CommPort = 5                'COM番号

MSComm1.Settings = "38400,N,8,1"    '設定パラメータ

MSComm1.PortOpen = True             'ポートを開く

End If

For m = 1 To 4

For k = 2 To 29

 Sheets("Robovie").Cells(k, 5) = Sheets("Motion").Cells(k, m + 1)

Next k

s$ = "@0030": h$ = "P1T00"

For k = 2 To 29

s$ = s$ & ":" & h$ & Sheets("Robovie").Cells(k, 7)

Next k

MSComm1.Output = s$ & Chr(10)

Next m

End Sub

 

 

<練習2> 4コマ動作で1つのアクションを作成せよ.

 

「数理科学U」 <テキスト4

4.Do〜Loop

一定回数を繰り返す文として,「For〜Next文」を学習しましたが,ある

条件を満たす間,繰り返す文として,「Do〜Loop文」があります.

 条件として,While(条件を満たす間)またはUntil(条件を満たすまで)の2

通りの方法で指定します.

 また,条件を記述する場所として,DoまたはLoopの後の2通りがあります.

    今回は,DoLoop Until (条件) を使います.

 

<例6>        DoLoop Until (条件)

雲形吹き出し: Do〜Loopは,これを書き落とすと,無限ループとなるので注意せよ.Sub Test()

k = 0

Do

          k = k + 1

          Cells(1, k) = k ^ 2

Loop Until k > 9

End Sub

 

 

・ロボットにコマンドを送る

 Robovie-MSの頭脳には,多くの命令を貯めておくことはできません.沢山の命令を

送ると誤作動を起こします.これを防ぐには,命令を受け付ける状態にあるかどうか

を調べ,受け付ける状態になったときに命令を送る必要があります.

 RS-232Cを通して,Robovie-MSの受け入れ状態を調べます.

    ロボットに,文字列":C0000Q00"を送り,次に,ロボットの情報を受け取ります.

受け取った文字列の9番目数字が,現在,ロボットに蓄えられているコマンドの数に

なっているので,これが6より小さくなった段階で,コマンドを送ればよいことにな

ります.9番目の文字列を取り出すために,今回,文字列処理関数としてMid関数を

使います.

     <例> 文字列S$5番目の文字から3個の文字を取り出す

        Mid(S$,5,3)

 

 

<例7>        ロボットがコマンドの受け入れ状態になるまで待つ

       String_Num = Len(s$)

       Do

         MSComm1.Output = ":C0000Q00" & Chr(10)

          Do

雲形吹き出し: このDo〜Loopは,時間調整をしている.            DoEvents

          Loop Until MSComm1.InBufferCount >= 9

          Q_Check = MSComm1.Input

          QN = Val(Mid(Q_Check, 9, 1))

        Loop Until QN < 6

  MSComm1.Output = s$ & Chr(10)

        Do

          DoEvents

        Loop Until MSComm1.InBufferCount >= String_Num

        Trash = MSComm1.Input

 

 

      ※ MSComm1.Input ・・・ RS-232Cを通してロボットから,文字列(情報)

を受け取る.

        Val ・・・ Value(値)の略で,数字の文字列を数値に変換する.VBA

プログラムでは,同じ数字であっても文字と数値の区別がある.

 

         変数QNには,現在,ロボットが蓄えている命令数が入る.したがって,

これが5以下になれば,次の命令を送ることになる.

 

<練習3> Excelの各シートにロボットの基本動作を作成し,その動作を

   組み合わせて動かすプログラムを作成せよ.

 

<練習4> Robovie-MSExcelの図形描画またはPower Point作成せよ.

        ただし,アニメーションができるように考慮せよ.

 

「数理科学U」 <テキスト5

5.通信方法

    ロボットとの通信は,RS-232Cを使って行います.これに対するVBAのプログラ

ムとしては,MSCOMMコントロールがありますが,フリーのプログラムもあります.

 次に,木下 隆さん(http://www.activecell.jp/)が作られたEasyComm

を使って,<例7>書き換えてみましょう.

雲形吹き出し: VBAを利用して,RS232Cポートを
アクセスするためのモジュールです.

<例1>        EasyCommによる通信

   2つのモジュール(ec.basesDef.bas

をインポート(I)する.

 

 

 

 

 


        ボタン〔TestMotion〕をクリックした

       ときのプログラム.

 

 

Private Sub TestMotion_Click()

        ec.COMn = 1               ' COM1を開く

        ec.Setting = "38400,n,8,1"     ' 通信条件の設定

        ec.Delimiter = "LF"           ' 文字列を送ったときにCHR(10)(=LF)を追加する

        For m = 1 To 7

           For k = 2 To 29

            Sheets("Robovie").Cells(k, 5) = Sheets("Motion").Cells(k, m + 4)

           Next k

           s$ = "@0030": h$ = "P1T00"

           For k = 2 To 29

              s$ = s$ & ":" & h$ & Sheets("Robovie").Cells(k, 8)

           Next k

          String_Num = Len(s$)

          Do

              ec.AsciiLine = ":C0000Q00"

              Do

                  DoEvents

              Loop Until ec.InBuffer >= 9

              Q_Check = ec.AsciiLine

              QN = Val(Mid(Q_Check, 9, 1))

          Loop Until QN < 6

          ec.AsciiLine = s$

          Do

              DoEvents

          Loop Until ec.InBuffer >= String_Num

          ec.InBufferClear

      Next m

      ec.COMn = 0                  ' すべてのCOMを閉じる

   End Sub

 

       マニュアルはしっかりできていますので,参考にしてください.

<参考>〔ロボットの基本姿勢〕

      ロボットを歩かせるための姿勢

としては,足の関節に余裕を持た

せる必要があり,突っ立っていて

はだめである.次のモーションは

試行錯誤で作ったものであり,不

完全なものである.