2018年2月4日日曜日

簡単なマイクアンプの製作




バンド活動において、ボーカルやコーラスを練習するため、自身用のマイクを購入しようとしましたが、楽器店で売られているマイクは高価で、とても手が出ません・・・。
そこで、自宅に持っていた、PC用の安価なマイクを、音楽活動に転用することを目的に、簡単なマイクアンプを製作してみました。

概 要

手持ちのPC用マイク(ECM-PCV40)を、音楽活動に活用できるようにする。
安価に、手早く製作するため、出来合いのキットを活用することを考慮する。

回 路

秋月電子通商のマイクアンプキットをそのまま使った、何の変哲も無い回路となりました。


当該キットは、20mm×12mmサイズの基板中に、アンプ及びマイクへの電源供給の機能を有しており、今回の目的に完全に合致します。

付属のユニットは当然使用せず、外部ジャックからの接続となります。
使用するマイク(ECM-PCV40)は、ステレオミニジャック仕様だったので、出力を観察したところ、LR端子とも同一接続と思われました。

よって、入力ジャック(J1)は、L端子のみを使用して、キット基板から電源供給・音声入力することにします。

キット基板の出力はDC分を含んでいますので、C1でDC分をカットすると同時に、容量を0.47uFと低く選び、ボーカル使用時の歪みを少しでも低減させる処置を行います。
※ C1とVR1で、カットオフ周波数は約33Hzとなります。

LED(D1)は、Vfが電池交換電圧にほぼ等しい、青色LEDを使用しました。なおR1は、当該LEDが超高輝度品だったので、高めの4.7kΩで充分でした。

電池(V1)は、キットの定格から、単4×3本の約4.5Vとしました。

出力ジャック(J2)は、ステレオジャックを使用して、R端子で電源スイッチを兼用させるようにします。

組み立て

ケースは、電池基板が入る範囲で小さいサイズを考慮すると、常連の タカチ SW-85 一択となりました。

電池基板用(後述)・ジャック・ボリューム等の穴を開けます。プラケースなので、作業は容易です。


電池の交換が行い易く、また、交換時に回路にストレスを与えないように、電池用の基板(Cタイプ 72×47)を、別途に用意します。前もって、電池ホルダー用の穴と、ジャックの逃げを開けておきます。


キット基板・ボリューム・ジャック等を取り付け配線します。キット基板は超小型で、機械的ストレスも掛からないので、他部品と空中配線で済ませました。


最後に、電池基板を取り付けます。


完 成
以下のように、マイクスタンド(銀色の足)下に置いて、マイクケーブルを垂らして接続し、運用しています。


PC用の安価なマイクを、音楽用に充分活用できることができました。

ただ、ECM-PCV40 は、卓上使用を想定しているためか感度が高く、特に、マイクスタンドを使って至近で使用する場合、音声が歪んでしまうことがありました。
対策として、上記の通り、低域を減衰する処置を行いましたが、それだけでは不十分でした。

よって、増幅してから音量調節する今回の回路は、やはり安易であり、ゲインそのものを調節する回路に改める必要があります。
ただし、この方法は、マイクアンプキット内部を改造する必要があり、これは宿題としたいと思います。








2017年5月25日木曜日

アート作品にイルミネーションを追加



以前製作した 「クリスマスリース」 を、あるアートサークル会員の方に観て頂く機会がありました。
このほど、その方から図面を貰い、「この作品にイルミネーションを組み込むことは出来ませんか?」という依頼を受けました。

作品の展示は、もっと先かなと思っていたら、5月に個展を開く(!)との旨を聞いて、急きょ製作に取りかかることになりました。

以下は、コントローラ部の完成写真です。


LED点灯操作という面では、特別な要素は何もありませんが、アート作品への組み込み・「EAGLE」を使った短納期設計などのノウハウを、得ることができました。

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


1、概 要

今回のアート作品は、80cm四方のキャンバスを12×12に区切った碁番目、都合144セグメントのうち、ちょうど半分72セグメントに、指定色のLEDを埋め込む旨依頼されたものです。

依頼図面の一部は、以下のような構成です。

※依頼図面の一部を抜粋 (C)Toshiaki Nagai


碁番目であることから、マトリクスLEDの要領で配線することはすぐに思いつき、操作は、恒例によりAVRマイコンを使用することにします。

問題は製作期間で、個展に間に合わせるために、短期間(約一ヶ月)で完成させなければなりません。最もクリチカルな基板製作について、何らかの解決策を検討します。


2、回 路

コントローラ側は、以下の回路です。
基板作成に、後述の通り「EAGLE」を使用しましたので、 回路図も、同ソフトウエアで作画しています。



ごく一般的なマトリクスLED駆動回路で、特に変わった点はありません。

例によって、AVRマイコン(ATmega168)を使い、リセット以外の22本を全てLED駆動用に回しました。うち10本(PNPトランジスタ接続)がアノード群用、12本(NPNトランジスタ接続)がカソード群用です。

「抵抗内蔵トランジスタ」を使うと簡略になりますが、最近入手が難しくなっており、また、LEDをダイナミック駆動するには定格の余裕がありません。
また、MOSFETを使えば、ベース(ゲート)抵抗が省略できるので採用できそうですが、対ソース間に保護抵抗が必要なので、あまりメリットはありません。
結局、一般のトランジスタで、定格に余裕のある品 (Ic = 1A) を使うことにします※。

※ 回路図上では、A1015/C1815 になっていますが、上記事由で、B562/D468 を使用しました(秋月電子で、一個\10)。

各トランジスタのベース・エミッタ間にも抵抗を配置するのが本来ですが、これ以上部品点数を増やすことは避けたいのと、LED駆動程度の速度・電流では問題は顕在化しませんので、今回は省略しました。

CN1・CN2は、AVRマイコンへのプログラム書き込み (ISP) 用端子で、CN3は、外部電源供給用です。
CN4がLEDのアノード側、CN5がカソード側です。

作品側(LEDマトリクス)は、以下の回路です。


前述の通り、Y方向(アノード側)を10本に制限したために、一部LEDは、隣りのアノード線から貰っています。

LEDは、作品が大きいので、迷わず超高輝度 5Φ品を使いました。
丸囲みで示したLEDは、作品のセグメントに合わせて、もっと大型の品を使う予定でしたが、他と同じ品種です。
また、作者が、横方向への光漏れを心配されたので、狭指向性のものを全色購入し、作者に見て頂き、配置場所を指定して頂きました。


3、基 板

出力22系統をユニバーサル基板に手組みする時間的余裕(気力?)はとても無く、さらに今回はオンリーワンの製作であるため、今までと同じように予算を組んで基板を発注することはできません。

そこで今回は、送料込み2,469円(!)で発注できる 「スイッチサイエンスPCB」 を利用することにしました。
同サービスは格安(寸法・枚数にもよる)ですが、使用するソフトウエアが事実上「EAGLE」指定であり、当ソフトウエアの使用方法を会得しなければなりません。

幸い、「EAGLE」に関するノウハウを提供している 「趣味の電子工作にようこそ」さまのサイト をが非常に参考になり、短期間で効率的に基板を設計することができました。

ライブラリは、全て、予め用意されているものを、以下の通り使いました(今回は、こだわらない)。

部品名ライブラリ備考
AVRマイコンatmelMEGA8-P


トランジスタ

transistor-small-signal
BC639
「品」型ランド
BC640
抵抗rclR-US_R_US_0207/10

コンデンサ

rcl
C-EUC-EU050-024X044
CPOL-EUCPOL-EUE2.5-6

コネクタ

con-lstb
MA03-1

MA05-2

MA06-2

VCCsupply1+5V

GNDsupply2GND

holesMOUNT-HOLE3.2


上記ライブラリを使って回路図(前項参照)を作成すると、基板パターンを自動生成 してくれます(「EAGLE」の目玉機能の一つ)

※ 部品配置は、手動で行なわねばなりません。
※ 生成結果に対して、若干のパターン修正(引き回し・電源パターンを太く、等)を行う必要が、ありました。


出来上がったパターンは、DRC(デザインルールチェック)が必要とされています。これは、スイッチサイエンスのサイトにある同チェック用ファイルを入手して、同サイトに記載の手順通りにチェックを行えばOKです。
以下が、DRCまで通したパターンです。



次に、ガーバーデータ生成(「EAGLE」では、CAMと呼んでいる) ですが、これも、同様にファイルを入手して、サイトに記載の手順通りに実行すればOKです。

基板が届くまでには約3週間かかりましたが、都度スイッチサイエンスから報告があり、不安を感じることは、ありませんでした(この間に、プログラムと作品側製作を済ませる)。


※ 初期設定では、部品名(MEGA8 や 1k 等)は、シルクに反映されませんでした。


4、プログラム

プログラム作成の時間が不足してしまい、今回は単にランダムに点滅させるだけの簡単なものになりました。

※ 今回は、ヒューズビット操作は行わず、デフォルト設定のままとしました(F_CPU = 1MHz)。

4.1 LEDアノードスキャン

今回は、LED点灯以外の機能がありませんので、アノードスキャン用に特にタイマーを割り当てて、割り込み処理の中で実行するようにしました。
Timer0 を約1msec※ のCTCモード(0から設定値までのカウントを繰り返すモード)にして、一周するごとに次のアノード端子をONにします。

このとき、前もって、全アノードを一旦オフにしておきます。1msecなので大丈夫と思っていましたが、やはり、直前の残像が出てしまいました。

※ 1msに設定すると、全アノードをスキャンするのに10msecかかります。これ以上大きくすると、LEDのチラつきが目立ちます。

また、この割り込み内で、次項で用意する各アノード毎の点灯パターンを、カソード端子に反映します。

4.2、点灯パターン生成

各アノードに対応する点灯パターンを用意しておきます。
今回は、ライブラリで標準で用意されている、rand()関数を使い、ランダムパターンを用意します。
ただ、この関数の出力は16ビットなので、今回の点灯パターン(12ビット)化するために、2^12で割った余りを採用します。

この値で実際に点灯させたところ、ランダムに点灯してはいるが、もう少し光っているLEDが少ないほうが自然ではと感じたので、上記12ビット化する際に、点灯数を約半分に減らす処置を追加しました。

4.3、点滅操作

常時点灯していると、作品の品位を損ねると感じたので、約40msecのみ点灯し、その後2秒は消灯する処理を追加しました。
LEDアノードスキャンの処理が約1msec毎に行われていますので、この回数をカウントし、指定回数に達する毎に、点灯パターンをクリアしています。



今回のソースは、以下の段階で、出品としました。


//////////////////////////////////////////////////////////////////////////////
//
// Project : LED Matrix
//
// Programmed by Ken_Craft(c)
//
// MPU =  ATmega168P
// F_CPU = 1MHz(default, decrared Configuration Options)
// Lfuse = 0x62(default)
// Hfuse = 0xDF(default)
// Efuse = 0xD9(default)
//
//////////////////////////////////////////////////////////////////////////////

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h> // for rand()

#define _SBI(p, q) ((p) |= _BV(q))
#define _CBI(p, q) ((p) &= ~_BV(q))

#define LED_OFF 0
#define LED_ON 1

//////////////////////////////////////////////////////////////////////////////
// グローバル変数及び各定義
//////////////////////////////////////////////////////////////////////////////

volatile uint8_t uLEDINDEX;
volatile uint16_t uTIMER;

volatile uint8_t uBLINK;
volatile uint16_t uMASK;

volatile uint16_t uLEDPATTERN[] = {

    0b0000111111111111,   // dummy
    0b0000000000000000,
    0b0000111111111111,   // dummy
    0b0000000000000000,
    0b0000111111111111,   // dummy
    0b0000000000000000,
    0b0000111111111111,   // dummy
    0b0000000000000000,
    0b0000111111111111,   // dummy
    0b0000000000000000

};


//////////////////////////////////////////////////////////////////////////////
// 割り込み及び各関数
//////////////////////////////////////////////////////////////////////////////
// ---------------------------------------------------------------------------
// タイマー0 比較一致割り込み
// ---------------------------------------------------------------------------
ISR(TIMER0_COMPA_vect)
{
    uTIMER++;

    /******** cathode (pattern) off ********/

    PORTB = 0;
    PORTC &= 0b00000011;

    /******** anode scan ********/

    uint16_t uLedScan = _BV(uLEDINDEX);

    uint8_t uLedScanL = ~(uLedScan) & 0b0000000011111111;
    uint8_t uLedScanH = ~(uLedScan >> 8) & 0b0000000000000011;

    PORTD = uLedScanL;
    PORTC = (PORTC & 0b11111100) | uLedScanH;

    /******** set (cathode) pattern ********/

    uint16_t uLedPattern = (uBLINK == LED_ON) ? uLEDPATTERN[uLEDINDEX] : 0;

    uint8_t uLedPatternL = uLedPattern & 0b000011111111;
    uint8_t uLedPatternH = (uLedPattern >> 8) & 0b000000001111;

    PORTB = uLedPatternL;
    PORTC = (PORTC & 0b00000011) | (uLedPatternH << 2);

    uLEDINDEX = (uLEDINDEX >= 9) ? 0 : uLEDINDEX + 1;

}

//////////////////////////////////////////////////////////////////////////////
// メインループ
//////////////////////////////////////////////////////////////////////////////
int main(void)
{
    uLEDINDEX = 0x00;
    uTIMER = 0x0000;
    uBLINK = LED_ON;
    uMASK = 0b0000010101010101;

    /******** I/O Setting ********/

    _SBI(DDRD, DDD0);   // PD0-7 Output
    _SBI(DDRD, DDD1);   // ↑
    _SBI(DDRD, DDD2);   // ↑
    _SBI(DDRD, DDD3);   // ↑
    _SBI(DDRD, DDD4);   // ↑
    _SBI(DDRD, DDD5);   // ↑
    _SBI(DDRD, DDD6);   // ↑
    _SBI(DDRD, DDD7);   // ↑

    _SBI(DDRC, DDC0);   // PC0-1 Output
    _SBI(DDRC, DDC1);   // ↑

    _SBI(DDRB, DDB0);   // PB0-7 Output
    _SBI(DDRB, DDB1);   // ↑
    _SBI(DDRB, DDB2);   // ↑
    _SBI(DDRB, DDB3);   // ↑
    _SBI(DDRB, DDB4);   // ↑
    _SBI(DDRB, DDB5);   // ↑
    _SBI(DDRB, DDB6);   // ↑
    _SBI(DDRB, DDB7);   // ↑

    _SBI(DDRC, DDC2);   // PC2-5 Output
    _SBI(DDRC, DDC3);   // ↑
    _SBI(DDRC, DDC4);   // ↑
    _SBI(DDRC, DDC5);   // ↑

    /******** Timer0 Setting ********/

    _SBI(TCCR0A, WGM01);    // TIMER0 CTCMode
    _SBI(TCCR0B, CS00);     // TIMER0 Prescaler = 1/64
    _SBI(TCCR0B, CS01);     // ↑
    OCR0A = (uint8_t)(F_CPU * 1E-3 / 64);
    _SBI(TIMSK0, OCIE0A);   // TIMER0 CTC Interrut Enable

    /******** Enable all interrupts ********/
    sei();

    while(1){

        if(uBLINK == LED_OFF && uTIMER >= 2000){

            uTIMER = 0;
            uBLINK = LED_ON;

            cli();  // disable interrupt            
                
            for(uint8_t i = 0; i <= 9; i++){

                uint16_t uRand = rand();
                uLEDPATTERN[i] = (uRand & /*0b0000111111111111*/uMASK);

            }

            uMASK = (uMASK == 0b0000010101010101) ? 0b0000101010101010 : 0b0000010101010101;

            sei();  // enable interrupt

        }else if(uBLINK == LED_ON && uTIMER >= 40){

            uTIMER = 0;
            uBLINK = LED_OFF;
        }

    }

}



5、製 作

5.1、作品側LED取り付け

当初、接着が必要?とか、リード二本の穴を開けなければいけないか?と考えていましたが、結局、
単に指定72箇所に、LEDに合わせて3Φの穴を一個だけ開け、作品表側から、以下写真のように各色LEDを差し込んで、リードを外曲げするだけで済みました。



次に、作品を裏返し、縦10本・横12本のポリウレタン線を張り、其々の交点付近に、LEDのリード線を半田付けして行きます。

※ まさに「マトリクスLEDを手作り」している状況です!




箇所を絞って拡大したものが、以下の写真です。


デザイン上、交点から外れたセグメントのLEDは、最寄りの交点に接続しています。


5.2、基板実装

トランジスタの基板パターン(「品」の形)は余り好みではありませんでしたが、コレクタのみフォーミングすれば良く、楽に早く実装することが出来ました。



6、完 成(とお詫び)

作品と基板を、フラットケーブルでドッキングして、作者に光り具合を見て頂き、展示会に搬入となりました。

※ 諸般の事情により、最終作品の画像をご紹介することができません。申訳ありません・・・


「スイッチサイエンスPCB」 の利用がなければ、期間内に完成させることは無理で、そうで無くても、予算オーバーでお断りしているところでした。

基板設計において、「EAGLE」は、業者向けの基板CADソフトウエアであり、自動配線や膨大なライブラリ(あくまでも量産用部品)を活用して、基板を短期間で作成するのに向いていると感じました。

また、アート作品に電子回路を組み込む作業は、方向を誤ると、作品の品位に影響を与えてしまうことを痛感しました(今回は、迷った箇所は、作者の指示を仰いで作業を進めることにより、影響を回避しました)。



最後に、本作品の製作でお世話になりました以下の皆さまに、この場を借りまして御礼申し上げます。

・「EAGLE」提供元 AUTODESK社
・「EAGLE」使い方の解説 趣味の電子工作にようこそ
・アートサークル主催 地域活動支援センターかけはし
・個展開催場所 谷山サザンホール

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(ほっけみりん さま)