トホホな疑問(14) Python, smbusモジュール

ラズパイに3角測量センサ接続」という話題で、何気にPythonの

smbus

というモジュールを使ってしまいました。理由は、PythonからI2Cを使うときに「よく使われているみたい」だったから。しかし、I2Cではなくsmbusです。遠い昔の朧げな記憶によれば、smbusは主にノートPC向けに始まった規格の筈。確かにI2Cベースだった気もしますが、そのあたり記憶もあやふや。それにsmbusモジュールのインタフェース関数が一体どのようなI2Cバス制御をしているのか実体が分からない。「簡易ロジアナ」で観察する元気もないし。。。

※「トホホな疑問」投稿順Indexはこちら

I2C自体は、SCLとSDAという2本の信号線だけで複数のデバイスを接続できる「バス」で、マイコン(シングルチップ・マイクロコントローラ)とセンサなどの外部デバイスを接続するために昔からお世話になってきたような気がします。通信方式を分類すれば、

同期式シリアル

です。

  • 簡単(低コスト)に複数のデバイスを接続できる。
  • 接続できるデバイスの種類が多い。

半面、

  • 高速デバイスには向かない(標準100k)
  • あまり距離は引っ張れない、せいぜい1枚の基板の中くらい

と弱点もありです。ご本家はフィリップス社。1980年代にルーツがあると思います。よって、基本特許はもう切れて久しい筈。さて、それに対するに SMbus(System Management Bus)の登場は、1990年代だった筈。

SMbus.org

へいって、バージョン1.0の仕様書をダウンロードしてみました。

System Management Bus Specification, Revision 1.0, February 15, 1995

であります。バージョン1.0のこの仕様書のコピーライトのところには、Intelをはじめとした10社ほどの会社名が連名で書かれています(昨年の最新版では規格化団体名になっています)。Linear(今や買収されてしまったが)を始めとする電源IC屋さん、DuracellにToshiba Batteryなどの電池屋さんも名を連ねていました。それはその筈、メインタイトルの上にサブタイトルあり、

Smart Battery System Specifications

ですもの。

1990年代を振り返れば、今につながる「モバイル」が爆発的に発展を始めた時代。端的に言えば、リチウムイオン電池の時代が始まった、というわけです。それ以前にも、持ち運びできるコンピュータというのはあったですが、90年代こそ本格化した時代と言えましょう。脱線させてもらえば、最初期の米国製

ハンドヘルド・コンピューター

というのは数十キログラムもある代物(ブラウン管ディスプレイが入っていた。CPUは勿論8ビット)と記憶しています。「取っ手が付いていれば」持ち運べる(アメリカは車に積み込めればOK)から「ハンドヘルド」と言っていた気がします。勿論電池では動かない。そこから東芝サンなどが頑張ってちゃんと電池で動く

ラップトップ・コンピューター

といった市場を作っていくわけですが、初期的には皆テンデバラバラに電池などを制御していたように記憶しています。これではイケないと思ったのかどうか。インテルがどうゆう仕切りをしたのか覚えていないですけれど、これからの電力制御はこれという感じでSMbusが制定され、それを内部にもった今につながる規格化された

ノートPC

の大群が現れてくるのでした。ダウンロードした第1版の仕様書の冒頭2行目から引用させていただきましょう。

It uses I²C as its backbone.

というわけで、I2Cバスの上にSMbusが構築されていることが明示されています。基本、通信はI2Cバスそのものですが、汎用で電源電圧とか緩い規定のI2Cに対してSMbusは「物理層」の縛りをきつくして「互換性」を重視したサブセットになっている感じです。しかし、まったくのサブセットでもなく、アラート線とか、I2Cには見られない信号も存在します。ハードウエアのスペック的には重なる部分が多いけれども独自も一部アリという感じ。電力制御のため、デジタル処理があまり得意でないアナログ主体のICとのインタフェースをメインに考えたスペックだったのでしょう。

そのSMBusのスペックのページを眺めていて面白いものを見つけました。

SMBus Short Description

というもの。SMbus制御のコマンドを転送するビット数に応じて分類しているページです。そこで気付きました。左が仕様書のコマンド、右がpyhon-smbusモジュールのメソッド名です。

  • Quick Command … write_quick
  • Send Byte … write_byte
  • Receive Byte … read_byte
  • Write Byte … write_byte_data
  • Read Byte … read_byte_data
  • Write Word … write_word_data
  • Read Word … read_word_data

ブロックコマンドは省略しましたが、見事に対応がとれてました。つまり、python-smbusモジュールは、ちゃんとSMbusの仕様書に定義されているコマンドと対応するメソッドを備えていたのであります。

なんか納得。

そして、SMbusの仕様書を見れば、各コマンドを発行したときに実際にI2Cバスの上を流れるビット列の図も明示されていました。おお、これが確認したかったのだね。SMbusの仕様書(古いやつ。最近のは仕様が増えてページ数がかなり多くなっている。。。)を見れば良かったんだ。

トホホな疑問(13) Python、lxml、デフォルト名前空間とXPath に戻る

トホホな疑問(15) Python、lxml、複数xsdファイル に進む