Lambdaカクテル

Common Lispを書くMT-03ライダー(初心者)です

Let's get arrested badge

2-in/2-outのオーディオスイッチャー作った

わが家には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で開発環境を構築した

制作風景

部品表

使った道具

  • どこの家にもあるもの
    • はんだごて&はんだ
    • ラジオペンチ
    • ワイヤストリッパ
      • 電線の被覆を剥いてくれるすごいやつだよ,これがないと人生損するレベル
    • マルチメータ
      • これがないと人生損するレベル,4000円くらいのを適当に買おう
  • 特殊なやつ
    • AVRISPmkII
      • AVRに書き込む装置.ディスコンになったのを最近知って悲しい.後継はAtmel ICEっぽい
    • 電動ドリル
      • 手動ドリルで穴なんか開けると日が暮れるので暴力で解決しよう.摩擦熱でビットにプラスチックがベッタリ張り付くので覚悟しよう
    • リーパーリーマー
      • ドリルで開けた穴を広げるやつ.邪悪な見た目をしている
    • グルーガン
    • そのグルガン族の男は静かに語った・・・
    • 溶けた樹脂を塗り付けられる道具.絶縁したいところに塗ったりグラグラする部品を固定するために無理矢理使ったりと,なにかと融通が効く
    • ヤスリ
      • プラケース加工に必要だった,これがないと円以外の穴が開けられなくなる

ハードウェア

回路図・配線図はFritzingを使って設計した.

このデータは後述のGitHubにアップロードしてあるので使っていいよ

f:id:Windymelt:20190414234851p:plain
回路図

↑の回路図は若干おかしな所があって,AVRのピンアサインが実際のピンアサインと違う(本来のatmega168-20PUのものではなく,別?のチップのピンアサインになっている)が,物理的な位置に問題はないのでこのまま配線して良い.例えば図では14番ピン(ピンアサインはD8になっている)にスイッチからの配線が伸びているが,実は14番ピンのアサインはB0だった.したがって後述のソースコードではD8ではなくB0ピンを使うようにしている.

f:id:Windymelt:20190414235200p:plain
配線図

↑の配線図では,後から追加した電源や,パネル取り付けの3.5mmステレオジャックは描かれていないので,別途端子をはんだ付けする必要がある. リレーの端子は,上のリレーが入力の切り替えを,下が出力を担当している.リレーの左側でLの信号を,右側でRの信号を扱う(混同しなければ全部逆でもちゃんと動くが).

ソフトウェア

実際に使ったソースコードは公開しています.

github.com

Makefileの書き方について以下のサイトを参考にしました.

www.clarestudio.org

この手の組込み開発ではとにかくビルド環境を用意するのが面倒な(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は強制的にリセットする仕様がある)したかもしれない.もしかするとバイパスコンデンサを仕込むことで耐えられるようになるかもしれない.

単純に大変だった

パーツの加工や終わりの見えないはんだ付けがけっこう大変だった.