2016年10月11日火曜日

ストロボチューナーの製作



楽器シリーズが続きます。

この度、「ストロボチューナー」を製作しましたので、以下に報告致します。
以下は、完成写真(マイク入力時を写す)です。



本機の原理である「ストロボ効果」は、ある周期で移動する系に対し、全く同じ周期でストローブ( =  ストロボ)すると、系が静止して見える、一種の錯覚現象です。

最も有名な例は、アナログのレコードプレーヤーにおいて、ターンテーブルに打刻された模様が静止するように回転数を調整する機構でしょう。
また、エンジンの点火時期を確認する「タイミングライト」(点火のタイミングでエンジンが止まって見える)も、今や懐かしい応用例です。

さて過日、ベースやギターを正確にチューニングしたい・・・ チューナーがあると良いな・・・ と思っていた矢先に、aitendo のサイトで以下のようなLEDを見つけて、「7SEG部分をスケールに、バー部分をストロボ表示にすれば、ストロボチューナになる?!」と誘惑されて、構想を練り始めたのが、製作の発端となりました。

※ aitendo 通販サイトより転載


以下はその顛末記です・・・

1、概 要

1.1、表示原理

14バーのLEDを、全バーがチューニングスケールの周期で一周するように、以下の通り順次点灯させます。

1234567891011121314
1 から 14 までが、チューニングスケールの周期

上記を目視すると、"1E"スケールでもかなりの高速なので、以下のように全て点灯して見えるでしょう。


この状態で、チューニングスケールと同一周波数の方形波信号を入力し、単に全てのバーをスイッチングします。
ここでは、"H" のときだけ点灯させるものとします。

外部信号
以降、同じ周期で入力されれば
常に、この箇所が点灯する

すると、どのバーかは特定できませんが、毎周期、同じバーだけが点灯するようになります。
このとき、表示は止まって見えます

もし入力信号の周波数が低ければ、次の周期の"H"がやって来るのは、直近より右に移動し(遅れ)ています。その次も、さらに右に移動していきます。
このとき、表示は右に移動して見えます

周波数が高いときは、左右逆(早まる)となり、表示は左に移動して見えます


1.2、基本仕様

冒頭のマトリクスLEDを活用することを前提に、スケール表示を行いながら、ストロボ表示を行えるようにする。

エレキギター及びベース共にチューニングできるように、基準スケール都合10本分(ギター6・ベース4)を用意する。

アコースティックギターもチューニングできるように、マイク(ECMユニット)を内蔵する。

本番でのトラブル対処のため、電池残量をチェックできるようにする。


、回 路

例によって、回路図エディタ「BSch3V」で作成しました。
上がAVRマイコン周辺部、右下がアナログ部、左下が電源部です。



2.1 AVRマイコン周辺部

AVRマイコン(U11 以下AVR)は、恒例の Atmega168P を使用します。また、今回はクロック精度が必要なため、外部にクリスタル発振子X11を設けますが、TO92型の振動子を見つけましたので、当素子を使用してみます。

LED1が、今回の「主役(主犯?)」である 2514BRYG-2 というマトリクスLEDで、7SEG二桁+バー14個が内蔵された品です。
サイト添付の図面は、7SEG部(DIG1・DIG2)がカソードコモンになっていますが、現物は上記回路図の通り、全セグメントがアノードコモンです。

CN11・CN12 は、AVRにプログラムを書き込む(ISP)ための端子です。

2.2 アナログ部

古くから、エフェクター自作誌などで採り上げられている回路(以下オリジナル回路)に、マイク入力を追加したものです。

J31 にプラグを差すと、外部入力が有効になり、差されていないときは、マイクが有効になります。
マイクはU21で、R31を電源供給&負荷抵抗とするECM(=エレクトレットコンデンサマイク)です。今回のユニットの負荷抵抗は、標準では1kΩですが、VCC=5Vでは、もっと高い値にして感度を稼げるので、6.8kΩに選びました。

U32a は、単なる非反転アンプで、U23b が、信号を方形波にクリップするコンパレーターです。
コンパレーターにおいて、R38 < R39 とすることによって、無入力・マイク背景音のみの時に、出力がバタつかないようになっています(以上オリジナル回路の通り)。
今回は、U32 にCMOSオペアンプを用いて、電源電圧をAVRと共通にすることで、同入力ポートに直結することにしました。

C31とC32は、オペアンプ(U21)側から見れば不要ですが、C31は、入力元の楽器にDC分が印加されないように、R32は、入力端子からマイクへの、静電気などの衝撃を和らげるために追加しています。

2.3 電源部

ダイナミック表示(3.2.2 セグメントスキャンを参照)とは言え、多数のLEDを点灯させるので、効率( = 電池寿命)を考えて、今回はDC-DCコンバータモジュールを使用してみました。

U21が、M78AR05-0.5 という同モジュールで、安価ではありませんが、3端子レギュレータ感覚で使用することができる、便利な品です。
同マニュアルによると、入力端子側にC及びLのノイズ対策が推奨されていましたが、C21(4.7uFの積層セラミック)のみで充分であったので、これで決定としました。

R21・R22 は、電池残量チェック用の分圧抵抗で、AVRのコンパレータに入力して、残量を監視しています(3.5 電池残量チェック参照)。

D21は、当初設けていませんでしたが、SW21がオンのままで電池交換を行い、誤って+-逆に接触してしまった時の回路保護用として、追加しました。

JP21は、AVRにプログラムを書き込む時・デバッグを行う時に、一時的にDC-DCコンバータを切り離すための端子です。


3、プログラム

プログラムの概略仕様を、以下より説明します。
プログラム本体は、さほど大きくはなりませんでしたが、後述の通り、構造体を多用したので冗長・見難くなってしまいました。
よって別ページに掲載しました。

プログラムのソースコードをご参照ください)。

3.1 ストロボサイクル生成

ギター及びベースで使用するスケールを、以下の通り定義します。

スケール周波数(Hz)用途
1E41.203ベース
1A55.000ベース
2D73.416ベース
2E82.407ギター
2G97.999ベース
2A110.000ギター
3D146.832ギター
3G195.998ギター
3B246.942ギター
4E329.628ギター

上記スケールの(1/各周波数)÷(LEDのアレイ数 今回は14個)の周期でストロボサイクル(タイミング)を生成します。

今回は、Timer1 を使い生成し、割り込みでタイミング発生します。
この割り込みは、Timer1 の設定周期で正確に実行されなければならないので、多重割り込みを禁止する設定にします。

周期データは、プログラムメモリ上※に構造体(SCALETABLE と定義)を用意しておき、スイッチ押下時に、Timer1 の値を再設定します。

※ メインメモリの余裕が無くなりそうになったのと、スケール切り替え時は、オーバーヘッドが発生しても構わないので、プログラムメモリ上に展開しました。

3.2 LED表示操作

3.2.1 各セグメント表示

2514BRYG-2のセグメント(M1~M7)、(DIG1)、(DIG2)、(L7~L1)の点灯操作を行います。

まず、点灯用のバッファとして、構造体(LEDDRVDATA と定義)を用意し、常に、同バッファに存在するデータを表示(ポート出力)できるようにしておきます。

セグメントM1~M7、同L7~L1 は、前項で生成したストロボサイクルに従って、都合14個を順次点灯し、L1まで点灯したら、またM1に戻ります(1.1、表示原理を参照)。

この点灯パターン全てを、前もって構造体(M17L17PATTERN と定義)に用意しておいて、前項割り込み処理内で一括してバッファにコピーします。これにより、ストロボサイクルの精度を落とさずに処理することができます※。

※例えば条件分岐で表示パターンを操作すると、パターンによって実行時間が変化し、精度が低下する恐れがあります。

セグメントDIG1、同DIG2 は、現在選択されているスケールを常時表示します。同表示データは、周期データと合わせて、SCALETABLE構造体に格納しています(3.1 ストロボサイクル生成を参照)。

3.2.2 セグメントスキャン

2514BRYG-2は、前述4セグメントがマトリクス構造になっているので、ダイナミック点灯させるために、(M1~M7)→(DIG1)→(DIG2)→(L7~L1) を順次切り替えて表示します。

この切り替えパターンも、点灯用バッファ(LEDDRVDATA構造体)に合わせて格納しておき、切り替えパターンと表示パターンを対応付けしておきます※。

※ 例えば、切り替えパターンが(DIG2)相当のとき、表示パターンも(DIG2)相当

この切り替えタイミングは精密である必要はありませんが、ストロボサイクルより充分高速に切り替えないと、スキャンタイミングで静止して表示される場合が発生してしまいます。
今回は、単にメインループ内で処理してすぐ抜けることで、対処しました。

3.2.3 輝度調整(ディマー)

2514BRYG-2を実際点灯させてみたところ、色による明るさのバラツキが大きく、表示品質が良くないと感じたので、各LED毎に輝度調整※を行います。

※ 輝度調整は、回路の外付け抵抗(R11 ~ R17)で行えそうですが、マトリクス構造で色の異なるLEDを共用していますので、行うことは出来ません。

止むを得ず、前項で、メインループ1回でスキャン切り替えを行う箇所を、同16回※で切り替えるように変更し、16回のうち、前半n回だけLEDを点灯する、簡易なディマー制御とすることで対処しました。

※ 2^3 = 8回では、バラツキが残ると感じ、2^4 = 16回に落ち着きました。2のべき乗にこだわらなければ、例えば12回という考え方も、あるかも知れません。

"n/16"(= ディマー係数)は、各色毎に、M17L17PATTERN構造体に同梱※することにして、セグメント表示時に、表示パターンと同時に反映します。

※ セグメントDIG1・DIG2は、全て同色なので固定で持っておいて、反映は上記同様とします。

これにより、スキャン切り替え時間が一気に1/16に低下してしまったので、クロックを、許容最高速の20MHzに変更しました。

3.3 入力信号取り込み

先述(1.1、表示原理を参照)の通り、単にスイッチングするだけなので、メインループ内で、入力ピンが"H"のときだけ、セグメントM1~M7、同L7~L1表示を有効にします。

また、上記操作に合わせて、入力ピンが"H"のとき、入力インジケータを点灯します※。これにより、入力ジャックまたはマイクより、適正なレベルの信号が入力されていることが一目で判ります。

※ 電池残量が有り、と判定された場合のみ(3.5 電池残量チェックを参照)。

3.4 スイッチ取り込み

チャタリング対策のためのサンプリング・連続押下検出のために、監視用タイマーを用意します。
今回は、Timer0 を使い、25msec毎に割り込みで、スイッチ入力をサンプリングします。
この割り込みの精度はそれほど必要無く、また、ストロボサイクル生成(3.1 ストロボサイクル生成を参照)の割り込みに影響してはならないので、この割り込みは、多重割り込みを許可する設定にします。

3.5 電池残量チェック

現場、特にライブ本番で、電池が空になって使えなくなる事態は、避けなければなりません。
ちょうど、AVR内蔵コンパレータの反転入力が開いていたので、電池電圧を抵抗で分圧して入力し、監視することにします。
基準電圧はAVR内部のリファレンス(2.1V)を用いて、電池電圧が設定値※を下回ったとき、今回は、入力インジケータ(3.3 入力信号取り込みを参照)を強制消灯するようにしました。

※ 設定値 = 2.1V × (1 + R21 / R22) + D21のドロップ分 = 約7.5V

3.6 ヒューズビット設定

AVRの基礎的挙動を決める設定要素が、「ヒューズビット」です。
今回は、クロックを外部から供給し、最高速で用いることから、下位バイトを、以下のように変更して設定します。

名称ビット既定値設定値
CKDIV870(有効)1(無効)
CKOUT61(無効)1(無効)
SUT151(無効)1(無効)
SUT040(有効)1(無効)
CKSEL330(有効)0(有効)
CKSEL220(有効)0(有効)
CKSEL111(無効)0(有効)
CKSEL000(有効)0(有効)
16進の値62hF0h


4、基 板

今回も、基板設計ソフト「PCBE」でパターン設計を行いました。
基板寸法は、決めていたケース(5.2 ケース加工と組み立てを参照)に合わせる範囲で、あまり無理をしない寸法(78mm×70mm)となりました。

2514BRYG-2 の足の縦方向の間隔がインチピッチで無く、止むを得ず、ホールをランド中央からずらしました(下記画像の上中央)。
また、アナログ回路はグランドを分離し(下記画像の下右寄り)、DC-DCコンバータ近辺で一点アースとしました(下記画像の左下)。



基板作成は、今回も、 (株)ユニクラフトに依頼しました。
基板完成品は、以下の通りです

左が部品面、右が半田面

5、製 作

5.1 基板実装

専用基板を作成すると、部品実装も容易です。
定石に従って、背の低い部品からマウントします。

未マウントの抵抗は、外部プルアップを想定してのものでしたが、AVR の内部プルアップ抵抗を有効設定にしたので、結局使用しませんでした。

未実装の抵抗は外部プルアップを考慮

さて今回は、時流に従って、「鉛フリーハンダ」を使用して実装してみました。
結果は、思いの外良好でした(このページを参照)。

部品を実装した時点で、通電確認を済ませておきます。



5.2 ケース加工と組み立て

表示穴を開ける必要がない、透明ABSケースを用意して加工しました
ジャックは、楽器のケーブル引き回しを考えて右下に、基板は、電池を挟み込める位置に配置しました(冒頭写真を参照)。

ABS樹脂は、バリが殆ど出ず、美しく仕上げることができました。

実装チェック(上記写真)の状態で、ケースに取り付けます。取り付けてからのハンダ付けは取り回しも難しく、誤ってケースをハンダコテで溶かしてしまう恐れがある由です。

このとき、DC-DC コンバータの高さが10.2mmあるので、10mmのスペーサーに、ワッシャーを一枚重ねることで対処しました。


6、完 成

癖のあるLEDには泣かされましたが、この存在感は強烈で、かつ、この表示によるチューニングも極めて直感的で、かなり正確にチューニングすることができました。

またストロボチューナーの他の特徴として、1オクターブ上の音であっても、表示が複数現れるだけで、静止すればチューニングできるのも、副次的な利点では?と感じました。

スケール名が直感的でないため、暫定で一覧表を貼付

一方、反省点としては、やはり冷静に他のマトリクスLEDを使えば、もっと簡単に出来ていたかも知れません。

次に寸法ですが、今回、余裕を見過ぎていたところがあり、出来上がってみると、チューナーとしてはかなり大柄になってしまいました。

また、スケール表示は、どのスケールがベースで、どのスケールがギターかを憶えないと使い辛く、現状では一覧表を張り付けて対処しています。
これは、スケール名ではなく、弦番号(例えば、ベースの1弦 → "b1" など)を表示した方が、良いかも知れません。

更に、ジャックの挿抜が非常に固く、少し端子を曲げ起こして対処しようとしたのですが、これが失敗で、逆に接触不良を誘発して、マイクに切り替わらなくなる事態が発生しました
この種のアナログ部品は、本機のように、音を出さなくとも、実績・定評ある品を使用すべきであると痛感しました。

最後に、今回の製作において、以下の書籍・サイトの情報を参考とさせて頂きましたことを報告・御礼申し上げます。

・だれにもわかる エフェクター自作 & 操作術 '81(立東社 1981年発行)

・最新エフェクター入門 組み立てて音楽する本(誠文堂新光社 1982年発行)

PICを使ったギターチューナー(椋鳥の喧騒 さま)

ストロボチューナーの製作/Ver.1(ほっけみりん さま)