リモコン付き電子ボリューム
いつも電子工作の記録代わりにつかっているmakeboothに新しく作品を投稿できなくなっていたので,代わりと言っては何ですが,久しぶりにこちらに書き込みします.
真空管を使ったミニアンプを良く作ります.リビングでも使っているのですが,市販品でも無いのでリモコンが使えない.音量調整がリモコンできないと家族から,市販品の方が良いと苦情が来ます.Mac を音源にしているので以前にはApple Remoteで音量調整ができたので,それで良かったのですが,OSを上げていくうちにいつの間にか使えなくなってしまって困っていました.
それでもモノ作りを志向する者はめげません.私たちはNJW1159Dがある.この難点は制御にマイコンが必要になることと正負の電源が必要になること.以前にはラズパイを使ってNJW1159Dを制御しました.電源もトランスとリップルフィルタを使って頑張ったのですが,少し高価になりオーバースペックなのと無線LANも付けちゃうと熱がこもってしまうので,今回はArduinoを使い,電源にはお安くUSBアダプタを使って作り直しました.
最終的にできあがったものは,こんな感じです.回路図はデータシート通りなので書いていないです.6ページの回路図で,CE0とCE1をグランドに落として,DATA,CLOCK,LATCH をArduinoに繋いでいます. 赤外線センサの使い方はこちらを参考にさせていただきました.
上に載っかっているのは,自宅で一番市販品に近い超三結改造済みの TU-870 です.
材料
- Arduino (今回はMega互換を使ってしまいました.Unoとかで十分.中国製互換機とか安い)
- 赤外線センサ(20円のコレ)
- NJW1159D
- ユニバーサル基板
- 電解コンデンサ(NJW1159Dのデータシートに載っているもの.100uF 2コ, 10uF 2コ, 1uF 4コ)
- ピンヘッダ(Arduinoシールド風にするため)
- USB電源アダプタ(品質いろいろみたいなので...)
- RCAプラグ白 2コ,RCAプラグ赤 2コ,ACコネクタ
- プラスチックケース(セリアで購入)
- 7セグLEDキット(使っていなかったものを有効利用!)
- ネジ,線材,はんだ,スズメッキ線,ホットボンド等
- リモコン(私はIOデータの使っていないリモコンを流用しました.)
道具
半田ごて,ハンドドリル,ドライバ,グルーガン
中身はこんな感じです.
Arduino のスケッチ
Arduino のスケッチはこんな感じです.
#include <irremote.h>
#include <softwareserial.h>
#define UP 0xA1C7E46C
#define DOWN 0xA1C7E493
#define REP 0xffffffff
#define LATCH 8
#define CLOCK 9
#define DATA 10
#define IRRECV 11
#define LED 12
unsigned long int lastCommand = 0;
int data[16];
IRrecv irrecv(IRRECV);
decode_results results;
int volume;
SoftwareSerial led(13, LED);
void sendData()
{
digitalWrite(LATCH, LOW);
for (int i=0; i < 16; i++) {
if (data[i] == 0) {
digitalWrite(DATA, LOW);
} else {
digitalWrite(DATA, HIGH);
}
digitalWrite(CLOCK, LOW);
digitalWrite(CLOCK, HIGH);
}
digitalWrite(LATCH, HIGH);
}
void makeData(int val, int lr)
{
data[0] = (val >> 6) & 1;
data[1] = (val >> 5) & 1;
data[2] = (val >> 4) & 1;
data[3] = (val >> 3) & 1;
data[4] = (val >> 2) & 1;
data[5] = (val >> 1) & 1;
data[6] = val & 1;
data[7] = data[8] = data[9] = data[10] = 0;
data[11] = lr;
data[12] = data[13] = data[14] = data[15] = 0;
}
void setup()
{
/* Setup IR-Receiver */
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
/* Setup NJW1159 */
pinMode(LATCH, OUTPUT);
digitalWrite(LATCH, HIGH);
pinMode(CLOCK, OUTPUT);
digitalWrite(CLOCK, HIGH);
pinMode(DATA, OUTPUT);
digitalWrite(DATA, HIGH);
delay(100);
volume = 100;
makeData(volume, 0);
sendData();
makeData(volume, 1);
sendData();
// LED
led.begin(9800);;
}
void volumeUp()
{
if (volume > 0) {
volume = volume - 1;
}
makeData(volume, 0);
sendData();
makeData(volume, 1);
sendData();
}
void volumeDown()
{
if (volume < 100) {
volume = volume + 1;
}
makeData(volume, 0);
sendData();
makeData(volume, 1);
sendData();
}
void loop() {
static char buf[10];
static char old_buf[10];
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (results.value == UP) {
volumeUp();
lastCommand=results.value;
} else if (results.value == DOWN) {
volumeDown();
lastCommand=results.value;
} else if (results.value == REP) {
if (lastCommand == UP)
volumeUp();
else if (lastCommand == DOWN)
volumeDown();
}
irrecv.resume(); // Receive the next value
}
sprintf(buf, "%d\r", 100-volume);
if (strncmp(buf, old_buf, 10) != 0) {
led.write(buf);
strncpy(old_buf, buf, 10);
}
delay(10);
}