Baumkuchen’s Workshop

バイオリンと電子工作、DIY、ジョギングなど。

バイオリンタイマーの製作#11-ソフトウェア(オシロ&スペアナ実装)

つぎは、練習判定の基礎となる音処理関連の実装(精緻化)です。簡易オシロと簡易スペアナ機能を作り込んで行きます。本体機能の練習時間積算タイマーは、平行して作業中。

baum-kuchen.hatenablog.com

タスク検討(ADサンプリングの割り込み化)

AD入力周期を正確に実施するため、タイマ割り込みでAD変換をするように、全体のタスク構成を変更しました。スイッチの反応も長押しをちゃんと判定できるように割り込みの中で一定周期(20Hz)で取り込むようにしました。

f:id:Baum_kuchen:20220211164405p:plain

AD変換は、3000Hzサンプリングとし、256サンプル取り込んだら、フラグによりバックグランドタスクとして走っている表示処理に受け渡す感じ。表示処理では、AD変換データが不要になったら、再度の取り込みを同じフラグにより指示。FFT処理は、今のところ、時間が掛かるので表示処理の中で実施してますが、別タスク化するかは今後の検討。

簡易オシロ機能

これで、修正した簡易オシロ機能を構築。横軸が150サンプルになるので時間にして50ms(固定)です。ADサンプリング、グラフ描画の繰り返し。縦軸は10btADCの値を60ドットで表現したもの(3.3V動作なので、PIC入力端で大体1DIV=0.5V相当です)

f:id:Baum_kuchen:20220211164615j:plain

簡易スペアナ機能

続いて、簡易スペアナ機能。横軸は周波数ですが、バーの幅を見やすく2ドットとして間に1ドットスペースを開けたので、全部で50本分のスペクトルになります。分解能が約11.7Hz(=3000Hz/256サンプル)なので、最大で586Hzとなります。

二つの数字のうち、右側がFFT演算に掛かる時間(ms)で、Sin、Cosをテーブル化して高速化したんですが、まだ、結構掛かってしまいます。Aruduinoで試した時は100ms以下だったので不思議です。

f:id:Baum_kuchen:20220211164647j:plain

(赤いドットは、ピークホールドの表示ですが、まだ、実装が上手くいってません)

動作チェック

簡易スペアナまで形ができたので、動作をもう少し正確に確認しよということで、先日、作ったファンクションジェネレータを使っての点検を行いました。

f:id:Baum_kuchen:20220211170656j:plain

デバッグ用に一部ソフトを書き換え、余ったアナログ入力端子にファンクションジェネレータからの信号を注入します。

f:id:Baum_kuchen:20220211170722j:plain

加えた信号は、400Hz、3.3Vppのサイン波。

f:id:Baum_kuchen:20220211170742j:plain

で、結果がこれ(最初の写真と同じ)です。

f:id:Baum_kuchen:20220211164647j:plain

が、よく見ると変です。横軸の4DIVのところにピークが来ていますが、そこは、40個目のバーなので、11.7Hz×40=468Hzを示していることになります。400Hzを入力して468Hzとは、あまりにもズレすぎてます。

トラブルシュート

ということで、トラブルシュートの始まりです。

まず、パッと思ったのが、FFTプログラムがおかしいのかな?と。

ただし、トラブルシュートの王道として、入り口側から順にたどって、どこがおかしいかを確認することにしました。

ADサンプリング周期の確認

最初は、ADのサンプリング周期が正しいか。

f:id:Baum_kuchen:20220211172714j:plain

デバッグ用に、余ったDIOに割り込み周期毎にBIT反転する処理を仕込んでいたので、オシロで確認すると、きっちり3000Hzで割り込みが掛かっていました。

簡易オシロモードでの確認

つぎに、折角作った簡易オシロ機能を活用しない手はない、ということで、波形を確認。

400Hzだと、50msで20波あるはずですが、なんか多いです。

f:id:Baum_kuchen:20220211173047j:plain

分かりやすく三角波として、周波数も200Hzに落としてみたけど、11.3波位あります。明らかに、13%も多いです。400×1.13倍=452Hzで、スペアナの周波数ズレと大体あってます。原因はこれです。

f:id:Baum_kuchen:20220211173209j:plain

でも、割り込み周期は正しいのに、なぜ、簡易オシロの表示がずれるのか、謎が謎を呼んだ形。

考えられることとしては、表示ソフトがバグっているとか。でも、13%ズレるバグってどんなものか相当できず。

入力信号は、本物のオシロで確認しているので、ファンクションジェネレータがおかしいということは無いので、多くの波が記録されるためには、ADサンプリングの周期が遅いことしか考えられないです。でも、割り込み周期は、確認しているし。

AD変換時間の確認

考えていても、らちが明かないので、AD変換時間が異常に掛かっていない確認することにしました。ADCの設定も、まだパラメータをちゃんと考えず、割と遅めにしてしていたのもありです。

先ほどと同じく、AD変換直後に、DIO出力を反転するプログラムを入れて、オシロで波形を見て見ました。

結果です。オシロのトリガをうまく使って、丁度、AD変換が開始されるタイミングを確認しました。ぱっと見、問題なさそうです(AD変換処理に結構時間が掛かてるなとは思いましたが)が、時間をしっかり確認してみると、1周期が380μSもあります。AD変化を実施していないとろが、約332μSでしたので、約50μSも増えています。

f:id:Baum_kuchen:20220211174346j:plain

ここで、ますます謎が深まりました。AD変換の開始タイミングは、タイマ割り込みで作っているので、AD変換を実施するか、しないかで、周期が変わるのは変です。

う~ン。分からん。

AD変換パラメータの見直し

PICのマニュアルのタイマとADCところをつぶさに読みましたが、そんな記述は、当然なしです。Microchipのホームページでエラッタ情報を確認しましたが、何もなし。
仕方無いので、AD変換の時間を短くするため、パラメータを見直すこととしました。(332μSの周期のうち、約140μSもAD変換にかかっていたので)

最初は、TAD=1/64Foscにしてましたが、マニュアルの最小値0.7μSを参考に、TAD=1μ、Fosc=8Mhzなので、1/8Foscと設定しました。これで、AD変換自体は15μSでできるはず。

ちゃんとAD変換時間が短くなっている確認です。うん。ちゃんとAD変換時間は短くなってる。よし、よし。

あれっ!?何と割り込み周期も短くなっているではないですか(336μSで4μSはカーソルの誤差)

f:id:Baum_kuchen:20220211175923j:plain

謎の3乗!!

ともあれ、治ってしまった。じゃあ、どこが影響するのか、TADの値を幾つか変えてみると、TAD=1/32Foscでは正常、TAD=1/64Foscの時だけ異常となることが判明。

そのあと、ソースコードを何回も見直しましたが、特に異常な箇所はないです。

再確認

真の原因が分からずじまいですが、ファンクションジェネレータを使っての再確認をすることに。

描画タイミングと重なってしまいましたが、200Hz入力で50mSにほぼ10波あります。

f:id:Baum_kuchen:20220211180745j:plain

スペアナモードで400Hz入力したこころですが、丁度、35スペクトル目なので約409Hzで概ね妥当な表示になりました。

f:id:Baum_kuchen:20220211180839j:plain

なには、ともあれ、治ってしまった。不思議。

今後の計画

謎が謎のまま残りましたが、これ以上、手の施しようがないので、治ってしまったことで、良しとて進めてしまいます。(製品作っているんじゃ、ダメですけどね)

次からは、本体機能の練習時間積算タイマーを仕上げていきます。それと、省電力化やFFTのさらなる高速化、スイッチ操作の細かい作り込みです。

引き続き、よろしかった、お付き合い願います。

バイオリンタイマーの製作#10-ソフトウェア(時計機能実装)

早速、ソフトウェアの作り込みをしていきます。

baum-kuchen.hatenablog.com

ソフトウェア作り込み

時計モード

写真的には、変わりませんが、時刻合わせ機能を実装しました。

f:id:Baum_kuchen:20220206000913j:plain

実装した機能としては、

・セットスイッチ(裏面)の長押し判定

・通常モード ⇔ 時刻合わせモード の遷移処理(セットスイッチ長押し)

・時刻合わせする桁(秒、分、時、日、月、年)の選択機能(セットスイッチ短押し)

・合わせる桁のブリンク表示

・合わせる桁のインクリメント(モードスイッチ押し) デクリメントは無し。

・曜日計算機能

です。表示処理に結構時間が掛かっているので、変化のある所だけ更新する処理にしたのでプログラムが結構複雑になってしまいました。また、ブリンク処理も結局0.5Hz(1秒表示、1秒消灯)しかできませんでした。

今後の計画

次のソフトウェア実装としては、本体機能の練習時間積算タイマーです。まずは、簡易版として、セットスイッチによるマニュアル入力を実装予定です。

引き続き、よろしかった、お付き合い願います。

バイオリンタイマーの製作#9-ケースに収納

基板むき出しだと、フラットケーブルがちぎれたら怖いので、ケースに入れて形にしました。

baum-kuchen.hatenablog.com

ケース加工

USBコネクタ

USBコネクタが載る台座を3Dプリンタで作りました。寸法がキッチリでるので楽です。

f:id:Baum_kuchen:20220205022737j:plain

ケースには瞬間接着剤で固定。3Dプリンタの樹脂の表面を紙やすりで少し平らにしてあげないと付きが悪いです。

f:id:Baum_kuchen:20220205023041j:plain

USBコネクタを載せたところ。配線と固定はまだあとです。

f:id:Baum_kuchen:20220205022802j:plain

単4電池ボックス

電池ボックスは、両面テープで固定しただけ。

f:id:Baum_kuchen:20220205022815j:plain

DCDCコンバータ

電池をNiH電池にすると電圧が2.6Vくらいしかならないので、3.3Vへの昇圧用DCDCコンバータを載せました。

f:id:Baum_kuchen:20220205094807j:plain

LCD

LCDの固定は、グルーです。

f:id:Baum_kuchen:20220205094843j:plain

仮組み立て

USBコネクタの実装がまだなので、一応、仮組み立て。スッキリしました。基板から出ているケーブルは、PICKit3に繋ぐケーブルです。

f:id:Baum_kuchen:20220205094155j:plain

作動確認

ちゃんと動きました。LCDの表示範囲(白線枠)もキッチリ見えるので寸法的にもOKです。

f:id:Baum_kuchen:20220205094235j:plain

今後の計画

ハードもケース実装までできました。あとはひたすらソフトを構築していくだけですが、PICの処理速度というかLCDの表示処理といか、どうもここら辺が律速となってかなり工夫が要りそうです。

めげずは、完成させていきますので、よろしかった、お付き合い願います。

バイオリンタイマーの製作#8-ソフトウェア

制御基板の作動確認ができたので、少しづつソフトを作っていきます。

baum-kuchen.hatenablog.com

ソフト製作

時計/時刻合わせ

ざっと考えた仕様は以下の通り。

 ・表示
  1行目 年/月/日 サイズ3(7x5の3倍)
  2行目 時:分:秒 サイズ4
  曜日は自動計算、1行目の上に記号(S M T W T F S)で表示、Sun:赤、Sat:青、他白
 ・操作(時刻設定)
  セットボタン(長押し)で時刻合わせ開始、秒、分、時、月、年の順に桁選択、年の次は→秒からと繰り返し。
  再度セットボタン(長押し)で時刻合わせ完了。 
  選択桁ブリンク 2Hz
  モードボタン→桁インクリメント、繰り上がりはしない。秒桁は、00にリセット。
  時刻合わせ中も時計機能は作動

現状、作成状況は、表示部分まで実装。

f:id:Baum_kuchen:20220130183844j:plain

簡易オシロ(波形)

ざっと考えた仕様は以下の通り。この機能は、どちらかと言うとデバッグ用です。

  256サンプリング、表示、サンプリング の繰り返し。
 表示は左から前回値を消して、書くことの繰り返し

 表示エリア 150ドット分なので、あとは飛ばす。表示性能上、スクロール表示は断念

実際に音を拾ってみたところ。サンプリング自体は約3KHzでやってますが、表示周期は3Hz位になってしまいます。ただ、ちゃんと音が取れていることは分かります。

f:id:Baum_kuchen:20220130183902j:plain

簡易スペアナ

同じく仕様。この機能も、どちらかと言うとデバッグ用です。

 256サンプリング。窓関数(ハニング窓)、FFT、表示、の繰り返し。
 棒グラフ化 レベルによる色分け、ピークホールド、ホールド値は一定レートで0に。32高調波まで。

基本的なところまで実装。表示関係の細かい仕様はまだですが、表示性能との兼ね合いで断念するかもしれません。写真は、実際にバイオリンを弾いてみた状態で、ちゃんとスペクトルが分かります。緑色の数字は、サンプリングからFFT計算までの所要時間(ms)です。表示の遅さを除けば、十分使えそうです。

f:id:Baum_kuchen:20220130183931j:plain

練習時間タイマー

最終的な目的である練習時間積算タイマー機能の仕様です。

・音判別(練習判別)
 マニュアル:練習開始、終了、1時間毎に確認アラート5分間待ち、終了自動判定
  簡易版、ある程度大きな音
  詳細版、バイオリンの音検知。本当にできるでしょうか。
・操作
 モードスイッチで、年、月、週、日の積算時間を表示
 履歴標示:月、週、日選択時は、日単位、年選択時は、月単位

まずは、画面イメージだけ作りました。本当に、千時間を超える練習をするのかは、自分自身不明です。

f:id:Baum_kuchen:20220130184000j:plain

バックライト制御

 ノーマル状態で セットスイッチ 消灯を含む4段階の輝度を設定。バックライトの自動消灯、点灯機能など、出来るだけ省電力化の工夫を実装予定。合わせて、PICのスリープ機能も実施しないと、電池が持たなそうです。

今後の計画

ソフトの各機能の仕様を検討しながら、一部実装を開始しました。一通り機能するようにするにはあと一歩ですが、表示処理をどこまで早くできるかを見ながら、細部を詰めていく予定です。

ソフトも開発のサイクルに乗りそうなの、ケース実装を含めたハードを最初に完成させていきます。

よろしかった、お付き合い願います。

バイオリンタイマーの製作#7-制御基板設計(つづき^3)

制御基板の作動確認をします。PICには、既にテスト用のプログラムが入っているので動くはず。

baum-kuchen.hatenablog.com

作動確認

配線チェック(2か所間違ってました)を行ったあと、LCDをつないで作動確認。

PICにはプログラムは入っているので、あっさりと画面が表示されました。

f:id:Baum_kuchen:20220125215305j:plain

ここまでくれば、後は、ソフトをひたすら組み上げるだけです。電池作動を意識して8MHzクロックで動かしているので、Aruduinoの時より、少し、表示スピードが遅いです。

写真では分かりませんが、時計IC、スイッチの作動確認プログラムもAruduinoから移植して無事動くことを確認。(時計ICの初期化を忘れて、少し、悩みましたが)

今後の計画

ハードは一応完成です。USBのインターフェースはまだ未確認ですが、何とかなるでしょう。ケースに組み込んだら、ソフトの完成度を上げていきます。

バイオリンタイマーの製作#6-制御基板設計(つづき^2)

土曜日にPICが届きました。制御基板の製作を進めます。

baum-kuchen.hatenablog.com

PICでの事前確認

いきなり回路を組んで動かないと、あとのデバッグが大変なので、ブレッドボードで事前確認を行いました。Aruduinoで作っていたプログラムをPICに移植してLCD表示だけでも出ることを確認します。

f:id:Baum_kuchen:20220123020256j:plain

無事に絵が出ました。細かい表示部品も平行して作ってたので、”VilolinTimer”のロゴも見えるかと思います。消費電力を抑えるため、内臓RCで8MHzで動かしていますのでSPIのクロックが2MHz(LCDのスペック的には最大6MHz)になりますが、描画の速度は、そんなに遜色ない感じです。

バックライト制御

最大の消費電力となるバックライトの制御は重要です。最大40mAも流せますが、そんなに流したらあっという間に電池が無くなります。3.3Vに100Ωつないでも可なり明るい感じなので、バックライト制御は、直接PICのポートに抵抗をつないで行うことにしました。

こんな感じです。片方だけONとする場合は、残ったポートに逆流しないように、入力に設定するようにします。で、問題は抵抗値をどうするかです。PICの出力電圧は、Min 2.4Vとあり、LCDバックライトの最低電圧2.9Vを満足しない可能性もありです。ちなみに、出力電流は、PORTCなら25mA Maxなので一応はOK。

f:id:Baum_kuchen:20220123023026p:plain

ということで、早速実験。

結果、

 100Ω×1(PC7のみ接続)     :電流4.2mA (PIC 出力3.1V) 

 100Ω×2(PC7、PC6の両方に接続):電流7.0mA

 200Ω×1(PC7のみ接続)     :電流2.8mA

で、電流によって明るさの違いは当然ありますが、2.8mAでもはっきり見えます。

昼間、明るいところで確認していないので、輝度を高めにできるように、最初は、100Ωと47Ω(多分8mAくらいにはなるでしょう)で行くことにしました。

基板組み立て

ほぼ完成しました。右側部分は、LCD接続用の基板が上に乗り隠れてしまいます。

f:id:Baum_kuchen:20220124015251j:plain

LCD接続用の基板を載せたところ。小さいコネクタにLCDのフラットケーブルが接続されます。

f:id:Baum_kuchen:20220124015303j:plain

今後の計画

制御基板の組立が完成したので、一通りの作動確認を行います。PICには、ブレッドボードで使ったソフトが入っているので、何事もなければ絵が出るハズです。

 

バイオリンタイマーの製作#5-制御基板設計(つづき)

制御基板の製作を進めます。

baum-kuchen.hatenablog.com

スイッチ部分(LCD面)

回路を実装していく前にスイッチの位置決めを行います。制御基板の裏(LCD面側)にタクトスイッチを付ける構想です。

f:id:Baum_kuchen:20220119233911j:plain

が、そのままむき出しは何なので、ちょっと細工を。ということで、3Dプリンタでボタンを作りました。これをタクトスイッチにかぶせます。

f:id:Baum_kuchen:20220119233847j:plain

組み上げたところ。穴の位置が制御基板のピッチと微妙にずれてしまったため、無理やり基板取付穴を削って位置合わせをしたので、中心があってません。

f:id:Baum_kuchen:20220119234241j:plain

裏カバー+スイッチ部分

制御基板表面(カバー側)にもスイッチを付ける予定。

f:id:Baum_kuchen:20220119234439j:plain

同じく3Dプリンターで作ったボタンをかぶせ、裏面カバーを閉めたところ。こっちも、センターが微妙にずれてますが、まずはこれでOKとします。(現状は、電池交換のため、裏面のネジを外さないといけないですが、この改善のため、ケースを作り直すときに考える予定)

f:id:Baum_kuchen:20220119234529j:plain

あと、ケースへの加工として、USBコネクタの取付が必要ですが、ペンディング

制御基板製作 その1

マイクアンプと時計ICまで実装しました。左のコンデンサがはみ出ていますが、ケース内のスペースが空いているのでOKです。とにかく、部品実装高さを6mmに納めないといけないので。

f:id:Baum_kuchen:20220122014830j:plain

(2022.1.21更新)

今後の計画

回路を作り出しました。注文したPICは、明日に届きそうです。