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ではありません。注意!

/media/uploads/yueee_yt/imgp0369.jpg

/media/uploads/yueee_yt/usb1.jpg

応用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
CN1p20
CN2p19
CN3Vout
CN4GND
USBmbed
1 - VUSBVin
2 - D-D-
3 - D+D+
4 - GNDGND

コードの完成版はここ/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.