3.3 とりあえず使ってみる。(USB マウス)
PICでマウスを作れるなら、mbedでもという事でやります。
1.サンプルを持ってくる。
mbedは豊富なサンプルがあるので、それを利用します。
サンプルはここにあります。 /users/simon/programs/USBMouse/5yz1g このmain.cppをみると
#include "mbed.h" #include "USBMouse.h" DigitalOut led(LED1); USBMouse mouse; int main() { while(1) { mouse.move(10, 5); led = !led; wait(4); } }
4秒ごとにxに10カウント、yに5カウント動かします。 USBMouse.hをみると、move以外にscroll(int z),buttons(int left, int middle, int right)のメソッドがあることがわかります。
接続
mbedのマイクロUSBはmbedIOというものに繋がっているので、ここでつかうUSBではありません。注意!
応用1 Joystickを接続
秋月電子のJoystick http://akizukidenshi.com/catalog/g/gP-04048/ を使用してアナログMouseを作成します。
できたものはこちら/users/yueee_yt/programs/USBMouse_Joystick/lsjbtk
#include "mbed.h" #include "USBMouse.h" DigitalOut led(LED1); USBMouse mouse; AnalogIn x(p19); AnalogIn y(p20); int main() { float xx,yy; int mx,my; while(1) { xx=x.read(); yy=y.read(); if((xx<0.45) || (xx>0.55))mx=(xx-0.5)*10.0; else mx=0; if((yy<0.45) || (yy>0.55))my=(yy-0.5)*10.0; else my=0; mouse.move(mx,-my); wait(0.01f); } }
Joystickにより少し中点の値がふらふらしていましたので0.45から0.55までを不感帯としています。
ジャイロセンサーを使用したマウス
秋月電子の圧電ジャイロモジュール(AE-GYRO-SMD)を使用しています。 準備AE-GYRO-SMDのC6とC7をショートさせます。これは微分回路になるのを防ぐためです。 (ショートさせるとその代わり、DC成分も流れるのでドリフト電圧が発生します) また、このモジュールは個体差がかなりあり、Offsetの電圧はまちまちみたいです。
接続
ジャイロモジュール | mbed |
---|---|
CN1 | p20 |
CN2 | p19 |
CN3 | Vout |
CN4 | GND |
USB | mbed |
---|---|
1 - VUSB | Vin |
2 - D- | D- |
3 - D+ | D+ |
4 - GND | GND |
コードの完成版はここ/users/yueee_yt/programs/USBMouse_Gyro/lsl2dq
#include "mbed.h" #include "USBMouse.h" #include "TextLCD.h" DigitalOut led(LED1); USBMouse mouse; AnalogIn x(p19); AnalogIn y(p20); TextLCD lcd(p24, p26, p27, p28, p29, p30); Ticker timer; float deg_x = 0.0; float deg_y = 0.0; float deg_xx=0.0; float deg_yy=0.0; float init_x=0.0; float init_y=0.0; void attime() { static int kai=0; static float xx=0.0; static float yy=0.0; static float xx_old=0.0; static float yy_old=0.0; xx+=x.read(); yy+=y.read(); kai++; if (kai==20) { xx=(xx-init_x)/20; xx=(int)(xx*3300); yy=(yy-init_y)/20; yy=(int)(yy*3300); if (((xx-xx_old)*(xx-xx_old))>100) { deg_xx=xx/6.1*0.02; deg_x+=deg_xx; xx_old=xx; } else { deg_xx=0; } if (((yy-yy_old)*(yy-yy_old))>100) { deg_yy=yy/6.1*0.02; deg_y+=deg_yy; yy_old=yy; } else { deg_yy=0; } lcd.locate(0,0); lcd.printf("x=%3.1f ",deg_x); lcd.locate(0,1); lcd.printf("y=%3.1f ",deg_y); kai=0; xx=0; yy=0; } } int main() { int i; lcd.cls(); lcd.printf("start!"); for (i=0;i<1000;i++) { init_x+=x.read(); init_y+=y.read(); } init_x=init_x/50; init_y=init_y/50; timer.attach(&attime, 0.001f); while (1){ mouse.move((int)(deg_xx*10),(int)(deg_yy*10)); } }
Information
Mouse.moveは割り込みに入れないこと。(とても遅い割り込みならOKかも)(処理が終わる前に次の割り込みが来るとPCが認識できません)
Please log in to post comments.