トドお父さん通信 -20ページ目

トドお父さん通信

北部九州在住 高BMI中高年のオタク趣味の活動記録

みなさんこんばんは、福岡でおもちゃドクターもやっている トドお父さんです。

前回はテスト用のサイン波のWAVファイルの音声データからHEXファイルを作って、フラッシュメモリICに書き込む所まででしたね。

【Part1】Sound Player基板V2の特性検討と音声データの作成方法

 

今日は、 生成した音声ファイルのインデックス vos_mac.txt に従って各曲のスタート

アドレスをプログラムに書き込むところ、およびフラッシュに書き込んだPCMデータの

確認方法、また音声再生したデータの再現性と周波数特性などを評価してレポしますね。

 

また、余裕があればVer3でAB級アンプICとHブリッジICの切り替えができるように設計した

ので、両者の消費電力を含めた比較を行いたいと思います。(これは別途のポストにします)

 

さて、ATMEL STUDIOでビルドしたファイルのATTINY402/202への書き込み方法に

ついては、前のこの記事に詳しいです。

 

PA0 UPDI端子をFUSE書き込みでGPIOに変更しなければHVP(高電圧プログラム)の

必要もないので、プログラムはseriauUPDIと言われる中華製の安価なSrialUSB変換モジュール

にダイオードと抵抗1本を追加するだけで構成できるから簡単ですね!

[Part2] ATTINY202への書き込みとプログラムをやっています!

 

閑話休題:ATMEL STUDIOでorgel_2 のorgel_SW_402プロジェクトを開いたら、

main.cを開きます。

 

356行 付近のvoice_s に音声データのインデックスが入ってます。

まず、「キティミラーナ」の音声データのインデックスを全てコメントアウトし、今回作成した

インデックス(vo_mos)を書き込みます。

そしたら、main.cをセーブしてリビルドを行います。今回はreleaseフォルダに生成されます。

 

プログラムがビルドできたら、AVRDUESSを立ち上げて、プログラムの書き込みを行います。

詳しくは前の記事を参照ください。 

ATTINY202/402のFUSEビットをAVRDUDESSを使って書く方法

今回はMCUにt402(ATTINY402)を選んで、下記のフォルダにあるプログラム

orgel_SW_402.hexへのパスを指定します。

D:\Users\powpher\documents\Atmel Studio\7.0\orgel1_2_anpan_240820\orgel_SW_402\Release\orgel_SW_402.hex

 

さらにprogramボタンを押すと、Additional command lineに書かれたFUSE書き込み後に

ビルドしたプログラムの書き込みを実行します。

FUSEデータは -U fuse2:w:0x01:m -U fuse5:w:0xC4:m クロックを16MHz、PA0はUPDI

 

PA0 UPDI端子はSW0 (タクトSW)の入力に使っていますが、UPDIからGPIOに変更する

とHVP(高電圧プログラミング)の対応が必要となります。

そのときのFUSEデータは-U fuse2:w:0x01:m -U fuse5:w:0xC4:m  になります。

 

今回はUPDIのまま入力端子として使っていますが、きちんと”H"、”L"認識するようです。

Sleep時の電流が増すとの情報がありましたが、確認した所 1uA 以下になりました。

 

これで、基板のタクトSWを押すたびに、wavelistで指定した音声ファイルが順次ラウンド

ロビンで再生されるようになりますね。

 

これで、ようやく音声再生の波形をオシロで測定して波形と周波数特性を評価できます。

前回作ってフラッシュメモリICに保存したのは、下記のサイン波 音声データでしたね。

 

1.1kHz  0dB 30秒

2.400Hz  0dB 30秒

3.100Hz -6dB 20秒

4.400Hz -6dB 20秒

5.1kHz   -6dB 20秒

6.2kHz   -6dB 20秒

7.5kHz   -6dB 20秒

1.から 再生してみました。

 

  1kHz 0db            400Hz 0db

  
 

あれっ、なんか波形がおかしいですね。

WAVデータとHEXデータを比較して確認してみます。

 

WAVデータはAudicityで16kHzサンプル 8bit PCM信号になっていますから、

WAVデータのRIFFヘッダ44バイトを除けば同じデータになるはずです。

 

こちらが1kHz 16kHz 8bit -6dB のWAVファイル

 

こちらが1kHz 16kHz 8bit -6dB の生成したHEX

 

WAVファイルの45バイト目から、83h、98h、AEh、BBh、と続くデータになるはずが

飽和したFFhまでの拡大したデータになっているようです。

 

続いて 400Hz 16kHz 8bit -6dB のWAVファイル

 

こちらは400Hz 16kHz 8bit -6dBのHEXファイル

これも正しければ、WAVファイルの45バイト目から、81h、8Ah、94h、9Dh、と続くデータになるはずが、やはりFFhまでの拡大して飽和したデータになっているようです。
 

大泉さん作成の WAV2HEXのC++プログラムをVisual Studio 2022で開いてみます。

ファイル名の末尾に’#’ がつけば、no_volというフラグが0になって、データの

加工をしないようにプログラムされています。

 

またHEXデータを生成するmake_hex()というメソッドはパラメータとしてno_vol

有り/なし を渡すようになっています。

当然プログラムには問題がないようですが、私のファイル名の付け方がまずくて認識しない

のかもしれません。そこで、no_volの値に関わらず、データを加工しないようにします。

 

 

これらの変更をした後、リビルドをします。

現状のexeファイルと区別するために、出力をReleaseから、Debugに変更します。

batファイルのWAV2HEX.exeへのパスもDebugに修正します。

 

出力 HEXファイル名も区別のため、変えておく方がいいでしょう。

 

さて、できました。

今度はどうでしょうか?

 

まず、1kHz 16kHz 8bit -6db のHEXファイル

WAVファイルの45バイト目と同じ、83h、98h、AEh、BBh、になりました!

 

次に、400Hz 16kHz 8bit -6db のHEXファイル

WAVファイルの45バイト目からとおなじ、81h、8Ah、94h、9Dh、になっています。

 

これで波形データは正常です。ようやくきちんとオシロで測定できるようになりました!

 1kHz 0db           400Hz 0dB

  

0dBなのでサイン波が飽和しています。 これは正常です。

 

 100Hz -6dB            400Hz -6dB

  

 

 1kHz -6dB           2kHz -6dB

  

 

5kHz -6dB

-6dBでは、0xFFの飽和データが現れないので、ちゃんとサイン波になっています。

振幅を見ると、2~5KHzくらいまでは、ちゃんと周波数特性が取れているようです。

5kHzでは、波形の振幅が少し弱くなります。サンプリングのせいかもしれませんね。

 

この実験に先立ち、アンプ前にいれたCRフィルタの定数は少し変更しました。

時定数 τ=CR で、1kΩと0.1uFで時定数は0.1mS(10kHz)になりますが、

フィルタとしてのカットオフ周波数は f=1/2πCR になります。(勘違いしてました💦)

 

つまり、この時のカットオフ周波数は ≒ 1.5kHz で、-3dBになります。

サンプリング周波数は16kHzにした場合、4~8kHzくらいまで帯域を伸ばしたいですね。

 

R8 1kΩ → 220Ω に変更しローパスフィルタのカットオフ周波数を1.5 →7KHzにしました。

  

 

以上の内容で、Sound Player基板の周波数特性の検討を終了します。

音声のHEX化で思わぬ問題が出たので、検討してよかったです。

今後は、Audicityで音声を事前に加工して、HEX化の際は加工なしにしたいと思います。

サイン波での試験では、スピーカからの音声はノイズっぽい感じは全く出ていません。

 

あとは、実際に音楽を鳴らして、音質の改善を確認したいと思います。

すこしPWMが残っているので、気にはなるところです。

少し高音が落ちても、フィルタを利かすか、現状でいくか検討が必要ですね。

 

それでは、おやすみなさい。

後日追記:ローパスフィルタの検討で1kΩ 0.1uFから、220Ω 0.1uFに変更したところ、
     PCMが少し残っているため、音楽再生時にザーザーとノイズが大きいです。
     もとの、1kΩ 0.1uFに戻しました。 これでノイズがだいぶ減りました。
     カットオフが1600Hz(-3dB)になりますが、音楽の再生は聴感上すなおに聞こえます。

 

関連記事 

【Part2】Sound Player基板V2の音声データの作成方法と特性検討
【Part1】Sound Player基板V2の音声データの作成方法と特性検討

ATTINY202/402のFUSEビットをAVRDUDESSを使って書く方法
おもちゃ修理用のSOUND PLAYER基板の小型版 V2を設計しました!
[Part2ピエゾアンプ]ATTINY用Sounds Player基板を作って動作確認しました!
[Part1] ATTINY用Sounds Player基板を作って動作確認しました!
[Part2 テスト終了です] ATTINY402で音声再生のテストをしました
[Part1] ATTINY402で音声再生のテストをしました
ATTINY402に電子オルゴールのHVPプログラム書き込みテストをしました
[Part2 完成しました!]HVP対応のUPDI プログラマーを作成中です
[Part1] HVP対応のUPDI プログラマーを作成中です
[Part4 IRリモコン完成!] ATTINY202への書き込みとプログラムをやっています!
[Part3] ATTINY202への書き込みとプログラムをやっています!
[Part2] ATTINY202への書き込みとプログラムをやっています!
[Part1] ATTINY202への書き込みとプログラムをやっています!
ATTINY85 CPUを使って小型の赤外リモコンを作りました!

 

みなさんこんにちは、福岡でおもちゃドクターもやっている トドお父さんです。

 

今回は先日つくったおもちゃ修理用のSound Plyer基板Ver2

の特性検討をしますね。まずはそのために音声データを作成し、フラッシュICに書き込む

必要があります。Part1はこの辺について説明しますね。

おもちゃ修理用のSOUND PLAYER基板の小型版 V2を設計しました!

V2とTINY1614実装のV3です


まずは、周波数特性の検討をするための音声データを収集します。

検討に必要なサイン波のWAVデータはこちらからDLさせて頂きました。

2.5Hz~21kHzサンプル音源(wav)

 

選んだのは、

1.1kHz  0dB 30秒

2.400Hz  0dB 30秒

3.100Hz -6dB 20秒

4.400Hz -6dB 20秒

5.1kHz   -6dB 20秒

6.2kHz   -6dB 20秒

7.5kHz   -6dB 20秒

 

フラッシュICに書き込むためのHEXファイル変換には、つつじが丘おもちゃ病院 大泉さんのWAV2HEXアプリを使わせていただきます。(こちらが最新のようです)

WAVファイルからHEXファイルを生成するツールの機能追加(ダイナミックレンジを加工しない指定)

 

前のWAVファイルは44.1 kHz 16bit ステレオのフォーマットだったので、Audicityという無償アプリを使って事前に16KHz 8bit モノラルのフォーマットに変換します。

 

Audicity のインストールと使い方については、色々なサイトがありますので割愛します

Audicityを立ち上げたら、WAVファイルのあるフォルダを選んで音声データを開きます。

(ドラッグ&ドロップでもOK)

 

音声ファイルを開いたら 左上のファイル → オーディオをエクスポートを選びます。

現在のフォーマットは、44.1kHz ステレオ 16bit だと思います。(サイン波は8bitでした)

これを16kHz モノラル 8bit(unsighted 8bit PCM)を選んで表示します。

 

変換したWAVファイルを再度Audicityで開くと、フォーマットが変換されているのが分かります。 こんな具合ですね。もちろんファイル容量も減っています。(16x8=128kbpsになる)

 

 

ここまで準備ができたら、大泉さんのAtmel Studioオルゴールプログラムに戻ります。

ここでtool_voiceのなかに、WAVファイルからHEXファイルに変換するWAV2HEXプログラム

が入っています。

このフォルダのWAV2HEX使い方を参照して、内容が理解できるかと思います。

作った例として、同じ改装にあるvoice_Mirrorna のフォルダの中身を見てくださいね。

 

これをWAVファイル以外 全コピーして、voice_feqというフォルダを作ります。

 

ここに、先に作ったWAVファイルを全部を持って来ます。

 

次にこのフォルダに入っている、wavelist.txtを編集し、WAVファイルの名称を再生する順番に書いて保存します。

 

編集が終わったら、WAV2HEX.BATをダブルクリックしてい下さい。保存したwavelistに従って、下記のようなメッセージが出たらOKです。

エラーの場合は、ディレクトリやwavelistをチェックしてくださいね。

 

これで、フラッシュメモリに書くHEXファイルができあがりました。

書き込みですが、自分はTL866IIという中華製のパラレルプログラマーを愛用しております。

いまは、AliExpressで安価なプログラマーも多数でていますので、このCh341aを買うのがいいかと思います。

https://ja.aliexpress.com/item/33054397283.html?spm=a2g0o.order_list.order_list_main.52.259f585aVX8WPq&gatewayAdapt=glo2jpn

 

ICソケットを使わずSOP8Pのまま書き込むのであれば、W25Q64の幅 208milに合わせたアダプタソケットが必要です。

 

 

これがTL866IIです。

アプリを起動すると、こんな画面が出ます。

 

まずはこのGUI画面から、select IC で自分がつかうFlashメモリICの品番を選びます。

自分の場合はAliExpressで10個買った 64MbitのWinBond W25Q64JVを選びます。

つぎにフラッシュに書き込むHEXファイルをダウンロードします。

File → Load File でPCのディレクトリを選び、先ほど作成したHEXファイルを指定します。

これで、書き込み準備ができました!

BUI上のタブからDevice → program を選ぶとプログラム画面がでるので、画面に従って

デバイスをセットし、programをクリックするとDevice IDを確認した後、Erase → Program → Verifyと一連の動作が始まります。もしデバイスのセットが間違ってもエラーがでるので安心です。

ちなみにCh341aでは、GUIでデバイスセットを逆に表示するバグがあり、1個壊しました。

その内容をGithubのIssueで発行しましたが、返事はなしのつぶてです(笑)

この辺は中華クォリティのところもありますので、注意して使いましょう。

(TL866II plusはその点、安心して使えますね)

 

閑話休題:こうやって、ようやく音声データをWAVデータに変換してフラッシュメモリICに

書き込むことができました。データ作成の際にはフラッシュの容量がオーバーしないように注意する必要があります。オーバした場合は、サンプルレートを8kHz に落とす、ファイル数を減らす、もっと大容量のフラッシュICを使う等で対応してください。

 

それでは、この辺でPatr1を終わりますね。音声データの作成で終わってしまいました 大汗;

複数の音声を再生するためには、生成した vos_mac.txt に従って、各曲のスタートアドレスをプログラムに書き込む必要があります。

 

次回に続きます。

 

関連記事

ATTINY用Sounds Player基板の設計をしました!

[Part1] ATTINY用Sounds Player基板を作って動作確認しました!

 

関連記事 

【Part2】Sound Player基板V2の音声データの作成方法と特性検討
【Part1】Sound Player基板V2の音声データの作成方法と特性検討

ATTINY202/402のFUSEビットをAVRDUDESSを使って書く方法
おもちゃ修理用のSOUND PLAYER基板の小型版 V2を設計しました!
[Part2ピエゾアンプ]ATTINY用Sounds Player基板を作って動作確認しました!
[Part1] ATTINY用Sounds Player基板を作って動作確認しました!
[Part2 テスト終了です] ATTINY402で音声再生のテストをしました
[Part1] ATTINY402で音声再生のテストをしました
ATTINY402に電子オルゴールのHVPプログラム書き込みテストをしました
[Part2 完成しました!]HVP対応のUPDI プログラマーを作成中です
[Part1] HVP対応のUPDI プログラマーを作成中です
[Part4 IRリモコン完成!] ATTINY202への書き込みとプログラムをやっています!
[Part3] ATTINY202への書き込みとプログラムをやっています!
[Part2] ATTINY202への書き込みとプログラムをやっています!
[Part1] ATTINY202への書き込みとプログラムをやっています!
ATTINY85 CPUを使って小型の赤外リモコンを作りました!

 

Technoblogyさんの最近のプロジェクト、Sound Lab - a Simple Analogue Synthesiser

KiCADで修正設計した基板と部品を手配した所まででしたね。

 

先週は秋月に注文した部品と、JLCPCBから基板が届いて、あとはMOUSERに注文した部品を残すだけになっていました。

 

今日はMOUSERから部品が届いたので、これで全て部品と基板が揃ったことになります。

 

今日は、メカ部品と基板のあたりに間違いがないかだけ、調べました。 

DCジャック OK 

3Pステレオ端子 OK 

スピーカの穴 OK 

ボリューム(可変抵抗)OKだが軸が長い30mm→15mm 

30mmしか入手できなかったので、大型ニッパで切りました。 これでピシャリ!

 

これで、基板への取り付け部品が問題なさそうで安心しました。

 

 

ノリで基板にメカ部品を取り付けて、ボリュームのツマミも付けてみました。

お~、いいじゃないですか! もう完成したかのようです。

 

ちなみに、今回購入した部品のうち、一番対価買ったのはこの32mmφのスピーカです。

なんと2200円もしました。でも、口径は小さいけど、性能はいいんですよ。

 

明日からの組み立てが楽しみですね。

それでは、おやすみなさい