Phidgets C言語 - eiichiromomma/CVMLAB GitHub Wiki
(Phidgets) C言語
VisualC++ 2005 EEによるセンサーの利用
- Phidgets/PhidgetInterfaceKitのドライバを入手しインストール。
- サンプルソースからphidget21.libとphidget21.hを使う
- c:\local\includeにphidget21.hを置く。(VCでのインクルードパスの追加を参考にc:\local\includeをライブラリパスに)
- c:\local\libにphidget21.libを(VCでのライブラリパスの追加を参考にc:\local\libをライブラリパスに)
-
ConsoleApplicationを参考にコンソールアプリケーションのプロジェクトを作成。名前は適当に。
-
プロジェクトへのライブラリの追加を参考にphidget21.libを加える
-
ソースファイルを追加し以下のinclude分を追加
#include <phidget21.h>
以下のセンサーを接続する。 詳細はセンサーのマニュアル(PDF) 参照。
0:Temperature
1:Slider
2:Joystick X
3:Joystick Y
4:Light
5:Force
6:Touch
7:Touch
やる事は非常に単純で、初期化をした後はセンサーの出力が変わった時に発生するコールバック関数を定義するだけ。
int __stdcall IFK_SensorChangeHandler(CPhidgetInterfaceKitHandle IFK, void *userptr, int Index, int Value)
IFKは初期化で取得するハンドル。Indexが0-7のアナログ入力ポート。Valueがその値。userptrは使わない。 コールバック関数内ではswitchでセンサー毎の処理を行なう。 Valueの解釈はセンサーのマニュアル(PDF) に載っている。
#include <phidget21.h>
#include <conio.h> //_getch()
int __stdcall IFK_SensorChangeHandler(CPhidgetInterfaceKitHandle IFK, void *userptr, int Index, int Value)
{
switch(Index){
case 0: //temperature
printf("Temperature (ID:%d) is %lf\n", Index, (Value-200)/4.0);
break;
case 1: //Slider
printf("Slider (ID:%d) is %lf%%\n",Index,Value*100.0/1000.0);
break;
case 2: //Joystick X
printf("Joystick X (ID:%d) is %lf%%\n",Index,(Value-500)*100.0/500.0);
break;
case 3: //Joystick Y
printf("Joystick Y (ID:%d) is %lf%%\n",Index,(Value-500)*100.0/500.0);
break;
case 4: //Light
printf("Light (ID:%d) is %lf%%\n",Index,Value*100.0/1000.0);
break;
case 5: //Force
printf("Force (ID:%d) is %lf%%\n",Index,Value*100.0/1000.0);
break;
case 6: //Touch
if(Value<500){
printf("Touched! (ID:%d, Value:%d)\n",Index,Value);
}
break;
case 7: //Touch
if(Value<500){
printf("Touched! (ID:%d, Value:%d)\n",Index,Value);
}
break;
default:
break;
}
return 0;
}
int main(void)
{
int result;
const char *err;
CPhidgetInterfaceKitHandle IFK = 0; //ハンドルの入れ物
CPhidgetInterfaceKit_create(&IFK); //ハンドルの作成
CPhidgetInterfaceKit_set_OnSensorChange_Handler(IFK, IFK_SensorChangeHandler, NULL);//コールバック関数の登録
//接続を10秒待って、接続失敗したら終了
if(result = CPhidget_waitForAttachment((CPhidgetHandle)IFK, 10000))
{
CPhidget_getErrorDescription(result, &err);
printf("Problem waiting for attachment: %s\n", err);
return 1;
}
//コールバック関数を呼び出す感度設定。引数はハンドル、Index、閾値の順
//試行錯誤して適切な値を決める。
CPhidgetInterfaceKit_setSensorChangeTrigger(IFK,0,4); //Temperature
CPhidgetInterfaceKit_setSensorChangeTrigger(IFK,1,1); //Slider
CPhidgetInterfaceKit_setSensorChangeTrigger(IFK,2,8); //Joystick X
CPhidgetInterfaceKit_setSensorChangeTrigger(IFK,3,8); //Joystick Y
CPhidgetInterfaceKit_setSensorChangeTrigger(IFK,4,10); //Light
CPhidgetInterfaceKit_setSensorChangeTrigger(IFK,5,5); //Force
CPhidgetInterfaceKit_setSensorChangeTrigger(IFK,6,400); //Touch
CPhidgetInterfaceKit_setSensorChangeTrigger(IFK,7,400);
char c;
do{
c=(char)_getch();
}while(c!='q');//qで終了
//あとかたづけ
CPhidget_close((CPhidgetHandle)IFK);
CPhidget_delete((CPhidgetHandle)IFK);
return 0;
}
暇があったら追記の予定
- CPhidgetInterfaceKit_set_OnInputChange_Handler(IFK, IFK_InputChangeHandler, NULL);
- CPhidgetInterfaceKit_set_OnOutputChange_Handler(IFK, IFK_OutputChangeHandler, NULL);
- CPhidgetInterfaceKit_set_OnSensorChange_Handler(IFK, IFK_SensorChangeHandler, NULL);
- CPhidget_set_OnAttach_Handler((CPhidgetHandle)IFK, IFK_AttachHandler, NULL);
- CPhidget_set_OnDetach_Handler((CPhidgetHandle)IFK, IFK_DetachHandler, NULL);
- CPhidget_set_OnError_Handler((CPhidgetHandle)IFK, IFK_ErrorHandler, NULL);
- CPhidgetInterfaceKit_getNumOutputs(IFK, &numOutputs);
- CPhidgetInterfaceKit_getNumInputs(IFK, &numInputs);
- CPhidgetInterfaceKit_getNumSensors(IFK, &numSensors);