チーム1454

課題名

PSoCマウス

研究者名

2年 14組 8番 Kazuyuki Kai
2年 14組 9番 Yumeharu Kaji

概要


三軸加速度センサーによるマウスの実装

使用機材

PSoC
PSoC MiniProg
通信用ケーブル
ジャンパー線(8本)
3軸加速度センサ
LCDディスプレイ

配線


2014-1454 配線.png


仕様


PSoCに3軸加速度センサーをつけ、そのセンサーを傾けることで生じるX軸とY軸の変化をマウスカーソルの移動に利用する。
またPSoCのスイッチをマウスのクリックとして使用した。

方法としては、xとyの値に対応した文字列とボタンが押された場合の文字列を出力している。

xとyの値に対応して出力している文字列は以下の図のようになっており、aからhを出力する。
ボタンが押された場合はzを出力する。
傾きの検知は一定値以上傾けた際に、傾きの判定を行うようにした。
また、その一定値は変数angle(図ではsとしている)として指定している。

判定範囲2.jpg

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

このWIKIを編集するにはパスワード入力が必要です

認証パスワード