スイッチャーできた、ちゃんと動いてる pic.twitter.com/p0f8B2OTmq
— めるくん🎨技術書典は(え40) (@windymelt) 2019年4月14日
わが家にはPCの他にレコードプレイヤーがあり,スピーカやヘッドホンがある.これまではこれらを今まで手で繋ぎ変えていたが,毎回机の裏をいじくるのが大変なのでサボるためにスイッチャーを作ることにした.
スイッチャーとは
オーディオ界隈におけるスイッチャーとは,いくつかの入力から1つを選んで出力できるようにする装置,もしくは1つの入力からいずれかの出力を選べる装置,もしくはいくつかの入力から1つを選んで,いくつかの出力からいずれかを選べる装置である.
例えば今回作成したスイッチャーは2つの3.5mmイヤホンジャックの入力を受け取り,そのどちらかを出力することができる. そして出力用の3.5mmイヤホンジャックも2つあり,このうちどちらかを選んで出力することができる.
今回は,入力にPCとレコードプレイヤー,出力にヘッドホンとスピーカーを選べるようになった.
アーキテクチャ
アーキテクチャというほどのものではないが,全体の概要は以下の通り.
- ハードウェア
- 基本的に秋月で入手できる部品を使う
- リレーを使ってどちらの入力を選ぶか・どちらの出力を選ぶかを選択する
- リレーの制御にはAVRマイコン(ATmega168-20PU)を利用する
- マイコン自体の出力(10mA程度?)ではリレー(40mAが2つ)を動かすことができないので,トランジスタで電力を増幅する
- 出力が大きいフォトカプラがあったので,絶縁と増幅を兼ねてこれを使った
- ソフトウェア
- avr-gcc+avr-libcで開発
- AVR用にクロスコンパイルできるGCC
- AVRの周辺機器に対応したlibc
- ミリ秒単位で停止させたり,割り込みを使ったりと,基本的なハードウェア機能が使える
- もちろんAVRにシステムコールはないので直接レジスタをいじったりする
- dockerで開発環境を構築した
- avr-gcc+avr-libcで開発
制作風景
あれ,AVRISPmkIIってターゲットに給電しないの?別途Vccに5Vかける必要ある?
— めるくん🎨技術書典は(え40) (@windymelt) 2019年4月7日
— めるくん🎨技術書典は(え40) (@windymelt) 2019年4月12日
いやーキツいっす・・・ pic.twitter.com/Ix4PCYrwkf
— めるくん🎨技術書典は(え40) (@windymelt) 2019年3月23日
圧倒的努力 pic.twitter.com/B3tfSanTav
— めるくん🎨技術書典は(え40) (@windymelt) 2019年3月24日
あ~~安物のオシロスコープ・・・
— めるくん🎨技術書典は(え40) (@windymelt) 2019年3月24日
AVRのチップイレースに成功した
— めるくん🎨技術書典は(え40) (@windymelt) 2019年4月8日
部品表
- I-04271 超小型ショットキーダイオード(40V350mA)SD103A(20本入)
- 1つ買えば良い
- リレーの還流ダイオード(フォトカプラの破壊を防ぐ)
- I-076924回路入フォトカプラ TLP627-4
- 1つ必要.地味に高い
- 電力増幅と絶縁を兼ねる高機能なやつ
- P-12139 ラッチリレー DC5V EA2-5TNAG 2回路C接点
- 2つ必要だがなんか役立ちそうだし5つくらい買おう(ガバ)
- 2回路C接点のマニアックなリレー,しかも安い
- ICソケット(適宜)
- リレーも着脱できるようにしておくと得
- いわゆるB基板
- B基板でけっこうカツカツ,というかジャンパだらけになって大変だったので余裕のある配線がしたければもっと大きい基板にしよう
- プラケース
- ギリギリ入るかどうか危ない感じだったので,みんなはタカチの大きめのケースにするといいゾ
- 基板用マイクロUSBコネクタ(電源専用): パーツ一般 秋月電子通商-電子部品・ネット通販
- 電源用.5V100mAくらい取れればどんな電源でもいい
- 家に落ちていたATmega168-20PU
- オーバースペック(Arduino同等)じゃない・・・?
- ATtiny2313とかで良さそう(ROMに収まるか未確認)
- ピンアサインも変化するので,ソフトウェアを使いまわしたい人はそのつもりで
- 1kΩ抵抗 2つ
- スイッチのプルアップ用抵抗
- 4.7kオーム抵抗 1つ
- リセットピンのプルアップ用抵抗
- 6.8kオーム抵抗 4つ
- フォトカプラの電流制限抵抗
- 3.5mmステレオミニジャックMJ−073H パネル取付用: パーツ一般 秋月電子通商-電子部品・ネット通販
- 4つ必要
- 単価が高い!!
- お好みのスイッチ(SPST)
- 適当なプッシュスイッチでいいと思う
- ピンヘッダ
- ISP書き込みのために必要.どこの家にもあるはず
使った道具
- どこの家にもあるもの
- はんだごて&はんだ
- ラジオペンチ
- ワイヤストリッパ
- 電線の被覆を剥いてくれるすごいやつだよ,これがないと人生損するレベル
- マルチメータ
- これがないと人生損するレベル,4000円くらいのを適当に買おう
- 特殊なやつ
- AVRISPmkII
- AVRに書き込む装置.ディスコンになったのを最近知って悲しい.後継はAtmel ICEっぽい
- 電動ドリル
- 手動ドリルで穴なんか開けると日が暮れるので暴力で解決しよう.摩擦熱でビットにプラスチックがベッタリ張り付くので覚悟しよう
- リーパーリーマー
- ドリルで開けた穴を広げるやつ.邪悪な見た目をしている
- グルーガン
- そのグルガン族の男は静かに語った・・・
- 溶けた樹脂を塗り付けられる道具.絶縁したいところに塗ったりグラグラする部品を固定するために無理矢理使ったりと,なにかと融通が効く
- ヤスリ
- プラケース加工に必要だった,これがないと円以外の穴が開けられなくなる
- AVRISPmkII
ハードウェア
回路図・配線図はFritzingを使って設計した.
このデータは後述のGitHubにアップロードしてあるので使っていいよ
↑の回路図は若干おかしな所があって,AVRのピンアサインが実際のピンアサインと違う(本来のatmega168-20PUのものではなく,別?のチップのピンアサインになっている)が,物理的な位置に問題はないのでこのまま配線して良い.例えば図では14番ピン(ピンアサインはD8になっている)にスイッチからの配線が伸びているが,実は14番ピンのアサインはB0だった.したがって後述のソースコードではD8ではなくB0ピンを使うようにしている.
↑の配線図では,後から追加した電源や,パネル取り付けの3.5mmステレオジャックは描かれていないので,別途端子をはんだ付けする必要がある. リレーの端子は,上のリレーが入力の切り替えを,下が出力を担当している.リレーの左側でLの信号を,右側でRの信号を扱う(混同しなければ全部逆でもちゃんと動くが).
ソフトウェア
実際に使ったソースコードは公開しています.
Makefileの書き方について以下のサイトを参考にしました.
この手の組込み開発ではとにかくビルド環境を用意するのが面倒な(Arduinoが異常に簡単すぎる)ので,Dockerを使ってAVR-GCCとAVR-Libcを用意した.
書き込みソフトウェアであるavrdude
はたいていのディストリビューションに付属しているので,自前で用意してほしい.
既に開発環境を用意しているdockerイメージがあったので,今回はこれを使ってdocker-composeを利用してソースコードがあるディレクトリをマウントするなどして手抜きをしまくる.
おかげでdocker-compose
コマンドとmake
コマンドしか不要になった.最高.
$ docker-compose run --rm builder bash # cd bench/ # make # ソースコードをビルドする # ^D $ make write # avrdudeを使ってAVRに書き込む
つらかったところ
電子工作は辛いことばかりだよね.
書き込み器の仕様を忘れた
AVRISPmkIIは書き込みはできるけど,書き込み対象のボードに電源供給はしてくれない.おそらくこれは,AVRは様々な電圧帯(モデルによるが1.8V-5Vなど)で動作するので,勝手に5Vかけて破壊するようなことがないようにこうしているのだろう.このため書き込みする前に電源供給箇所も作っておく必要がある.
リレーが動かない
開発中は電源をPCのUSB端子から取って動かしてたけど,リレーを駆動するだけの電力を供給できなかったのか,リレーが動いてくれなかった.もしくはリレーの駆動で大電流が流れたことで電圧降下が発生し,AVRがブラウンリセット(電圧が低下するとAVRは強制的にリセットする仕様がある)したかもしれない.もしかするとバイパスコンデンサを仕込むことで耐えられるようになるかもしれない.
単純に大変だった
パーツの加工や終わりの見えないはんだ付けがけっこう大変だった.