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);
}
}
この記事が気に入ったらサポートをしてみませんか?