オーディオ/ミニアンプ0.2/設計

 実在の部品を使って、要求仕様を実体化する手段を考えてます。まず、基本的な構成を決定し、回路や部品の選定、実際製作できるまで調査/検討/開発/検証していきます。成果物は「設計書」です。

<技術的なポイントの要約>
■ハードウエア
・ST Microelectronics社(以後STMと表記)のSTM32F4マイクロコントローラ(Nucleoボード利用)
・PWMスピーカ駆動は、モーター用フルブリッジコントローラBD6211を使用
・アナログ入力にオペアンプの反転増幅回路を利用
 「仮想グラウンドのオフセット+ハイパスフィルタ+ローパスフィルタ」
・Bluetooth-USBドングルを利用
■ソフトウエア
・プログラミング言語は「C」
・STM提供のソースコードジェネレータSTM32CubeMXを利用、基本ロジックを自動生成
・STM32F4のペリフェラルの組合せで、アナログ音声信号をデジタル化(タイマ割込+ADC+DMA)
・STM32F4のペリフェラルの組合せで、PCM音声データをスピーカ出力(タイマ割込+PWM+DMA)
・自家製Bluetoothソフトウエアスタックで、A2DPオーディオ受信
・自家製GUIライブラリで、Z180SN009LCDモジュールをサポート
■開発法
・回路検証には、無料で利用出来る回路シミュレータのLTspiceを利用
・回路製図は、無料で利用出来るCadSoft Computer社(AUTODESK社)のEAGLEを使用
・ソフトウエア開発は、AC6 tools社が無料提供している「System Workbench for STM32」を利用
   各スポンサー様、無料使用できる事に感謝します

全体構成

機能分割

ミキシングアンプは、おおむね以下の機能に分割できます。

  • 音声信号入力部
  • ミキシング部
  • パワーアンプ部

 音声信号入力部は、さまざまな音源機器の出力条件を、統一した音声信号レベルに合わせる機能です。レベル値は回路内部の話なので、自由に設定しますが一般的にはラインレベル位 (*1) で設計されているものと思われます。ヘッドフォン出力は、音源側のボリュームでレベルを調整できますが、それでもおおむね1/10程度ですのでプリアンプ 機能が必要となります。マイクの場合は、もっと小さい信号となりますので、高ゲインのアンプを用意しなければなりません。レコードプレーヤーはもっと面倒で、周波数特性のRIAA補正を行わなければなりません。また、全般的に、直流成分を抜いたり、過電圧に対する保護や、音声帯域以外の信号をカットする機能も必要となります。

 ミキシング部は、複数の音声信号を混合して1つにまとめる部分です。オペアンプの加算回路を使う例が多いようです。ここで、レベル調整やバランス調整も行います。調整するには、何らかの情報源を要しますので、レベルメータの機能もあった方が良いで す。メインボリュームをここに入れますが、パワーアンプ部に入れても良いです。

 パワー・アンプ部は、信号をスピーカを駆動できるまでに増幅する部分です。接続されるスピーカは色々なものがありますので、問題なく音が出るようにしなければなりませ ん。また、大出力の場合、危なくないよう過電流や過熱保護も考慮する必要がありま す。

1) ラインレベル=-10dBV=1Vrms/3.162=0.32Vrms、正弦波の場合のピーク~ピ ーク値は(√2)0.32*2=1Vpp

基本構成案

アナログ回路ベース

 まずは、オーソドックスなアナログベースの回路から考えます。普通のミキシングアンプ回路に、Bluetooth入力を加えただけの構成です。デジタル部分はBluetooth部だけで、他の機能は全てをアナログ回路です。Bluetoothからのアナログ音声信号出力で すが、便利なことにアナログ出力するモジュールがあり、比較的に入手容易で安い値段 で手に入ります。

•Microchip RN52 ¥2083/DigiKey
•Microchip BM20 ¥932/DigiKey
•Microchip BM62 ¥1260/DigiKey [BLE対応]
•Microchip BM64 ¥1326/DigiKey [マルチスピーカ対応]
•Silicon Labs WT32 ¥2542/DigiKey
•Sierra Wireless BC127 ¥2315/DigiKey [BLE対応]

 大抵は、ライン入力やマイク入力と小出力用スピーカアンプが付いており、それだけでBluetoothスピーカやBluetoothヘッドフォンを実現できる機能を持ちます。つまり、これだけで要件を満足しそうではありますが、ミキシング機能がなく、そう都合よくはいきませんでした。話がそれてしいましたが、以下に利点/欠点をまとめます。

•回路が簡単、低コストで実現可能
•ボリューム/スイッチ等の機構部品が各系統×左右チャネル毎に必要、高コスト
•レベルメータも同数必要、高コスト
•筐体が大きくなる
•省電力化、スタンバイ機能が必要
•きめ細かい制御をしようとすると、マイクロコントローラが必要

 アナログベースとなると、どうしてもUI(ユーザインタフェース)が弱いというか、 ここにコストがかかってしまう感じです。

デジタル回路ベース

 次に考えたのが、デジタル化率を最大限にしたもの。アナログ音声入力はADCで即デジタル化します。Bluetooth受信はPCMデータが直接出力される。ミキシングやレベル調整は数値演算で行います。スピーカ出力は、PWM信号を直接スイッチ素子で電力駆動してアナログアンプを不要とします。昨今の高機能なマイクロコントローラを利用すれば、かなりの部品を削減できる可能性があります。

•リアルタイムで音声データを処理可能な、高性能なマイクロコントローラが必要
•アナログ回路がほとんどない
•外来ノイズの影響を受けにくい(ラジオ放送が混入してくるような事がない)
•スピーカケーブルからのノイズ放射が多い
•柔軟な操作/表示を可能とし、機構部品を減らせコストカットできる
•ADCやPWM、Bluetoothを内蔵したマイクロコントローラであれば、かなりコストカットできる

 市販製品で「フルデジタルアンプ」と呼ばれるものも、ここまでデジタル化したものを見かけた事はありませんが、構成としてはあり得ます。

アナログパワーアンプ

 DACでアナログ信号を生成し、アナログパワーアンプを使用する構成です。市販のデジタルオーディオ機器やオーディオ用のチップは、このような構成になっている事が多いようです。D級アンプを使えば、電力効率を良く出来ます。
 要求仕様で電力効率を気にしていますので、やはりD級アンプの選択となります。安くて入手性も良いチップもあるようなので、とても魅力的な構成になります。ただ気になるのは、D級アンプというのは、内部でデジタル化するものなので、デジタルーアナログ変換を2回やっている事になります。

選定する構成

 今回の選択と考えるのは、(2)デジタル回路ベース 案です。
 もし、レベルメータが必須ではなかったら、低コストで作りやすい(1)アナログ回路ベース案となると思われますが、小型の筐体にアナログメータとか、4×2連のレベルメータ群とか考えたら、小さくなるはずがありません。また、スキル的な問題もあります。アナログ回路は、LTspiceでかなり敷居が下がりましたが、電気の性質を十分理解しているとは言えないと自己評価していますので、アナログまみれの回路に手を出すのは早計だと考えました。
 (3)アナログパワーアンプ案にしなかった理由は、技術的な興味がわかないと思ったからです。オーディオ専用のICを使う事で、ブラックボックス的に機能実現してしまうのは、つまらないです。(2)案では、ほぼマイクロコントローラだけでデジタルアンプを実現できると考えたら、わくわくします。

入力部

Bluetooth入力

BluetoothモジュールもしくはUSBドングルを利用するしかありません。 入手可能な部品を洗ってみます。

 調査時点で入手可能なモジュールは、大きく2つのタイプに分かれます。BluetoothではHCIを使うのが基本ですが、かなり複雑なインタフェースですし、上位層のサービス機能も実現しなければならない事を考えると、どこかからソフトウエアライブラリ(プロトコルスタック)を持ってくる必要があります。通常はチップベンダから提供されています。HCIは共通なので、おおむね動くとは思いますが、自分でソースコードを改造する必要があるかもしれません。

 コマンドタイプは超簡単です。汎用性はありませんが、欲しいサービス機能のプロトコルスタックがモジュール内に既に実装されており、コマンド1発で簡単に利用できるようになったものです。今回の様にA2DPをサポートするだけなら、1回コマンド設定しておくだけでI2SやSPDIFから音声データが流れ出してくるようになります。ソフトウェアの負荷が極めて軽いので、安いマイクロコントローラでも制御できます。

 今回の選択としては、USBドングルを使うこととします。USBホストインタフェースを用意しなければなりませんが、PC用に量販されているので入手性/価格の良さが一番の理由です。現時点でBluetoothモジュールは、秋月電子やDigi-Keyといった限られた店から通信販売でしか買えませんが、Bluetoothドングルは近所の家電量販店やパソコンショップで入手でき十分安いのです。これを利用しない手はありません。安くて入手性の良い定番的なモジュールが出てこない限りは、この選択は変わらないでしょう。
 ソフトウェアライブラリ(プロトコルスタック)については、自主開発したものを利用します。中身を熟知しているのが理由です。以下に、ソフトウェアインタフェース条件を示します。

•使用するBT-USBドングルの品種は不問
•シンク機能(受信/吸い込み)のみ
•音声データ形式はPCM符号付き16ビット×2(ステレオ)=1サンプル
•多面メモリバッファ渡し、1024サンプル×4面、ラップアラウンド式
•サンプリング周波数44.1kHz固定(23.22ms毎に1面更新)
•制御テーブルにステータス(有効/無効/再生中/停止中)を保持

ADC(アナログデジタル変換)

 ラインレベルもしくはヘッドフォン出力等のアナログ音声信号を、デジタル化する機能の実際を考えます。まずは、アナログからデジタルへの変換の要である、ADCについて入力仕様を中心に調査して、具体的な部品まで決定します。

 この仕様では、サンプリング速度以外は、ほとんどのマイクロコントローラ内蔵のADCで対応可能だと思います。外部に、ADCを別途設けるほどでもありません。

ライン/ヘッドフォン入力

 当初、ライン入力とヘッドフォン入力部の設計を別々に行いましたが、1つの回路を単純に2セットにした方が融通が効きますし、製作しやすく、何かと都合が良いので両対応の設計としました。
ライン端子/ヘッドフォン出力からADCへつなげる部分となります。求められる機能は以下の通りです。

  • レベル変換(ライン⇨ADC) 
  • 音声帯域バンドパスフィルタ
  • 入力保護回路

レベル変換

 レベル変換には2つの意味が含まれています。1つは交流から直流信号への変換と、もう一つが振幅をちょうど良い幅に調整する事です。

 1つ目ですが、正負電圧で表現される交流から、正電圧のみの直流信号への変換は、比較的簡単に実現できます。①コンデンサで直流成分をカットしたのち基準電圧でオフセットするか、②交流グラウンドを基準電圧にしてしまう手法です。部品としてはコンデンサ1本+抵抗2本といった感じ。基準電圧は、電源電圧の中間に設定するのが普通で、分圧抵抗で簡単に得られます。これを、ADCで取り込んで基準電圧分を減算すれば、元の正負の交流データに復元できる仕組みです。

 もう一つの、振幅調整ですが、必要な調整量を確認してみます。ラインレベルは”-10dBV”と言われますが、正式な規格ではなく市販品ではその仕様に準ずるものが多いというもののようですので、変動を考慮する必要があります。レベル値を解りやすいように変換すると、1Vrms/3.162=0.32Vrms、正弦波の場合のピーク~ピーク値は(√2)0.322=0.91Vppとなります。これならば、ADCの入力電圧3.3Vで直接取り込めそうです。ただし、入力可能範囲の3割ほどしか使わないことになりますので、少々もったいないです。理想的には7、8割位にしたいところなので、2倍ゲインのアンプを使いたい所です。

 ヘッドフォン入力の場合、どうしてもアンプ機能が必要となります。扱う信号レベルが、おおむね0.3Vppと言われていますので、これを3.3Vppまで引き上げるには、10倍ゲインを要します。また、音源機器によって振幅が違いますので、ボリュームでゲインを変更できる必要があります。

•帯域 20~20kHz
•最大10倍ゲイン(半固定式)
•出力は0~Vddの単一電源でのスイング

出来るだけ低コストで、高音質にはこだわらない
このような要件を満たす回路/方法を考えます。

•トランジスタ単体回路
•オペアンプ増幅回路
•アンプ基板/モジュール

 トランジスタ回路は、低コスト、入手性良好ですが、未経験なので設計が未知数の部分を考慮する必要があります。新たなスキルを身につけるチャンスです。
 オペアンプは、トランジスタに比べればコスト高ですが、汎用品は同等です。とっつきやすく、設計容易(変更も柔軟)、安定動作、部品数も少ないというメリットもあります。
 オペアンプの反転増幅回路は、レベルシフト機能も持たせられる事が解りました。この小物にかける時間が惜しい所がありましたのでので、今回は、オペアンプを選択します。

バンドパスフィルタ

音声帯域(100~20kHz)だけを通すフィルタが必要です。理由は、下記の通り。
音声帯域下限 = 20Hz以下
 ハムノイズ(AC電源由来のノイズ)が大きく入る音源がある
 電源由来なので50/60Hzを排除すれば解決
 高音質を狙っていないので、単純に100Hz位以下をカットで対応
音声帯域上限 = 20kHz以上
 ホワイトノイズという形で可聴域に出現する
 実際、20kHz以上の信号が出力される音源機器が存在する
 ローパスフィルタを付けると効果絶大

 オペアンプの増幅回路にC(コンデンサ)を追加するだけで、アクティブフィルタとして機能させることが出来ます。もちろん、増幅機能も持ちます。今回は、オペアンプによるアクティブフィルタアンプ回路を使うものとします。

入力保護回路

 主に過電圧保護の事となると思います。そもそも、これが必要かどうかですが、よほどの規格外の音源機器があるとか、落雷の影響によるもの位しか状況を想定できないので、優先度は高くないと考えられます。もし、対応するならば、ちょとした仕様の逸脱程度ならば、クランプダイオードで電源ラインに流し込む作戦で回避可能ですが、それを超える落雷のような場合に対しては専用の保護部品が必要になります。
 今回は、コスト的な理由から、積極的な保護回路は設けないものとします。回路の工夫などで、保護機能を実装できるのであれば、もちろん適用したいと思います。今回は、オペアンプを通しますので、これがある意味保護素子と言えるかもしれません。ICソケットで交換容易にしておきます。

入力回路(まとめ)

 まとめると、ヘッドフォン入力部はレベルシフト、アンプ、バンドパスフィルタを1つのオペアンプだけで実装する方法にします。使用するオペアンプの具体的な品種選定ですが、ステレオ2系統分なので4回路内臓、単電源、DIP品で入手しやすい物を探します。

 電源3.3Vにする場合は、出力フルスイングにしなければなりませんが。そうでなければ、非スイング領域(大抵は約2V)を差し引いて、5V電源を用意する必要があります。選定は、入手性とコストが優良な「LM324N」にしてみます。汎用品なのでオーディオ回路に使えるものか不安ですが、データシート上では大丈夫なはずです。一応回路シミュレータLTspiceで、動作確認しておきます。

 LM358になっていますが、2回路品と4回路品の違いで特性は同一です。R1は入力インピーダンスの決定要素になりますので50kΩ位で考えましたが、10倍ゲインにするにはR2を500kΩと高い抵抗値となり、回路の安定度が心配です。チャレンジしても良いのですが、出来上がってから基板改造するのも面倒なのを考えてしまい、実績のある定数にしてしまいました。LM358はフルスイング品ではないので、5V電源から2V位の所でクランプ(頭打ち)される特性を持つので、最大3V出力となります。ADCは3.3Vで考えていますのでちょうど良い設定です。R3,R4の分圧抵抗はADC参照電圧3.3Vの半分1.65Vになるように設定します。波形を確認してみましょう。

 緑が入力信号で、440Hzの正弦波0.4V振幅の信号を設定しました。青がその時の出力、つまりADCの入力となります。回路では4倍ゲイン、レベルシフト量が5V(1kΩ /(2kΩ+1kΩ))=1.67Vにしていますので、上が0.4V4+1.67=3.27V、下が0.4V*4-1.67=0.07V、まあ大体計算通りになっています。

 周波数特性グラフですが、緑が入力、青が出力、点線が位相差です。フラット部分の差が4dB-(-8dB)=12dB=約4倍で計算通り。100~20kHzでバンドパスされるのも、きれなものです。全く問題ありません。それでも、オーディオ用途ではない汎用品という事で、ちょっと心配なのでICソケットにして差し替えできるようにしておきたいと思います。
 その後のノイズ対策で、3V電源に変更したのでNJU7044Dに変更していますが、基本的には同じはずです。

ミキシング部

 入力は3系統のステレオ、6本のPCMデータストリームで、出力はステレオ(2多重)でPWM信号を出力します。全てマイクロコントローラ上のペリフェラル機能+プログラムで処理します。

•入力PCMデータの受け取り
•データ処理(レベル・バランス調整、ミキシング、出力レベル調整)
•PCMからPWMへのデータ変換・出力
•入力、出力レベルメータのリアルタイム表示
•入力レベル値、バランス値、出力レベル値のハンドリング
•無信号検出、電源オン/オフ、入力系統有効/無効化
•入力レベルの自動調整

使用する、マイクロコントローラはBluetoothスタックソフトウェアの都合で、STM32F4系、それも100MHz以上CPUクロックとなります。製作に利用できるものとしては実質以下の通り。

•STM32F4チップ(表面実装パッケージ)
•STM32F4 Discovery 評価ボード
•STM43F4 NUCLEO 開発/評価ボード

STM32F4の表面実装パッケージを扱うのは、専用基板を起こさないといけないレベルなので、かなりやっかいです。自作で、手っ取り早く小型にできるのはNUCLEOボードです。今回は、これを利用するものとします。F446はF4系では高性能の部類で値段も高いのですが、下位ボードでも200円違い位しか差がないので、余裕を持たせてこれで良いと思います。

パワーアンプ部

 今回は、スイッチ素子をPWMで駆動する事によって、スピーカを鳴らす方式です。デジタル信号をいきなり、スピーカ駆動してまともな音がでるのかと思っていましたが、可聴範囲以上の領域でデジタル信号を投入すれば、可聴域のアナログ波形を再現できるという発想です。実際前作で、この事実を体感できています。とは言え、いくつかの制御方法があり、それぞれ利点欠点があります。

ハーフブリッジ/フルブリッジ/3値制御

 回路構成としては、ハーフブリッジか、フルブリッジ回路かを選択する必要があります。ハーフブリッジは回路の基本なので、特に欠点はないです。フルブリッジは部品数が単純に倍になり回路が複雑になるのが大きな欠点ですが、それでも欲しい利点を持っています。低電圧でも大きな出力を得られますので、電源に制約がある場合有効です。差動駆動になるので、ノイズ発生/影響を少なくする事が期待され、場合によってはローパスフィルター回路を省略できます。フルブリッジ構成で設計する事とします。この判断は、前作での実績と、3値制御の可能性をまだ捨てきれない所があるためです。

スイッチ素子の選定

前作は、MOS-FET単体の素子でブリッジを作り、最終的には満足する音質を得られましたが、若干の不満点が残りました。

•最適な品種を探すのが面倒(定番品にない)
•配線が面倒
•保護機能を実装していない

 最適なMOS-FETを探していると気がつくのですが、マイクロコントローラから直接パワーMOS-FETを駆動できるような品種は存在せず、どうしてもゲート駆動用の回路が必要な事に気付かされます。直接ゲート駆動できるのは、やはりID=1A級が限界のようで、また入手しやすくもありません。それだったら、ゲート駆動回路やブリッジ回路が入ったコントローラを利用するという選択肢が出てきます。安く入手しやすいものがあれば、全てを解決してくれます。そこで、使えそうな物を探してみました。

 もっと、色々あるはずなのですが、これしか見つけられませんでした。NJM2670はDIPなので工作上で好ましいのですが、バイポーラ型なので発熱が好ましくありません。NJW4860は使いやすそうに見えますが、所詮ゲートドライバ、RDが3~4Ωなので1A流れ続けると相当発熱します。一番適当と思われるのがNJW4800ですが、ちょっと高めの値段です。結局「BD6211」を選択しました。前作でまずまずの音質が出た事を確認していますし、入手しやすく安いのが良いですね。3値制御には未対応なのは割り切りですが、将来の改造に対応するために、サブ基板化しておくものとします。

メインボリュームの実装

 PWM駆動でメインボリュームをどこに入れ込むか、いくつかの手段があります。

•PWM信号上でレベル制限する
•スピーカ駆動する電源パワーを制御する

 前者は、パワー・アンプ自体は常にフルパワーで稼働し、入力ゲインを制限する事で出力を制限するものです。アナログ回路では極めて普通に使われる手法です。デジタル系ではゲイン調整は単なる計算処理となりますのでコスト0で済みます。しかし、無音時であってもボリューム位置にかかわらず常時フルスイングしますので、消費電力的には不利な方式です。3値制御が実装できればこの問題は回避できますが、まだ実現できていません。
 後者は、最終段を駆動する電圧を制御し、出力するパワーを制限する方法です。可変DC-DCコンバータ電源と組み合わせればボリュームに応じた消費電力になります。しかし、コスト的には不利ですし、スイッチング信号混入が懸念されます。実際、前作ではノイズの混入を完全に無効化できていません。これを選択する一番の理由は、誤動作時でも必ず消音できるのはかなりの利点だと思います。(ソフト開発者の立場として)
 ボリュームの絶対値性は捨てがたいのですが、DC-DC電源(500円位)を削減できる事を考えたら、悩むところです。今回は、前者のPWM信号でのレベル調整にするするものとしました。理由は、ソフトウェアの信頼性は、それなりに確保出来ていると感じていますし、単純化/コストダウンは大事です。

出力保護

 スピーカケーブルの誤配線や接触で、ショートによる発火が一番可能性の高い事故です。小出力なので、別に保護回路は省略しても良いという判断はアリだとは思われます。今回は、ドライバICの保護機能を利用する事にできましたので、この件はクリアされます。
 ざっと、各場所の電力を確認しておきます。ほとんどは、スピーカ出力に電力が使われるので、この部分のみ考えます。スピーカをFETスイッチでオンオフするので、FETの内部抵抗を直列に入れた単純なモデルを想定します。(本当はもっと複雑でしょうが、ザクッとした計算です)スピーカのインピーダンスを仮に4Ω、FETはBD6211のデータシートから0.5Ω(1A時)なので、回路全体は4.5Ω。電源を5Vとした場合、この回路に流れる電流と電力は
  I=V/R=5V/4.5Ω=1.1A
 スピーカにかかる電力は
  P(spk)=I^2R(spk)=1.1A^24.5Ω=4.8W
 FETにかかる電力は
  P(fet)=I^2R(fet)=1.1A^20.5Ω=0.6W
同様に、 スピーカのインピーダンスが8Ωの場合
 I=V/R=5V/9Ω=0.56A
 P(spk)=I^2R(spk)=0.56A^29Ω=2.8W
 P(fet)=I^2R(fet)=0.56A^21Ω=0.3W
要求仕様ではスピーカ出力は片チャネル1.5Wでしたので、ちょっとオーバスペックになってしまいます。わざわざスペックダウンさせるのは、余分な部品が必要になってきますので、このままでいきます。また、FETで消費される電力は、データシート上は最大0.68Wなので、放熱に気を使う必要があります。

ノイズ放射対策

 スピーカケーブルから出る高周波ノイズの低減対策を行う必要があります。前回、影響度合いを見ましたが、PCよりは酷くなかったので、特に対策なしでも問題ないと考えます。大した出力じゃないので、大丈夫という判断です。

表示・操作系

表示デバイスの選定

•発光もしくは照明付
•反応速度は10Hz程度

 ケースの大きさからから、1.5インチクラスのグラフィックディスプレイ装置が適当かと思います。在庫している部品、もしくは現時点で入手可能な部品で、サイズが35x40mm位の物を探してみました。

 値段的には十分安い物が見付かりましたが、ほとんどは安定的に入手できない出物的なものばかりです。この辺は仕方ないと思われます。とりあえず、手元にあったHT161T01がサイズ的に入りそうですし、SPI接続なので配線数も少なくて済みます。ドライバを作って表示確認まで済みました。

 ところが、ケースの設計で正確なサイズをとっていくと、もう少しサイズの大きいZ180SN009がぴったり入る事がわかりました。新たに、ドライバソフトウェアを開発しなければなりませんが、とにかくこの「小物」用にしつらえたようなディスプレイなので、何とか使いたいと思いました。

操作デバイスの選定

 操作対象の選択に1プッシュボタンが必要ですが、NUCLEOボード上のプッシュボタンを利用できます。隠しボタンですので好都合です。メインボリューム調整を、デジタル計算で行う方針にしていますので、そのレベル量をつまみ操作で指示する方法としては

•可変抵抗器を分圧抵抗とし、それをADCで読み取ってレベル値を得る(絶対値型)
•ロータリーエンコーダで回転パルスを得る(相対値型)

 前者は絶対値、後者は相対値を得られるものです。前者の場合、ADC性能によりますが、少なくとも1回転弱で1000ステップ位のレベル表現できますので、ダイレクトな操作感を得られると思われます。ただし、色々なレベル値を兼用(切り替え)で設定操作を行う用途では、設定変更前の値から、いきなりつまみの位置の値に引き戻されるので、使い勝手が良くないかもしれません。また、外部からボリューム値を変更されても、つまみ回転角に逆反映させる(モータで動かすとか)ような事はできません。アナログ1ポートが必要です。なお、絶対値を出力するエンコーダもありますが、特性としては同じですし、入手性は良くないので除外しました。
 後者の場合、1回転あたり24ステップなので、きめ細かなレベル指示という感じにはならないと思われます。クリック間隔時間で加速させる等の工夫で、操作性は改善できるかもしれません。操作対象の絶対レベル値が表示されている必要があります。つまみには何の印もない事になりますので、自動的にレベル調整されたり、遠隔調整されても、違和感なくできます。デジタルポートを2つ使います。
 前者と後者を組み合わせて、メインボリュームは可変抵抗器、レベル/バランンス調整はロータリーエンコーダにすれば、操作性は良好になります。ただし、若干のコストアップと狭い筐体内に押し込めるかが問題です。
 今回は、各系統のレベル/バランス値の設定と共用化したい(部品削減)ので、後者の「ロータリーエンコーダ」を使用するものとします。

電源部

 商用AC電源から電力を得ます。本体に、AC電源ケーブルが付いているのが普通ですし、使い勝手は良いものです。しかしながら、直接商用電源を使うのは、運用時の安全確保の面で若干抵抗があります。個人的に製作する「小物」としては、自己責任で使うのも良いのですが、できれば普通に使いたいのです。結局、面倒な安全対策に時間を費やしたくはありませんので、AC-DCアダプタという便利な物に頼ります。これなら、製作時の感電の心配もなくなります。

•スピーカ用の駆動電源 5V/2A
•マイクロコントローラ基板用電源 5Vまたは7~9V/100mA程度
•音声入力部 5V/10mA安定化、低ノイズ
•ディスプレイ制御部 3.3V/2mA
•ディスプレイバックライト 3V~/20mA

 必要な消費源をリストしたものです。最大というか、ほとんどを占めるのはスピーカ用の駆動電源で、これをメインで考えるのが効率的でしょう。5Vをベースに考えると、他は解決できます。マイクロコントローラ基板(NUCLEO-F446RE)内部で5VからCPU用の3.3V電源を作っているので、ここから供給させることが可能です。また、バックライトも電流制限抵抗の設計値を変えれば5Vでも何ら問題はありません。

回路まとめ

ここまでの、結果を1つにまとめた回路図です。

 単に、ペタペタと各部の回路を組み合わせただけのものになりました。強いて言えば、アナログ系の電源をノイズ対策しているぐらいです。前作ではADCポートにPB系を使いましたが、ノイズが若干入ったので、今回はPC系を使うように変更しています。改善できているかどうかは未確認です。(この辺りは前作の反映で、大事です)
 スピーカ駆動のPWM信号については、負側の信号をマイクロコントローラの機能で生成するのが簡単/確実/安全です。しかし、3値制御はまだ諦め切れない所があり、前作同様全て独立させるようにしています。ソフトウェアの負荷は高くなりますが、色々な制御を試してみる事ができます。
 表示器のバックライト制御をマイクロコントローラからできるようにしました。単純にオンオフするだけなら、入手しやすい2N7000でも多分大丈夫だと思いますが、PWMで輝度調整するならば、2SK4150辺りにしないと厳しいかもしれません。私は手持ち部品2SK1772を利用しました。データシートを見てイケると思ったのですが2SK1772では安定動作しません。
 NUCLEO64ボードは若干のカスタマイズが必要です。メインクロック用の8MHzクリスタル,20pFを追加しなければならないのと、これを有効にするためのハンダブリッジやチップ部品削除があります。クリスタルはUSB機能を使用する場合の前提条件となっておりますし、音源の再生レートがずれると音飛びするので、メインクロックは正確な方が良いに決まっています。

基板

 CPU基板は出来合いの物でユーザ回路を組めるようなエリアもありませんので、これ(STM32-NUCLEO64)に別基板を重ねる形にします。基板間の接続はヘッダコネクタを使います。ケースへの固定は、その基板のみををねじ止めします。

 今回は、大した回路ではありませんし一品ものなので、ユニバーサル基板(蛇の目基板)を利用します。72x95mmのものが適当です。この回路としては、大きすぎる位ですがCPU基板を重ねるには、この位のサイズは必要です。なお、DIP品以外の小さい部品については、配線面に配置するか、変換基板を作ってDIP型にするようにして、半田付けに失敗してもリカバリしやすいようにします。

ソフトウェア

開発環境

 IDEは、無料で利用できる「System Workbench for STM32」(SW4STM32)を使用します。これはAC6 tools社(フランス)が提供しているもので、EclipseをSTM32での開発行えるようにGCCクロスコンパイラなど、面倒なセットアップ作業をしないで済むようにしたパッケージです。お試し的に使えるようなものではなく、コードの最大制限もありませんし、最大最適化(-O3)も有効で、かなり使えます。個人開発者としては、これのおかげでSTM32を選択する大きな要素になっています。

 STM社が提供している「STM32CubeMX」も利用します。これは、PCでハードウェアの設定をGUIで行い、ソースコードを自動生成するツールです。非常に手軽にプログラム開発にかかれます。

開発作業およびテスト

 ソフトウェア開発において、単にライブラリなどソフト部品の組み合わせで実現できる場合、実際動くハードウェア環境下で、作業した方が開発と動作確認がシリアル的に実施できるので短期間ですむ事が多いです。今回は、開発専用のハードウェアを用意する事はコスト的に無理な話なので、最終ハードウェアを作ってから、ソフトウェアを開発する順序とします。

機能関連(ライブラリ利用)

 隅から隅までコードを書くには時間がかかりすぎますので、既存のリソースで利用できるものは使っていった方が早く完成します。

  • STMペリフェラルライブラリ+CMSIS
  • Bluetoothスタックライブラリ
  • グラフィックディスプレイライブラリ

 1個目のライブラリは、STM社が提供しているもので、CubeMXを利用すると、これを前提としたコードが生成されます。超ページ数の多いSTM32F4のリファレンスを熟読しなくとも、APIをコールするだけでペリフェラル機能を利用でき、移植性も良くなるメリットがあります。

 2個目のライブラリは、Bluetoothモジュールを利用するためのもので、STM社からも提供されています。しかし、設計時にはまだ、A2DPプロファイルはサポートされておらず、というかそんなニッチな機能を用意するとも思えませんが、使えるライブラリはありません。無ければ作ろうという事で、「自家製のBluetoothライブラリ」を使います。前作でA2DPに対応済みです。

 3つ目のライブラリは、グラフィックディスプレイを簡単に利用できるようにするものです。これも、STM社からライブラリが提供されており、これを利用することも出来ますが、過去に、いくつかのLCDモジュールに対応するライブラリを自主製作しております。新しいグラフィック表示APIを受け入れるよりは、自分で作った方が早いと判断しました。

 今回使う、LCDモジュールのZ180SN009は初めて扱う部品で、新たなソフトウェア開発が必要です。描画の汎用的なコードは既に開発済みなので、デバイスドライバ部分のみ新規に書き起こしただけで済みました。写真は、初期化設定を試行錯誤し、やっと表示された時の感激の一枚です。フレームバッファメモリ上のランダムなデータが表示されています。意外とこういう写真がないので、載せておきます。インターフェイスはシリアルSPIのみとなっており、転送スピードが心配です。動作確認として、とりあえずソフトウェアのみで実装してみましたが、まずまずのスピード感でしたので、このままにしています。気になるような状況が出たら、ハードウェア(SPIペリフェラル)を利用して性能改善したいと思います。

 これは、インタフェース信号の様子です。上からCS,SDA,SCK,A0です。SPIクロックが250nsなので、4Mbps位の性能が出ています。本来、この表示器は縦長(ポートレート)で使われる想定ですが、今回は横置き(ランドスケープ)で使いました。ユーザアプリ側で工夫するのも大変なので、ドライバ側で対応しました。ケース実装時の都合で取り付け方向を変える必要があったりしますので、表示向きはLCDドライバAPIのヘッダファイルlcd_draw.h内の#defineで任意に変更可能にしました。視野角が不自然な所もありますが、単純なグラフィック表示では大丈夫です。中間色を使うと色の反転が出てくるような感じなので、原色系のみの色使いにしました。この辺は、LCDの内部設定を細かく調整すれば改善できるものなのかもしれません。私は必要最小限の初期化しかしておらず、ほぼデフォルトの状態です。

アプリケーション

  • Bluetooth連携、問題なし
  • 音声入力(ADCアナログキャプチャ)
  • 音声出力(PWM駆動)
  • グラフィック画面表示、Z180SN009の新規サポート
  • ロータリーエンコーダ入力、STMタイマーペリフェラル機能利用
  • 自動電源オン/オフ、問題なし
  • 自動ライン入力切断機能の追加
  • BLEのATT対応の追加

音声入力(ADCアナログキャプチャ)

 基本、ソフトウェア介入100%ならば難しさはないのですが、どれだけハードウェアに機能を任せることができるかです。一応、前回開発実証済みの部分ですので、詳しい設計は省略します。

音声出力(PWM駆動)

 STM32の高機能タイマーペリフェラルTIM1を利用して、PWM信号を生成します。音声を再生するには、PWMのDuty値を一定時間間隔で次々と変化させる必要があります。この時間間隔はサンプリング周波数となります。TIM1の機能では、Duty値をDMAを使って更新させる事が可能なので、ソフトウェアの介入を少なくできます。

これは、無音時のスピーカの出力波形で、黄色が+側、緑がー側となります。50%Dutyで綺麗にドライブされていました。スピーカも無音状態です。音楽などの音声を入力させると、まずまずの音質でスピーカを鳴らしました。

ロータリーエンコーダ入力(回転ツマミ)

 エンコード値は、STMペリフェラルライブラリを使って得られます。変化をチェックする事で、回転量/方向が分かります。現在のフォーカス値に従って、対象の設定値を上げたり、下げたりするだけです。なお、メインボリュームの場合、増減量を少なくしてアナログ的な動きを再現できるようにしますが、これだとたくさんつまみを回さなければならなくなりますので、PCのマウスのように加速度的な変化をするようにしておきます。

 実際の、ロータリーエンコーダの対応は、全く苦労なく済みました。写真はつまみを回すのに合わせて、エンコード値が変化するテストを行った時のものです。ペリフェラルモジュールのTIM3をSTM32CubeMXのGUI画面でEncoder Modeに設定し、TI1/TI2ピンをPC6/PC7に割り当てるだけ。ソフトウェアの介入なく、いつでもエンコード値をライブラリを使って読み出す事が可能です。必要なら、変化があったら割り込みを発生させる事もできます。

UI(ユーザインタフェース)

 画面表示:ソフトウェアライブラリを利用して、画面を描画するだけなので、何も難しさはありません。描画部品を定義するだけで、画面への実際の表示/再表示はライブラリが行う方式です。レベルメータはバーグラフ部品を、レベル/バランス設定はバーチャート部品を、メインボリュームもバーグラフ部品を使って画面レイアウトを構成します。もちろん文字も部品として配置できます。ライブラリの再描画(リフレッシュ)機能を、グランドループに組み込んでおきます。画面レイアウトについては、概ねの形を決めておりますので、これを元に実際の座標を決めていきます。レベルメータは、リアルタイムに値を更新しますが、音声データつまり交流を単一の数値に表現しなければならず、最大/絶対値平均/RMS等の表現方法があります。今回の場合、最大値が適当かと思います。しかし、全音声データをチェックするのは、CPU負荷的に心配ですので、今回はサンプリングで対応します。1音声フレームからnサンプル等間隔で抜き取り、最大値を調べる方式としました。

 ボタン操作:NUCLEOボード上に実装されているプッシュボタンを利用します。ボタンの状態は、STMペリフェラルライブラリを使って得られますので、変化があった時がボタンが押された/放されたタイミングとなります。ボタンにはチャッタリングがありますので、キャンセル機構は必要ですが、今回は遅延式で対応しました。ボタン操作は、調整対象を切り替える行為としていますので、操作対象(フォーカス)を順次切り替えるロジックを実装します。これは、タイムアウトを設けて一定時間経過したら、強制的にメインボリュームにフォーカスします。

 これが、最終版に近い状態の画面です。レベルメータは50ms毎に再表示しており、ストレスなく動きます。AチャネルとBluetoothが生きていて、Bチャネルが切り離されているのがレターの色で判別できるようにしました。メインボリュームつまみは思ったよりアナログ的に反応するようにできました。ノンクリック型のロータリーエンコーダを使い、スキャンも10ms毎にし、変化量も小さめにしたのが良かったのかもしれません。操作量に応じて加速度的に変化するロジックも組み込んであります。小音量から大音量までリニアに変化する所は、前作から改善されました。各系統のレベルやバランス調整は、天板を開けてボタンを押すことで、設定値を表す黄色部分が赤色になり、ツマミの操作対象が変わります。一定時間何も操作しないと、メインボリュームに戻ります。

 システムクロック設定ですが、STM32F4内臓のクロック源でUSBが動作すれば、NUCLEOボードの改造が不要になるので、大変好ましいです。レジスタ設定的には可能なのですが、STM32CubeMXの画面で設定すると警告が出てしまいます。強行するという選択もあるかと思います。

外装

 部品を配置してみて最終的なケースの寸法や、見栄えを決定します。今回は、既製品を使わず、最適なケースを用意するものとします。

外形

 要求仕様でハーフDINサイズ(89x50mm)と決まっていますし、前面パネルにはディスプレイと回転つまみがギリギリ入るので、あまり考える余地はありません。つまみを右側にするか、左側にするかぐらいです。接続端子類は、一般的な製品のように全てバックパネルに配置します。というか、入るような部品を探してレイアウトします。
 なお、縦置きでの使用も考えられますが、要求仕様にはないので今回は対応しません。

 上面パネルは、ヒンジで開くようにして、CPU基板上のボタンを操作出来るようにします。下面は、メンテナンス(改造)を容易にするため、パネルを外せるか全く取り付けないものとします。その都合で、基板は側面に固定するようにします。

素材、仕上げ

 透明3mm厚のアクリルシートを使い、表示窓部が見えるようにして、それ以外は黒で塗装します。上面は、CPUボード上のLEDを確認できるように、乳白色とします。今まで使ってきた意匠です。
 レターはインスタントレタリングで文字入れし、最後にクリアを吹き付けて固定化すると、普通の使用に耐えるレベルになります。

Copyright©2019 Toyohiko TOGASHI


投稿日

カテゴリー:

, ,

投稿者:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です