2020年1月12日日曜日

ポテンショメーター(I2C通信で制御可能な可変抵抗)AD5254をArduinoで制御してみた


背景

ポテンショメーターとは、マイコンなどで通信して抵抗値を変えられる装置です。
1kΩのポテンショメーターを使いたかったのですが月電子にもスイッチサイエンスにも売っていなかったので、自分で配線を引き出す基板(ブレイクアウトボード)を作ってみました。
備忘録を兼ねて機能と使い方を共有します。

使ったもの

  • AD5254(1kΩ4ch256ステップ)ブレイクアウトボード
    スイッチサイエンスで購入できます。
    ポテンショメーターAD5254(1kΩ256ステップ)ブレイクアウトボード | スイッチサイエンス
    AD5254とは、抵抗値の種類としては1kΩ,10kΩ,100kΩがあり、ステップの種類としては64と256がある、4ch(抵抗の線が4つある)のポテンショメーターです。
    今回は1kΩが使いたかったので、1k256ステップのAD5254を利用しました。
    基板の設計データはこちらです。
    https://github.com/asukiaaa/AD5254Breakout
  • ProMicro + microUSBケーブル
    Arduino Leonardoの互換機です。
    microUSBケーブルでPCに接続します。
  • ProMicroにプログラムを書き込むためのPC
    Arduino IDEかPlatformIOをインストールし、USBポートを持つPCを利用します。
  • ブレッドボード + ジャンパワイヤ
    ProMicroとAD5254を接続します。
  • テスター + ワニ口クリップ
    ポテンショメーターの抵抗値を測定します。

AD5254ブレイクアウトボードの特徴


アドレスを決めるA0とA1はVDDに接続済み

AD5254はA0とA1に接続する先をGNDかVDDにすることで、自身のI2Cアドレスを変えられます。ブレイクアウトボードは標準でA0とA1をVDDに接続しています。
AD5254を1つのArduinoに複数接続したい場合は、VDDのジャンパをカッターなどで接続してGNDのジャンパを盛ってください。

WPはVDDに接続済み

WPをVDDに接続していない状態では、AD5254に値を書き込めません。
そのため、ブレイクアウトボードはWPをVDDに接続して値を書き込める状態にしてあります。

EEPROMに値を書き込んで以後書き換えられたくないような場合は、WPとVDDのジャンパをカッターなどで切断してください。
そうすると、値を書き込めなくなります。(読み込みは可能です。)

VSSはGNDに接続済み

AD5254におけるVSSとは、可変抵抗の信号線の下限値(またはそれ以下)の電位を渡すための信号線です。(VSSにはGND+0.3Vから-7Vを接続できます。)
可変抵抗の下限値はGNDで利用することが多いと思うので、VSSはGNDに接続した状態にしてあります。

VSSをGND以外の値にしたい場合は、VSSとGNDのジャンパを切断して、VSSのパッドから動線などで信号線を引き出して、VSSに接続したい電位を供給してください。

I2Cのプルアップ抵抗を未接続の状態で設置

I2Cの信号線(SDAとSCL)をVDDにプルアップしたい場合は、I2C PullUpと書いてあるパッド2つを盛ってください。

可変抵抗の扱える電圧はVDD以下VSS以上

データシートのTable 5. Pin Function Descriptions に書いてあります。

可変抵抗に流せる電流量は5mA

データシートのABSOLUTE MAXIMUM RATINGSに書いてあります。

LEDを光らせるほどの電流は流せません。

その他の情報

AD5254についてもっと詳しく知りたい場合は、データシートをご覧ください。

https://www.analog.com/media/en/technical-documentation/data-sheets/AD5253_5254.pdf

回路

AD5254をProMicroの電源とI2Cの信号線に繋ぎます。


ProMicroはI2Cの信号線はプルアップされていないので、ブレイクアウトボードのI2Cのパッドを盛ってプルアップします。


B0をテスターの-に、W0をテスターの+に接続して、変化を見れるようにします。


全て行うとこのようになりました。


ライブラリを準備

AD5254を扱うためのライブラリを作りました。

https://github.com/asukiaaa/AD5254_asukiaaa

Arduino IDEのライブラリマネージャーからダウンロード・インストールできます。


PlatformIOの場合はplatformio.iniのlib_depsにAD5254_asukiaaaを記述すると使えます。

プログラム

サンプルプログラムreadAndWriteを利用して動作を確認します。
このプログラムは下記の動作を繰り返します。
  • チャンネル0の抵抗を1秒ごとにチャンネルのステップを1ずつ加算する
  • チャンネル0のステップが255になったら0に戻す
記事を書いている時点でのプログラムはこちらです。
#include <AD5254_asukiaaa.h>

AD5254_asukiaaa potentio(AD5254_ASUKIAAA_ADDR_A0_VDD_A1_VDD);

void setup() {
  Serial.begin(115200);
  potentio.begin();
}

void loop() {
  uint8_t value;
  for (uint8_t i = 0; i < 4; ++i) {
    String indexStr = String(i);
    if (potentio.readRDAC(i, &value) == 0) {
      Serial.println("RDAC of channel " + indexStr + " is " + String(value));
    } else {
      Serial.println("Cannot read RDAC of channel " + indexStr + ".");
    }
  }

  // Make sure the WP(write protect) is connected to VDD
  uint8_t targetValue = (millis() / 1000) % 256;
  if (potentio.writeRDAC(0, targetValue) == 0) {
    Serial.println("Update RDAC of channel 0 to " + String(targetValue));
  } else {
    Serial.println("Cannot update RDAC of channel 0.");
  }

  delay(1000);
}

ArduinoIDEかPlatformIOで上記のサンプルプログラムをProMicroに書き込んでください。

動作確認

サンプルプログラムを書き込んだProMicroから送信される情報をシリアルモニタで確認します。
Arduino IDEの場合は、IDE右上のシリアルモニタボタンを押して、通信速度を115200bpsにしてください。
PlatformIOを利用する場合は、下記のコマンドで115200bpsのシリアルモニタを開けます。
pio device monitor -b 115200

うまくいけば、1秒ごとにチャンネル0に書き込まれる値と各チャンネルの現在の値をシリアルモニタで確認できます。


チャンネル0の抵抗値をテスターで確認します。

書き込んだ値が255のときは、1.088kΩになりました。
期待する値は1kΩ(1k*255/255)なので、 90Ωくらい高い抵抗値になっています。


書き込んだ値が10のときは、106Ωになりました。
期待する値は1k*10/255 = 39.2Ωなので、65Ωくらい高い抵抗値になっています。


手持ちのテスターで計測すると期待する値より65〜90Ω高くなるものの、書き込んだ値に比例して抵抗値が変わっていました。

まとめ

ポテンショメーターAD5254の1kΩ256ステップ版を利用してLEDの明るさをArduinoで制御できました。

参考

AD5253/AD5254データシート (PDF)
asukiaaa/AD5254_asukiaaa
asukiaaa/AD5254Breakout

変更履歴

2020.01.24
スイッチサイエンスの商品ページを追加しました。

0 件のコメント :

コメントを投稿