Segmentation Fault

いちおう技術系ブログ.信用しないでね.

リモコン付き電子ボリューム

いつも電子工作の記録代わりにつかっているmakeboothに新しく作品を投稿できなくなっていたので,代わりと言っては何ですが,久しぶりにこちらに書き込みします.

 真空管を使ったミニアンプを良く作ります.リビングでも使っているのですが,市販品でも無いのでリモコンが使えない.音量調整がリモコンできないと家族から,市販品の方が良いと苦情が来ます.Mac を音源にしているので以前にはApple Remoteで音量調整ができたので,それで良かったのですが,OSを上げていくうちにいつの間にか使えなくなってしまって困っていました.

 それでもモノ作りを志向する者はめげません.私たちはNJW1159Dがある.この難点は制御にマイコンが必要になることと正負の電源が必要になること.以前にはラズパイを使ってNJW1159Dを制御しました.電源もトランスとリップルフィルタを使って頑張ったのですが,少し高価になりオーバースペックなのと無線LANも付けちゃうと熱がこもってしまうので,今回はArduinoを使い,電源にはお安くUSBアダプタを使って作り直しました.

 最終的にできあがったものは,こんな感じです.回路図はデータシート通りなので書いていないです.6ページの回路図で,CE0とCE1をグランドに落として,DATA,CLOCK,LATCH をArduinoに繋いでいます. 赤外線センサの使い方はこちらを参考にさせていただきました.

f:id:hkoide:20160509114036j:plain

上に載っかっているのは,自宅で一番市販品に近い超三結改造済みの TU-870 です.

材料

道具

半田ごて,ハンドドリル,ドライバ,グルーガン

中身はこんな感じです.

f:id:hkoide:20160507195827j:plain

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); }