あ、へるばれモバイル

あ、へるばれモバイル by 無頼寿あさむ

主にゲーム関連の仕事をしているフリーライターの日記。企画、ゲームシナリオ、その他文章の仕事募集中。

◆ メニュー ◆

HOME | 最新日記(10件) | プロフィール | リンク
*** PCサイト(大きい画面)はこちら ***

乱れて交わる俺と姫」 WAFFLE
祝WAFFLE様10周年のファンタジーもの。AVG+エロエロH

ノベルゲームのシナリオ作成奥義」 秀和システム
シナリオの書き方に留まらず、ライターが担当するさまざまな作業を解説。企画・プロットに始まり各種資料やフローの書き方、台本の書き方、etc。プランナーを目指す人にもお勧め

◆ 置いてけぼり日記 ◆

2009/5/24 : 電子工作してた


「USB温度・湿度測定モジュール」というものを入手した。
http://www2.strawberry-linux.com/products/usbrh/

[画像リンク]

単に室温を知りたいだけなので、別に100円ショップで買えばよしなんだが……まあ、なんとなく。
実際に使うにはプログラムを組む必要があるのだけども、使えるAPIは結構シンプル。

[DllImport("USBMeter.dll",CharSet = CharSet.Ansi)] public static extern String FindUSB(ref long index);
[DllImport("USBMeter.dll",CharSet = CharSet.Ansi)] public static extern long GetTempHumid(String dev,ref double temp,ref double humid);

ドライバは自動認識・自動インストール、供給されているUSBMeter.dllから上の2つを呼び出せば十分なわけで、

 String USBDEV = ""; // デバイスID
 long USBNUM = 0; // デバイスの数 or インデックス
 double temp = 0; // 温度(度)
 double humid = 0; // 湿度(%)

 USBDEV = FindUSB(ref USBNUM);
 GetTempHumid(USBDEV,ref temp,ref humid);

C#だとこんだけで温度が引っ張れる。
実はサンプルにはVBの場合とVCの場合しか無かったので、あえてC#で挑戦ってことで(笑)
Cサンプルを参考にアンマネージAPIの呼び出し宣言を書いていたのだけど、一部のlongパラメータがそのまま使えずに難儀した。あれこれ試していくうちにintにすればOKってことで落ち着いたが。
諦めかけたりもしたけど、メーカーサイトにあるサンプルアプリの再現はこの通り完成。

メーカーサイトには対応OSはXPと2000と書いてあるが、この通りVistaでも動かせるようになっている。.NET Framework呼び出しも少し工夫すればOKだ。

[画像リンク]

ここまでできればあとは使いたいアプリに組み込むだけさーといいながら、実は温度計アプリ以上にネタはなかったりする(笑)
メーカーから提供される制御API「USBMeter.dll」の内部はブラックボックスであり、提供されているAPI自体もあとはテスト用ヒーターON/OFFとか、基板についているLEDのON/OFFとかしか機能は無い。本当にシンプルな回路なのだ。
以下にC#用に書いたラッパーを置いておくので、興味のある人はいじってみてほしい。もちろん、回路購入は必須です(笑)


  ■使い方
  public USBMeter usbMeter = new USBMeter(); // オブジェクトの初期化
  if(usbMeter.IsUSBMeter()){ // 回路が認識できるか?
    usbMeter.GetData(); // 値を取得
    textBox1.Text = usbMeter.Temp.ToString(); // 温度(℃)
    textBox2.Text = usbMeter.Humid.ToString(); // 湿度(%)
  }


  /// ----------------------------------------------------------------------
  /// <summary>
  /// USBMeter.dll呼び出しクラス
  /// </summary>
  /// ----------------------------------------------------------------------
  public class USBMeter {
    /// ------------------------------------------------------------------
    /// <summary>
    /// モジュールの検索
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern String FindUSB(ref long index);

    /// ------------------------------------------------------------------
    /// <summary>
    /// 温度・湿度の取得
    /// </summary>
    /// <param name="dev"></param>
    /// <param name="temp"></param>
    /// <param name="humid"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern long GetTempHumid(String dev,ref double temp,ref double humid);

    /// ------------------------------------------------------------------
    /// <summary>
    /// ヒーターの制御
    /// </summary>
    /// <param name="dev"></param>
    /// <param name="val"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern long SetHeater(String dev,int val);

    /// ------------------------------------------------------------------
    /// <summary>
    /// LEDの制御
    /// </summary>
    /// <param name="dev"></param>
    /// <param name="port"></param>
    /// <param name="val"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern long ControlIO(String dev,int port,int val);

    /// ------------------------------------------------------------------
    /// <summary>
    /// ファームウェアバージョンの取得
    /// </summary>
    /// <param name="dev"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern string GetVers(String dev);

    /// ------------------------------------------------------------------
    /// <summary>
    /// 温度・湿度の取得(2)
    /// </summary>
    /// <param name="dev"></param>
    /// <param name="temp"></param>
    /// <param name="humid"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern long GetTempHumidTrue(String dev,ref double temp,ref double humid);

    /// <summary>
    /// デバイス名
    /// </summary>
    public String USBDEV = "";

    /// <summary>
    /// FindUSBで取得される数値
    /// </summary>
    public long USBNUM = 0;

    /// <summary>
    /// パラメータ
    /// </summary>
    public struct USBMETER_DATA{
      /// <summary>
      /// 温度
      /// </summary>
      public double temp;

      /// <summary>
      /// 湿度
      /// </summary>
      public double humid;
    }
    public USBMETER_DATA Data;

    public USBMeter() {
      Data.temp = Data.humid = 0;

      USBDEV = "";
      USBNUM = 0;
      try{
        USBDEV = FindUSB(ref USBNUM);
      }catch{
        USBNUM = 0;
        USBDEV = "";
      }
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// USBMeterが有効かどうかのチェック
    /// </summary>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    public bool IsUSBMeter() {
      return USBNUM > 0 && USBDEV != "";
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// 値を取得する
    /// </summary>
    /// ------------------------------------------------------------------
    public void GetData() {
      GetTempHumid(USBDEV,ref Data.temp,ref Data.humid);
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// 値を取得する(2)
    /// </summary>
    /// ------------------------------------------------------------------
    public void GetData2() {
      GetTempHumidTrue(USBDEV,ref Data.temp,ref Data.humid);
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// 温度を取得
    /// </summary>
    /// ------------------------------------------------------------------
    public double Temp {
      get {
        return Data.temp;
      }
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// 湿度を取得
    /// </summary>
    /// ------------------------------------------------------------------
    public double Humid {
      get {
        return Data.humid;
      }
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// ヒーターON/OFF
    /// </summary>
    /// <param name="b">ONならtrue</param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    public void SetHeater(bool b) {
      SetHeater(USBDEV,b ? 1 : 0);
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// LEDのON/OFF
    /// </summary>
    /// <param name="port">LEDポート 0-1</param>
    /// <param name="b">ONならtrue</param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    public void SetLED(int port,bool b) {
      ControlIO(USBDEV,port,b ? 1 : 0);
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// ファームウェアバージョン
    /// </summary>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    public string GetVersion() {
      return GetVers(USBDEV);
    }
  }



関連タグ: PC 開発


◆ バックナンバー ◆

2009年09月 2009年08月 2009年07月 2009年06月 2009年05月 2009年04月 2009年03月 2009年02月 2009年01月 2008年12月 2008年11月 2008年10月 2008年09月 2008年08月 2008年07月 2008年06月 2008年05月 2008年04月 2008年03月 2008年02月


Copyright (c) 無頼寿あさむ/Powerd by Digital Cottage.Net
ご意見ご感想ネタの提供は、assem-blage@digital-cottage.netにどうぞ