見出し画像

Tips:Low cost Digital Controlled Resistor with Arduino

Arduinoを用いて、デジタル制御で抵抗値を制御する方法を思いついたので、記録する。

目的

抵抗値のデジタル制御は、一般的にデジタルポテンションメータICを使用する。デジタルポテンションメータICは安くて、小型のため、簡単に使うことができる。

ICの数は少なければ少ないほど、組み立ては簡単だ。
デジタルポテンションメータICを使わず、抵抗値を制御する回路があれば嬉しいと思ったのだ。

回路

Arduino nanoと、外部抵抗でデジタル制御抵抗回路を作った。
D4~D8のpinを、オープンドレインで駆動することで合成抵抗値を制御する。

D4~D8が全てドレイン(GND)ならば、合成抵抗は5.16kオームになる。
全てオープンならば、合成抵抗は無限大になる。
D4のみドレインならば、合成抵抗は10kオーム。
D4とD5がドレインならば、合成抵抗は6.67kオームだ。

使い道

Arduino nanoのADコンバータと組み合わせて使えば、Voltage controlled resistorとして使うことができる。
例えば、音量を大きくしたり、小さくしたりすることができる。

上にある回路図のように10kオームの抵抗で分圧する場合、下記のグラフのようにexpカーブとなる。通称Aカーブと呼ばれていて、オーディオ回路の増幅に用いられる増幅特性だ。

宣伝:オープンソースプロジェクトの支援をお願いします

DIYモジュラーシンセのオープンソースプロジェクトを継続するために、patreonというサービスでパトロンを募集しています。
コーヒー一杯の支援をいただけると嬉しいです。
また、パトロン限定のコンテンツも配信しています。

ソースコード


int R_count=0;//0-31

void setup() {
  // put your setup code here, to run once:
pinMode(2,INPUT_PULLUP);//SW1
pinMode(3,INPUT_PULLUP);//SW2
pinMode(4,INPUT);//R0
pinMode(5,INPUT);//R1
pinMode(6,INPUT);//R2
pinMode(7,INPUT);//R3
pinMode(8,INPUT);//R4

 Serial.begin(9600);
 
}

void loop() {
delay(200);
if(digitalRead(2)==0 && digitalRead(3)==1){
  R_count++;
  if(R_count>31){
    R_count=31;
  }
}
else if(digitalRead(2)==1 && digitalRead(3)==0){
  R_count--;
  if(R_count<0){
    R_count=0;
  }
}

if(bitRead(R_count,0)==1){
  digitalWrite(13,HIGH);
}
else if(bitRead(R_count,0)==0){
  digitalWrite(13,LOW);
}

//-------------------VCR-------------------
if(bitRead(R_count,0)==1){
  pinMode(8,OUTPUT);
  digitalWrite(8,LOW);
}
else if(bitRead(R_count,0)==0){
  pinMode(8,INPUT);
}

if(bitRead(R_count,1)==1){
  pinMode(7,OUTPUT);
  digitalWrite(7,LOW);
}
else if(bitRead(R_count,1)==0){
  pinMode(7,INPUT);
}

if(bitRead(R_count,2)==1){
  pinMode(6,OUTPUT);
  digitalWrite(6,LOW);
}
else if(bitRead(R_count,2)==0){
  pinMode(6,INPUT);
}

if(bitRead(R_count,3)==1){
  pinMode(5,OUTPUT);
  digitalWrite(5,LOW);
}
else if(bitRead(R_count,3)==0){
  pinMode(5,INPUT);
}

if(bitRead(R_count,4)==1){
  pinMode(4,OUTPUT);
  digitalWrite(4,LOW);
}
else if(bitRead(R_count,4)==0){
  pinMode(4,INPUT);
}
}

この記事が気に入ったらサポートをしてみませんか?