May 17, 2009

DS18B20を使ってみる(プログラム) [computer]

前回書いた時点で既にDS18B20を使って温度を測定するところまで動いていたが動作検証したプログラムについては特に述べなかった。

動くのは動くんだが、 ソフトウェア的にμS単位のタイミングを制御する必要があり動作環境で動いたり動かなかったりすることがあるのも確認している(ぉい)

どのみちすべての環境で動くことが期待できるようにするのは難しいし、そこまでやる気がないのでスペルミス等の些細な部分だけ直したきちゃないプログラムを公開してみる。

それぞれFreeBSDの7.1-stable(時々buildしなおしているのでいつの環境かは不明。前回迄は確かに7.1だったが今は7.2-stableになっていたりする)上で作成した。Linux(Debian 5.0)上でも一応動くようにはしたがろくに動作確認はしていない。どのみちマザーボード等のハードウェアによって動いたり動かなかったりする。

ターゲットマシンのスペック、動作条件は以下のとおり

  • マザーボード Intel D945GCLF (intel Atom230 1.6GHz/945GC)
  • RAM 2GB
  • BIOSでプリンタポートを双方向に設定
  • FreeBSDではpowerdは止めている。これはCPUのrdtscを使ってタイミングを計っているため、動作中に省電力化のためにクロックが変わってしまうとタイミングに誤りが出てしまうため。

ちなみに以下のプログラムのds_tlib.cにはセンサのリセットルーチンが2つ(ds_reset(), ry_reset() )入っている。デバッグ時の便宜も考えてリセットの時のステータスを見ながらリセットをかけているのがds_reset()だが、これがたまたま試してみたマシンで動作しなかった。ry_reset()は単純に規程時間だけ待ってリセットがかかったとみなしている。ds_reset()が動かなかったマシンでry_reset()を代わりに使ったらそれなりに動いたので残してみた。

  • 温度測定 (chktemp090517.tar.gz )
  • センサを1個だけ前回(5/7分)の図のバス上に接続して使うプログラム。 makeするとrom_readとchktempの2つの実行ファイルができるはず。

    • rom_read
    • 半分デバッグ用。実行するとセンサの情報を色々だしてくれる。

      % ./rom_read 
      tsc_1micro 1599
      
      Family Code: 28
      CRC        : c8
      Serial No. : 000001aff6c5
      verify CRC : c8 OK
      8a 01 4b 46 7f ff 06 10 2c 
      scpad crc 2c
      CRC        : 2c
      Temperature : 24.625000
      out length 12
      verify CRC : 2c OK
      

    • chktemp
    • このプログラムを 動かすと延々温度を測定して表示する。 多分時々エラーが出るでしょう。

      % ./chktemp
      Temp. :  24.69
      Temp. :  24.69
      Temp. :  24.62
      Temp. :  24.69
      Temp. :  24.69
      Temp. :  24.69
      Temp. :  24.69
      Temp. :  24.75
      

  • ROMサーチ (ds1w_search090517.tar.gz)
  • 複数のセンサをバス上に接続してこれを動かすと1-Wireバスのサーチアルゴリズムにより各センサのROM IDを取得して画面上に表示する。以下実行例。

    % ./rom_search 
    write: f0, 1599
    find device 
    28 78 07 b0 01 00 00 4c 
    write: f0, 1599
    28 ac bf b1 01 00 00 aa 
    write: f0, 1599
    28 c5 f6 af 01 00 00 c8 
    
    この例では3個のDS18B20が接続されている。

    このプログラムについてはアルゴリズムの中核部分、CRCの算出部分にMAXIMが提供しているサンプルコードを使用している。そのライセンスの部分をここに引用しておく。

     Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved.
    
     Permission is hereby granted, free of charge, to any person obtaining a
     copy of this software and associated documentation files (the "Software"),
     to deal in the Software without restriction, including without limitation
     the rights to use, copy, modify, merge, publish, distribute, sublicense,
     and/or sell copies of the Software, and to permit persons to whom the
     Software is furnished to do so, subject to the following conditions:
    
     The above copyright notice and this permission notice shall be included
     in all copies or substantial portions of the Software.
    
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     MERCHANTABILITY,  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES
     OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     OTHER DEALINGS IN THE SOFTWARE.
    
     Except as contained in this notice, the name of Dallas Semiconductor
     shall not be used except as stated in the Dallas Semiconductor
     Branding Policy.
    

P.S. ところで某の某氏よりUSB温度計の話が秋葉原の三月兎で売られていることを聞いた。確かにWebの方にも紹介されている。いかにもな怪しい作りで、PCにつなぐとUSBシリアルがつながっているように見え、USBシリアルの先に温度センサがあるようだ。

というかこれUSB-シリアルコンバータのPL230xじゃない。どうもデータ垂れ流しっぽいような気もするけど。

秋月で売られているUSBデータロガーも試してみるかな?

Posted at 19:44 in computer

5/15(金)のライブ [music]

表参道のFABってライブハウスに行ってきた 4組出演 到着したら最初のバンドが終わったところ(Cycloneだったようだ)

    というわけで2組目から

  • 6ft.down
  • 黒っぽいという印象。決して下手ではないのだけど何か印象が残らなかった。 単に合わなかっただけかもしれないけれど。 上手いのと面白いのは全然違う...というようなことを考えたりして。

    オフィシャルサイト

  • Angelique
  • なにやら前のほうに女性が詰めていく様子。オープニング...ん、これは? なにやらデジャヴ...

    .....ぉ..ぉ..凶子ちゃんではっ!! 知らなかったがAngeliqueは犬神サーカス団のaliasだったか。そういやあ前にもらったビラの犬神サーカス団のスケジュールに「犬神サーカス団の出演はありません」と書いてあったのが混ざっていたがこれの事だったのか。

    アイドル歌謡風メタルなのかな。それはともかく面白い。演奏が上手いのも確かだけどそれ以上に面白い。絶対にメジャーにはならんけど。アンダーグラウンド的に面白い。

    オフィシャルサイト

  • TorN
  • DVD発売ライブと言うことでトリ。今回は結構いい調子でやっていたような。 ベースが頑張っているね。

Posted at 11:44 in music

May 08, 2009

DS18B20 を使ってみる:1-Wireバスの接続 [computer]

1-Wireバスはコントローラ1台と複数台のスレーブデバイスから構成される。 コントローラは+5Vの電源が供給できて、データ線は1ビットの入出力端子が必要となる。 入出力端子の出力側はTTLレベルの3-stateまたはオープンドレイン出力である必要がある。データ線は5KΩ程度でプルアップされる。

電気的には大きな問題はないが、PCをコントローラにする場合タイミングの条件が比較的厳しい。仕様上タイミングを最低15μS以内で制御する必要がある。これはUnix系のOSのようなラウンドロビンのスケジューリングをするOSの場合、ユーザプログラムでは条件を満たすことができない場合がある。

信頼性を高くする必要のあるアプリケーションの場合、クリチカルな部分ではカーネル内で割り込みを禁止して処理を行う必要がある。 もっとも温度の測定タイミングが数秒ずれても問題が無いような場合(室温の測定や水槽の水温の測定の場合が当てはまる)はそこまで厳密に行う必要がない。 ディスクのアクセスやネットワークからのデータ処理のため温度測定に失敗したとしたらまた最初からやり直せばいい。

今回はプリンタポートを双方向モードに設定してポートのデータ線のうち最下位ビットを1-Wireに割り当てることにした。+5Vはプリンタポートのコントロール信号のうち1本(~AUTOFEED)を利用した。後で仕様の確認をしたところ、電流の供給能力等で問題がないわけではないことが分かったが取り合えずセンサ1,2本をつないで動かしたところ動いてはいるので現状のままにしてある。

DS18B20 - PC Circuit

DS18B20等の1-Wireバスのデバイスはそれぞれ64bitのユニークなID(ROMID)を持っている。コントローラは各デバイスにIDを指定してコマンド(温度測定開始、変換結果の読み取り等)を送る。なお温度測定開始など一部のコマンドについてはバス上のデバイスすべてに対して同時に送ることもできるようになっている。


P.S.
ところで最近ではレガシーなインターフェースが無いマザーボードとかもあって、USB-シリアル変換器とかUSB-パラレル変換器とか後ろ向きなソリューションを使ってる人もいるかと思いやす。

この手の変換器では対応できないことがいくつかあります。ここに書いたような用途もその一つです。現状、USB-パラレル変換器では絶対に動きません(USB3.0が出てきたら可能性はある)。

USBではフレーム単位でデータの送信が行われ、USB1.1では1ms, 2.0のハイスピードモードでは125μsの単位で転送動作が行われます。なのでホスト側でスレーブのデバイスの信号線を15μs以下の間隔でソフトウェア制御するのは不可能です。 USBしか使えない場合素直にUSBの先にPICなりH8なりMAXIMの出しているプロトコルコントローラICなりを繋ぎましょう。

Posted at 00:35 in computer

May 07, 2009

デジタルシリアル出力の温度センサ DS18B20 [computer]

PCなどに接続して使う目的で温度センサを色々検討していた。 従来LM35などの温度をアナログの電圧に変換するセンサとA/Dコンバータを組み合わせるスタイルが多かったが、今はIC化したセンサにA/Dコンバータも内蔵してシリアルのデジタル出力が得られるものも多い。

よく使われるものはPCのマザーボード上の温度測定で比較的よく知られているLM75。 これは2線式インターフェース(データ線が2本。通常別に電源ラインが必要)のI2Cインターフェースが使用されている。

Web上で検索するとMAXIMのDS18S20を使った例がいくつか見つかった。これは1線式の1-Wireインターフェースを利用するもので比較的安価で精度が高いらしい。 MAXIMのサイトにはスペックからICの品種候補を出してくれるページがありこちらで調べてみるとDS18B20というものもあるらしい。 簡単にまとめるとこんな感じ。

温度センサ(Serial出力)
型番 インターフェース 精度 分解能 パッケージ
LM75 I2C (同期2線式バス) ±2℃(-25℃〜100℃ 最大) 0.5℃(9bit出力:LSB=0.5℃) SOP (8pin 1.27mmピッチフラット)
DS18B20 1-Wire (非同期1線式バス) ±0.5℃ (-10℃〜85℃ 最大) 0.0625℃ (12bit出力時 9〜12bit出力) TO-92 (3pin)
DS18S20 1-Wire (非同期1線式バス) ±0.5℃ (-10℃〜85℃ 最大) 0.5℃ (9bit出力:LSB=0.5℃) TO-92 (3pin)

精度については個々のセンサのばらつき以外に温度範囲の中での校正誤差が含まれる。 つまり温度の上限(例えばLM75では100℃近辺)、下限では比較的誤差が大きい。

I2Cバスはホスト→センサ方向のデータ線とセンサ→ホスト方向のデータ線が別で同期バスで通信速度は速い(ノーマルモードで100kbps、最大3.4Mbpsの仕様もある)。1-Wireの場合は1本の線を両方の方向の通信に用い、非同期通信を行う。制御がやや複雑で通信速度は遅い(1bit送るのに少なくとも60μSかかる=16kbps程度。最大142kbpsの仕様もあるがDS18B20のデータシートには記載はない)。 温度測定の場合は扱うデータの量が少ないため通信速度が遅くてもあまり問題にはならない。

DS18B20とDS18S20は外見上もソフト的にもほとんど同じ。値段も1個数百円で大して違わない(MAXIMから直接1000個以上で購入した場合DS18B20の方が安い)。

どうせ使うならDS18B20の方がよいだろう。試しに3個ほど買ってみた。 ちなみに秋葉原のパーツショップでは置いてある所は見つからないので通販を利用した。 最近の傾向として電子部品は標準品やカタログ/web等で確認できるもの以外は通販を使った方が便利。

1-WireやDS18B20/DS18S20についてはWeb上で検索すればそれなりに情報は出てくる。 時期的な関係なのか9bit固定出力のDS18S20の方が使用例は多い。 また、MAXIMのサイトには詳細な情報とサンプルプログラムが置いてあるので参考になる。

書籍ではCQ出版より
「マイコンの1線2線3線インターフェース活用入門」(ISBN978-4-7898-4208-2: 2800円)
が出ていて1-Wire/I2CやDS18S20についての詳しい解説がある。 これは実際にある程度プログラムを動かしてからだが、人に説明する必要もあって買った。 サンプルプログラムもCQ出版のサイトから入手できる。ただしターゲットはPICやH8なので...まあ1-Wireに関する限り普通のPCよりもH8あたりの方が扱いやすいかもしれない。

Posted at 19:43 in computer