ファンレス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')