「数理科学U」 <テキスト1>
第1章 ロボット入門
§1 プログラムの基礎
今回作成するロボットは,ヴィストン株式会社のRobovie-MSです.このロボッ
トを動かすのに付属のアプリケーションはありますが,ここではプログラムを作
成して動かします.
プログラムは,ExcelのVBA(Visual
Basic for Applications)を使って行い
ます.
・ ツールバー(Visual Basic)の表示
ツールバーの「表示(V)」の中のツールバー(T)
より,Visual Basicにチェックを入れます.
・ Visual Basic Editorの表示
ツールバー(Visual Basic)より,Visual Basic Editorを
表示させます.
これに,ユーザーホームを追加
します.
オブジェクト名を「Robovie」
Captionを「Robovie-MS」と
します.
これに,コマンドボタンを1個
付けます.このコマンドボタン
のオブジェクト名を「Command」
Captionを「命令」とします.
また,シリアル通信のボタン
(MSComm)も付けます.
・ 通信プログラム
VBAのMSCOMMコントロールを使って,ロボットと通信をします.ここでの通信は,
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のプロパティのPortOpenをTrueにするとポートが開かれて通信
できる状態となる.
・ サーボモータを動かす
Robovie-MSには,腕に6個,脚に10個,首に1個の
計17個のサーボモータが入っています.
それらを動かすことによりロボットを動かします.
<例2> サーボモータを動かすプログラム
MSComm1.Output =“@0030:P1T0068:〜略〜:P1T00a5::” & Chr(10)
※ MSComm1のプロパティのOutputに文字列を代入することにより
サーボモータを動かします.
「@0030:」に続きP1T0068と入力すると第1サーボモータが,
回転します.( P1T00の部分は,必ず書くこと)
サーボモータは,コロン「:」で区切って指定します.
「数理科学U」 <テキスト2>
・ 初期姿勢の設定
Robovie-MSは最初に初期姿勢を設定し,そこからの差分としてサーボモータ
を回転させます.
初期値の取得は,Robovie-MSに付属のアプリケーションであるRobovieMaker
バージョン2を使い,このソフトでロボットの初期の姿勢を設定し,保存し
ます.保存ファイル名は,「def.ini」です.
初期位置は,すべて127となっています.これに微調整値を加えたものが初期
姿勢となり,サーボモータはその位置に回転します.
・ サーボモータの順番
軸番号は1〜28まであるますが,実際に使っている軸番号は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>
・モーションの作成
初期姿勢が決まれば,次にその位置からの差分としてサーボモータを回転させます.
その値をExcelのワークシート「Motion」に入力します.
その値をRobovie-MSに伝えて動かします.
<例4> ワークシートへの記述(シート名「Motion」)
※ 入力する数値に[初期位置]
と[微調整値]を加えて実際
のサーボモータの回転値が
決まりますので,実際値が
0〜255 の範囲に収まって
いなければならないことに
注意する必要があります.
<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は,一度に送れる動作が4〜5までしかありません.それ以上の動作
をさせるには,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>
一定回数を繰り返す文として,「For〜Next文」を学習しましたが,ある
条件を満たす間,繰り返す文として,「Do〜Loop文」があります.
条件として,While(条件を満たす間)またはUntil(条件を満たすまで)の2
通りの方法で指定します.
また,条件を記述する場所として,DoまたはLoopの後の2通りがあります.
今回は,Do〜Loop Until (条件) を使います.
<例6>
Do〜Loop Until (条件)
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
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-MSをExcelの図形描画またはPower Pointで作成せよ.
ただし,アニメーションができるように考慮せよ.
5.通信方法
ロボットとの通信は,RS-232Cを使って行います.これに対するVBAのプログラ
ムとしては,MSCOMMコントロールがありますが,フリーのプログラムもあります.
次に,木下 隆さん(http://www.activecell.jp/)が作られたEasyComm
を使って,<例7>書き換えてみましょう.
<例1>
EasyCommによる通信
2つのモジュール(ec.bas,esDef.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
※ マニュアルはしっかりできていますので,参考にしてください.
<参考>〔ロボットの基本姿勢〕
ロボットを歩かせるための姿勢
としては,足の関節に余裕を持た
せる必要があり,突っ立っていて
はだめである.次のモーションは
試行錯誤で作ったものであり,不
完全なものである.