■>サンテックのホームページTOPへ       ■>サンおやじの工作室TOPへ
    工作室
       第3章 PC用ジョイスティックでRCサーボをコントロールする

<工作室に戻る
プレステのコントローラでRCサーボを動かそう
  ■第1書 RCサーボをどうやってコントロールするか
  ■第2章 RCサーボの性能を調べる
  ■第3章 PC用ジョイスッテックをRCサーボをコントロールする
10ms周期で8個のRCサーボを制御する
RCサーボコントローラの限界に挑戦!

第3章 PC用ジョイスティックでRCサーボをコントロールする

前章のプログラムで、RCサーボをパソコンから制御できるようにしました。
制御と言ってもハイパーターミナルから手入力で数値を入れるだけですから、リアルタイムに動かすことはできませんし、制御できるRCサーボもひとつだけです。
せっかくここまで作ったのですから、何か制御データを与える物は無いかと・・・・・・
普通は探し回るのでしょうが、”サンおやじ”の場合は工作室に出入りする連中に聞いて回ります。
(他人事で話す人間が多いのでまじめに聞くと大変な事になる)
すると、「ジョイスティックのような物で動かせないかなー、それもかっこいいやつがいいね」
かっこいいは必要ないような気もするが、そう言えばロボコンとか見ているとロボットの出来の割にはコントローラが・・・・・昔の鉄人28号だってもう少し・・・・(失礼しましたm(__)m)。
ともかく、おもちゃ屋さんへ出発。コントローラと言えばゲーム機、中でもプレイステーションは”サンおやじ”の得意な分野!・・・・・・なんだけど、このコントローラパソコンに接続するの(ゲゲッ)。
ところが最近は便利な物が売ってます。(写真1)

プレイステーション用のアナログスティックをUSBでパソコンと接続・・・・・フムフム・・・・・DirectXが・・・・
”サンおやじ”お店で説明を読みながらピーンと来てしまいました。
たぶん、DirectXのDirectInput関数でスティックの値を読める!(予想なんでハズレも多い)ってな訳で、早速買いこんだ変換ケーブルをDirectXで読み込んで見ます。
特に難しい事をした訳では有りません。
DirectXはMicrosoftからSDKが公開されていますから、それをダウンロードしてサンプルプログラムを動かしただけです。
案の定コントローラのスティックを動かすと数値が読み出せます。読めると判れば出来たも同然。
なにせSDKはソースコードも付属していますから、RCサーボの制御に必要なデータだけを読み取ってRS232Cに送り出すようにすれば後は「H8Tiny CPUボード」でなんとかできます。
RCサーボ2チャンネル位は簡単に制御できます。
 
写真1
USBtoPS/PS2ゲームパッドコンバータ
エレコム株式会社(コントローラは付属していない)

パソコン側のソフトはDIrectX8とVC++6.0を利用して作りました。実行ファイルとソースを載せておきます。
ダウンロードして使ってください。エレコム社製のUSBtoPS/PS2ゲームパッドコンバータをインストールした後に、PS2USB_PRG1.exeを起動すればパソコン側は準備OKです。
DirectXを使用していますので、他のアナログスティックでも動作するかもしれませんが、保障はできません。
また、パソコン側のソフトに関しては、VC++が必要ですし、DirectXに関する書籍やサイトも多く見かけますのでここでは説明しません。
ソース・実行ファイルSのダウンロード(ps2usb_prg1.lzh)

せっかくですから、今回はRS232Cの通信は割り込みを使いましょう。H8Tinyのような組み込み用のCPUでは、割り込みプログラムが結構重要になります。世間一般では割り込みプログラムは複雑とかうまく動かないとか言われることが多いのですが、そんなに難しい物ではありません。
本を読んだり頭で考えるから難しいのです。理論なんか後回しで良いのです。
実践あるのみ!理屈は後から付いてくる?(かも)。悩んでいるより動くプログラムを書いた人の勝ちです。

それではソフトの説明に移ります。割り込みを使うのは、パソコンからデータを受信する部分だけです。
リスト1はプログラムのスタートアップ部分(start.asm)です。赤い文字の部分が割り込みを使用するために追加した部分です。
スタックポインタ設定直後に割り込みを禁止し、ハードウェアの初期化を呼び出しています。
そして、メインルーチン(main)を呼び出す直前に割り込みを許可しています。
デフォルトで作成したプロジェクトは、割り込み禁止になっていますので、割り込みを使う場合は、割り込み許可をしないといけません。

リスト1

_start:
  ; initialise the SP for non-vectored code
  mov.l  #_stack,er7
orc.b  #0x80,ccr               ;割り込み禁止
  ; call the hardware initialiser
  jsr    @_hw_initialise
#ifdef ROMSTART
  ; get the boundaries for the .data section initialisation
  mov.l  #_data,er0
       ・
       ・
       ・
      (略)
       ・
       ・
       ・ 
start_3:
andc.b  #0x7f,ccr             ;割り込み許可
#ifdef CPPAPP
  ;Initialize global constructor
  jsr    @___main
#endif

  ; call the mainline
  jsr    @_main

忙しくて途中までです。 ごめんなさいm(__)m


  

プレステのコントローラでRCサーボを動かそう
  ■第1書 RCサーボをどうやってコントロールするか
  ■第2章 RCサーボの性能を調べる
  ■第3章 PC用ジョイスッテックをRCサーボをコントロールする
10ms周期で8個のRCサーボを制御する
RCサーボコントローラの限界に挑戦!