はじめに
この記事では、mbedを使ってUSBエアマウスの簡単なプロトタイプを作成する方法を説明します。
mbedとは
mbedとは、mbed対応ボード(ARM Cortex-Mベース)のための開発フレームワークのことです。オンラインIDE、OS、mbed対応ボードなどを含めたエコシステム全体のことをmbedと呼びます。mbedを使うことで、プロトタイプ開発を迅速に進めることができます。詳細については、公式ページなどを参照してください。
作成したUSBエアマウスの使い方
以下に、作成したUSBエアマウスの使い方を説明します。
マウスカーソルの水平移動
ボードを横方向に傾けると水平方向にマウスカーソルが移動します。また、傾きを検出している間は、LEDが青色に点灯します。
マウスカーソルの垂直移動
ボードを縦方向に傾けると垂直方向にマウスカーソルが移動します。傾きを検出している間は、LEDが青色に点灯します。
マウスの右クリック
タッチセンサの右半分をタッチすることで、マウスの右クリックができます。同時にLEDが緑色に点灯します。
マウスの左クリック
タッチセンサの左半分をタッチすることで、マウスの左クリックができます。同時にLEDが赤色に点灯します。
USBエアマウスの作成方法
USBエアマウスは、以下の流れで作成しました。
- FRDM-KL25Zのファームウェアの更新
- 必要なライブラリのインポート
- コーディング
- コンパイル
FRDM-KL25Z
今回は、mbed対応ボードとして、FRDM-KL25Zを採用しました。FRDM-KL25Zは、以下のような機能を備えています。
- ARM Cortex-M0+
- 3軸加速度センサ
- 静電容量タッチセンサ
mbed FRDM KL25Z 諸元
https://os.mbed.com/users/okini3939/notebook/mbed_frdm_kl25z_jp/
ファームウェアの更新
FRDM-KL25Z上でmbedを使うために、ファームウェアを更新する必要があります。更新方法については、以下のWebページなど参照してください。
mbed FRDM KL25Z ゲッティングスターテッド
https://os.mbed.com/users/Norisuke/notebook/mbed-frdm-kl25z-Getting-started-jp/
コーディング
続いて、mbedのオンラインIDE上でC/C++を使って実装を行っていきます。
mbedのオンラインIDEの使い方
mbedのオンラインIDEの使い方については、以下のWebページなどを参照してください。
mbed入門
https://os.mbed.com/users/RyoheiHagimoto/notebook/mbed_introduction/
ライブラリのインポート
今回は以下の3つのライブラリを使いました。
それぞれのWebページで「Import program」のボタンをクリックします。
インポートする際は、Libraryとしてインポートしてください。
ライブラリとしてインポートした場合、ライブラリ内のmain.cppは不要ですので削除してください。
コード
今回実装したコードは以下のとおりです。main.cppに以下のコードを記述してください。
#include "mbed.h"
#include "MMA8451Q.h"
#include "TSISensor.h"
#include "USBMouse.h"
class LED {
public:
LED() : _rled(LED_RED),
_gled(LED_GREEN),
_bled(LED_BLUE) {}
void turnOn(PinName pin) {
turnOffAll();
if (pin == LED_RED) {
_rled = 0;
_timeout_rled.attach(this, &LED::turnOffAll, 0.01);
} else if (pin == LED_GREEN) {
_gled = 0;
_timeout_gled.attach(this, &LED::turnOffAll, 0.01);
} else {
_bled = 0;
_timeout_bled.attach(this, &LED::turnOffAll, 0.01);
}
}
private:
DigitalOut _rled;
DigitalOut _gled;
DigitalOut _bled;
Timeout _timeout_rled;
Timeout _timeout_gled;
Timeout _timeout_bled;
void turnOffAll(void) {
_rled = 1;
_gled = 1;
_bled = 1;
}
};
class TouchSensor {
public:
TouchSensor() {}
bool isLeftClick(void) {
float tsi_val = _tsi.readPercentage();
return tsi_val > 0.0 && tsi_val < 0.5;
}
bool isRightClick(void) {
float tsi_val = _tsi.readPercentage();
return tsi_val >= 0.5 && tsi_val < 1.0;
}
private:
TSISensor _tsi;
};
class Accelerometer {
public:
Accelerometer() : _acc(PTE25, PTE24, MMA8451_I2C_ADDRESS) {}
int getMouseCursorXDist(void) {
return (int)(10.0 * _acc.getAccY());
}
int getMouseCursorYDist(void) {
return (int)(10.0 * _acc.getAccX());
}
bool isMouseCursorMoved(void) {
return getMouseCursorXDist() != 0 || getMouseCursorYDist() != 0;
}
private:
static const int MMA8451_I2C_ADDRESS = 0x1d << 1;
MMA8451Q _acc;
};
class Mouse {
public:
Mouse() {}
void handle(void) {
while (true) {
handleClick();
handleMove();
wait(0.01);
}
}
private:
LED _led;
USBMouse _mouse;
TouchSensor _ts;
Accelerometer _acc;
void handleClick(void) {
if (_ts.isLeftClick()) {
_mouse.click(MOUSE_LEFT);
_led.turnOn(LED_RED);
} else if (_ts.isRightClick()) {
_mouse.click(MOUSE_RIGHT);
_led.turnOn(LED_GREEN);
}
}
void handleMove(void) {
if (_acc.isMouseCursorMoved()) {
_mouse.move(_acc.getMouseCursorXDist(), _acc.getMouseCursorYDist());
_led.turnOn(LED_BLUE);
}
}
};
int main(void) {
Mouse mouse;
mouse.handle();
}
コンパイル
以下の画像のとおり、FRDM-KL25Zにある2つのUSBのうち、「OpenSDA」の方にUSBケーブルを接続すると、「MBED」という名前のUSBメモリとして認識されます。
続いて、オンラインIDE上で「コンパイル」ボタンをクリックすると、.binファイルが作成されるので、それを先ほどの「MBED」にコピーしてください。自動的に.binファイルがインストールされます。
USBエアマウスとして使用する
USBエアマウスとして使用する場合は、以下の画像のとおり、2つのUSBのうち、「KL25Z USB」の方にUSBケーブルを接続します。
補足)
Windows、Macの双方でUSBエアマウスとして使用することができます。
参考文献
ほとんどコピペで作るコピペ専用USBデバイス
http://www.dm9records.com/index.php/tips/elec/mbedadvent2014/