Skip to content
eiichiromomma edited this page Aug 16, 2014 · 1 revision

(Phidgets) C言語

VisualC++ 2005 EEによるセンサーの利用

準備

  1. Phidgets/PhidgetInterfaceKitのドライバを入手しインストール。
  2. サンプルソースからphidget21.libとphidget21.hを使う
  3. c:\local\includeにphidget21.hを置く。(VCでのインクルードパスの追加を参考にc:\local\includeをライブラリパスに)
  4. c:\local\libにphidget21.libを(VCでのライブラリパスの追加を参考にc:\local\libをライブラリパスに)

プロジェクト毎の準備

  1. ConsoleApplicationを参考にコンソールアプリケーションのプロジェクトを作成。名前は適当に。

  2. プロジェクトへのライブラリの追加を参考にphidget21.libを加える

  3. ソースファイルを追加し以下の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);
Clone this wiki locally