● 実験テーマ117

「電子メトロノーム_V2の実験」
(7年に前行った実験テーマ17で作ったメトロノームの、バージョンアップ版の実験を行いました。今回は、PIC18F14K50を使いました。) 
※ この実験で使った「チャイム音発生治具基板」の詳細については、実験テーマ16:「PICによる、チャイム音発生基板の製作日記」
  (山名宏治氏の製作記事による製作と動作確認まで)を参照してください。

※ 2019.7.27
→  2回目の更新です。
   ソフトを更新し、metronome_v2a.cとしました。
   BEAT 1, 2, 3, 4に、x2(1拍=8分2個)・x3(1拍=8分x3個)・x4(1拍=16分x4個)を追加しました。
   x2は、液晶に、8分音符キャラクタを2個、x3は、8分音符キャラクタを3個、x4は、16分音符キャラクタを4個
   表示して視覚的に解り易くしました。
   例えば、x3(1拍=8分x3個=3連符)は、6/8拍子系の曲を練習する時に適しています。


※ 2019.7.13
→ 1回目の更新です。
  Eagle CADにより、基板設計を行い、P板化しました。

  ・6月23日からの記事を参照してください。


以下、この実験の顛末記です。

■ 2019.6.1
  ・最近、フルートの発表会が近いせいもあり、自作メトロノームを自宅で使うことが多くなりました。
   また前々から、もっと使い勝手を良くしたいなとも思っていました。
   そこで、バージョンアップ版を検討してみることにしました。
   改善点は以下です。
    @ MPUの変更:dsPIC30F4012→ PIC18F14K50
       Fcy=29.48MHz→ 4MHzに落とし省エネ化
    A PIC18F14K50内蔵の、EEPROMに、TEMPOと、BEAT情報を保存
       次回、P_ON時、読出して前回の設定を再現する。
    B 内蔵RCオシレータ→ 外部水晶に変更し、TEMPO精度を上げる。

   最初は、ソフト変更のみで対応しようと考えたのですが、現行の、dsPIC30F4012内蔵の、EEPROMは、
   ネットで色々調べたが、製作記事も殆どなく、使い難い印象を受けました。
   以前DSPラジオでPIC18F14K50内蔵のEEPROMが使い易かったし実績もあるので、PICをこれに変更することにしました。


■ 2019.6.4
  ・dsPIC30F4012を使った昔のソースを眺めて、ADSR制御部の記述を思い起す作業を行った。
   なにせ7年前の、自前のC記述なので、今読むとコメントもやや少なく自分ながら解りにくかった。
   理解を深めようと、紙の上で、コメントを追記して、ソースを整理して行った。

   ADSR制御信号は、0.5mSタイマー割込み内で正確に、3種類の信号のタイミングを作っています。
   それが基本です。


■ 2019.6.5
  ・まずは、PIC18F14K50でタイマー割込みを使ったことはないので、0.5mS周期の割込みを、LEDトグル
   で検証するところから始めてみることにした。
   これと関連する、クロック設定も見直した。
   今回、省エネを考え、クロックダウン(Fcy=29.48MHz→ 4MHzに落とし省エネ化)することにした。


■ 2019.6.6〜 2019.6.7
  ・PIC18F14K50のタイマー割込み検証開始
   まずは、Timer1(16bitタイマ)を試してみた。
   割込み発生タイミングは、カウントアップ・オーバーフロー(65536)時点。
   webを検索していたら、TMRに設定する値を、諸条件から自動計算してくれる、ジャバ・スクリプトが記載されていた。
   こちらのサイトです。→ 「山本ワールド」
   参考にして書いたのが、以下の設定部分抜粋
   
///// Timer1をベーシックなインターバルタイマとして設定(Fosc=16MHz)
T1CON= 0b00101101; // 上位、下位8bit単位でTMR値設定・クロック源:Fosc/4=4MHz・プリスケーラ:1/4
// カウンタ入力クロック= 4MHz/4= 1MHz

//// T1周期= 0.5mS(2kHz)とする為の、TMR値設定
/// 分周比= 1000000/2000= 500
/// TMR値= 65536-500= 65036= 0xFE0C
/// 65036から65535(フルカウント)までカウントし、65536でオーバーフローし割込み発生
TMR1H= 254; // 0xFE
TMR1L= 12; // 0x0C

   この設定で、割込み内で、LEDトグルを実行すると、2倍の1mS=1000Hzになるはずが、自作周波数カウンタで確認
   すると、979〜980Hzになる?
   今は、内蔵のRCオシレータの16M(HFINTOSC)を使っている。
   この精度は、データシートによると、±2% 0℃〜 +85℃なのでこんなもんか。
   16MHzのX'tal振動子を手配して追試してみるか。


■ 2019.6.8
  ・ところで外部X'talにすると、ポート不足になる。
   液晶は、今1602タイプの4bitバス+2制御信号を使っている。
   これを、3wireSPIか、2wireI2Cタイプのものに変更してみる。
   結局、秋月から販売されている、DIP変換基板付の、I2C液晶:AQM1602XA-RN-GBW(コントローラ:ST7032)
   を使うことにした。


■ 2019.6.10
  ・外部X'talでも結果は同じだった。自作周波数カウンタで確認すると、979〜980Hzになる?
   WEBで同じような経験をした人がいた。→「PICとか電子工作とか本とか科学の話」サイト
   これによると、2500Hz(0.4mS)周期設定で実測すると、0.4118mS(2.428kHz)
   Timer1は、カウンタにプリセット値(TMR)を割込みが発生した時点で都度ソフト的にロードするタイプなので、
   その時間分、遅れる可能性が考えられる。
   そこで、プリセット値からカウントするのではなく、カウンタリセット状態からカウントアップし、
   PR2値とマッチしたと同時にカウンタリセットがハード的に行われる Timer2を試してみる。
   ソフトリセットと再プリセットが不要になり、その分のタイムラグが無くなり改善されると考える。


■ 2019.6.11
  ・Timer2の設定部分を抜粋
///// Timer2設定:T2周期= 0.5mS
T2CON= 0b00000110; // 出力ポストスケール値:1:1・T2 ON・プリスケーラ:PS= 1:16
PR2= 124; // 基準周期レジスタ値:124= N-1
// カウンタ入力クロック= (16MHz/4)/16= 250kHz= 4uS(= ワンカウントの時間)
// これを、0.5mS(500uS)にするには、N= 500/4= 125回カウントアップさせればよい。

   結果、外部X'tal(30ppm=0.0003%)の場合、LEDトグル周波数=999Hzで動かず改善された。


   ちなみにこのタイマ設定で、内蔵OSC(±2%)の場合は、998〜999Hzで変動していた。


■ 2019.6.12
  ・次のステップとして、I2C液晶:AQM1602XA-RN-GBWも初物なので、表示テストを試してみる。
   同じコントローラを使っている、アイコンも表示できるタイプの、ラズパイ製の、小型I2C液晶:SB1602Bのライブラリ
   は既に実績があるので、これを少し改版(ポート割付け・クロック設定)すれば使えそうである。

  ・ビルド〜HEX準備OK
   まずは動作NG
   上段のイニシャル・メッセージ "LCD Disp Test"が、'C'からスタートする?
   下段は正常だが、次の瞬間、■で埋め尽くされる?
   色々調査した結果を整理してみた。
    @ 初期化時、各コマンドレジスタにセットする値は、ストリナのI2C LCDの時と同じでも一応は動いた。
       一箇所だけ、秋月の説明シートの設定例と異なる項目有り。
       Follower contorolレジスタ:LCD内部の液晶駆動電圧発生ブロックのアンプ利得を決めるファクターらしい。
       Rab2:Rab1:Rab0ビットが相当→ 英文では、Select follower amplified ratioと書いてある。
       0x6B→ 秋月説明では、0X6Cだが、秋月の値を採用した。
    A 各コマンド設定後に、50uS程度のウエイトを入れないと正しく動かなかった。(秋月の説明通り)
    B 液晶初期化後、1行目にイニシャルメッセージを表示したが、最初、頭の文字が出なく、次の文字から表示した。
       初期化後、(0,0)に、ロケートしないと駄目のようだ。

   これで一応は動いた。


■ 2019.6.13
  ・一応は動いたが、Delayの時間が合ってないような気がする?早い?
   まずはFoscのマクロ定義が、4000000になっていたので、16000000に修正する。
   修正して、クリーン・ビルドしたが、何故か、クリーン段階でエラー(clean failed)発生
   たまたま、このビルド作業中に、window10の更新ダウンロードの準備が重なったせいか?→ 関係なかった。


■ 2019.6.14〜 2019.6.15
  ・今迄、clean failedになる原因としては、たまたまメール受信と重なった時が多かった。
   なのでそう考えたのだが・・・
   一度、プロジェクトを閉じて、MPLAB X IDEを立ち下げ、再起動したら、何故か、clean failedは出なくなった。(しかし数日後再発したが・・)
   一応この状態で作業を進めることにした。
   さて、Delay時間の件だが、Foscのマクロ定義を、16000000に修正すると、Delay_100msマクロ(#define Delay_100mS __delay_ms(100) )
   のところで、ビルドエラー:error:・・・・in-line dejay argument too lage 発生?

  ・#define Delay_100mS __delay_ms(100)
   
error:・・・・in-line dejay argument too lage
   このエラーメッセージから推測すると、__
delay_ms(100)で指定している、100が大きいと言っているような気がする。
   そこでwegb検索したら、「はじめてのPIC」サイトに有益な情報があった。
   要約するとこうだ。
   __delay_ms(x)
   (x)は、Fosc=4MHzで197mS以下の定数
   時間直接指定で遅延量を指定
   ※ 遅延出来る最大は、インストラクション・クロック:Fcyに換算し197000サイクル分
      なので、Fosc=4MHzで197mSが最大遅延時間になる。

   現状の、Fosc=16MHz, Fcy=4MHzなので、(x)の最大値=0.25u x 197000= 49250u= 49.25mSにまで減少する。
   これで解明した。
   100mS遅延の時は、_delay_ms(1)を、n回(n=100)繰り返す関数を利用すれば良い。
   これで、ビルドokになり、遅延時間も正確になった。

  ・あと、I2C転送スピードも、Foscのマクロ定義を、4000000から、16000000に修正したので、
   ボーレート定数マクロ:BaudConstに設定している値を変更しないといけない。
   今は、Fosc=4MHz, Fcy=1MHzで、0x09を設定→ これで
I2C転送スピード= 100kHz
   この値は、SSPADD<7:0>レジスタにセットする値で、次式による。
   Fscl= Fosc/(4 x (SSPADD + 1))
   Fosc= 16MHzの場合は、SSPADD= 0x27(39)となる。
   修正で、概ね100kHzのスピードになった。


■ 2019.6.15〜 2019.6.18
  ・metronome_v2プロジェクト開始
   ビルド〜HEX準備OK
   <デバッグ開始>
    @ 一応、BEAT/TEMPO可変出来るが、EEPROMへのアクセスが上手くないようで、
       設定範囲:BPM= 40〜200, BEAT= 1〜4のはずが、
       P_OFFして、P_ONした時、BPM= 255, BEAT= 5 になる時がある。
    → 今メインループの最後で、eeprom_writeを実行しているが、これでは駄目。
       Beat SWリードルーチン及び、Tempo(ロータリエンコーダ・リードルーチン)で直接 eeprom_writeを実行すれば
       良くなるはず。
       これを修正してビルドしたら、またまた、clean failedエラーが出た。
    A チャイム音発生治具からのテンポ音がおかしい?(ビートは刻んでいるが、ウッドブロック風の音が歪んで聞こえる)

  ・ここで、再発して気になるので、clean failedエラーの原因を追究することにした。
   一度、MPLAB X IDEを閉じて、プロジェクト・ディレクトリ下を見てみた。
   metronome_v2
    |- dist
       |- default
          |- prodaction(ここにhexが格納される)

   prodactionフォルダを開こうとしたら、
   「場所が利用できません。 C:\・・・・・・・・・・\prodaction にアクセスできません。アクセスが拒否されました」と出た。
   これは、ビルドした時出た、フェイルメッセージ:rm・・・・・・・・・permmition denier clean failed とリンクしている。

   clean failedエラーが出ない他のプロジェクトの、prodactionフォルダのプロパティのセキュリティTAGを見ると、
   アクセス許可(P):Authentiated Users(認証されたユーザー)になっている。
   ところが、エラーが出る今回のプロジェクトのそれを見ると、
   「(i)このオブジェクトのプロパティを表示するには、読取りアクセス許可が必要です。続行するには[詳細設定]をクリックしてください。」
   と出た。この指示に従ってやってみたが、権限が無いと言われて出来ない。
   しょうがないので、このプロジェクトを一度削除して、再度構築し直したら、今度は、clean failedエラーが出なくなった。
   デバッグ途中でエラーが出て修正出来なかった、eeprom_writeする場所の修正をして、ビルドしたら今度は成功した。
   この修正で、<デバッグ開始>にある、@、Aともに解決した。

   しかし何故認証不可になったかは不明?
   調べると、最近大幅更新された、windows10 v1903が原因とも考えられるようだ。
   また、読取りアクセス許可をするための[詳細設定]方法はネット検索で調べ上げたが、かなり面倒そうでまだ試してはいない。


■ 2019.6.19
  ・これで動作はokになったので、ADSR部の波形をいくつか取得してみた。
   このページ冒頭の写真にもアップされているが、自作計測器を使っている関係で、CLK1ブロックの末端が欠けていたり
   SP出力波形の、減衰部の末端部が欠けたりしているので、ここでは全体波形をアップしておきます。


---<Eagle CADで、基板設計〜P板化した記事>-------------------------------------------

■ 2019.6.23
  ・次の理由で、今回は、Ki-CADでなく、Eagle CADを使うことにしました。
   MPUを、dsPIC33Fから、PIC18F及び、LCDを、4bitバス・タイプのものから、I2Cタイプのものに変更するのみ
   なので、アナログ部は元の回路・パターンが殆ど残る。
   前作の、Eagleで作成した、boardファイルと、schファイルを元に、修正・追加する形で作業を進めた方が、効率的。
   筐体も前作のものを使いまわす予定なので、基板サイズも、主部品(操作部)の位置も変えない予定。
   ただ、I2C液晶(AQM1602XA-RN-GBW)の基板への装着が、4pinコネクタのみだと、不安定なので、支えの
   スタッドを、1本立てることにした。その固定穴が追加になる。
   また、I2C液晶のブルアップは、ピッチ変換基板上のプルアップ抵抗を使うことにし、ジャンパー・パターンを半田ブリッジした。


■ 2019.6.25
  ・新規登録パーツは、I2C液晶用4pnソケットコネクタと、DC/DC出力リップル除去用OSコンデンサ:16V470uFの、2つのみ。


■ 2019.6.26〜 2019.6.28
  ・元図の修正・回路ブロックの移動・バターン引き・ベタ生成まで行う。
   作業手順と進行具合を以下に示した。
   
@ 回路図から変更部分削除



    A アナログ部右サイドへ移動
    B GND分離境界線位置変更
    C LCD支えスタッド固定穴+禁止帯追加
    D 回路図追加分入力後、LCDコネクタ配置
    E ERCチェック
    F PIC_XTAL等配置
    G +5V配線
    ➈ 手配線暫定終了
    I 残りデジタル・ネットを、オートルータで引かせる。
    J DRCエラー修正
    K シルク整理+STOP ON+ベタ生成+最終DRCでOKを確認



■ 2019.6.29
  ・
ガーバ作成〜ビューワ(gerbv及び、fusion pcbビューワ)での確認まで行う。

  ・これでよさそうなので、正式発注を済ませる。


■ 2019.7.5
  ・ステータスが、深圳より出荷済になった。


■ 2019.7.8
  ・17:00頃、DHLの運転手さんから、外出先に電話が入り、「郵便受け口に、入れておきます。」との
   連絡が入った。
   留守にしていたが、再配達にならず、DHLさんには、感謝です。
   P板到着です。
   見た目、問題無さそうです。
   今回は、シルクも割と綺麗でした。


■ 2019.7.9
  ・午前中に、実装完了

  ・チェック開始
   @ 新品の単4アルカリ乾電池を用意した。
      単品実測=1.6V
      3本直列実測(無負荷)=4.84V(DC/DCは、昇圧型・Vin(max)= 5.0V)
   A +5V⇔GND間のショート・チェック(テスターにて)→ OK
      DC/DC出力に、低ESRの電解コンデンサが実装されているので、テスト棒を当てた瞬間は、≒1kΩ以下。
      次第に、6kΩ位まで上昇。
   B IC未実装・SP未実装・液晶未実装で、+5V確認
      Vcc= 5.00V ・リップル≒ 15mVp-p ・Vbat=4.85V

   C ICを実装し、HEX書込み→ OK

   D 液晶・SPを実装して音出し動作確認
      一応動作確認OK
      VRは中央付近。音出し動作中の、Vcc= 5.00V(Vbat= 4.78V)
      リップルは若干下がり≒10mVp-p
      しかし、スイッチングノイズが重畳する。多少「シャー」というノイズ音が聞こえる。

  ・電池の消費電流:Ibatを測定してみた。
   VRmin(スタンバイ時)≒ 21mA
   VR中央(音出し)≒ 25mA
   VRmax(音出し)≒ 38mA

  ※ 以前の、metrenome(Fcy=29.48MHz)の時は、100mAオーダーで負荷電流が流れていたので、150mA位と考えられる。
     それと比較するとかなりの省エネと言える。


■ 2019.7.12
  ・
あまり気にならないレベルだが、「シャー」というノイズ音の原因は、はっきりしない。DC/DCモジュール内部の
   コイル電極と、ショットキーダイオードの接続点に発生する、MOSFETによるスイッチング・ノイズが関係している
   ものと思われる。しかしノイズ経路が難解。
   最大スイッチング周波数は、200kHzであるが、今回のように負荷電流が少ない時は、可聴周波数帯の、20kHz以下
   程度になり、耳障りな感じになる。
   下写真のように、Vcc=5Vに重畳する、スイッチングノイズの周期は、この周期と一致する。

  ・電池電圧が下がってきた時の動作確認をした。
   単4電池1本(単体無負荷実測:1.51V)にして動くか確認。
   問題無く動いた。
   VRmin(スタンバイ時)の、Vbat= 1.45V, Vcc= 5.02V
   VRmax(音出し)の、Vbat= 1.41V, Vcc= 4.94V

   DC/DCモジュールの取説によれば、Vbat=1.5V時の、最大出力電流は、25mAなので、実負荷に流れる
   電流は、それ以下なことは確かなようだ。(実測はしてないが、20mA程度と思われる。)

  ・とりあえずは、省エネ化も、EEPROMへの設定値の書込み・読出しも上手く行ったので、これでこのプロジェクトは
   クローズすることにした。
   DC/DC電源については、未だ解らない事が多く、今後個別にじっくり実験してみたい。


<回路図>
 ・こちらからどうぞ
 「METRONOME_V2実験」
              「METRONOME_V2」(Eagle回路図)→ LM3900NによるADSR制御回路部は、山名宏治氏の製作記事のものを片CH分拝借させて頂きました。

<最終ソース・ヘッダファイル>
 ・こちらから、どうぞ
    /// メインソース
     metronome_v2.c
         metronome_v2a.c : 190727更新(
BEAT 1, 2, 3, 4に、x2(1拍=8分2個)・x3(1拍=8分x3個)・x4(1拍=16分x4個)を追加しました。)

     /// I2C液晶ライブラリ
             AQM1602XA_i2cLCD.c : 190727更新(ファイル名は、そのままにしました。)
                   ユーザー定義キャラクタ、以下2個を音符キャラクタに置き替えました。
                   キャラクタ・コード= 0x06:Checkered→ 8分音符
                                          キャラクタ・コード= 0x07:Smole Dog→ 16分音符
             AQM1602XA_i2cLCD.h 


← 実験テーマ1に戻る   TOP PAGEに戻る   実験テーマ118へ →