チーム1454
課題名
PSoCマウス
研究者名
2年 14組 8番 Kazuyuki Kai
2年 14組 9番 Yumeharu Kaji
概要
三軸加速度センサーによるマウスの実装
使用機材
PSoC
PSoC MiniProg
通信用ケーブル
ジャンパー線(8本)
3軸加速度センサ
LCDディスプレイ
配線
仕様
PSoCに3軸加速度センサーをつけ、そのセンサーを傾けることで生じるX軸とY軸の変化をマウスカーソルの移動に利用する。
またPSoCのスイッチをマウスのクリックとして使用した。
方法としては、xとyの値に対応した文字列とボタンが押された場合の文字列を出力している。
xとyの値に対応して出力している文字列は以下の図のようになっており、aからhを出力する。
ボタンが押された場合はzを出力する。
傾きの検知は一定値以上傾けた際に、傾きの判定を行うようにした。
また、その一定値は変数angle(図ではsとしている)として指定している。
HSPで作成したアプリケーションに文字列を渡し、その文字列に応じてカーソルの移動や、クリックの処理を行う。
また、傾きの変位は起動時の値を基準値とし、その位置からどの程度傾きが発生しているかを検知している。
このため、三軸加速度センサーの基盤の初期値の違いに左右されない。
main.c
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "stdlib.h"
#define SW 00000001
void User_Function(int x, int y)
{
char pszData[7];
LCD_1_Position(0,0); LCD_1_PrCString("X:"); itoa(pszData,x,10); LCD_1_PrString(pszData); LCD_1_PrCString(" ");
LCD_1_Position(1,0); LCD_1_PrCString("Y:"); itoa(pszData,y,10); LCD_1_PrString(pszData); LCD_1_PrCString(" ");
}
void main(void)
{
int x, y; int defx, defy; int angle = 25; LCD_1_Start();
PGA_1_Start(PGA_1_MEDPOWER); PGA_2_Start(PGA_2_MEDPOWER); PGA_3_Start(PGA_3_MEDPOWER);
UART_CmdReset(); UART_IntCntl(UART_ENABLE_RX_INT); Counter8_WritePeriod(155); Counter8_WriteCompareValue(77); Counter8_Start(); UART_Start(UART_PARITY_NONE);
M8C_EnableGInt;
TRIADC_1_Start(TRIADC_1_HIGHPOWER); TRIADC_1_SetResolution(12); TRIADC_1_GetSamples(0);
while(TRIADC_1_fIsDataAvailable() == 0); defx = TRIADC_1_iGetData1() / 10; defy = TRIADC_1_iGetData2() / 10;
for(;;){ while(TRIADC_1_fIsDataAvailable() == 0); x = TRIADC_1_iGetData1() /10 - defx; y = TRIADC_1_iGetData2() /10 - defy;
User_Function(x,y); // User function to use
if(PRT0DR & SW){ UART_PutChar('z'); }else if(x > angle && y > angle){//b 右上 UART_PutChar('b'); }else if(x > angle && y < -angle){//d 右下 UART_PutChar('d'); }else if(x < -angle && y < -angle){//f 左下 UART_PutChar('f'); }else if(x < -angle && y > angle){//h 左上 UART_PutChar('h'); }else if(-angle <= x && x <= angle && y > angle ){//a 上 UART_PutChar('a'); }else if(x > angle && -angle <= y && y <= angle){//c 右 UART_PutChar('c'); }else if(-angle <= x && x <= angle && y < -angle){//e 下 UART_PutChar('e'); }else if(x < -angle && -angle <= y && y <= angle){//g 左 UART_PutChar('g'); } }
}
HSPのコード
#include "hspext.as"
#include "hspdef.as"
#include "llmod3/llmod3.hsp"
#include "llmod3/input.hsp"
comopen 4, "baud=38400 parity=N data=8 stop=1" // シリアルポートの初期化
if stat : dialog "接続されていません" : end // 接続エラーの処理
sdim char, 1 // シリアルポートからの受信文字列
x = ginfo(0) : y = ginfo(1) ;初期座標設定(開始位置)
dx = 3 : dy = 3 ;移動量の設定
m = 0
*main
comget char, 1 // シリアルポート受信
color 255, 255, 255 ;※1 白色。背景と同じ色。
boxf ;※1 ウィンドウと同じサイズの四角形を塗りつぶしで描画する。
if char == "a"{y -= dy} //上
else : if char == "b"{x += dx : y -= dy}//右上
else : if char == "c"{x += dx} //右
else : if char == "d"{x += dx : y += dy}//右下
else : if char == "e"{y += dy} //下
else : if char == "f"{x -= dx : y += dy}//左下
else : if char == "g"{x -= dx} //左
else : if char == "h"{x -= dx : y -= dy}//左上
else : if char == "z" && m = 0{m = 1}
if 0 > x {x = 0}
if x > ginfo(20)-1 {x = ginfo(20)-1}
if 0 > y {y = 0}
if y > ginfo(21)-1 {y = ginfo(21)-1}
if m = 1 {
mouse_event $2
m = 0
mouse_event $4
}
color 0, 0, 0 ;※2 黒色
mouse x, y ;※2 カレントポジションを座標(x, y)に設定する。
wait 0 ;無限ループの時のお約束
goto *main
考察
このマウスの欠点は、移動とクリックが同時に出来ない事である。つまり、ドラッグアンドドロップが出来ない。
これはマウスとしては、欠点のある設計なので、改善が必要である。
現在、この装置はスイッチの入力や3軸加速度センサによる入力をポーリングにより受け付けているが、
理想の使用は割り込みなのではないかと考える。ドラッグアンドドロップを可能にするとなると、CPUが常にレジスタの変化を監視するポーリングより、割り込みが向いている。
割り込みであれば、スイッチが押されたときに押されたという判定を割り込ませ、スイッチを離した時、離したという判定を割り込ませることができる。これにより、マウスカーソルの移動をしながらクリックの判定を残すことが出来る。
- 最終更新:2014-11-18 15:54:31