STEMMAで広がるArduinoの世界⑨Step1 対数変化電子抵抗器DS1841

 多くのボリュームや半固定抵抗は、人が回すことで抵抗値を変化させます。DS1841はI2Cバスを通して抵抗値(値は不揮発性)を設定できます。その抵抗値の変化は対数と書かれていますが、ボリュームでいうA型相当なので、アンプなどで使うときのように、最初は抵抗値の変化が少ない特性です。
 さらに、温度によって、その変化を変える=温度補償も可能な機能を備えています。

 IC自体が3.3/5Vの電源で使えるデバイスのため、I2Cの信号レベル変換回路は入っていません。SDA/SCL信号のプルアップ抵抗は10kΩが入っています。

Adafruitのブレークアウト・ボード

 STEMMA QT(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

   Adafruit DS1841 I2C Logarithmic Resistor

 裏面には、I2Cアドレスを設定するA0とA1ピンのショート・ジャンパが用意されています。デフォルトで、A0/A1は10kでプルダウンされており0x28です。アドレスは、0b01010'A1''A0'の7ビットなので、ジャンパをはんだでショートし'1'にするとアドレスを変更できます。

DS1841のおもなスペック

 データシート

  • 電源電圧  2.7~5.5V
  • 可変抵抗範囲 370Ω~22kΩ(RW端子)
  • タップ 128
  • インターフェース I2C(0~400kHz)
  • スレーブ・アドレス 0x28(デフォルト)。A0/A1の設定で0x29、0x2a、0x2bに変更できる

 出力部分です。

使用環境

  • Arduino UNO R3
  • Arduino IDE 1.8.13
  • Windows10 20H2

接続

 電源は5V を使いました。Arduino UNO R3のI2Cは、SCLとSDA端子がありますが、SCLはA5に、SDAはA4につながっています。どちら側につないでもかまいません。白色のリード線は見えないので、黄色で配線図を描きました。

スケッチ

 利用手順は、Adafruit DS1841 I2C Logarithmic Resistor Overviewに書かれています。

 ライブラリを導入します。メニューのツールから、「ライブラリを管理」を選び、検索欄にDS1841を入力します。見つけてきたAdafruit DS1841のインストールをクリックします。

 同時にサンプル・スケッチも導入されます。

 メニューのファイルからサンプルの入っているスケッチ例を選択します。そこから、Adafruit DS1841- adafruit_ds1841_testを選択します。

 実行中の様子です。Wiper(POS)を10LSBと120LSBの位置に動かし、その時点の電圧を読んでいます。

 Wiperの出力をコメントアウトし、シリアルプロッタを動かしました。

 RW端子をA0へ、RH端子を3.3Vへつなぎました。温度(赤色)は一定、電圧(青色)は0.47Vと2.87Vを交互に表示しています。Wiperの動作が確認できました。

Adafruit_ds1841_lut_test

もう一つのサンプル・スケッチAdafruit_ds1841_lut_testを読み込んで動かします。

 実行結果です。

 LUTは、72バイトの Lookup Tableを指します。-40~100°Cの温度範囲を0x80~0xc7のアドレスに対応させた表で管理します。0x80~0xc7のアドレスには、0xd8~0x65の値が入っています。

 LUTには、LUTモードとLUT加算モード(デフォルト)があります。

 LUT加算モードはLUTと同じように働きますが、LUT Value Register のWRには、

  • LUTVAL(LUTARに格納されているアドレスが指す値)
  • Initial Value RegisterであるIVRの値

を合計した値がロードされます。LUTにプログラムされた値は2の補数で表現されるので、正または負のオフセットがついて扱いやすいです。

 LUTモードの場合、電源投入時にIVR値がWRに読み出されます。 上記の実行例では0x72です。この値は、電源投入後の最初の温度変換が完了するまでそこに残ります。
 温度はtFRAMEごとに測定されます。 温度の値は、LUT内の対応する値を指すインデックスを計算するために使用されます。 このインデックスはLUTアドレス・レジスタ(LUTAR)と呼ばれ、アドレス08hにあります。 LUTARが指す位置でLUTに格納される値は、LUTVALと呼ばれ、この値は、更新モード・ビット= 1のときにアドレス09hにWR値(WR)として格納されます。その後、プロセスが繰り返され、Wiper設定が継続的に更新されます。

 このLUTモードでは、72バイトのLUTに温度ウィンドウごとにWiperに設定が入力されます。 有効なWiperの設定値は0x00から0x7fです(MSBは無視される)。

 LUTが0x42の場合、そのときの温度の値は0x21(32-33℃)です。

 Wiperの値を読み出すと0x72でした。

  Enabling LUT mode

 LUTモードを有効にします。LUTを0x42にセットします。Wiperの値を読み出すと0x72です。

  Disabling LUT mode

 LUTモードを無効にします。LUT加算モードになります。Wiperの値を0x66にセットします。Wiperの値を読み出すと0x66でした。

 このスケッチは、LUT関連の関数の動作を確認しただけのようです。

前へ

STEMMAで広がるArduinoの世界⑧Step1 気圧、湿度、温度センサMS8607

次へ

STEMMAで広がるArduinoの世界⑩Step1 湿度センサSi7021