PCをバッテリーで動作させようと考えています。
バッテリーの情報を取得するためにバッテリーとマザーボードは
SMBusで接続してします。
バッテリー情報を取得するWindowsのAPIとして
「GetSystemPowerStatus」
があり、この関数をコールしてみましたが、AC接続と判断されてしまいます。
この関数はSMBus接続されたバッテリーとは通信しないのでしょうか?
SMBusを使用した通信はどのようにすれば実現できるのでしょうか?
(COMポートの様にOpen/Write/Readの様にできるのでしょうか?)
あんまり詳しくないのですが、まず、SMBusでメインボードと
対象バッテリーを物理的につないだけではだめかもしれません。
SMBusはACPIデバイスドライバが管理しているのですが、
そのドライバがSMBus経由で対象バッテリーと通信し、認識
できなければ無視されるでしょう。認識はできたが、話が
通じない状態なら、デバイスマネージャに何らかのサインが
でるかもしれません。
ちなみに当該のバッテリーにはACPIかそれに準ずるデバイス
ドライバや、テスト用アプリケーションなどは付いていないので
しょうか。そうであると手に負えない可能性があります。
>仲澤様
本件でもお世話になります。
WindowsAPI→ACPIデバイスドライバ→SMBus→バッテリー
の順で制御されているという認識であっていますでしょうか?
デバイスマネージャには何も表示されていませんので、
無視されていると思います。
当該バッテリーのWindowsドライバが無いか確認してみます。
>WindowsAPI→ACPIデバイスドライバ→SMBus→バッテリー
>の順で制御されているという認識であっていますでしょうか?
その通りです。実態はACPI(Advanced Configuration and
Power Interface)がSMBusを利用して所定の機能を実現
しているという意味にになります。
ACPIはドライバーなので、IOCTL系関数、つまり
DeviceIoControl()でアクセスはできると思うのですが、
役に立ちそうな知識はありません。
>仲澤様
返答ありがとうございます。
DeviceIoControlを調べたところ、SMBusにアクセス出来そうです。
しかし、問題なのがハンドルの取得です。
CreateFileでハンドル取得すればいいことはわかったのですが、
第一引数に何を渡せばいいのかがわかりません。
Aドライブの場合、「"\\\\.\\a:"」ですが、SMBusの場合は…
もう少し調べてみます。
>仲澤様
バッテリーメーカーに問い合わせを行ったところ、
ドライバもテスト用アプリケーションも無いとのことでした。
自力でアクセスするしかなさそうです…
WMIのWin32_Batteryでは取れませんか?
>subaru様
ありがとうございます。
Win32_Batteryについて調べてみましたが、VBやC#での使用方法
は見つけることが出来ましたが、VCでの使用方法を見つけることが
出来ませんでした。
VCでの使用方法をご存じでしたら教えて頂けますでしょうか。
宜しくお願い致します。
言語は何でもいいですがまずは実際に取れるかどうか確認してください。
WMICodeCreatorを使うと楽です。
http://www.atmarkit.co.jp/fwin2k/win2ktips/756wmicreator/wmicreator.html
VC++での使用方法についてはこちらを参考にしてみてください。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+201002/10020012.txt
役に立つかどうかはわかりませんが一応APIの関連しそうなとこのリンクも書いておきます。
http://msdn.microsoft.com/en-us/library/bb204769%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa373163%28VS.85%29.aspx
http://www.codeproject.com/KB/vista/VGPowerMonitor.aspx
>subaru様
回答ありがとうございます。
ターゲットPC上でWMICodeCreatorを起動し、Win32_Batteryの
コマンドすべてを実行してみましたが、値は取得出来ませんでした。
(Let's Noteでは正常に値の取得が出来ました。)
やはり、Windowsにバッテリーのデバイスドライバ的な物が無いので
取得できないのでしょうか?
(おそらく、バッテリーと通信し、Windowsに通知する箇所が無いと思われます。)
チップセット(ICH9)のSMBusレジスタを使用して直接通信するしかなさそうです。
>ターゲットPC上でWMICodeCreatorを起動し、Win32_Batteryの
>コマンドすべてを実行してみましたが、値は取得出来ませんでした。
仲澤さんの説明でそんな気がしていましたがやはり無理でしたか。
しかしデスクトップPCをバッテリーで動かすってことなんですかね?
デスクトップPC向けのバッテリーってなさそうなので実現可能かどうかもわかりませんが、
できるとしてもハードやドライバの知識まで必要っぽい気はしますね。。。
>しかしデスクトップPCをバッテリーで動かすってことなんですかね?
デスクトップほど大きくはないのですが、Mini-ITXのPCをバッテリーで
動作させたいと考えています。
SMBusについて勉強します。
仲澤様・subaru様ありがとうございました。
ツイート | ![]() |