シュウジマブログ

Apple製品,技術系の話をするブログ

MCP4018を2つ同時に利用する場合

この記事は以下の記事の続きです.

masa-flyu.hatenablog.com

結論

2つを同じ値に設定する場合はなんの工夫も無しに可能です.

逆に2つを異なる値に設定することはできません(正攻法では).

はじめに

MCP4018をオーディオの音量調整に使用したいと考えています.その場合L,R両チャンネルを同時に制御したいという要求があります.

ところで,MCP4018はI2C通信を利用しています. I2Cはバス上にいくつものデバイスを接続できますが,その接続されたスレーブデバイスはアドレスで管理されます.データ送信時に必ずアドレスを伝送することで,他のアドレスの機器は反応せず,必要な機器だけが反応します.

MCP4018はアドレス0x2Fに設定されています.そしてこれを変えることはできません.

同じアドレスの機器がバス上に2つ存在する場合どのような挙動になるのかわからなかったため,同時に使用できるか調べてみました.

実験

回路

過去記事の回路にもう一つのMCP4018を接続します.

5番Wピン以外は全て同じものを接続しました.

I2Cも変えていません.

5番WピンをArduinoのA1に接続しました.

これで,1つ目のMCP4018を接続したA0ピンの電圧と同時に確認できそうです.

プログラム

// MCP4018用実験プログラム
// MCP4018の抵抗を一定時間ごとに一定量変化させる.

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

int cnt = 0 , a1 , a2 ;
 
void loop() {

  // MCP4018 のアドレスは0101111 → 16進数で2Fにセットされている
  // 0〜127の値を送る
  Wire.beginTransmission(0x2F);
  Wire.write(cnt);
  Wire.endTransmission();

  // 送信した値と,それをW→Vss間の抵抗で表した抵抗値をシリアル出力させる.
  Serial.print(cnt);
  Serial.print(" ( ");
  Serial.print(cnt / 127.0 * 10.0);
  Serial.print(" kohm)  ");

  a1 = analogRead(0);

  // MCP4018-1 のW-Vssの電位差をシリアル出力させる.
  Serial.print("\t\t 1 =" );
  Serial.print(a1);
  Serial.print(" ( ");
  Serial.print(a1 / 1024.0 * 5.0 );
  Serial.print(" V )");

  a2 = analogRead(1);

  // MCP4018-2 のW-Vssの電位差をシリアル出力させる.
  Serial.print("\t 2 =" );
  Serial.print(a2);
  Serial.print(" ( ");
  Serial.print(a2 / 1024.0 * 5.0 );
  Serial.println(" V )");

  // カウントアップ
  cnt += 5 ;

  // カウントが127を超えていたら,意味がないので,0に戻す.
  if( cnt > 127 ) cnt = 0;
  
  delay(200);
}

実験結果

実行すると以下のように出力されます.

f:id:masa_flyu:20181007224848p:plain

同じI2Cアドレスに設定されている2つのMCP4018について,同じ抵抗値に設定されることが確認できます.

当ブログをご利用いただく際には免責事項をお読みください。