● 実験テーマ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へ →