はじめに
このページでは、インタラクティブインターフェイスiIF−12を動かすサンプルソフトウェアをご紹介します。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。
※以下の情報は2010年3月現在のものです。ご注意ください。
iIF−12についてはこちらを参照願います。
開発環境について
このページのサンプルプログラムはMicrosoftのVisualC#2008(以降VC#と略す)で作られています。開発環境や、初めてのプログラミングについてはセンサの値を読み取るのページで紹介していますので、そちらを参照願います。
サンプルプログラムの意味合い
センサー及びサーボの駆動方法の説明で、iIF−12を使う方法はわかるかと思います。プログラム初心者の方にとってはここからが難しいところ。自分のやりたいことがどうやったら実現できるか、検討も付かないという方もいるかもしれません。ここでは、とりあえず、需要が多そうな、モーションエディタソフトを作ってみます。卓上ガジェットでモーション編集が必要か?とも思われますが、ファイル操作など、基本的な要素がたくさんあるので、あくまでもサンプルとして。
音楽を流しながらなにかを動かしたり、鳩時計のような用途ならそのまま使えるかも。です。
プログラムのダウンロード
急に複雑、かつ長くなります。とりあえず、プロジェクト全体を圧縮しました。
iIF-12_mortion.lzh
(右クリックで対象を保存)
圧縮しているので、解凍してください。VC#2008のプロジェクトがそのまま入っています。
このプログラムでは、iIF-12の操作以外に、PCからテキストトークを行う機能も入れてみました。テキストトーク機能も使ってみる場合は、以下のファイルを解凍し、PCのCドライブ直下においてください。
voice.lzh
(右クリックで対象を保存)
音源はMP3形式になっています。音源の著作権は浅草ギ研にありますので、商用利用の場合はご一報下さい。商用以外であれば使用制限はありません。自分でMP3音源を用意すれば、それを再生させることもできます。
プログラムの使い方
まず、VC#(又はVisualStudio)を起動します。。

「ファイル」−>「開く」−>「プロジェクト/ソリューション」を選び、先ほど解凍したプロジェクトを指定します。
iIF-12_Motion.lzhを解凍すると、その下にiIF-12_MotionEditorというフォルダがあります。

その中の.csprojと拡張子がついているのが、C#のプロジェクトファイルですのでそれを開くと、プロジェクトが起動します。
初期画面はこのような感じになっています。
正常に開かれた場合は、ソリューションエクスプローラが上のようになります。このプロジェクトで使われているファイルの一覧です。
説明は後にして、とりあえず使い方を説明します。F5キーでデバック実行してください。
ソフトウェアは大きく3つのパートにわかれています。1つ目はメイン画面、2つ目はロボット構成画面、3つ目はモーション作成画面です。
■メイン画面:ロボット構成ファイルの操作、通信設定、作ったモーションの再生、テキストトーク、センサー読み取りなどを行います。
■ロボット構成画面:サーボ配置を構成し、登録します。
■モーション作成画面:モーション作成、登録、テスト実行などを行います。
<メイン画面>
起動直後は、次のメイン画面が表示されます。

*通信設定
まず、COM番号の設定を行います。メイン画面から、「通信設定」−>「COM設定」を選ぶと、次のウィンドウが開きます。

「COM番号:」のリストボックスには、現在PC上で使用可能なCOM番号の一覧が表示されますので、iIF−12がつながっている番号を選択して「設定」ボタンを押します。
通信速度は115200のままにします。(このソフトでは9600も選択できるが、iIF−12は115200固定です。)
設定後はメイン画面に戻ります。一見なにも変化が無いですが、内部でCOM番号を記憶しています。これは後でファイルに記録します。
<ロボット構成画面>
次に、サーボ配置を登録します。メイン画面から、「設定」−>「ロボット構成」を選ぶと、サーボ構成登録ウィンドウが開きます。
マス目が切ってありますが、1つの四角が1つのサーボにあたります。まだ配置していないのでなにも表示されていません。サーボを配置する位置をクリックします。

マスをクリックすると、サーボ情報登録ウィンドウが開きます。ここに、サーボの番号を入れます。iIF−12の場合はIDは3に固定なので、ボードIDにはかならず3を入れてください。上ではサーボIDに0を登録していますのでS0につながったサーボを動かすことができるようになります。
記入したら「登録」ボタンを押します。
サーボ情報を登録すると、該当位置がピンクになり、設定されたことがわかります。このようにして、作成した造形物のサーボの配置の通りにサーボ構成を登録します。
全てのサーボ構成を登録したら「登録」ボタンを押します。
尚、本プログラムでは、配置のマスが3x16になっていますが、これはプログラムで変えられます。ここでは人形のような造形を想定しているのでこのようなマス配置になっています。
登録すると、メイン画面に戻ります。一見、なにも変化が無いようですが、内部でサーボ構成及びCOM番号情報を保持しています。
このままでは、プログラムを終了するとその設定が消えてしまうので、ファイルに保存します。
メイン画面で、「ファイル」−>「保存」を選びます。
ファイル名にてきとうな名前を付けて、「保存」ボタンを押します。拡張子はosfとなります。これがサーボ配置とCOM番号を記録しているファイルになります。
次に使う時は、メイン画面から「ファイル」−>「開く」を選択すると、この情報が設定されます。
<通信の開始>
起動直後は、まだCOMポートはオープンしていません。

通信切断中、というボタンが赤くなっていると思います。COMがクローズしているときはこのように赤になっています。このボタンを押すと、設定したCOMポートをオープンしようとします。
COMポートのオープンに成功すると、このように青になります。この状態でもう一度押すと、クローズして赤のボタンに戻ります。
次にサーボを動かしてみるので、オープンの状態にしておいてください。
<モーション作成画面>
メイン画面で、「設定」−>「モーション作成」を選択すると、モーション作成画面になります。

画面中央部には、サーボを配置した構成でトラックバーが表示されます。トラックバーの横にはサーボの位置が”相対値”で表示されます。サーボ位置は、基本の位置を「ホームポジション」として登録し、その相対値で操作することにより、サーボを交換した後もホームポジションの調整だけで同じように使えることになります。
トラックバーを動かすと、対応するサーボが動きます。ホームポジションにしたいところで「ホームポジション」−>「現在値をホームポジションに設定」を選択すると、今の位置がホームポジションに設定されます。
各トラックバーを動かして、ポーズをつけ、ポーズ編集のところの「追加」ボタンを押すと、そのポーズが登録されます。尚、このとき、スピードボタンで設定したスピードになります(デフォルトは100。結構遅い)。ポーズを追加すると、右のリスト欄にポーズが追加され、:マークがつきます。このとき、ポーズ名称の欄になにか書いてあると、その:の横にポーズ名称が表示されます。
ポーズをどんどん追加していくと、順番を変えたり、コピーしたり、削除したくなると思います。この場合は、対象のポーズをポーズ一覧表示でクリックし、ポーズ編集ボタンで編集します。
トラックバーは小さいので微調整したい場合は、微調整ボタンで行います。
全てのポーズができたら、プレイボタンを押すと、登録したポーズが順番に再生されます。この一連のポーズの流れがモーションになります。
モーションが完成したら、「ファイル」−>「保存」でモーションを保存します。「ファイル」−>「開く」で、登録したモーションを開くことができます。
モーションファイルにはomfという拡張子がつきます。
尚、メイン画面にはAとBと書かれたボタンが配置されています。Aボタンを押すとA.omfで記録されたモーションが再生され、Bを押すとB.omfが再生されます。
モーション作成が終わったら、xボタンか、「ファイル」−>「終了」でモーション作成を終了します。その後、画面はメイン画面に戻ります。
<メイン画面の操作>
通信可能状態のメイン画面は次のようになっています。

Aボタンは、説明したとおり、A.omfで記録したモーションが再生されます。
Bボタンも同様です。これらはボタンを追加して、クリックイベントにAボタンと同じようにプログラムを書けば(2行です)、ボタンを追加することができます。
「今何時?」ボタンは参考までに、テキストトークで時間を読み上げるものを作ってみました。ちょっと改造すれば、時間が来るとなにかが動く、鳩時計のようなものが作れるかと思います。
「TALK」ボタンも参考までにテキストトークのサンプルです。左のテキストボックスにローマ字を入れてボタンを押すと、その言葉を読み上げます。
「SensorRead」ボタンはS1〜4のセンサー値を表示するもので、前に作ったものと同じです。その下の「SensorRead12」ボタンは12bitモードで表示します(0〜4095の値になる。8ビットモードは0〜255)。
プログラムの説明
全部説明すると長くなるので概要だけ説明します。iIF−12に関連する部分は説明済みですが、ファイル操作やエラー処理など、一般的なWindowsプログラミングの部分がプログラムの大半を占めています。(ということで詳しくはコメントや書籍などを参照してください)
あまりC#に深入りしたくないがちょっと改造したい、という方はここを飛ばして次の節を読んでください。
<ファイル構成>
<フォーム>
From1.cs:メイン画面のフォームです。
RobotMake.cs:サーボ構成画面
RobotMakeSub:サーボ構成画面でマスをクリックしたときに出る画面
RobotNames.cs:使ってません。
MortionMake.cs:モーション作成画面
comSetting.cs:通信設定画面
<自作クラス>
RobotInfo.cs:サーボ構成と、COM情報を格納するクラス
ServoInfo.cs:サーボ番号を保持するクラス
TextSpeech.cs:テキストトークに関連するクラス
その他は自動生成されるファイルです。
<データ構成>
データはRobotInfoとServoInfoの2つのクラスからなります。
■RobotInfo
RobotInfoはロボット構成を保持し、以下のプロパティがあります。
LayoutAmoutX:サーボ配置のマスの横方向の数
LayoutAmoutY:サーボ配置のマスの縦方向の数
LayoutAmout:サーボ配置のマスの総数
LayoutData:ServoInfoクラスを保持する配列
RoboName:ロボット名称を保持、しようと思いましたが使ってません。
ComName:COM番号
ComBps:通信速度
ロボット情報には、主にレイアウトやCOMの情報があります。サーボレイアウトのマスには番号が付けられており、それにサーボが配置されているかの情報も保持します。たとえば、デフォルトでは3x16のマスになっているので、0〜47の48個の番号が付いたマスの情報があります。それぞれに対応したServoInfoがあり、配置されているか?番号は何番か?などの値を保持します。
1つのアプリケーションに、ロボット情報は1つ、となります。
■ServoInfo
ServoInfoには以下のプロパティがあります。
BID:ボードID。iIF−12は3で固定だが、このプログラムはもともと違うもの(ロボット神経システム)用に作られたものの流用なので、IDが複数選択できるようになっている。外すのが面倒だったので、すいません。
SID:サーボID。0〜11番
HomePos:そのサーボのホームポジションを絶対値(0〜254)で保持
DispOn:マスに配置されたかどうか。bool型なので、ture=配置された、false=配置されてないになります。
<Form1の説明>
Form1は次のような構成になっています。

メニュー関連の部分は、ファイル操作と、他の画面への移行の部分です。これらについては、C#逆引き大全(という書籍。時期により名称若干違います。)に書いてあるので、それらを参照してください。ファイルはテキスト形式にしてあるので、メモ帳などのテキストエディタでのぞけます。
モーション再生の部分は、行371からのrunMortionメソッドになります。ファイル名を指定することにより、そのファイルを開き、データを展開し、順番にiIf−12にデータを送る、という部分です。
プログラムの改造方法
<ボタンの追加>
デフォルトではAとBの2つしかボタンがありませんが、もっと増やすのは非常に簡単です。たとえば、Aボタンクリックイベントは次のようになっています。
行526で、押したボタンの情報をmyButtonに引き継いでいます。
行527で、ボタンのTextプロパティの値をrunMortionメソッドに渡しています。
runMortionメソッドは行371から書かれています。ここでは、引数で指定したファイルを開いて、そのモーションを実行します。
たとえば、デザイン画面でボタンを追加したとします。

ツールボックスからボタンコンポーネントをドラック&ドロップするとbutton1というボタンが作られます。button1のTextプロパティもbutton1になっています。

画面右下のプロパティのところで、イベント表示ボタンを押すと、button1のイベント一覧が表示されます。Clickイベントの横をダブルクリックすると、Form1のコードにイベントが追加されます。
ここに、前出の行526、527のコードをそのままコピーすれば、button1を押すとbutton1.omfというファイルが再生されます。
<MP3音源の再生>
テキストトークをさせるのにTextSpeechというクラスを作っていますが、これはMP3ファイルを再生させるものです。Talkメソッドにローマ字を渡せばそれを読むような機能がありますが、独自にMP3ファイルを用意してそれを再生させることもできます。
使い方の手順としては、
1)TextSpeechクラスのインスタンスを生成
2)mp3Stopメソッドを実行
3)ファイル名を指定してmp3Playメソッドを実行
となります。
たとえば、先ほどのbutton1を押したときに、モーション再生と同時にmySong.mp3というファイルを再生したいとすると、次のようになります。
runMortionメソッドでは、Sleepメソッドを使っていますので、先に音声を再生させ、その後にモーション再生と書いた方がいいです。
最後に
そこそこ実用に耐えるように、エラー処理などもある程度入れていますが、実際に動かすとエラーが出ることがあるかもしれません。その時は書籍などを参考に、修正してみてください。
ここでは、ボタンを押しただけの操作のプログラムになっていますが、センサー読み取りもできますので、センサーによってモーション再生をさせるなど、簡単に応用ができると思います。また、PCのイベント、たとえばPCでは時計機能があるので、ある時間になると何かが動き出す、というものも簡単に応用できるかと思います。
2010年3月11日
|