Lesson4 プチロボをC#言語で動かす(3)
前進するパターン、後進するパターン、回転するパターンなどを作っておき、JoyStickでそれらの動作をリモートコントロールするようにします。前進はforward.msf、後進はbackward.msf、回転はrotate.msfとします。
4-1 プチロボのクラスを作る
プチロボ用のクラスを作るにあたって、次のような手順を考えます。
- コンストラクタでは初期設定ファイルを読み込み、シリアルのポート番号を設定しオープンし、プチロボのホームポジションに設定する。
- forward, backward, turn, rotateメソッドを作り、ジョイスティックでコントロールすることができるようにする。
- C言語(Dev-CPP)で作った関数をC#に移植する。
4-2 開始時にホームポジションに移動させる
4-2-1 コマンドラインでの開発
Visual Studioによる開発は暫く忘れて、シンプルにC#のコンパイラを用いてテストプログラムを開発します。たかが10KB程度のプログラムを作るのに200KBに及ぶプロジェクトを作るのは馬鹿なので、簡単なチェックプログラムは通常のコンパイラで試作します。
C#のコンパイラはC:\Windows\Microsoft.NET\Framework\v3.5にあるので、この場所を環境変数、あるいはシェル変数に設定しておきます。
先ずは、「Puchi_Robo_Config.ini」ファイルを読んで、設定を配列に入れることを考えます。
そのために、ファイルを読んで表示だけしてみましょう。
// ディスク上のPuchi_Robo_Config.iniファイルを読み込み、表示する。
// ファイル名:IniRead.cs
using System;
using System.IO;
class IniRead {
static void Main() {
//using ステートメントを使うと、
//オブジェクトでのメソッドの呼び出し中に例外が発生した場合でも
// Dispose が必ず呼び出されます。
using(StreamReader r = new StreamReader("Puchi_Robo_Config.ini"))
{
String value;
while((value = r.ReadLine()) != null) {
Console.WriteLine(value);
}
}
}
}
次に、複数の数字を読んでみましょう。この時に数字はインスタンス変数に代入することとします。インスタンス変数に代入するにはオブジェクトを作り、そのオブジェクトの中にあるメソッドで代入しなければいけません。(static からではできない)
// ディスク上のファイルから変数に値を入力する
// IntData.txtの中味は例えば1行に
// 123,456,7890
// と記述してある。
// ファイル名:IntRead.cs
using System;
using System.IO;
class IntRead {
int a, b, c; // インスタンス変数
static void Main() {
new IntRead().FileRead();
}
private void FileRead()
{
using(StreamReader r = new StreamReader("IntData.txt"))
{
String [] value = r.ReadLine().Split(',');
int.TryParse(value[0], out a);
int.TryParse(value[1], out b);
int.TryParse(value[2], out c);
}
Console.WriteLine("a={0} b={1} c={2}", a, b, c);
}
}
課題4-2-1
(1)IniReadを改造し、文字列"Comm"を見つけた次の行だけを表示するようにしなさい。
(2)次に、"="の右側に整数の数字の文字列があると仮定して、その文字列を整数型の変数portに入れなさい。
ヒント:StringクラスのSubstringメソッドを用いる。
課題4-2-2
(1)4-1で改造したIniReadを元にして作ります。クラス名をPuchiRoboに変更して(ファイル名PuchiRobo.cs)、文字列"HomePosition"を見つけた次の行から、9行分読み込み、各々"="の右側の数字を、整数型の配列homeに入れるようにしなさい。
メソッド名は、次のことを考えて"initialization()"とします。
(2)同様に"Direction"を見つけた次の行から、'+'だったら整数の1、'-'だったら-1を整数型の配列directionにそれぞれ入れなさい。
(3)入力した値をMainメソッドで全て表示させなさい。(initializationでは何も表示させない)
4-2-2 Visual StudioでPuchi_Robo_Config.iniを読み込ませる
Lesson2では、とにかく動かすためのプロジェクトを作りました。今度は大きなプログラムにした時に分かりやすい形に新しく作り直します。
- プロジェクト名(ソリューション名)はPuchiRoboとします。
- 格納フォルダはどこでもいいですが、以前と同じ所のほうが分かりやすいのでC:\prog\C#\puchiにします。
- Form1のTextプロパティもPuchiRoboにします。(これは何でもよい)
- Form1のデザインの(Name)プロパティをPuchiRoboにします。
- 前に作ったPuchiRobo.csをForm1.csのあるフォルダにコピーします。
ソリューションエクスプローラでプロジェクトPuchiRoboを選択し、右クリック→追加→既存の項目→PuchiRobo.csを選び追加する。
- ソリューションエクスプローラに追加されたPuchiRobo.csをダブルクリックして開く。
class PuchiRobo {
の部分を次のように書き換えます。これに伴い、インデント、終りの中括弧を追加します。(終りの中括弧をつけると自動的にインデントがつけられるはず)
namespace PuchiRobo
{
public partial class PuchiRobo
{
- ここにMainメソッドがあってはいけないので、削除します。(Program.csにすでにある)
- Form1.cs[デザイン]タブを選び、フォームをダブルクリックして、フォームオブジェクトが出来た時に実行するメソッドを表示させます。(PuchiRobo_Load)
このメソッドの中はテスト的に以下のようにコードを入れてみます。
private void PuchiRobo_Load(object sender, EventArgs e)
{
initialization();
System.Diagnostics.Debug.WriteLine("port=" + port);
foreach (int x in home)
System.Diagnostics.Debug.WriteLine(x);
}
- Puchi_Robo_Config.iniが無いと読めないので、コンパイルして出来上がる実行ファイルと同じ場所にコピーします。(ここでは、デバッグ版を作っているのでC:\prog\C#\puchi\PuchiRobo\PuchiRobo\bin\Debug)
- 正しく表示できたらここの部分はテスト終了。
4-2-3 サーボモータを動かす
- Lesson2と同じにシリアルポートの設定をします。
- Puchi_Robo_Config.iniを読んでシリアルポート番号を設定するので、PuchiRobo_Loadメソッドの中に以下のようなコードをtryの前に入れ、tryの中も変更します。
String Port = "COM" + port;
try
{
serialPort1.PortName = Port;
serialPort1.Open();
}
- 同様にボタンを付けてサーボモーターを動かしてみるの設定を行います。
ただし、配列buffer、メソッドservo、FreeModeはPuchiRobo.csに付け加えます。
- これで動けばサーボモータの部分は正常動作であることが分かります。
4-2-4 Load時にホームポジションに移動させる
課題4-2-3
PuchiRobo_Loadでシリアルポートをopenした後にホームポジションに移動するようにプログラムしなさい。
4-2-5 JoyStickで動作させる
課題4-2-4
Lesson3を参考にしてJoystickで動かせるようにしなさい。
ヒント:サーボモーター関係のメソッドはPuriRobo.csに変更を加えます。
4-2-6 JoyStickで前後、回転などの動作をさせる
前後、回転などの動作のパターンファイルは作ってあるとします。ここでは前進はforward.msf、後進はbackward.msf、旋回はrotate.msf、回転はturn.msfとします。
課題4-2-5
課題4-2で作ったPuchiRobo.csを参考にしてforward.msfを読み込み、Lesson1で作った、doMove()(データ表示のみでサーボモータは実際には動かない)及びtranslation()メソッドをC#に直し組み込み、動作チェックをしなさい。ファイル名はmove.csとします。これが完成したならば、これをVisual Studioに組み込み、JoyStickで動作を指令できるようにしなさい。
参考:時間待ちをするには次のようにします。
using System.Threading;
Thread.Sleep(wait); // 単位はミリ秒