はじめに
このページでは、インタラクティブインターフェイスiIF−12でセンサーの値を読み取る方法について説明します。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。
※以下の情報は2010年3月現在のものです。ご注意ください。
iIF−12についてはこちらを参照願います。
開発環境について
このページのサンプルプログラムはMicrosoftのVisualC#2008(以降VC#と略す)で作られています。VC#はVisualStudio(以降VSと略す)という製品の一部です。無償版のVisualC#2008ExpressEdisionをMicrosoftのホームページから入手するか、VisualStudioを購入するかが必要です。
VisualStudioはバージョンがいろいろありますが、StandardEditionで十分だと思います。アカデミック版で1万円ぐらい、普通に買うと3万円ぐらいです。
無償で入手できるExpressEditionはこちらからダウンロードできます。ExpressEditionは、言語が固定されるだけで、機能的にはStandardとあまり変わりません。個人でプログラムする範囲で、個人使用するならExpressEditionで十分です。
??2008ExpressEditionのダウンロードページ
2009年11月25日現在で、ExpressEditionのダウンロードページはこのようになっています。C#2008の「Webインストール(ダウンロード)」というところを押すとダウンロードが開始されます。ダウンロード及びインストールにはかなり時間がかかりますので、注意してください。インストール時には同時に.NetFreamWork3.5というソフトもインストールされます(これが無いとVSが動かない)。
※このページはMicrosoftの都合で変わったりしますので、適時、ホームページを探して入手してください。現時点ですでにVS2010が発表されています。
なぜC#か?というところですが、現在はWindowsPCのプログラムはC++、C#、BisualBasicが主流かと思います。
C#はC++やJavaをもとに作られた言語(と聞いてます)ですので、C++が理解できる方はC#のソースを理解できると考えました。
BisualBasicは、もともと高度なプログラムを組む目的ではなかったものを無理やり改変した結果現在に至り、最新版では過去のものと大きくかわったりしています。初心者が覚えやすいというメリットもあまり無く、ビギナーが始めて覚えるならC#の方がわかりやすい(構文が短い)ようなので、C#を選択しました。実際に、企業用途では、BisualBasicプログラマがC#へ移行しているところが多いようです。
C#の勉強方法、MSDNの活用
プログラム未経験者がプログラムを覚えようとする場合、本やインターネットを見るかと思いますが、どうしても人に聞きたくなる場合があります。このような場合のために、MicrosoftではMSDNというプログラマー向けのページがあります。ここのフォーラムで質問をすると、教えてもらえます。
書籍で勉強する場合ですが、難易度が違う複数の本で勉強することをお勧めします。私の場合、初心者向け1冊、中級向け4冊、逆引き大全1冊で勉強しました。とりあえずiIF−12を使いたいだけ、という方は、浅草ギ研で用意しているサンプルプログラムを改造して使うのも良いでしょう。
C#の起動〜プロジェクトの作成
VC#を起動すると、次のような画面になります。
Windowsのプログラムは、1つのアプリケーションに複数のファイルが必要なことが多いので、「プロジェクト」という単位で開発を行います。よって、プログラムの初めは、プロジェクトの作成から行います。
「ファイル」−>「新規作成」−>「プロジェクト」を選びます。
プロジェクトを作成するには、あらかじめ用意されたテンプレートを使います。今回作成するようなソフトは、「Windowsフォーム」というものです。これはWindows上のフォーム(ウィンドウ)の中で動くソフトで、基本的なものです。その他のテンプレートについて知りたい方は書籍などを参照してください。iIF−12で動かすものはWindowsフォームでほとんど作れます。
よって「Windowsフォームアプリケーション」を選択します。
下の方にプロジェクト名と場所を指定するところがありますので、それらを指定してOKを押します。今回、プロジェクト名は「iIF-12_sensor」としました。
テンプレートでWindowsフォームを指定したので、空のフォームが1つつくられたプロジェクトが作られます。このフォームに対してプログラムしていくことになります。
コンポーネントの配置
フォームにはコンポーネントを配置することができます。コンポーネントとはソフトウェアの部品で、自分で作ったものを部品として登録したり、あらかじめ開発環境で用意されている部品を使ったりもできます。ほとんどは用意されたコンポーネントをいじるだけでプログラムを組むことができます。
今回はセンサーの読み取りを行うので、結果を表示させるコンポーネントを配置してみましょう。用意されたコンポーネントは、ウィンドウ左の「ツールボックス」というところから引き出せます。
用意されたコンポーネントは沢山あって、どれを使うか迷うと思います。「C#逆引き大全」という本が、基本的なコンポーネントについて書いてある辞書のようなものなので、一冊用意しておいて、どのような機能があるのか確認すると良いでしょう。今回はTextBoxというコンポーネントを使います。センサーポートは4つあるので4つ配置してみます。配置はフォーム上にドラック&ドロップすると配置されます。
Form1の上に4つ配置したところです。どのテキストボックスが何番かを示したいので、Labelコンポーネントをその下に配置します。
貼った直後は、デフォルト(初期値)の表示になっています。Labelコンポーネントを貼ると、自動的にlabel1、label2と番号が付いた名前が設定されていきます。コンポーネントの設定を変えるには、「プロパティ」を変更します。
画面右下にプロパティというところがあります。ここで、指定したコンポーネントのプロパティを変えることができます。今、label4を指定すると、プロパティは次のようになっています。
プロパティのところの上の方に押せるボタンが何個かあります。上のマルがついているところで、プロパティを表示するボタンを押すとプロパティが表示され、イベントの表示ボタンを押すとイベント一覧が表示されます。
ラベルコンポーネントの表示を変えたいので、Textという項目を書き換えます。
すると、このように表示が変わります。プロパティはプログラム中で変えることもできます。各コンポーネントには沢山のプロパティがありますので、初めは何がなんだかわからないと思います。前出の大全本などで、基本的なコンポーネントの使い方を確認するとよいでしょう。
ビギナーが質問をすると「ヘルプに書いてある」と言われてしまうことがありますが、ヘルプ(F1キー押しで関連ヘルプが出る)はまったくの初心者には理解するのは無理なので、どうしてもプログラムが先にすすまないときは、初級本を何冊か演習してみるとよいと思います。急がば回れ、と。
テキストボックスのプロパティも見てみます。プロパティの中に(Name)というところがあります。これはコンポーネントの名前になり、プログラム中でプロパティを変えるときもこの名前でアクセスします。デフォルトではtextBox1になってますが、違う名前に変えても良いです。今回はセンサーを表示させるのでsensorTextBox1のようにしても良いかもしれません。
名称ですが、VC#で推奨される付け方は、長くなってもよいから省略しない付け方が良い、とされています。
ということでNameを書き換えました。
これで表示させる準備はできました。
<SerialPortコンポーネントの配置>
iIF-12と通信するには、通信プログラムが必要です。これにはSerialPortというコンポーネントを使います。ツールボックスのコンポーネントのところに入っています。
SerialPortをFrorm1にドラック&ドロップすると、Form1の上ではなく、画面下の方に表示されます。このように、実際にはフォーム上に表示されないコンポーネントは、画面下に配置されます。但し、ドロップするのはフォームの上にドロップします。
これで今回使用するコンポーネントは全て貼り付けました。次は実際のプログラミングです。
プログラミング
From1のタブを見ると「From1.cs[デザイン]」となっています。プロジェクトを作った一発目のフォームの画面はデザイン画面になっています。プログラムコードを書くにはデザイン画面ではなくコード表示にします。
Form1の近辺でてきとうに右クリックをするとポップアップが出ますので、「コードの表示」を選択します。
すると、[デザイン]が取れたForm1.csというタブになり、ココにプログラムが書けるようになります。テンプレートで作っているので、あらかじめ、ある程度プログラムが書かれた状態になっています。
C#の構文は書籍などで勉強してもらうとして、ここでは簡単に説明します。
<行1〜8>
using は、このFormにライブラリを組み込むものです。WindowsFormのテンプレートでプロジェクトを作った場合は、上のようになにも書かなくても8行のusingが組み込まれます。C言語で言うところの#includeのようなものですね。
<行10>
namespaceは名前空間です。プロジェクト名と同じものになります。別ファイルでプログラムを組んだ場合も、namespaceを同じにすれば、同じ名前空間に組み込まれます。とりあえずはプロジェクト=名前空間だと考えてください。
<行12>
C#のプログラムは「クラス」単位で行われます。Fromクラスを元にForm1が生成されています。
<行14>
プログラムは、まずコンストラクタというところから実行されます。行14〜17がコンストラクタ部で、必ず必要なので自動的に生成されています。コンストラクタはクラスの名前と同じ名前の関数のような形で宣言されます。クラスがForm1なのでコンストラクタはForm1(
)になります。
<行16>
Windowsのフォームは、本来は、単純にフォームを開くだけでも非常に多くのプログラムを書かなくてはなりません。しかし、VC#(及びVS)は、デザイン画面で貼り付けたコンポーネントの生成などを自動的に記述してくれます。そのプログラムは別ファイルになっていますが、行16を実行するとそれが実行されます。
コンストラクタの記述
では、コンストラクタ部にプログラムを書いていってみましょう。
デザイン画面で、各コンポーネントのプロパティを変更しましたが、プログラム中でもプロパティを変更できます。SerialPortコンポーネントのプロパティは、まだ変更していなかったので、コンストラクタ内で設定してみます。
serialPort1と書いて . を打つと、serialPortのプロパティなどの候補が表示されます。完全に手打ちで書くか、候補から選んでも良いでしょう。PortNameプロパティは、接続したCOMポートの名称(番号)を設定します。COMの番号確認方法についてはiIF−12の紹介ページに書いてあります。このでの例はCOM28になっています。
BaudRateプロパティはその名の通り、ボーレート(通信速度)を設定します。iIF−12は115200bpsで固定です。
各コンポーネントには、プロパティ以外に「メソッド」という機能があります。Cで言うところの関数のようなものです。SerialPortコンポーネントはOpenメソッドを実行すると、設定したCOMポートをオープンしようとします。
プログラムの実行(デバック実行)
一応プログラムを書いたので、実行させてみます。尚、ここまででは単にプロパティを設定しただけなので、何もおきません。
プログラムを実行するにはF5キーを押します。
このように、Form1が表示されました。
プログラムの停止
プログラムを終了するには、フォームの右上の×ボタンを押すか、開発環境画面の停止ボタン
を押します。四角が停止ボタンです。ちなみに、縦棒2本は一時停止で、これを押した瞬間のところでプログラムが止まり、計算結果などを見ることができます。一時停止後に再開したい場合はそのとなりの三角ボタンを押します。
デバック
F5キー(デバック実行)でプログラムを実行すると、エラーが出たときにプログラムが一時停止してエラー箇所を表示します。たとえば、ありえないCOM番号をオープンしようとするとエラーが起きますので実際にやってみます。COM番号をありえない値にしてF5キーを押すと
このようにエラーが出て止まり、エラー箇所と問題点が表示されます。この状態ではまだプログラムは一時停止なので、停止ボタンを押して停止させ、プログラムを修正します。
イベント
Windowsのプログラムは、「なにかのきっかけによってプログラムを動かす」、というのが基本の作り方になります。きっかけを「イベント」と言います。各コンポーネントにはいろいろなイベントがあり、たとえばボタンコンポーネントは「そのボタンを押した」というイベントあります。
今回は、iIF-12から定期的にセンサーデータを読んで表示させる、というものを作ります。”定期的に”の部分は、タイマーコンポーネントのイベントを使ってみます。画面を[デザイン]にし、タイマーコンポーネントをForm1に貼り付けてください。
タイマーコンポーネントも、フォームには表示されないものなので、画面下に出ます。名前はtimer1になりました。
プロパティ表示ボタンを押してプロパティをみたところです。Intervalというプロパティが、周期の長さを調整する部分です。mSで表します。ここでは200mSに設定しています。
イベント表示ボタンを押してみるとTickというイベントがあるのがわかります。TickはIntervalで設定した時間ごとに発生するイベントです。Tick横をダブルクリックすると、イベント内にプログラムが書けます。
ダブルクリックすると、このように、コードに自動的にイベントが挿入されますので、その中にプログラムを書いていきます。Intervalの通り、200mSごとにこの部分が実行されることになります。
※但し、WindowsはリアルタイムOSではないので、正確に200mSごと、にはなりません。他のソフトが動いていたらズレます。
シリアル命令の送信と受信
iIF-12にはまず、シリアル通信で命令を送ります。その後、センサーの値を読み取り、結果を返信してきます。
ということで、組んだプログラムが次のようになります。
<行9>
行41で、少し待つ、という動作をしているが、このSleep( )メソッドを使うのにSystem.Threadingを組み込んでおく必要がある。
<行25>
Timerコンポーネントは、デフォルトでは停止状態になっています。タイマーを動かすにはEnabledプロパティをtrueにします。
<行30,31>
送受信用のバイトサイズの配列を宣言しています。今回は8ビットで読み取りをしますので、返信フォーマットは
[255] [ID(3)] [長(1)] [命令(10)] [S1] [S2] [S3] [S4]
となりますので、一見、受信用の配列は8個でいいような気がします。しかし、通信時にはいろいろなことがおきるので多めにしておかないと、すぐにエラーが出るプログラムになってしまいます。今回は多めに1000個宣言してます。マイコンと違い、PCはメモリが豊富なので、このようなバッファは多めに取っておいた方がいいでしょう。
<行33〜39>
送信用の配列にデータを格納し、Writeメソッドで送信します。行37,38はPC側のバッファをクリアしています。この程度のプログラムならバッファクリアは不要だと思いますが、複雑なものになってくると必要なときもあります。
<行41>
単純に、このプログラムを20mS間(返信されるであろう時間)停止させています。8バイト受信されるまで待っても良いのですが、なんらかの原因で8バイトよりも少ないデータしかこないと、その後のデータがズレたり、プログラムが停止してしまう可能性がありますので、このように単純に停止、という方法を取っています。この部分は改善の余地がたくさんありますが簡単なのでとりあえずこれで。
<行43>
受信したデータは、PCのバッファに格納されていますので、Read命令で取り出します。
<行45〜48>
あらかじめ貼り付けておいたテキストボックスに、結果を表示させています。Textプロパティに文字を設定すると、それがテキストボックスの四角の中に表示されます。Read命令でrsvDataというバイトサイズの配列に値を格納しています。Textプロパティには文字しか入れられないので、Tostring(
) メソッドで数値を文字化しています。
ハードウェア接続
実際に動作させるまえに、ハードウェアを接続します。各センサーとの接続例はiIF−12のページに書いてあります。今回は、安価で入手性も安定しているシャープのPSD距離センサをつないでみます。PSD距離センサは、千石電商やテクノロジアなどで通販で買えます。
動作確認
実際に動かしてみましょう。距離センサーはS1ポートにつないでいます。その他は開放なので値は不定です。
距離が近いときは100近辺、
ちょっと離すと50ぐらい、
何も障害物が無いと10前後、となりました。
というように、非常に簡単にセンサー値をPCに取り込むことができます。
通信時間とタイミング
通信は一瞬のうちに行われるのではなく、やりとりにある程度時間がかかります。あまり通信系のプログラムを書いていないと、このあたりがネックとなって思うように動かないということをよく見受けます。遅延時間などにも考慮してプログラミングするようにしてください。具体的には、思ったように動かなかった場合はSleepを長めにしてみる、などの方法があります。以下、ポイントです。
1)PCからのデータは、プログラム実行後に瞬時に行われるわけではない。Windowsの都合で、数m〜40mSぐらい遅れるのが常。
2)データは8ビット(1バイト)づつやりとりされるが、スタートビット、ストップビットがあるので実質は10ビット分の時間がかかる。115200bpsの場合は1バイト分(10ビット)送るのに1/115200x10=86uSec必要になる。センサ読み取りの場合、4バイトのデータを送るので、データを送信するのにかかるのは344uSec前後となる。同じく、返信データは8バイトなので、688uSec前後かかる。あわせて1mSecは通信だけで必要な時間となる。
3)iIf−12では、センサー読み取り命令を受け取ってから、データ送信開始するまでに200uSec前後かかります。
最後に
このようにして簡単にセンサー値をPCに取り込めるわけですが、センサー数が足りないという場合は、iIF−12を複数使うという手もあります。次はサーボ駆動について説明します。
2010年3月10日
|