卒業研究ジョイスティックによる全方向移動車の制御

高知工科大学

知能機械システム工学科
１０１０１８８

野村

和寿

２００１年２月

i

目次

第一章

緒言

１

１．１ はじめに・・・・・・・・・・・・・・・・・・１
１．２ 本研究の内容・・・・・・・・・・・・・・・・２
１．３ 本文の構成・・・・・・・・・・・・・・・・・３

第二章

全方向移動車について

４

２．１ 全方向移動車の定義・・・・・・・・・・・・・４
２．２ 全方向移動車の利点・・・・・・・・・・・・・５

第三章

メカニズム

７

３．１ メカニカル部の構成・・・・・・・・・・・・・７
３．２ 移動時の動作・・・・・・・・・・・・・・・・８
３．３ 本メカニズムの利点・・・・・・・・・・・・・９
３．４ 実物・・・・・・・・・・・・・・・・・・・・１０

ii

第四章

制御システム１３

４．１ 制御システムの構成と制御のながれ・・・・・・１３
４．２ 制御ボード・・・・・・・・・・・・・・・・・１５

４．３

４．２．１

制御ボードの構成・・・・・・・・１５

４．２．２

ＣＰＵボード・・・・・・・・・・１６

４．３．３

ＡＤ−ＤＡボード・・・・・・・・１７４．２．３

制御ボードボックス・・・・・・・１８

ジョイスティック・・・・・・・・・・・・２０
４．３．１ ジョイスティックのメカニズム・・・２０
４．３．２ ジョイスティックの信号処理・・・・２１
４．３．３ スイッチ・・・・・・・・・・・・・２２

４．４

モーター・・・・・・・・・・・・・・・・２３
４．４．１ モーター制御の構成・・・・・・・・２３
４．４．２ ドライバー・・・・・・・・・・・・２４４．５ブレーキ・・・・・・・・・・・・・・・・２６４．６

角度センサー・・・・・・・・・・・・・・２８
４．６．１ 角度センサーのメカニズム・・・・・２８
４．６．２ 角度センサーの信号処理・・・・・・２９

４．７

電源・・・・・・・・・・・・・・・・・・３１

iii

第五章

プログラム

３４

５．１

プログラムのながれ・・・・・・・・・・・・３４

５．２

プログラムソース・・・・・・・・・・・・・３６

５．３

プログラムの解説・・・・・・・・・・・・・４６

第六章

まとめ

４９

６．１

研究成果と考察・・・・・・・・・・・・・・・４９

６．２

今後の展開・・・・・・・・・・・・・・・・・５０

参考文献

５１

謝辞

５２

1

第一章

緒言

本文は移動ロボットのプラットホームとしての全方向移動
車を，ジョイスティックによって制御した結果をまとめたものである．

１．１ はじめにロボットは人間にかわる労働手段として様々な研究，開発が行われてきた．その需要はおもに工場における生産，組み立て作業のオートメーション化に従事するロボットマニピュ
レータや，深海や宇宙空間など人が作業できない場所で働くロボットなどが求められ，基本的には人間がそこにいない，もしくは直接手などで関わらない場で作業することを前提に設 計 さ れ て き た ．し か し ，近 年 に お い て は ，Ｓ ｏ ｎ ｙ の A I B Oの よ う な ペ ッ ト 型 ロ ボ ッ ト や HONDA の

Ｐ３

のような人

間型ロボットなどアミューズメントとして人とふれあうロボ

2ットが社会で注目を集めている．さらに研究段階では人間のケアをする介護ロボットなどの開発が行われ，掃除ロボット
や家事ロボットのような人間の生活の場に密接したロボットの需要が増えてきている．このような場所は得てして狭く，煩雑であり，その床面もカーペット，フローリング，畳など
様々なものがある．その中での移動するロボットはこの限られた空間の中で極力無駄がなく正確に動き，どのような床面にも対応する必要がある．このような条件に対応したロボッ
トの移動手段の一つとして本研究の全方向移動車があげられる．

１．２ 本研究の内容

本研究は王によって応用が提案され，設計，作製された全方向移動車を筆者が動きを解析し，ジョイスティックによる制御システムを組み上げたものである．よって本文では制御システムの説明をメインにおいて，全方向移動車本体の設計における細かな形状，寸法などは省略し，大まかなメカニズ
ムのみを記載する．

3

１．３

本文の構成

本節は本文の構成とその具体的な内容について説明する．
第二章では全方向移動台車についての定義と，その利点について説明する．第三章では本研究における全方向移動車のメ
カニカル部の構成と移動における動作，他の全方向移動機構
に対する相違点とその利点についてまとめ，実物を写真を交
え て 説 明 す る ．第 四 章 で は 制 御 シ ス テ ム の 構 成 と 制 御 の 流 れ ，そして各部品の制御に対する説明を記載．第五章では制御プ
ログラムを解説．終わりに第六章において本研究の結果と今後の展開をまとめる．

4

第二章

全方向移動車について

本 章 で は 全 方 向 移 動 車 の 定 義 と ， 一 般 的 な 車 両 に 対 し てどのような利点が生ずるのかを論ずる．

２．１

全方向移動車の定義

本研究における全方向移動車とは具体的には床平面上での移動において以下の機能を持つ車両を指すこととする．

（１）車体の向きを変えることなく３６０度全ての方向に対して直進できる（２）その場で回転することで３６０度全ての方向に車体を
向けられる

5

２．２

全方向移動車の利点

前節において定義した機能を有することで，床平面上での移動において目標に対して移動する際に，車体を移動する方
向にむき直す，目標に達したときに希望の方向に車体の向きを向け直す，といった無駄な動きを省くことができる．この移動は目標に対してきわめて直進的に行動がとれるので，制御操作もわかりやすく，容易になる．以下には自動車と全方向移動車の移動を比較した例を挙げる．

Ｂ

Ａ

図１
図１で図示する地形においてＡ地点からＢ地点へ自動車と全方向移動車の移動経路を比較する．点線で囲まれた四角形
は各車両の大きさであり，Ｂ地点においては車体前面を図の上方に向かせることを条件とする．
自動車の場合図２の矢印で示したような経路となる．この動きは自動車の縦列駐車である．このような複雑な移動は操6

縦者に技量を求める．また，車体の前後に移動するためのス
ペースが不可欠である．

図２

自動車の場合対して全方向移動車の場合図３の矢印で示すように，直進的かつ単純であり，移動するのに車体の幅以上のスペースを必要としていない．

図３

全方向移動車の場合以上はあくまで１例にすぎないが，狭く混雑な床面上での移動に対して全方向移動車が適していると言える．

7

第三章

メカニズム

本章では本研究における全方向移動車の機械構造と動きの検証，他で考案されている全方向移動車に対しての利点の比較を行う．そして実際に作製された全方向移動車を写真を交えて説明する．

３．１

メカニカル部の構成

本研究で制御された全方向移動台車の機構部分の構成は図４に示すようにフリーに動く四つのキャスターで支えられた台車の中央に，２つの独立して動く駆動輪を並列に配置した駆動輪部を，回転軸で連結させたものである．回転軸はブレーキによって台車と駆動輪部の固定，回転が任意にできる．
図５は上からの台車，回転軸，駆動輪部を示している．

8

図４

全方向移動車イメージ

３．２

図５

台車，回転軸，駆動輪部

移動時の動作

車体の方向を維持したまま任意の方向に直進する場合，図６の様に，両駆動輪を異方向に駆動することで駆動輪部を回転 さ せ る（ 状 態

１ ）．駆 動 輪 部 が 台 車 に 対 し て 任 意 の 方 向 をとったとき，回転軸を固定（状態２ ）． 両 駆 動 輪 を 同 方 向 に

駆 動 す る こ と で 直 進 す る ．（ 状 態

３）

状態

１．

状態

図６

２．

６０度方向に直進するプロセス

状態

３．

9

また，回転軸を固定したまま両駆動輪を異方向に駆動することで，その場で回転し，車体を任意の方向に向かせることができる．
以上により本メカニズムは第二章で定義した全方向移動車の条件を満たしたといえる．

３．３

本メカニズムの利点

他の研究で開発されている全方向移動車の多くは，オムニ
ホイールのといった軸方向に対する摩擦なくす特殊な車輪を用い，それを３つから４つをそれぞれ独立して駆動することに よ っ て 全 方 向 移 動 を 実 現 し て い る （ 図 ７ 参 照 ）．

図７

オムニホイール型全方向移動システム

10

それに対して本全方向移動車のメカニズムの特徴は，第一に特殊な車輪を必要としていない．図７からもわかるように
オムニホイールはその複雑な形状から，駆動方向に対する床面への摩擦が弱く，積載量も制限されてしまう．また，その移動もスムーズとは言い難く移動できる床面も限られてしまう．本メカニズムは駆動輪が通常の車輪を使用するので床面の状態や積載量，室内外での使用と様々な使用条件に対応することができる．
第 二 に 独 立 し て 駆 動 さ せ る 車 輪 が 二 つ だ け で あ る ．つ ま り ，駆動に必要なモーターが二つですむということである．このことによりシステムの小型化，メカニズムの簡略化，費用の安価，車体重量の軽量化，電源の省エネなどさまざまな利点が生じている．

３．３

実物

本節では上記で述べたメカニズムを元に設計された実物を，メカニカル部のみを対象として写真を交えて説明する．

11

写真１

全方向移動車上面

写真３

全方向移動車側面

写真２

全方向移動車下面

写真１は全方向移動車の上面部で，車体の上に乗っているのは第四章で説明する制御ボード，ドライバー，ジョイスティックである．写真２は全方向移動車の下面部である．本体の４すみにはフリーに動くキャスターが付いており，中央には２つのモーターと駆動輪を持つ駆動部がある．写真３は全方向移動車の側面部であり，４っつのキャスターと２つの駆動輪が床面に接地しているのがわかる．
台 車 部 分 の 寸 法 は ７ ８ ０ × ６ ５ ０ × ２ １ ５（ ｍ ｍ ）で あ る ．

12

写真４

写真６

駆動輪部

駆動輪と伝達ベルト

写真５

写真７

モーター

回転軸

写真４は駆動輪部，写真５はモーターである．モータから駆動輪への力の伝達は，写真６の様にベルトによって行われる．写真７は台車と駆動輪をつなぐ回転軸で，回転を固定するブレーキと角度を検出する角度センサーがついている．この２つの部品についても第四章で詳しく述べる．

13

第四章

制御システム

本章では制御システムの構成から制御のながれにはじまり，制御に関する各部の詳しい説明を記載する．写真８は実験段階での制御システムである．

写真８

４．１

制御システム

制御システムの構成と制御のながれ

本研究の制御システムは制御ボード，ジョイスティック，
モーター×２，ブレーキ，角度センサー，そして電源部によ14って構成されている．制御ボードは演算用ＣＰＵボードとア
ナログ信号の入出力用ＡＤ−ＤＡボードで構成されており，モーターはドライバーによって制御する．
図８は制御システムの構成図であり，矢印向きは入出力する信号の流れを表している．設置場所としてジョイスティッ
ク以外に特に指定されていないものは台車上部に置く．

駆動輪部
ＣＰＵ

ジョイスティック

ＡＤ−ＤＡ

角度センサー

ドライバー

モーター１

ドライバー

モーター２

ブレーキ

回転軸部

図８

制御システム構成図

制御のながれとしては，ジョイスティック，角度センサー
からの信号をＣＰＵが受け取り，その状態に応じてドライバ
ーとブレーキに信号を送る．ドライバーは受け取った信号に

15

応じてモーターを駆動．なお，ＣＰＵに対して入出力する信号は全てアナログ信号なので，間にＡＤ−ＤＡを通してデジタル化して処理する．

４．２

制御ボード

本研究においての制御ボードとは，単純に使用された電子基板を指すのではなく，ＣＰＵボード，ＡＤ−ＤＡボードを内包したコンピュータシステム全体のことを指す．

４．２．１

制御ボードの構成

制御ボードの構成はＣＰＵ，メモリを有するＣＰＵボードと拡張ボードであるグラフィックカード，ＬＡＮカード，Ａ
Ｄ−ＤＡボード，主記憶装置のハードディスク，入力機器のキーボード，マウス，グラフィックカードからの画像情報を
表 示 す る Ｃ Ｒ Ｔ で 構 成 さ れ る （ 図 ９ 参 照 ）．

16

ＣＰＵボードＣＰＵ

ハードディスクメモリ

グラフィックカード

ＬＡＮカードＣＲＴ

他のコンピュータ

ＡＤ−ＤＡボード

アナログ入出力信号
キーボード

マウス

図９

４．２．２

制御ボードの構成図

ＣＰＵボード

ＣＰＵボードは産業用のものではなく，市販されている組
み立てパソコン用のものを使用した．その意義は，処理速度が高速，ＩＳＡバス，ＰＣＩバスを有し拡張性が高い，安価の３点である．よって本研究のＣＰＵボードの構成は一般的なパソコンとなんら変わりは無い．主なスペックを表１で示
す．

17

ＣＰＵ

Ｃｅｌｅｒｏｎメインメモリ

１２８ＭＢ

ハードディスク

１０ＧＢ

７００ＭＨｚ表１

４．２．３

ＡＤ−ＤＡボード

ＡＤ−ＤＡボードには富士通ロボット用インターフェイス
ボード

ＲＩＦ−０１を 使 用 （ 写 真 ９ ）． こ の ボ ー ド は Ｉ Ｓ

Ａバス規格のハーフサイズ・ボードで，±１０ｖレンジのア
ナログ入力１６チャンネル，±１０ｖレンジのアナログ出力
１６チャンネル有している．

写真９

ＲＩＦ−０１18

それぞれのデータ長は１２ビットで，ＩＳＡバスの割り込み
線はＩＲＱ９〜ＩＲＱ１５まで選択ができる．この設定はジャンパピンで行い，本研究ではＩＲＱ１５を選択している．

４．２．４

制御ボードボックス

制御ボードを納めるボックスはアルミ材で作製．サイズは
３５０×２８０×１６０（ｍｍ）でＣＰＵボードのサイズに合わせており，ハードディスクや電源はボックスの外に配置した．ボックス正面左側にはパワースイッチとＬＥＤを配置（ 写 真 １ ０ ）．

写真１０

ボックス正面

ボックス側面の右側にはセンサー，モーターなどのアナログ
入出力機器の拡張を容易にするために，ＡＤ−ＤＡボードの入出力各１６チャンネルと電源＋５ｖ，±１２ｖにつないだ19

コ ネ ク タ を 並 べ る （ 写 真 １ １ ）．

写真１１

ボックス右側面また，背面にはキーボード，マウス，ＣＲＴの接続の他にドライバー，ブレーキ，角度センサーに接続するコネクタボー
ドと２４ｖバッテリーのＯＮ／ＯＦＦスイッチを設置する（ 写 真 １ ２ ）．

写真１２

ボックス背面

20

４．３

ジョイスティック

制御用のコントローラーであるジョイスティックは，市販の パ ソ コ ン ゲ ー ム 用 の も の を 流 用 し た （ 写 真 １ ３ ）．

写真１３

４ ． ３ ． １

ジョイスティック

ジョイスティックのメカニズム

Ｘ−Ｙ平面の角度を指定する命令はスティックを任意の角度 に 倒 し て 行 う ． そ の メ カニズムは図１０のように，スティックの動きに対してＸ，Ｙそれぞれ方向に連動するようにポテンションメーターを２つ配置する．各ポテンションメータ
ー の 信 号 を 制 御 ボ ー ド の A／ D 入 力 チ ャ ン ネ ル ０ ， １ に 入 力
する．

21

スティック

Ｙ軸 ポテンションメーター

Ｘ軸 ポテンションメーター

図１０

４．３．２

ジョイスティックのメカニズム

ジョイスティックの信号処理

制 御 ボ ー ド が 受 け 取 っ た 信 号 は プ ロ グ ラ ム の 中 で ，（ １ ）式 に
よって角度に変換する．

角度

＝

180
π

(x =

×

arctan( x, y )x軸の入力電圧x 軸の原点時の電圧,y =y軸の入力電圧)y軸の原点時の電圧

（１）

22

さらに本研究ではこの値を±２２．５度の角度は誤差範囲とし て ，４ ５ 度 ず つ の ８ 方 向（ 前 後 左 右 と そ の 間 の 斜 め ４ 方 向 ）に 置 き 直 し て い る ． こ れ は 人 間 が ２ ０ 度 や １ ５ ０ 度 の よ うな
微妙な角度を認識して操作をするのは難しいと判断したから
である．

４．３．３

スイッチ

また，図１２のようにこのジョイスティックには十字キー
１つと４つのスイッチが搭載されている．そのうちの十字キー の 左 右 を そ れ ぞ れ A／ D 入 力 チ ャ ン ネ ル ２ ， ３ に 接 続 し ，
その場での右回転，左回転の信号に割り当てている．その他のキーは現状では使用していない．

図１２

ジョイスティックのスイッチの配置図

23

４．４

モーター

駆動用のモーターは，ギア比４３：１のギアボックス付きの２４ｖＤＣモーターを使用．その制御はドライバーによって行われる．

４．４．１

モーター制御の構成

モーターに対する指令信号は制御ボードのＤ／Ａ出力チャ
ンネル０，１より出力し，それぞれのモータに接続されたドライバーに信号を送る．ドライバーは指令された信号に応じて電源からモータへと電流を流す．図１３はドライバーによって制御されるモーターのイメージ図である．

ＤＣ２４ｖ
＋

−

指令信号
DRIVER

図１３

MOTOR

モーター制御のイメージ

24

４．４．２

ドライバー

モーターの制御用ドライバーには，東京工業大学の
ＴＥＣＨ

ＲＯＢＯＴ

ＴＩ

Ｄ Ｒ Ｉ Ｖ Ｅ Ｒ （ 写 真 １ ４ 参 照 ）を 使

用した．

写真１４

ＴＩＴＥＣＨ

ＴＩＴＥＣＨ

ＲＯＢＯＴ

ＲＯＢＯＴ

ＤＲＩＶＥＲＤＲＩＶＥＲには電流制

御 モ ー ド ， 速 度 制 御モード，位置制御モードという３つの動作モードがある．本研究では指令信号によって速度を制御するために，速度制御モードを使用する．
速度制御モードでフィードバックに用いる回転速度情報は，
疑似タコジェネレータ回路

電子ガバナ回路によって演算する方法と，外部の機械的タコジェネレータによって測定す25

る方法の２通りあるが，制御システムの簡略化のために，外部の速度計を必要としない疑似タコジェネレータ回路を使用する方法をとった．
以上の設定により，モーターは負荷がかかっても，指令信号の速度を保つよう制御される．
写真１５は放熱版をつけて本体に配置されたドライバーで
ある．

写真１５

配置されたドライバー

26

４．５

ブレーキ

回転軸の固定をするためのブレーキは小倉クラッチ社のＴＭＢ１．２を 使 用 （ 写 真 １ ６ 矢 印 ）．

写真１６

ブレーキ

ＤＣ２４ｖ駆動で静摩擦トルクが１２Ｎｍである．制御ボー
ドのＤ／Ａ出力チャンネル２からの信号を図１４に示す回路で増幅して駆動させる．回路は制御ボードボックス背面のコ
ネ ク タ ボ ー ド の 右 側 に 設 置 （ 写 真 １ ７ 参 照 ）．

27

図１７

写真１７

ブレーキ駆動回路図

コネクタボード

ブレーキ駆動回路部

28

４．６

角度センサー

台車と駆動輪部との間の角度を測る角度センサーには，ポテ ン シ ョ ン メ ー タ ー を 使 用 （ 写 真 １ ８ 矢 印 ）．

写真１８

４．６．１

角度センサー

角度センサーのメカニズム

ポテンションメーターとはつまみを回すことで抵抗値の変わる可変抵抗で，本研究では写真１８の様に回転軸の台車側に取り付けて，駆動輪部が回転するとギアによってつまみが回るようになっており，１２ｖの電圧を流したときの電圧の変化を制御ボードのＡＤ入力チャンネル４で読みとらせて，計算によって３６０度の角度に変換させている．

29

４．６．２

角度センサーの信号処理

表２は台車に対して駆動輪部を１５度ずつ回転させ，それぞ れ の 角 度 に 対 し て 読 み と っ た 電 圧の値を表にしたものである．

表２角度に対する電圧の値

この表からは各角度間の電圧の差，つまり変化の度合いは一定ではなく，１８０度に近づくほどに大きくなっていくという特性がみられる．よって角度の算出を（１）式の放物線で近似した．

Y＝A × X ２ + B × X + C(Y : 角度（１），
X : 電圧)30

定 数 A， B， C は 前 後 左 右 に 対 し て の 直 進 移 動 に 重 点 を お いて，０度，９０度，１８０度の３点の電圧値から逆算して割り 出 し た（ 表 ３ ）． 表 ４ は 割 り 出 し た 値 に よ っ て 算 出 し た 角 度と理想の角度を示す．算出した角度と理想の角度の差は１．
５度以内であり，誤差の範囲内であると判断した．

表３

逆算した定数Ａ，Ｂ，Ｃの値

表４算出した角度の値

31

４．６

電源

写真１９

ＤＣ１２ｖ，７Ａの鉛蓄電池

電源はＧＳ社のＤＣ１２ｖ，７Ａの鉛蓄電池（写真１９）
２つを直列につないでＤＣ２４ｖの電源を作る．図１５に示すように，並列してＤＣ−ＤＣコンバーターを接続し，ＤＣ＋５ｖ，ＤＣ±１５ｖ，ＤＣ±１２ｖの電源を作り出す（写真２０

左 か ら ＋ ５ ｖ ， Ｄ Ｃ ± １ ５ ｖ ， Ｄ Ｃ ± １ ２ ｖ ）． そ れ

ぞれの電源を電源配分用コネクタ（写真２１矢印）に接続．
＋２４ｖをモータ駆動用として，＋５ｖと±１５ｖを制御用電源としてドライバーに供給．＋２４ｖをブレーキに供給している．また安全対策として＋２４ｖにはＯＮ／ＯＦＦスイッチを設置した

32

ＤＣ１２ｖ

＋

７Ａ
ＤＣ１２ｖ
７Ａ

＋５ｖ

バッテリー

±１５ｖ

±１２ｖ

−
ＤＣ−ＤＣコンバーター

電流
ＤＣ２４ｖ

ＤＣ＋５ｖ

ＤＣ±１５ｖ

ＤＣ±１２ｖ

グランド
電源分配用コネクタ

各 部 の 電 源
図１５

ＤＣ電源分配の配線図

写真２０ＤＣ−ＤＣコンバーター

33

写真２１

電源分配用コネクタ

ただし，制御ボードはパソコン用の電源ボックスにつなぎ
ＡＣ１００ｖの家庭用電源から供給している．ＣＲＴの電源も同様にＡＣ１００ｖの家庭用電源から供給している．ジョイスティック，角度センサーのポテンションメーターの電源
は，制御ボードボックスに着けた電源コネクタから供給され
ている．

34

第五章

プログラム

本研究ではＣ言語を使用して制御プログラムを組んだ．本章ではプログラムの流れを提示し，ソースとその内容を解説する．

コンパイル環境

本研究制御ボード

コンパイラ

ボーランド社

５．１

Turbo C++ ４ ． ２ ｊ

プログラムのながれ本プログラムのながれを図１６に図示する．これはフローチャートではなく本プログラムによる制御の働きを大まかに理解する手助けとするものであるので，実際のプログラムに対して省略している部が多々有ることをここに前述しておく

35

図１６

プログラムのながれ図

開始

各パラメータの定義付け

キーボードが押されるまで

ジョイスティックの命令
３６０度平面方向＝ＸＹ
全体を回転＝Ｚ

角度センサー＝ａｎｇ

ＮＯ
ＸＹ−ａｎｇ

＞誤差

Ｚ＝無し

駆動輪回転

終了

直進

ＮＯ
全体が回転

36

５．２

プログラムソース

インクルードファイル

N_RIF01.c#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <math.h>int da̲data,i,volt,volt1;
unsigned int reg̲data,baseadr1,baseadr2;
char erron,erroff;

int regst( unsigned baseadr){reg̲data=0xcf;
outpw(baseadr+4, reg̲data);
erroff=(baseadr+4);
return(erroff);}

int regst̲outpw(unsigned baseadr ,unsigned int regst̲no)37{
reg̲data=regst̲no;outpw( baseadr, reg̲data);
return 0;}
double da̲outpw(unsigned baseadr ,int port̲no, double value ){if( (port̲no >= 0)&&(port̲no <= 15) ){da̲data = (value+10.0) / 20.0 * 4096.0;
if (da̲data <0) d a ̲ d a t a =0;

if (da̲data > 4095) da̲data = 4095;
outpw(baseadr+2, 0xf0+port̲no);outpw(baseadr, (unsigned)da̲data);
erroff=(da̲data);
return(erroff);}else{
erron=1;
return(erron);
}
}

38

double ad̲inpw( unsigned int baseadr ,unsigned int port̲no ){doublevolt;

int

ad̲read̲data;

unsigned int ad̲write̲data;ad̲write̲data = port̲no*8+5;
if( (port̲no >= 0)&&(port̲no <= 15) ){outpw(baseadr+2, 0x70+port̲no);/*0..7:AD1, 8..F:AD2 */outpw(baseadr , port̲no*8+5);/* SWCONV on, 2'comp. format */for(i=0;i<10; i++) ad̲write̲data=i;/* wait */ad̲read̲data = (signed)inpw( baseadr );if ( ad̲read̲data & 0x0800 ) ad̲read̲data ¦= 0xf000;
volt = (double)ad̲read̲data // 2048 * 10;return(volt);}
else{
erron=(1);return(erron);
}
}

39

C ファイル

Nomura.c#include <stdio.h>#include <stdlib.h>#include <math.h>#include <conio.h>#include "c:¥N̲works¥N̲rif01.c"#define base̲adr 0x1a0 //RIF01 ボ ー ド

ベースアドレスvoid

control̲body(void);

doublexy̲angle(int *);doublez̲angle(void);

doublepost̲s(void);void

post̲control(double, double, double);void

motion̲control(double, double, int);/*各 固 定 値 の 定 義 */doubleX0, Y0; //ジ ョ イ ス テ ィ ッ ク (x,y)零 点 値

static double delta̲x=0.7, delta̲y=0.7;//ロ バ ス ト 方 向 を 実 現 す る た め の し き い 値
static int K=30; //駆 動 輪 部 角 度 検 出 の 修 正 回 数
static double delta̲alph=5.0; //delta̲alph=駆 動 輪 部 姿 勢 誤 差
static double U̲alph=2.5; //U̲alph=駆 動 輪 回 転 時 の 電 圧
static double P̲alph=0.5;//P̲alph=本 体 回 転 時 の 電 圧
static double U̲motion=1.0; //U̲motion=駆 動 輪 直 進 時 の 電 圧

40static double P̲fix=5.0; //P̲fix=駆 動 輪 部 姿 勢 固 定 の 電 圧
static int joy̲x=0,joy̲y=1,joy̲z1=2,joy̲z2=3; //AD
static int post=4;
static int motor1=0,motor2=1;//DA

出 力 chst a t i c i n t f i x = 2 ;void main(void){
printf("¥n");regst(base̲adr);//レ ジ ス タ の 設 定

X0=ad̲inpw(base̲adr,joy̲x); //零 点 測 定
Y0=ad̲inpw(base̲adr,joy̲y);control̲body();da̲outpw(base̲adr,motor1,0.0);//終 了 プ ロ セ ス
da̲outpw(base̲adr,motor2,0.0);da̲outpw(base̲adr,fix,0.0);
exit(0);}void control̲body(void)
{
int

i;

int

p=0;

doublexy̲R,doublealph=0.0;z̲R;for(;!kbhit();){
xy̲R = xy̲angle(&p);//方 向 目 標 値 の 測 定

入 力 ch41z̲R= z̲angle();alph = post̲s();if(xy̲R!=1000 ¦¦ z̲R!=1000){if(fabs(xy̲R - alph) > delta̲alph){post̲control(xy̲R, alph, z̲R);}
else{
motion̲control(xy̲R, alph, p);
}
}
else{
da̲outpw(base̲adr,motor1,0.0);//各 部 停 止da̲outpw(base̲adr,motor2,0.0);da̲outpw(base̲adr,fix,P̲fix);}

printf("xy̲R=%f p=%d z̲R=%f alph=%f ¥r",xy̲R,p,z̲R,alph);}}void post̲control(double xy̲R, double alph, double z̲R)//回 転{if(z̲R == 1000){da̲outpw(base̲adr,fix,0.0);
if(xy̲R >= alph){da̲outpw(base̲adr,motor1,+U̲alph);da̲outpw(base̲adr,motor2,+U̲alph);

42

}
else{
da̲outpw(base̲adr,motor1,-U̲alph);d a ̲ o u t p w ( b a s e ̲ a d r , m o t o r 2 , - U ̲ a lp h ) ;
}
}
else{
da̲outpw(base̲adr,fix,P̲fix);if(z̲R > 0){da̲outpw(base̲adr,motor1,-P̲alph);da̲outpw(base̲adr,motor2,-P̲alph);}else{da̲outpw(base̲adr,motor1,+P̲alph);da̲outpw(base̲adr,motor2,+P̲alph);}}}void motion̲control(double xy̲R, double alph, int p){da̲outpw(base̲adr,fix,P̲fix);if(p==12){
da̲outpw(base̲adr,motor1,-U̲motion);da̲outpw(base̲adr,motor2,+U̲motion);}else{da̲outpw(base̲adr,motor1,+U̲motion);

//直 進

43

da̲outpw(base̲adr,motor2,-U̲motion);}}

double xy̲angle(int *p)//(x y)平面の全方向目標値(0-360)を 測 定 す る{
intstop=1000;

doubleang,x,y;doubler,r1,r2;

x=X0 - ad̲inpw(base̲adr,joy̲x);y=ad̲inpw(base̲adr,joy̲y) - Y0;

if(fabs(x)<=delta̲x && fabs(y)<=delta̲y) return(stop);

ang = (180.0/3.1415926)*atan2(y, x);if(ang<=-22.5) ang=ang + 360.0;
for(i=0;i<=7;i++){r = 45*i;r1= r - 22.5;
r2= r + 22.5;
if(ang>=r1 && ang<r2) ang=r;}
if(ang>=180){*p=34;
ang=ang - 180.0;
}

44

else{
*p=12;}

return(ang);}

double z̲angle()//z 軸 回 転 （ 本 体 と 駆 動 輪 部 を 固 定 し て 回 転 ） を 指 定//順 時 計 回 り :ad̲ch → joy̲z1//逆 時 計 回 り :ad̲ch → joy̲z2{
intstop=1000;

doubleb ang,z1,z2;

z1=ad̲inpw(base̲adr,joy̲z1);
z2=ad̲inpw(base̲adr,joy̲z2);

if(z1>4.0 && z2<1.0){
ang = -30.0;}
else if(z1<4.0 && z2>1.0){
ang = 30.0;}
else{
return(stop);}
return(ang);

45}
double post̲s()//駆 動 輪 部 の 角 度 検 出//alph=a*Vo^2+b*Vo+c/ / ( 1 8 0 度 → 2 . 7 1 v 9 0 度 → 4 . 5 6 v 0 度 → 7 . 3 7 v )の 二 次 式 に よ る 近//Vo＝ 測 定 し た 電 圧 値{
int i;
double a=3.566561995,b=-74.57755435,c=355.9119844;
double alph,Vo;for(i=0;i<K;i++){Vo=ad̲inpw(base̲adr,post);
alph = alph + (a*Vo*Vo + b*Vo +c);}alph = alph/K;

return(alph);
}

46

５．３

プログラムの解説

Ｎ＿ＲＩＦ０１．ｃ
ＡＤ−ＤＡボードＲＩＦ−０１のドライバー．プログラムに
インクルードすることで以下の関数が使える．

double da_outpw(unsigned baseadr ,int port_no, double
value )
ベースアドレス，ポートナンバー，電圧を指定してＤＡポートから信号を出力．出力電圧範囲は±１０ｖである．

double da_outpw(unsigned baseadr ,int port_no, double
value )
ベースアドレス，ポートナンバーを指定してＡＤポートからの信号を入力．入力電圧範囲は±１０ｖである．

47

ｎｏｍｕｒａ．ｃ
本プログラムvoid

control_body(void)

本章で提示したプログラムの流れを組む関数．

doublexy_angle(int *);第四章ジョイスティックの節で提示した，ＸＹ平面方向への信号に対する角度の計算をする関数．指令がなければ１０００を返す．角度が１８０度以内ならＰ＝１２として角度を返し，１８０度を超えるとＰ＝３２として−１８０した角度を返す．

doublez_angle(void);

第 四 章 ジ ョ イ ス テ ィ ッ ク の 節 で 提 示 し た ，そ の 場 で の 右 回 転 ，
左回転の信号を計算する関数．指令がなければ１０００を返す．

doublepost_s(void);

第四章角度センサーの節で提示した，台車に対する駆動輪の角度を計算する関数．

48

void

post_control(double, double, double);

ドライバーに指令を送り車体もしくは駆動輪を回転させる関
数 ．関 数 z _ a n g l e ( v o i d ) の 指 令 が あ る 場 合 ブ レ ー キ を 締 め て 回転．なければブレーキを解放する事で駆動輪部のみが回転す
る．

void

motion_control(double, double, int);

ドライバーに指令を送りブレーキを締めた状態で直進させる
関 数 ． 関 数 x y _ a n g l e ( i n t * )の Ｐ ＝ １ ２ の 時 正 方 向 に 直 進 し ，Ｐ＝３２の時逆方向に直進．

49

第六章

まとめ

本文では，全方向移動車の一つの形を考察し，ジョイステ
ィックによって制御する事を前提とした制御システムの作製をして，その構成をまとめてきた．本章では作製した全方向移動台車についての実験による研究成果の考察と，今後の課題などを述べる．

６．１

研究成果と考察

結果から述べると，本制御システムによって第二章で定義した動きを実現することには成功した．しかし，その実現性は高いとは言い難いものであった．
その問題の一つめとして長距離の直進が難しいという点が上げられる．本研究ではモーターの回転特性をドライバーによって調整ができるようになっているが，あくまで人の感覚によって調整されたものなので，その回転特性を同期させるのが難しく，結果として直進せずに緩やかにカーブを描くよ50

うな移動をとった．この対処法として，調整によるモーターの同期には限界があると考え，外部の速度計などでフィードバックする事が考えられる．
二つめの問題として予想以上に積載用が低いという点である．何も乗せていない状態では，円滑に直進，回転といった行動がとれたのだが，５０ｋｇの荷物を載せたところ，その場で回転する動作をとらしたとき，回転軸のブレーキが滑って回転する事ができなかった．１００ｋｇの荷物を載せた場
合は床面を駆動輪が滑り出し，直進行動すらとることができなかった．この問題はブレーキの力が足りないのと，駆動輪の床に対する摩擦が弱いことが原因だと考えられ，５０ｋｇ以上の積載量を求めるので有ればメカニカル部の部品に対する再設計が必要であると考える．

６．２

今後の展開

今後の展開としてはまず前節であげたような欠点を取り除くこと．次にさらなる研究課題として各種のセンサーを搭載
し，自動化を図る．そしてこの全方向移動車の応用による製品の開発をすることを目標に挙げる．

51

参考文献

日向俊二， すぐに役立つ！Ｃ／Ｃ＋＋プログラミング辞典
翔 泳 社 （ 2000）

52

謝辞

本文は，筆者の高知工科大学知能機械システム工学科卒業
研究の内容をまとめたものです．
本研究を行うのに当たって，何の知識も持ち合わせていな
い筆者を２年間にわたって親身となってご指導をしていただ
き，ものを作る楽しさを教えていただいた高知工科大学知能
機械システム工学科王碩玉助教授に深く御礼申し上げます．
また，日頃から研究において励まし，アドバイスをくださった同大学王碩玉知能ロボティクス研究室の種植健二氏，溝渕宣誠氏，二木亮輔氏，菅野正人氏，隅田由紀氏に感謝します．
そして，自身が忙しいにも関わらず，筆者のわがままな行
動に時間を割いていただいた同大学４回生の浜口和洋氏，飯田一生氏に深く感謝いたします．
最後に，筆者の研究に対して理解を示し，支援してくれた
両親に深く感謝をいたします．
２００１年２月