作成日時:2018年01月07日 17時40分14秒
更新日時:2020年11月28日 16時59分21秒
この記事は6年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。
この前よりちまちまと作ってきたアンプを完成させます。
アンプの仕様
- 4Ω時40W、8Ω時20Wの出力を持つ
- 12V ACアダプタ電源
- 電子ボリュームによる音量制御
- 音量表示はキャラクター有機ELディスプレイ
- ロータリーエンコーダで音量調整
- 1系統入力1系統出力
(ICが4chだけど2chは遊ばせておく) - 制御はAVRマイコンで行う
前工程
この記事は最近いくつか小分けで掲載していた記事の総まとめに当たります。こちらを読まれる前に以下の記事を参考にしてください。
まずは心臓部であるアンプ回路を作っています。元記事にも加筆しましたが、こちらの記事で使っている電線はちょっと細めなので、もう少し太いものを使ってあげると安心です。とはいえ普通は最大電力で使うことはないでしょうから。AWG24のままでも良いかもしれません。これで3.5A流せますので20W級のアンプとして使うならば2Aないので問題ないでしょう。
次に音量制御に使う電子ボリュームです。こちらはも以前使っていたICが入手性に難が出てきていますので新しいものを作りました。
次に表示器ですが、今回はパラレルタイプの接続のキャラクター有機ELをシリアル接続に改造して使っています。
ちなみにもしこれが出来なくてもシフトレジスタを使用して同じ事をやろうとしていました。
電源基板の制作
電源基板に使用した部品は上の写真のとおりです。
基本的にはレギュレーターの構成部品とDC-DCコンバータの平滑用コンデンサになります。
コンデンサ類はこんな感じ。レギュレーター側に0.1μFのセラコンと100μFの電解コンデンサを置きます。DC-DCコンバータ側に470μFの電解コンデンサを設置します。
なお、今回は電動機やリレーといったコイルの類いがないため、レギュレーター保護のダイオードは省略しました。DC-DCコンバータ平滑用のコンデンサは電子ボリューム側にもつけていますので実は不要な部品ですが、念のためこちらにも取り付けました。
レギュレーターは5V1A品。ヒートシンクは適当な大きさのものを、ネジ類は買い置きのものを使いましたので詳細が分りません。なお、写真と同じJRC 7805Aを使うのであれば、絶縁シートとワッシャーは不要ですが、念のためつけました。
音質を考えたら本当はトランスなどを利用した方が良いのでしょうが、今回は手軽にDC-DCコンバータを使います。
今回使用したものはMinmaxのMIWI06-24D05というもの。±5V500mAの出力があります。
基板はいつもの。
完成。
電源基板に関しては概ね基本的な回路になっていますのでここでは紹介しません。分らない人が居ましたらググってください。
制御基板
制御基板も特に説明するところはありません。
リセットピンとロータリーエンコーダ用のプルアップ抵抗(4.7kΩ)とパスコン(0.1μF)
ICソケットとAVRマイコンだけです。
AVRマイコンはサイズと、PB端子が片側に集中しているという理由からATTiny2313を選択しました。
しかしこいつはプログラムフラッシュが2KBしかないのでC++でのコーディングだと結構ギリギリなんですよね。
完成。
なお。ロータリーエンコーダの接続などについては、こちらの記事を参考にしてください。
すべてを繋いで動作確認。
外装パーツの選定
それでは外装パーツを選定していきますが、外装パーツというものは、基本的に常に目に触れるものですし、個人の技能や好み、予算に合わせて選択するべきなので、ここからはあくまで参考にしてください。ただし、今回はアンプの発熱がそれなりなので金属製ケースをおすすめします。
まずケースを選びます。今回は基板のサイズなどからタカチのYM-250を選びました。
ケースは見た目が良く加工しやすいものがよいでしょう。今回も裏返して縦向きに使います。
使用する部品は規格を満たしているもので、見た目が気にいったものを使います。今回はつまみが写っていませんが、以前作ったアンプから流用しました。
ケース加工
ケースの加工は 位置を決める→センターポンチであたりをつける→2mmくらいの小さいドリルから始めて徐々にドリルを大きくする。という手順で穴を開け、その後に必要に応じて穴を加工して、最後にヤスリで現物合わせをしながら微調整をします。
ちなみに加工に関しては以下のページがわかりやすく丁寧です。
部品の取り付け
後ろ側はこんな感じで。写真に見切れている小さめのスパナがあると結構便利。
有機ELの取り付けには樹脂製のスペーサーとM2x10のネジを使います。なお、有機ELの穴径は2.5mmですが、2.5mmのネジがなかったので2mmを使用しました。
こんな感じで取り付けます。
次にロータリーエンコーダですが、ナットを2つ用意して、こんな感じで1つを先につけておき、ぎりぎり固定できる位置で止めておきます。
そうしてつまみの隙間を最小にします。といっても、完全にくっつけるとケースを削ってしまってアレなので。
裏。
基板を取り付けるネジはM3です。写真のものは10mmですが、アンプ部は少し短かったので12mm以上を使用します。
基板を取り付けて
配線。コンデンサが微妙なことになっていますが気にしないでください。
アンプのネジが微妙なことになっているのがDIYクオリティ。逆ハの字なので脱落はしないでしょうからとりあえずこれで様子を見ます。
通電確認をして
完成!
前面はスイッチと有機ELとロータリーエンコーダが付いているだけでシンプル。どうせ有機ELが常時点灯なので電源ランプもない。
裏面も至ってシンプル。
最後に
というわけで長かったアンプ制作も終わりました。今回は以前に多様な構成にしたもののリベンジという意味合いで製作しましたが、なかなか良いものが出来たと思います。
ちなみに次回はため込んでいる部品がいくつかあるので徐々に流していきたいと思います。アンプはしばらく作らない予定です。
音質
音質はなかなか良いですな。音の広がりもよく高音から低音までしっかり出ていて素直な感じの音質。細かいことはアンプICの記事に書いているので見てちょ。
プログラムコード
たいしたものじゃないですが一応載せておきます。なお、電源を切ると次回立ち上げ時に音量が1dB下がるというバグがありますがそのうち直します。
/*
* GccApplication1.cpp
*
* Created: 2017/11/25 19:34:48
* Author : sakura87
*/
#include <avr/io.h>
#include <avr/eeprom.h>
#include <util/delay.h>
//#include <stdlib.h>
#define SPI_MOSI char(5)
#define SPI_MISO char(6)
#define SPI_SCLK char(7)
#define OLED_CS char(4)
#define EVOL_CS char(3)
#define F_CPU 8000000
#define EEP_VOL char(0x0000)
void PBWrite(char p,unsigned char d){PORTB = (d<<p)&(1<<p) ? PORTB | (1<<p) : PORTB & ~(1<<p);}
int rec(void){
// http://elm-chan.org/docs/tec/te04.html
static const int d[]={ 0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0 };
static unsigned char p;p =((PIND >> 4 )& 3)|(p << 2) &0x0F ;
return d[p];
}
void OLED_spiSend(unsigned int rs,unsigned char data){
char i=10;
rs = int(rs << 9) | int(data);
PBWrite(SPI_SCLK,0);
PBWrite(OLED_CS,0);
while(i--){
PBWrite(SPI_MOSI,(rs >> i) & 1);
PBWrite(SPI_SCLK,0);PBWrite(SPI_SCLK,1);
}
PBWrite(OLED_CS,1);
}
void EVOL_spiSend(unsigned char channel,unsigned char vol){
char i=16;
unsigned int data =(int(channel) <<8 ) | vol;
PBWrite(SPI_SCLK,0);
PBWrite(EVOL_CS,0);
while(i--){
PBWrite(SPI_MOSI,(data >> i) & 1);
PBWrite(SPI_SCLK,0);PBWrite(SPI_SCLK,1);
}
PBWrite(EVOL_CS,1);
}
int main(void)
{
DDRD = 0x00; // ALL Input
DDRB = 0xbf; // MISO:INPUT
// PB76543210
PORTB = 0b11111000;
/* Replace with your application code */
unsigned char vol=64 ;
unsigned char voldB =0;
eeprom_busy_wait();
vol = eeprom_read_byte((char)EEP_VOL) & 0x7F;
char i = 8;
char inData[] ={0,0,0,0,0b00111000,0b00001100,0b00000001,0b00000010,0b00000110};
while(i--) OLED_spiSend(0,inData[char(8)-i]);
bool f = true;
while (1)
{
char oledStrings[15];
int REstate = rec();
switch(REstate){
case 0:
if(f){f=false;}else{continue;}
break;
case 1:
if(vol < 96){ vol++; vol++;} else if(vol <127){ vol++;}
break;
case -1:
if(vol > 96){vol--;} else if(vol >1) {vol--;vol--;}
break;
}
if(vol > 96) {voldB=vol-48;}else{voldB=vol>>1;}
oledStrings[0] =' ';
oledStrings[1] =' ';
oledStrings[2] ='V';
oledStrings[3] ='o';
oledStrings[4] ='l';
oledStrings[5] ='.';
oledStrings[6] =' ';
oledStrings[7] ='-';
oledStrings[8] =char(voldB/10+48);
oledStrings[9] =char(voldB%10+48);
oledStrings[10] =' ';
oledStrings[11] ='d';
oledStrings[12] ='B';
oledStrings[13] =' ';
oledStrings[14] =' ';
oledStrings[15] =' ';
oledStrings[16] =' ';
eeprom_busy_wait();
eeprom_write_byte(EEP_VOL,vol & 0x7F);
EVOL_spiSend(0,vol);
EVOL_spiSend(1,vol);
//OLED_spiSend(0,1);
OLED_spiSend(0,char(2));
char i = 15;
while(i--) OLED_spiSend(char(1),oledStrings[char(14)-i]);
}
}
[…] 今回、このIC基板以外の回路は、以前作ったアンプからすべて流用しました。 […]