ROS(Robot Operating System)を使う
安曇野の森から> ROS(Robot Operating System)を使う> TurtleRealを作る
ROSのチュートリアルでよく使われるTurtlesimの実機版TurtleRealを作りました。
本家本元のTurtlesimはROSを勉強すると必ず出てくる左図のようなウミガメロボットのシミュレーターです。
勉強用にROSで動く安価でシンプルな実機を作る。
TurtleRealに必要な機能は以下のとおりです。
左図はTurtleRealのハードウェアブロック図です。
Raspberry Pi model BにはUSBポートが一つしかないので2ポートのUSBハブを付けて位置検出用マウスと無線LANドングルを接続します。
モーターの制御はモータードライバーにRaspberry PiのGPIOを接続し、ソフトウェアでPWMを行います。
以下が今回作成したTurtuleRealの制御回路です。
電源回路とRaspberry Piに直結するモータードライバーだけで構成されていす。
Raspberry Pi Model AにRASPBIANとROS(Hydro)をインストールしてあります。
Raspberry PiへのROSのインストール方法はこちらを見てください。
Raspberry Piに取り付けているUSBハブと無線LANドングルです。
基板側にハブが入るようにUSBの自在コネクタを使いハブをコネクタ側に折り返しています。
USBハブとUSB自在コネクタは百円均一で\100で購入したものです。今は\100でUSBハブが買えてしまうんですね。
シャーシー代わりになるガラスエポキシ両面スルーホール基板にギアボックスを直接取り付けています。
ギアボックスは可能な限り遅くなるように設定しています。(モータ電圧3V時9rpm)これは後で制御ソフトのところで説明しますがRaspberry Piでは制御周期が短く出来ないことを補うため、移動速度を出来るだけ抑えています。
回路的には紙エポキシの片面基板でも使えますが、紙エポキシの場合は吸湿等の影響がありソリが大きい場合があるので、シャーシー代わりとして使うのは不具合が出そうです。
そのため今回は、ちょっと高めですがガラスエポキシの両面基盤を使っています。
今回はマウスを位置センサーの代わりとして使います。
左図は百円均一で購入した\300のマウスです。価格.comでもここまで安いマウスはありません。
この格安マウスを分解すると左図のようになっています。
中の基板は左図のような構造になっています。光センサー以外の部分は不要なので切り離します。
切り離す部分はほとんどスイッチですが、プルアップ抵抗等が入っていないので、そのまま切り離したままにしも回路的には問題がなさそうです。
左図はマウス基板を切った状態です。
予想どおり、この状態でも正常に動作しました。
切り離した部分のクリック用スイッチはバンパースイッチとして再利用出来ますが、今回は使っていません。
アルミ板で左図のような部品を作りました。
左からマウス基板固定板、電池ボックス固定台、放熱板です。
マウス基板はマウス基板固定板とシャーシーになる両面基板とで挟んだ状態で固定します。マウス基板固定板の底にはマウスから剥がした樹脂製のすべり板を張り付けてあります。
電池ボックス固定台はコの字のブリッジ形状で上面に電池ボックスを両面テープで貼り付け、両面基板上に載せています。
放熱板は両面基板左側に立てて取り付けてあり、電源レギュレーターの熱を逃す役目と電池ボックスをベルクロテープで固定する役目をします。
タミヤ純正の直径58mmの細めのタイヤです。
2軸式の移動ロボットの場合、タイヤが太すぎるとタイヤ間に回転速度差がある時に位置誤差につながるので出来るだけ細い方が望ましいためです。
左図は今回使用した新日本無線製モータードライバーNJM2670です。
このデバイスには2つのモータードライブ回路が入っています。最大出力も1.3Aと比較的大きいので今回のロボットには最適です。
インターフェースはTTL仕様ですが、"H"レベルの最大値が2VなのでRaspberry Piの3.3V出力でも直結で制御出来ます。
モータードライブHブリッジ回路の上下トランジスタの順方向電圧降下が最大合計で2.3Vと大きいのでモーター電流を流し過ぎるとかなり発熱する可能性があります。
6VバッテリーからRaspberry Piとモータードライバー用の5Vを作る東芝製低損失レギュレーターTA4805Sです。
低損失とは言っても電圧ドロップが0.5Vありますから、5Vとのマージンは0.5Vしか残らないのでバッテリーはあまり長持ちしないかもしれません。
もっともバッテリーの方も公証出力は1.5Vですが、実際にはそれより高い電圧が出ているので、もしかしたら比較的長く使えるかもしれません。
いずれにせよ実験用なので気にしないことにします。
小型化のため、単4 x 4本の電池ボックスを使っています。
以下がRaspberry Piと周辺を除いた主要部品の価格です。
小さく作ることにこだわりすぎて目標の\3000を越えてしまいました。
小型化のために小型ギアーボックスとタイヤをタミヤの通販サイトから購入しましたが、ここを千石電商あたりで売っている少し大きめで安いものに代えれば、あと\1500は安くなり、余裕で目標値内に入ります。
部品名 | 型番/仕様 | 販売店 | 個数 | 単価 |
---|---|---|---|---|
ミニモーター低速ギヤボックス | 4速 | タミヤ | 2 | \928 |
ナロータイヤセット | 58mm径 | タミヤ | 1 | \518 |
マウス | USB光学 | ダイソー | 1 | \300 |
モータードライバー | NJM2670 | 秋月電子 | 1 | \300 |
基板 | 両面スルーホール | 秋月電子 | 1 | \200 |
分割ロングピンソケット | 42pin | 秋月電子 | 1 | \80 |
電池ケース | 単4 x 4 | 秋月電子 | 1 | \50 |
5Vレギュレーター | TA4805S | 秋月電子 | 1 | \100 |
電源スイッチ | 125V,5A | 秋月電子 | 1 | \80 |
電解コンデンサ | 1000uF,16V | 秋月電子 | 2 | \20 |
アルミ板 | 1.0t 300 x 100mm | 1 | \120 | |
合計金額 | \3644 |
上で紹介した部品を順に組み立てていく様子を以下で説明します。
左図は回路図どおりに配線が済んだ状態です。
基板中央部にモータードライバーが付いています。
また、画面上側に放熱板が立っており、そこに電圧レギュレーターが付いています。
左図は回路作成後の底面です。
切断されたマウス基盤がアルミ板によって挟まれて底面に取り付けられています。
進行前方向にマウスから外した樹脂製のすべり板が付いていて、ここでロボット前部の重量を受けます。
バッテリーケースはアルミ板で作ったコの字型の台の上に両面テープで張り付けて両面基板に載せてあります。
また、動かないように片側をベルクロテープで放熱板に張り付けてあります。
両面基板に立てた30mmのスペーサーで基板上にRaspbeery Piを取り付けています。
このRaspberry PiにはUSB自在コネクタでつなげたUSBハブを取り付け、USBハブには無線LANドングルとマウスをつないであります。
右側には電源回路と放熱板が付いています。
左側からバッテリーを出し入れします。
タイヤを取り付けて完成です。
Raspberry Piでは仮想ディレクトリ/sys/class/gpioを通してGPIOにアクセス出来ます。
古いバージョンのRASPBIANでは、この仮想ディレクトリをアクセスするのにルート権限が必要でしたが、最近のバージョンではユーザー権限でもアクセス出来るようになりました。
以下のコマンドで仮想ファイル/sys/class/gpio/exportにポート番号を書き込むと/sys/class/gpio内に"gpio"にポート番号が付いた仮想ディレクトリが作成されます。
例えばポート番号に"2"を入れて上記コマンドを実行すると「/sys/class/gpio/」内に「gpio2」という仮想ディレクトリが作成されます。
この仮想ディレクトリ内にGPIOの入出力方向を設定する仮想ファイル「direction」と入出力値を読み書きする仮想ファイル「value」が作成されます。
ポートがGPIO2の場合、以下のコマンドで仮想ファイル/sys/class/gpio/gpio2/directionに"out"を書くと出力、"in"を書くと入力になります。
ポートGPIO2を出力に設定した場合は以下のコマンドで仮想ファイル/sys/class/gpio/gpio2/valueに出力値を書くと、その値がGPIO2に出力されます。
ポートGPIO2を入力に設定した場合、以下のコマンドで仮想ファイル/sys/class/gpio/gpio2/valueからGPIO2の入力値を読み出すことが出来ます。
プログラムからは上記仮想ファイルを普通のファイルと同じようにオープンして読み書きすればGPIOにアクセスすることが出来ます。
以下にサンプルコードを示します。
exportにポート番号7を書いてから、実際に仮想ディレクトリ"/sys/class/gpio/gpio7"が生成されるまで、少し時間がかかります。すぐに"/sys/class/gpio/gpio7"を使おうとするとオープンエラーになることがありましたので注意してください。
以下の一連のスクリプトでハードウェアが正常に動作しているかを確認することが出来ます。
以下のスクリプトはRaspberry Pi上で動作させるスクリプトです。
以下のスクリプトはGPIOの入出力モードと初期出力値を設定します。
以降のスクリプトを実行する前に必ず1度は実行してください。
以下のスクリプトを実行するとロボットは前進します。
以下のスクリプトを実行するとロボットは停止します。
以下のスクリプトを実行するとロボットは後進します。
以下のスクリプトを実行するとロボットは右回転します。
以下のスクリプトを実行するとロボットは左回転します。
申し訳ありません。工事中です。
「Raspberry Piで遊ぼう!」 | 林和孝著 | ラトルズ社 | 2014年 |
「ラズパイマガジン」 | 日経BP社編 | 日経BP社 | 2014年 |
ROS JAPAN Users Group主催の第5回ROS勉強会@名古屋2015/4/11でTurtleRealについて発表しました。
その発表で使った資料が以下リンクにありますので参考にご覧ください。
「TurtleReal ー Raspberry PiとROSで動かす安価な2軸駆動ロボット ‐」