Rough English Here |
|
|
|
|
|
7/30, 2002: 自立型になりました!全面的に加筆修正してあります.
7/15, 2002: ページ作成
[]
オプティカルマウスに車輪を取り付け,自ら走ってしまうマウスを製作してみました.
制御に用いたマイコンはCygnal社のC8051F300で,開発キットおよびチップを 三洋電機(株)様よりご提供いただきました.
オプティカルマウスセンサについて
![]()
現在,オプティカルマウス(光学式マウス)として売られているものの多くには, Agilent Technologies社製のセンサが使われています.
今回購入したLogitech社製のマウスには"ADNS-2051"が使われていました(データシートはAgilent Technologiesのサイトから入手可能です).このセンサは,対象物体の表面のテクスチャを16x16画素のCMOSイメージセンサで1秒間に最大2300回(!)読み取り,相関演算によって移動距離を算出するというものです.ADNS-2051には外部とのインターフェースとしてロータリエンコーダ互換の出力の他,2線式のシリアルインターフェース(SPI)を備えており,MPUと簡単に接続することが可能です.
今回はこのセンサから得られるX,Y方向の移動速度を基に,左右のモータのフィードバック制御を行います.
ちなみに今回使ったマウスはLogicool OM-45UPiBという型番のものです. 「スキャンスピードが2000回/秒」という記述からADNS-2051が使われているはずと推測し, えいやっと購入したらビンゴでした:-)
ラジコンサーボについて
![]()
車輪を駆動するためのモータとして,今回は市販の小型ラジコンサーボを改造して使用しました. 一般に,ラジコンサーボにはモータ,ギア,ドライバ回路,位置フィードバック用のポテンショメータが内蔵されていて,電源と位置指令用の信号を与えるだけで動作します.
今回は GWS社の"PICO STD"という製品を使いました.重さがわずか5.4gで非常に小型ですので,マウスのような小さい筐体に収めるには最適です.
通常,ラジコンサーボはそのままでは無限回転ができません.このため,最終段のギア(写真右)にあったストッパをカッターで切り取り,さらにこのギアの軸穴をドリルで少し広げる加工をしました.こうすると,サーボのポテンショメータ(写真左の,左側の軸についている)に動力が伝わらなくなります. さらに,ポテンショメータが振動等で動かないよう,念のため瞬間接着剤で軸を固定しました.
車輪は'ホールソー'という大きい穴をあけるための工具を使いって,ボール盤でアルミ板から切り出しました. 両面テープで薄いゴムを張り付けてあります. 中央の穴にはサーボホーンがしまりばめで装着されています.
バッテリについて
電源はラジコン用の小型ニッケル水素電池(4セル,4.8V)を利用しました. ユニオンモデルのRCP-110というものです. 充電器には秋月電子の急速充電キットを改造して使っています.
マウス内部のスペースが小さくそのままでは収まらなかったので,電池を分解して2つに分離しています.
とりあえず動かしてみる
まず,「C8051F300 MCU用開発キット」に付属のボードに接続して動かしてみました. プログラムの開発は付属の統合開発環境を使って,C言語で記述しました. プログラムの転送やデバッグは2線式のJTAGみたいなのを経由して行います.楽ちんです.
自立化への道
←回路図(クリックで拡大します)
C8051F300は3.3V動作,ADNS-2051とラジコンサーボは5V動作です.普通はレベル変換の回路が必要ですが,C8051F300のI/Oピンの耐圧が5Vあるので直結することが可能です.このため回路はとてもシンプルになりました.
マウス内部の基板にはADNS-2051とUSBとのインターフェースを行うためのIC等も搭載されていますが, これらは不要なので取り去り,結果的に右の回路図のようになりました.
SW1,SW2はマウスのボタンで, CN1は充電用のコネクタ,CN2はJTAGアダプタを接続するコネクタです.
これがご本尊様のC8051F300.小さい!
このチップは 三洋電機(株)様よりご提供いただいたものですm(..)m
取り付け方法はいしかわさん方式です. ハンダづけする時にコテ先が震えますが,がんばります.
3.3Vを作る3端子レギュレータも超小型のものを使いました. XC62FP3302というものです.
後輩が現品.comで購入したものを分けてもらいました.
実は光学マウス自体もプレゼントされたものなので,このマウスの部品はほとんど人からもらったものばっかりです(^^;
マウスの筐体に穴あけ加工をし,基板,サーボ,バッテリを取りつけました.
なんとかギリギリ収まっています.
フロントには小型のスライドスイッチを取り付け,電源スイッチとしました.
コネクタはおしりから出ています.
ソフトウェア
ソフトウェアはCYGNAL開発キットに付属の統合開発環境を用い,Windows上で行いました. C言語でソースレベルデバッグが行えるので,はじめてでもスムーズに開発を行うことができました.
- モータ制御
ラジコンサーボは通常,PWMのデューティ比によって位置制御を行いますが, 今回はポテンショメータが固定されていて無限回転をします. このため,PWMのデューティ比をある値にするとモータが停止し,デューティ比を上げていくとモータが徐々に回りはじめます.また,デューティ比を下げていくと逆に回転をします.
PWMの発生にはPCAの16bit PWMモードを使用しました. デューティ比を制御するためにCCF割り込みを使っています.
- センサとの通信
C8051F300とADNS-2051とはSPI(Serial Peripheral Interface)という2線式シリアルインターフェースを使って接続しています. C8051Fxxxの他のシリーズはSPIを搭載しているようですが,C8051F300は残念ながらSPIを持っていません.そこでSPIはソフトウェアで実装しました.SPIの2本の線のうち,一方はMPUから出力するクロック信号で,他方は双方向のデータ信号です.ADNS-2051のデータシートの記述に従い,クロックに同期してデータをやり取りすることでADNS-2051のレジスタにアクセスします. なお,今回は簡単のためエラー訂正は実装していません.
- フィードバック制御
ADNS-2051からは,X方向,Y方向の移動速度の他,センサのシャッター速度(対象物が明るければ小さくなり,暗ければ大きくなります)などのデータが得られます.今回はこれらのデータを利用して,車輪の速度制御およびライントレース(地面の線に沿って進む)を実装してみました.
─ 速度制御 ─
右図のようなモデルを考えると,左右の車輪の速度(VR,VL)は,センサの速度(Vx,Vy)を用いて 以下のように求めることができます. 車輪の速度を左右独立に測定ことができるので,それぞれに対して比例制御(目標速度との差に定数をかけたものを出力とする)を行うことで,速度制御を実現しました.
![]()
─ 直進制御 ─マウスを直進させたい場合,上の図のVyを積算することでマウスがどれだけ曲がったかを知ることができます.直線から外れたら逆の方向に曲げる(左右の車輪の速度差を変える)ことで,マウスを真っ直ぐ走らせることができます.
─ ライントレース ─
ADNS-2051からはシャッター速度の値を読むことができますが,この値は対象物(地面)が明るければ小さくなり,暗ければ大きくなります.そこで,「対象物が明るければ右に曲がり,暗ければ左に曲がる」といった制御をすることで,白と黒の境界線をたどるように走らせることが可能です.
- プログラム
製作したプログラムを以下に置いておきます.
running-mouse-v2.lzh (LHA圧縮,6k byte)
running-mouse.lzh (自立化前の旧バージョン.LHA圧縮,6k byte)
デモンストレーション
実際に動作させたときの動画です.
直進 (AVI(MotionJPEG)形式, 1.5M byte)
マウスを直進させます.制御がかかっているので,指で突っついても直進しようとします.
これは自立化前の映像です.
ライントレース (AVI(MotionJPEG)形式, 2.3M byte)
地面の白と黒の境界線をたどるように走行します.今度は自立してます.
速度は遅めですが,ちゃんと動作しているのが分かると思います.
![]() |
このページに関するコメントをお願いします | ![]() |
| Copyright © 2002 KOMORIYA Takeru | リンクはご自由に (参考) | →開発レポートにもどる |