● 実験テーマ118
「電子メトロノーム_V3の実験」
(液晶をGLCDに変更し、ビート音に合わせ振り子が動く様を表現しました。今回は、PIC16F1938を使いました。)
※ 191001
→ 1回目の更新です。
Eagle CADにより、基板設計を行い、P板化しました。
・9月15日からの記事を参照してください。
※ TG12864Eの振り子デモ動画です。
こちらからどうぞ→ video001.mp4
: ファイル・サイズ=196KB/ 画面サイズ=QVGAサイズ
以下、この実験の顛末記です。
■ 2019.8.13
・metronome_v3計画
機械式メトロノームの振り子を液晶上で表現してみたい。
適当な液晶が?
大きさ的には、SG12864A互換で小型版:TG12864E(心電計で使用)が丁度良さそう。
また心電計では、PIC16F1938(フラッシュ:16kword・SRAM:1kbyte・EEPROM:256byte)を使っていて
実験用のユニバーサル基板+治具ケーブルも作成しているので、これをそのまま使える。
これを使って動画テストを進めていく。
・例として、60bpm=1秒周期時の、振り子の描画(動画)を考えてみた。
最初メトロノームの針の動きを勘違いしていて、往復で、1拍と思っていた。
途中で気が付いたが、暫くはこの考えで進めてしまった。経過を残す為に、そのまま記述します。
まず、針描画の本数は、計5本(中央+分割角度=30度で、右端から左端まで、120度のふり幅)にした。
以下に、単純にその5本の静止画を描画した画面をアップしました。
時間換算だと、125mS間隔で往路・復路を繰返せば、片道0.5秒・往復1秒の描画
が出来るはず。
動いている風に見せるには、前回描画した針(ライン)を消しながら移動先の針を描画して行けば
良いはず。
最初(MovePendulumTestプロジェクト)は、ベタにメインで、0.125秒の遅延をしながら、
往復1秒の振り子動画を考えてみた。
■ 2019.8.15
・MovePendulumTestは上手く行く。
振り子が動いて見える。本数は少な目だが、そんなに違和感は無い。
次のステップは、タイマー割込みで考える。
■ 2019.8.16
・MovePendulumTest_2
0.5mS周期T2割込みで、同様の60bpm固定振り子動画テストを行う。
一応動いている様子。
詳細は見ていないが・・
■ 2019.8.17
・MovePendulumTest_3
0.5mS周期T2割込みで、60bpm固定の振り子動画テストを行う。その2
今回は、テンポ:BPM可変(40〜200)で試せるように、パラメータを一般式で与えてみる。
テンポ:BPMと、ビート周期:Beat_Period、最大T2カウント:T2_count_MAXの間には
次の関係がある。
Beat_Period = 60000/BPM
T2_count_MAX = Beat_Period * 2
針の描画間隔 = Beat_Period/4
T2_count値によって、case分岐し、それぞれの針描画処理を行うようにした。
■ 2019.8.18
・続MovePendulumTest_3
メトロノームの針の動きを勘違いしていた。
往復で、1拍と思っていた。
片道で1拍(発音)、往復で2拍(発音)が正しかった。
ソースを修正した。
音と振り子描画の、割込み数カウント変数を別にして管理することにした。
各パラメータの関係は以下の通リにした。
音:
Beat_Period = 60000/BPM;
T2_count_MAX = Beat_Period * 2;
振り子:
Pendulum_Period = Beat_Period*2;
Pendulum_count_MAX = Pendulum_Period * 2;
例えば60BPMの場合、1000mS間隔で発音し、250mS間隔で振り子描画を繰返せばよいことになる。
結果、一応は動てはいるが、発音間隔と、描画間隔が倍近く間延びしているようだ。
現在割込み内で描画処理も行っている。
直線描画処理には、数10mSの時間を要する為、割込み周期内で処理が終わらないためと考えられる。
■ 2019.8.19
・続MovePendulumTest_3
振り子動画処理をメインに移して、割込み内の処理を軽くしてみた。
割込み内では、動画処理シーケンスの番号(case番号)のみを取得して、メインに渡すことにした。
結果これでも駄目だった。
懸念はあったがメインでの針(直線)描画中に頻繁に割込みが入るために、時々ゴミが表示されてしまう。
あとled点滅周期が、2秒近くになってしまう。
■ 2019.8.24
・MovePendulumTest_4
多重割込みを使ってみる。
0.5mS周期T2割込みで、ビート音制御、
75mS周期T4割込みにて、シーケンス番号を割込み中で取得しメインで振り子動画処理
尚、75mS周期というのは、振り子(直線)描画で、最小の描画間隔になる、200BPMmaxの時の
割込み周期(300mS/4=75mS)である。これを基準に各BPMの時の、描画間隔時間を求める考え。
<結果>
60BPMにての描画は見た感じOKだが、音タイミングが途中から微妙にズレてくる感じ。
しかし修正前よりは、かなり良くなった。
■ 2019.8.27
・MovePendulumTest_5
0.5mS周期T2割込みで、ビート音制御→1mS周期T2割込みに変更(多重割込みはそのまま)
swでbpm可変にしてみる
メインで描画中に入ってくるT2音割込みの頻度を半分にすれば、描画及び音間隔への影響
が少なくなるのではと考えた。これを試す。
また1mS周期T2割込みに変更すると、音程がオクターブ下がって、
頭の音:500Hz(楽音の中央ドの8va上に近い音)→ 修正前は、1000Hz
頭以外の音:250Hz(楽音の中央ドに近い音)→ 修正前は、500Hz
になりオクターブ低い音域になるが、対象楽器がフルートなので低い音の方がマスキングされにくい
のでgoodと勝手に思っています。
尚、現在音出しは基板を改造して別基板(チャイム音発生治具)に渡す信号をコネクタ出ししないと出来ないので、
LEDにてタイミング確認している。
<結果>
やや良くなった感じ。
中華オシロのカウンタで、60bpm時のを見ると、1秒毎にトリガしていて、1Hzになっている。
ただ、振り子とは途中から若干ズレてくる感じに見える。
■ 2019.8.30
・実験基板を改造して音出しまで確認することにした。
以下に、コネクタ出し改造後の基板の様子をアップしました。
■ 2019.8.31
・GLCD用キャラROM(フォントテーブル)に、8分音符と16分音符を追加した。
妥協レベルまで来たので、ここらで、metronome_v3プロジェクトとして進めることにした。
■ 2019.9.5
・懸念はしていたが、T4割込み周期=75mSでは、指定BPMによるが、振り子の直線描画間隔の時間がピッタリ出ない。
例えば、60BPM時の振り子の直線描画間隔の時間は、75mS x 200/60= 75mS x 3.333という
フローティングでの計算が必要になってくる。整数型にしているので切捨てられ75mS x 3= 225mSとなってしまう。
なので、T2=1mS周期の中で全て時間管理をしないと振り幅が不正確になる。
これから先は、T2=1mS周期のみ使って試す。
■ 2019.9.9
・metronome_v3
メインでの直線描画処理時間を短くできれば割込みの影響が少なくなるのではと考えPIC16F1938を最高速:32MHzに設定して試してみた。
最高速:32MHzで動かしてみる。(修正前は、8MHz)
Condition変更:
8MHz 内部クロック→ PLL有り
Fcy=8MH x 4= 32MHz, Tcy=31.25ns
<結果>
ゴミの出方が激しくなる(直線の周囲に発生、たぶん読込時)以外は、40〜200bpmのフル範囲で、音と振り子動画の同期が改善された。
またビート周期精度も上がった。音程が低くなったが問題無し。
BPM Fカウンタ実測値[Hz] 改修前[Hz]
------------------------------------------------
40 0.665 0.633
50 0.831 0.782
60 0.997 未測定
100 1.662 1.478
120 1.995 未測定
200 3.326 2.660
■ 2019.9.10
・描画中のT2割込みの影響(タイミング)が丁度良くなる頃合いがあるのではと思いクロック設定を少し下げて、16MHzにしてみた。
16MHzで動かしてみる。
Condition変更:8MHzからの変更
16MHz 内部クロック→ PLL無し
Fcy=16MHz, Tcy=62.5ns
<結果>
ようやく使えそうな物が出来た!!
@ 40〜200bpm全域で、ゴミ出なくなった。
A ビート音と振り子動画も、見た目、同期している。
B ビート周期精度も、ok
BPM Fカウンタ実測値[Hz] 理論値[Hz]
--------------------------------------------------
40 0.664 0.666
50 0.830 0.833
60 0.996 1.000
70 1.163 1.167
100 1.661 1.666
120
1.993
2.000
200 3.321
3.333
---<「Eagle CADで、基板設計〜P板化した記事>-------------------------------------------
■ 2019.9.15
・予めセクションペーパー上で、主な部品の配置を検討した。
■ 2019.9.16
・回路図入力終了後、ERCチェック+NET LISTチェック→ 問題無し。
ERCチェックの結果、幾つかワーニングが出たが、全て承認出来るワーニングなので、OKとした。
■ 2019.9.18
・DRC+シルク整理が済、Eagleでの作業が完了した。
・ガーバーデータを、CAMプロセッサで作成し、gerbv及び、FusionPCBサイトの、ビューワにて確認した。
・これでよさそうなので、正式発注を済ませる。(運送業者はDHL)
尚、15%OFFのキャンペーン期限:9/20にぎりぎり間に合ったので、何時もより若干安くオーダー出来ました。
■ 2019.9.21
・FusionPCBでの、P板製造行程完了となった。
WEB上のマイページにて確認した。今回より作業行程進捗度合いが、より詳細に判るようになっていました。
■ 2019.9.23
・ステータスが、「追跡可能:Traceable」になった。
DHLサイトの荷物追跡システムにて確認すると、「出荷(shipped)貨物情報がDHLに送信される」となっていた。
■ 2019.9.26
・ステータスが、「8:41
国内配達業者への荷物引渡し完了」になった。
佐川急便に荷物引き渡されたようだ。
朝方の話だったので、今日中には到着と思っていたが、今日中には届かなかった。
■ 2019.9.27
・今朝10:00にようやく、P板が到着した。
見た目、問題無さそうです。
シルクも割と綺麗でした。
■ 2019.9.28
・部品実装完了
・チェック開始
@ 多少使用したが殆ど新品の単4アルカリ乾電池を用意した。
3本直列実測(無負荷)=4.66V(DC/DCは、昇圧型・Vin(max)=
5.0V)
A +5V⇔GND間のショート・チェック(テスターにて)→
OK
DC/DC出力に、低ESRの電解コンデンサが実装されているので、テスト棒を当てた瞬間は、≒1kΩ以下。
次第に、6kΩ位まで上昇。
B ICはPICのみ実装・SP未実装・液晶未実装で、+5V確認
Vcc= 5.01V・Vbat=4.66V
C HEX書込み→ OK
D 残りのIC・液晶・SPを実装して音出し動作確認
一応動作確認OK
VRは中央付近。音出し動作中の、Vcc= 5.01V(Vbat=
4.59V)
リップルは≒25mVp-p(_V2より倍ちょっと増加)
しかし、スイッチングノイズが重畳する。多少「シャー」というノイズ音が聞こえる。
聞いた感じは、_V2とさほど変わらないので良しとした。
(DC/DCでなく、電池を006Pの9Vにしてドロッパー式の3端子レギュレータにした方がノイズに対しては有利かも
しれないので追試で試すかも・・・ ただ電池の持ちが問題だが・・・)
・電池の消費電流:Ibatを測定してみた。_V2より、約5mAアップ
VRmin(スタンバイ時)≒ 24.7mA
VR中央(音出し)≒ 30mA
VRmax(音出し)≒ 45mA
・音出し中のスピーカー端子間の波形を取ってみた。良さそうです。
V2よりオクターブ低く設定しました。
・最後に、上下ケースを組合わせていた時、気が付いたのだが、今回、基板サイズを、Y方向5mm大きくしたせい
で、SPの取付けビス(3点の内の頂点の1個)の頭が、DC/DCのピンに当たってしまう。
DC/DCのピンは元々長目なので短くカットし、それでも数mmのギャップで安全のため、このビスとナットのみ
樹脂製のものに変更することで対処した。
<回路図>
・こちらからどうぞ→ 「METRONOME_V3実験」
「METRONOME
V3」(Eagle回路図)
<最終ソース・ヘッダファイル>
・こちらから、どうぞ:
/// メインソース
metronome_v3.c
/// グラフィック液晶ライブラリ
glcd_PIC16F_lib_v2.c
glcd_PIC16F_lib_v2.h
/// フォント・データ
font_add_note.h