ディジタル・ポテンショメータ (1) MCP4012
受動部品の半固定抵抗器は、電子工作でよく使われる部品です。ボリュームと同じ機能ですが、回転回数が数百回までと少ないのが特徴です。人が調整するときに便利ですが、自動化するには不便なデバイスです。電子的なボリュームにディジタル・ポテンショメータ(Digital POT)があります。
半固定抵抗器は、抵抗の両端と可動接点(ワイパ)から構成されています。ディジタル・ポテンショメータはそのような接続を (a) potentiometer(ポテンショメータ・モード)、抵抗の片方を開放もしくは可動接点とショートしたタイプを (b) Rheostat(レオスタット・モード)と呼びます。半固定抵抗では、抵抗の片方を開放する使い方は推奨されていません。
●インターフェース
調べたところ、抵抗値を変更するインターフェースが3種類あります。
- I2C
- SPI
- 独自方式
I2Cの事例は、Arduino.ccでAD5171を利用例が説明されています。ここでは、2線を制御に用いた独自方法のMCP4012を利用します。SOT23の小型パッケージに入っているので、秋月電子通商の変換基板を利用してDIP化しました。
●MCP4012のおもなスペック
タップ数はD-Aコンバータのビット数と同様な値で、分解能を表します。電源が入ると、前回設定した値が設定されます。
- タップ数 64
- 抵抗値 2.1k、5k、10k、50kΩ(今回使用)
- 温度係数 50ppm
- 動作電圧 1.8~5.5V
- 温度範囲 -40~125℃
●抵抗値の増減タイミング
増加時;U/DをHIGHにした後CSをLOWにしてシーケンスをスタートする。U/DをいったんLOWにし、スタート時から3usたってから再度500usの間HIGHにしたのちLOWにする。U/DをHIGHにし、つづいてCSをHIGHに、U/DをLOWにしCSをLOWにして終了。
データシートのタイムチャートはFIGURE1-1です。
下記のスケッチを動かして実測した波形です。
減少時;U/DをLOWにした後CSをLOWにしてシーケンスをスタートする。U/DをいったんHIGHにし、スタート時から500usたってから再度HIGHにしたのち500us間LOWにする。U/DをHIGHにし、500us以降にCSをHIGHに、U/DをLOWにしCSをLOWにして終了。
データシートのタイムチャートはFIGURE1-2です。
●接続
Arduino | MCP4012 | Arduino | |
---|---|---|---|
5V | 1ピン(Vdd) | 6ピン(A) | 抵抗端子 |
GND | 2ピン(Vss) | 5ピン(W) | 可動接点 |
9番 | 3ピン(U/D) | 4ピン(CS) | 8番 |
●スケッチ
delayMicrosecondsは最小値が1ですが、確かめていませんが実際は数usになるようです。ns単位のコントロールはできないので、データシートにある3usというところだけを注意してdelayMicrosecondsの引数を決めました。
#define CS 9 // pin
#define UD 8 // pin
void setup() {
pinMode(CS, OUTPUT);
pinMode(UD, OUTPUT);
digitalWrite(CS,HIGH);
digitalWrite(UD,LOW);
Serial.begin(9600);
}
void Increment() {
digitalWrite(CS,HIGH);
digitalWrite(UD,LOW);
digitalWrite(UD,HIGH);
delayMicroseconds(2);
digitalWrite(CS,LOW);
delayMicroseconds(1);
digitalWrite(UD,LOW);
delayMicroseconds(1);
digitalWrite(UD,HIGH);
delayMicroseconds(2);
digitalWrite(UD,LOW);
delayMicroseconds(1);
digitalWrite(UD,HIGH);
delayMicroseconds(1);
digitalWrite(CS,HIGH);
delayMicroseconds(1);
digitalWrite(UD,LOW);
digitalWrite(CS,LOW);
}
void Decrement() {
digitalWrite(CS,HIGH);
digitalWrite(UD,HIGH);
digitalWrite(UD,LOW);
delayMicroseconds(2);
digitalWrite(CS,LOW);
delayMicroseconds(1);
digitalWrite(UD,HIGH);
delayMicroseconds(1);
digitalWrite(UD,LOW);
delayMicroseconds(2);
digitalWrite(UD,HIGH);
delayMicroseconds(1);
digitalWrite(CS,HIGH);
delayMicroseconds(1);
digitalWrite(UD,LOW);
digitalWrite(CS,LOW);
}
void loop() {
Serial.println("Decrement; d , Increment; i ");
while (!Serial.available()); {
char a = Serial.read();
if(a == 'i'){
Increment() ;Serial.print(" i ");
} else if(a == 'd'){
Decrement() ;Serial.print(" d ");
}
}
delay(1000);
}
5番と6番ピンをテスタの抵抗レンジで測定します。シリアルモニタの送信部分にdを入れると値は増加し、iを入れると抵抗値は下がります。