ファンレスPCで24時間運転にチャレンジ (4) i2cdriverライブラリ①LM75B

 Windows PCには通常センサなどをつなぐためのI/Oポートはありません。COMポートはマザーボード上に用意されていることは多く、調歩同期式シリアル通信は利用できますが、信号の電圧レベルが、電子工作で利用する0-5VのTTLレベルではありません。

 10cm角ぐらいの形状の小型PCでは、半分がCPU FANが内蔵されています。半分は大きめの放熱器がついていてFANレスで運用できます。CPUの能力が高いほど、発熱量は多くなるので安定な動作を確保するためにはFANが必要です。

 台湾の多くのマザーボード・メーカは、産業用のマザーボードも製造していますが、日本国内ではほとんど流通していません。入手可能であっても大変高価です。今回入手したのは民生用ですが、FANレスの上、現状ではCPUのパフォーマンスはとても高いモデルです。そして、CPUの動作電圧も細かく制御されているので、通常の利用時には、発熱はとても少ないです。

I2CDriverボードのライブラリ

 USBポートに接続してI2Cバスの利用できるI2CDriverボードには、WindowsのPythonドライバが付属しています。ソース、サンプル・プログラムはGitHubにあります。利用方法の解説はないので、ソースを読みながら、使い方を模索します。


 前回、I2Cで接続できる温度センサLM75Bを利用しました。上記のGitHubにもライブラリが入っているので、利用するのは簡単でした。

 このライブラリを利用するのではなく、I2Cのライブラリを使って温度を読み出す方法を調べます。ラズパイならばsmbusライブラリに相当します。

ネイティブなI2Cバスのアクセス

 読み出しは、次のシーケンスで行うようです。

i2c.start(0x48, 1) 
data = i2c.read(2) 
i2c.stop()

 start()の0x48はLM75Bのスレーブア・アドレスです、その次の引数は0と1があり、役目は不明ですが、1で読み出しができます。
 read()の引数はバイト数を指定します。LM75Bの温度は11ビットなので、2バイト分読み出します。温度ポインタは0x00なので、ポインタ・レジスタを指定していません。
 最後はstop()です。

import sys
sys.path.append('C:\\Users\\yoshidawin\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages')
from i2cdriver import I2CDriver
from time import sleep

i2c = I2CDriver('COM3')

while 1:
i2c.start(0x48, 1) # LM75B slave address 0x48
data = i2c.read(2) # 2bytes
i2c.stop()
print('read data ', data, data[0], data[1])
TempData = data[0]<<8 | data[1]
print('2bytes data', TempData)
Temp = (TempData >> 5 ) * 0.125
print('Temp ', Temp)
sleep(3.14)

 実行中の様子です。

上位レベルのI2Cバスのアクセス

 start()、read()、stop()の上位の関数にregrd()があります。

import sys
sys.path.append('C:\\Users\\yoshidawin\\AppData\\Local\\Programs\\Python\\Python38\\lib\\site-packages')
from i2cdriver import I2CDriver
from time import sleep

i2c = I2CDriver('COM3')

while 1:
tempData = i2c.regrd(0x48, 0x00, '>h')
print('readReg', tempData, hex(tempData))
Temp = (tempData >> 5 ) * 0.125
print('Temp ', Temp)
sleep(3.14)

 実行中の様子です。

コラム 引数とタイミング

 最初のネイティブなI2Cアクセスです。

i2c.start(0x48, 1) 
data = i2c.read(2) 
i2c.stop()

のタイミングです。

 2番目の引数を1から0へ変更します。

i2c.start(0x48, 0

 Writeに変わりました。

 次は上位の関数regrd()です。

tempData = i2c.regrd(0x48, 0x00, '>h')

 2番目の引数は、レジスタもしくはポインタのアドレスと思われます。

 0x00を0x01に変更して実行します。

tempData = i2c.regrd(0x48, 0x01, '>h')

 いずれも、レジスタもしくはポインタの書き込みの後はリピーテッド・スタート・コンディションになっています。

 引数を変更してみた結果です。

tempData = i2c.regrd(0x48, 0x00, 'B')
tempData = i2c.regrd(0x48, 0x00)

tempData = i2c.regrd(0x48, 0x00, 'H')