UnityでCONTECの産業用リレーボードを制御する

# 1. 概要

I/Oで外部機器とやりとりする際に、Arduinoなどではなく産業用の機器を使いたいことってありますよね。そんなときに頼りになるのがCONTEC。ここではCONTECのリレーボードをUnityから使う方法を説明します。

# 2. 環境
- Windows 10
- Unity 2018.2.0f2
- CONTEC製 RRY-16CX-USB リードリレー接点出力 USB I/Oユニット 16ch
  - https://www.contec.com/jp/products-services/daq-control/pc-helper/usb-module/rry-16cx-usb/price/
  - ケーブルと端子台も買うと使いやすいです(高いですが)。


# 3. 参考サイト
- マニュアル
  - https://www.contec.com/jp/download/contract/contract3/?itemid=ed49d394-0715-48a6-991a-56ad9913c1ab&downloaditemid=9a314c4e-d0e3-4a0e-9a22-351b76e43550
  - ダウンロードには会員登録が必要です

# 4. 手順

## 4.1 ドライバライブラリのダウンロード、インストール

- ドライバライブラリ API-USBP(WDM) デジタル入出力ドライバ 開発環境(フルセット) Ver. 6.30をダウンロード
  - ダウンロードには会員登録が必要です。
- `INF - WDM - DioForWin10`に入っている`Setup.exe`を実行
  - ダイアログに従ってインストール
- `APIUSBP - DIO - Disk1`に入っている`setup.exe`を実行
  - ダイアログに従ってインストールする
  - インストールが終了するとヘルプが立ち上がる
![](https://d2mxuefqeaa7sj.cloudfront.net/s_DF7DFE020111A0B956A6F3E77E4BFC739476C5C18AD2B56CA139BA4167FDAB73_1541150486872_image.png)

## 4.2 テスト
- この辺りはマニュアルに沿って実行します。
- リレーボードに付属の電源を挿し、Mini USBでPCに接続します
- デバイスマネージャーを開きデバイスのプロパティを開きます
![](https://d2mxuefqeaa7sj.cloudfront.net/s_DF7DFE020111A0B956A6F3E77E4BFC739476C5C18AD2B56CA139BA4167FDAB73_1541151840188_image.png)

- `共通設定`タブの`診断`を押します
![](https://d2mxuefqeaa7sj.cloudfront.net/s_DF7DFE020111A0B956A6F3E77E4BFC739476C5C18AD2B56CA139BA4167FDAB73_1541151898997_image.png)

- 12個ある緑のボタンを押すと機器からリレーが切り替わる音が聞こえると思います。
![](https://d2mxuefqeaa7sj.cloudfront.net/s_DF7DFE020111A0B956A6F3E77E4BFC739476C5C18AD2B56CA139BA4167FDAB73_1541151929417_image.png)

## 4.3 Unityから制御する

- Unityで空のプロジェクトを立ち上げます。

- 先程インストールしたAPI-USBPの以下のフォルダ(例：`C:\Program Files (x86)\CONTEC\API-USBP(WDM)\Dio\Samples\Inc`)に入っている`CdioCs.cs`をAssetフォルダにコピーします。

- コンソールを見ると以下のようなエラーが沢山出ています。

``` 
error CS0227: Unsafe code requires the `unsafe` command line option to be specified. Enable "Allow 'unsafe' code" in Player Settings to fix this error.
```

- エラー通りにメニューの`Edit - Project Setting - Player`を選び`Other Setting - Configration`の`Allow 'unsafe' setting`にチェックを入れる。
![](https://d2mxuefqeaa7sj.cloudfront.net/s_DF7DFE020111A0B956A6F3E77E4BFC739476C5C18AD2B56CA139BA4167FDAB73_1541152804324_+2018-11-02+18.59.35.png)

- エラーが消えたことを確認
- Hierarchyの`Create - UI - Button`でボタンを配置する
- 以下のスクリプトを作成しボタンのOnClickイベントに紐付ける

``` cs:button.cs
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using CdioCs;
    
    public class ButtonTest : MonoBehaviour {
    
      int Ret;
      short Id;
      bool isState0 = false;
    
      Cdio  dio = new Cdio();
    
      void Start () {
        Ret = dio.Init ( "DIO000" , out Id );
        Ret = dio.ResetDevice ( Id );
    
        Debug.Log("State 0");
        Ret = dio.OutBit(Id, 0, 0);
        Ret = dio.OutBit(Id, 1, 1);
        isState0 = true;
      }
    
      public void OnClick() {
        isState0 = !isState0;
    
        short[] BitNo = new short[2];
        byte[] Data = new byte[2];        
                    
        if(isState0){
          Debug.Log ("State 0");
          Ret = dio.OutBit ( Id , 0 , 0 );
          Ret = dio.OutBit ( Id , 1 , 1 );
        }
        else {
          Debug.Log ("State 1");
          Ret = dio.OutBit ( Id , 0 , 1 );
          Ret = dio.OutBit ( Id , 1 , 0 );
        }   
      }
    }
```

- 実行するとカチっという音が鳴り以下の状態になる。
![](https://d2mxuefqeaa7sj.cloudfront.net/s_DF7DFE020111A0B956A6F3E77E4BFC739476C5C18AD2B56CA139BA4167FDAB73_1541154366277_image.png)

- ボタンを押すと再度音が鳴り以下の状態になる。以降ボタンを押すたびに上と下の状態を繰り返す。
![](https://d2mxuefqeaa7sj.cloudfront.net/s_DF7DFE020111A0B956A6F3E77E4BFC739476C5C18AD2B56CA139BA4167FDAB73_1541154409757_image.png)

- あとはお好きなように使ってください。