この記事は以下の記事の続きです.
結論
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); }
実験結果
実行すると以下のように出力されます.
同じI2Cアドレスに設定されている2つのMCP4018について,同じ抵抗値に設定されることが確認できます.