PageTopへ戻る

8.列車のスピード(モーターの回転速度)の検出

●次は列車のモーター回転による発電電圧を検出してPCにスピードデータを送信します。
 ・ブレッドボードにRS232CのインターフェイスICであるMAX232CPEを追加します。これにより、PCにRS232Cで送信が出来ます。
 ・レール出力を分圧して、ADCの入力ポートに接続します。









・オシロの画面でわかるように、モーターが回転すると、モーター自体から回転速度に応じた電圧が発生し、パルスOFFの時に検出することが出来ます。
・従って、パルスONの直前(IntCounter = 0x1FF)にこの発電電圧を読み込みます。
・dsPICのADC入力の0〜5Vになるように抵抗で分圧して入力ポートPB9に接続します。

【dsPICのコード】



【PC側のソフト】

・7.PCから両方向制御のソフトにRectangleShapeを追加します。
・また、すべてのコードを削除し、下記のコードを貼り付けます。





・ADCで読み込んだ電圧はモーターが動いていない時は2.5Vなので、この時の値を基準にします。
・正転のときは2.5Vより高い電圧が検出され、逆転時は2.5Vより低い電圧が返ってきます。
・従って、返ってきたADC値から基準値を引いて絶対値をとった値をスピードメータの値にします。
・基準値は0xFFFの中間ぐらいの値になり、実際は0x7F0位になります。
・動かすとわかるのですがスピード値はADC値をそのまま使っているのでかなりバタつきます。

(2015/03追加)

・VB2013Expressの場合のコード

9. 3区間で自動往復運転

●次は3区間を制御して自動で往復運転をします。
 ・列車が区間1から2、1から0に移動したことを検知して減速して停止後、逆転を繰り返して3区間を自動往復運転します。


 ・ブレッドボードのスペースを作るためドライブ回路の配置を整理して、とりあえず3区間分のドライブ回路を作ります。
 ・各区間の電圧を検出するため、CMOSアナログスイッチ(4051)により区間を選択してADC入力に送ります。





【dsPICのコード】

※2013/11/3 区間変更部分変更しています。



・列車が区間0と1の間にあるとします。このとき、進行方向側の区間1を現位置、区間0を前位置とします。 進行方向の次の区間2を次位置とします。
・現位置のみ通電すると、接触が悪い場合止まってしまうので、前意位置にも通電します。
・列車が現位置から次位置にかかったときに、次位置の電圧を監視しておいて、区間移動したことを検知します。
・接触が悪く検知が少し遅れたとき列車が止まることがあるので、位置検出後に次位置もパルスONして通電します。




【PC側のソフト】

・8.列車のスピードの検出のソフトにLabelコントロールを追加します。
・また同様に、すべてのコードを削除し、下記のコードを貼り付けます。



※2013/11/3 区間変更部分変更しています。


・VB2013の場合は、Label3を追加します。

VB2013の場合のコード


・はじめに区間0か区間1に列車を置きます。
・実行してスライダーを上げると、区間2に進入したところで減速して、完全に停止した後、逆転します。
・次に区間0に進入したところで減速、完全停止後逆転します。以上を繰り返します。

【コードの説明】
・列車の位置情報等を管理するためのクラスを作ります。

Class 位置情報
・PIC側と同じように、区間、路線などを扱います。

Class train
・同じく列車に関する現在位置、前位置、次位置などの位置情報等の情報を扱います。
・区間の変更処理、逆転処理などの関数を実装しています。

宣言  Dim 列車(8) As train → train Classの配列を8つ用意します。(今のところ1つしか使いません)
実装  列車(0) = New train(New 位置情報(1, 0, 0)) → (区間:1、路線:0、方向:正で初期化・実装します。)
タイマー(Timer1)で200ms間隔でdsPICに列車のスピード・位置情報などを送ります。実際は100バイトのブロックを送ります。
dsPIC側でこれを受け取ると、実際のスピード、区間変化情報を送り返してきます。これも100バイトまとめて送ってきます。

【区間変化処理の説明】
・まずdsPIC側の処理ですが、IntCountが0の時駆動パルスをONにしているので、次の割り込みのIntCountが1のとき、次の区間の電圧を監視しておいて、レールを跨いだときに、方向が正の場合は+12V、方向が逆の場合は-12Vを検知します。
・レール電圧は5.1kΩと1kΩの抵抗で分圧した値で約1/6になっていて、レール共通側はdsPICから見て2.5Vなので
  +12Vは 12V / 6 + 2.5V = 4.5V
  -12Vは -12V / 6 + 2.5V = 0.5V
になります。すなわちdsPICのADC入力は0.5V〜4.5Vの範囲になります。
・そして8入力を選択するCMOSアナログSWの4051の選択bitであるABCに次位置の区間をセットして入力を選択し、ADC入力ポートに入力します。
・プログラムでは正転時は、ADCのHバイトが0xBより大きいとき(約3.5V)、逆転時は0x3より小さいとき(約0.9V)で区間変化を判断しています。
・区間変化を検知したら変化フラグのhenkaを0x80にセットして、このhenkaがRS232CでPCに送信されます。
・PC側ソフトでこれを受信したら、区間変更の処理をして、PC側の区間変化フラグを1にセットします。
・区間変更処理では
  前位置←現位置
  現位置←次位置
  次位置は方向により計算します。
・次のタイマーイベント(200ms後)により新しい位置情報と区間変化フラグをdsPICに送信します。
・dsPIC側でこれらを受信し、henkaフラグを0にクリアし、次の区間変化に備えます。
以上が、区間変化時の処理の流れです。

次へ

PageTopへ戻る