主にゲーム関連の仕事をしているフリーライターの日記。企画、ゲームシナリオ、その他文章の仕事募集中。
◆ メニュー ◆
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にどうぞ