● 実験テーマ71

「dsPIC33F_WAVプレーヤ_V2の、製作実験記」
(テーマ57で作ったプレーヤの液晶を、超小型GLCD"AQM1248A"に置換え、リスト表示選択方式のプレーヤにしてみました。) 

※ 161211:
→ 液晶を、超小型GLCD"AQM1248A"から、最近使ったノキア液晶5110に置換えました。
   そして、バージョンを、V3としました。
   液晶が縦長になったので、文字高も高くなり、リスト表示の視覚性が改善されたと思います。
   12月5日からの記事を参照してください。

※ 161221:
→ ソフトを更新しました。V3aとしました。
   現在は、Skip SWによる順送りと、順方向のループ再生のみの機能ですが、
   Home SWを、MODE切替SWにして、電源ON後、このSWの状態を読込み、
   押されていたら、Skip SWによる逆送りと、逆方向のループ再生機能に切替えられるように
   しました。もちろん、バック・スクロールもします。
   12月13日からの記事を参照してください。


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

■ 2015.10.26
  ・もう70テーマも公開してきたので、次のテーマを何にしようかと考えてもなかなか決まらない。
   安上がりに出来るテーマを探している。

   WEB検索をしていたら、「はじめてのPIC」というサイトの岩本さんの記事の中に、
   PIC18F14K50を使って、超小型GLCDの表示デモを行っている記事があった。
   超小型でありながら、128x48dotの解像度のモノクロ・グラフィック液晶
   (SPI制御)なので興味を持った。
   ライブラリもそのサイトに公開されていたので、まずは単体表示テストを
   自作の、PIC18F14K50トレーニング基板にて行うことにした。

   尚この液晶は、秋月で、LCDピッチ変換キット「AE-AQM1248」と称して、750円で販売している。

   これを何に使うかだが、以前作った、WAVPlayerの液晶を、これに置換えて、リスト表示選択方式
   のプレーヤにしようと考えた。
   (後閑さんのHPには、Wi-Fiでダブレットにリスト表示するものは載っていたが、その簡易
   スタンドアロン版といったところ。)

   少しの改造(2本ライン追加)で前のハードを流用できそうである。
   また、液晶の部分は、接続変換基板を自作すれば、そのまま差替えて使用できそうである。     
 


■ 2015.10.28
  ・基本、「はじめてのPIC」サイトに載っていた、表示デモ・プロジェクト(
PIC18F1K50使用)のまま、
   (但し、ライブラリの名前は今迄の私の慣習から、Libの文字を入れリネームした。
    また、サイトのは、XC8を使ってるが、私は、MPLAB IDE V8.6+C18を使用した。)
   新規プロジェクトを組み、コンパイルしたが、何故かリンクエラーが発生してしまう。
   以下のメッセージだが、その意味が不明
   「Error - section '.idata_AQM1248A_Lib.o' can not fit the section. Section '.idata_AQM1248A_Lib.o' 
    length=0x000001e0Errors」
   :1Link step failed.

   どうもサイトのは、SPIを、18F14K50の専用モード(MSSP SPIモード)で動かしているようだ。
   私が最終的にやりたいのは、以前作った、WAVPlayerの、dsPIC33Fでの単純ポートでのSPI実現なので、
   このエラーの深追いをしてもしょうがないのだが・・・
   とりあえず、このまま、SPIを単純ポートで制御するように、ソースを変更してみた。
   当然これでコンパイルしても同様な、リンク・エラーが発生する。
   このエラーに関して、WEB検索したら、「PIC体験記/JA1HHF」というサイトにC18コンパイルエラーの対応例
   載っていて、このエラーに対する対処法も載っていた。
   次のようにすると、うまくコンパイルできるらしい。(ビルドオプションの設定)
   Project
    ↓
   Build Options... → Project
                 ↓
       Build Option For Project "xxxx.mcp"
              (xxxx.mcp はコンパイルしようとしているソース)
         ↓
      MPLAB C18 → Categories... → Opitmization
                              ↓
                            Enable all
                     ラジオボタンにチェックを入れる
                              ↓
                              OK
   しかしこの設定にしてみてもエラーは消えなかった。
   ここで、エラーの内容をもう一度よく見てみた。
   リンクエラーの内容にある数値:length=0x000001e0であるが、これは10進で、480(バイト)
   思い当たる数値である。
   この数値は、今回サイトで使用しているフォント・テーブルの配列の容量:chrom[96][5]= 480バイト
   である。
   これが入り切れないと言っているようだ。(またそういう問題か・・・)


■ 2015.10.29
  ・リンクエラーの意味は分かったが、解明できず。
   最終ターゲットはこのMPUではないので、このプロジェクトはやはり深追いしないで中断した方がよいようである。
   最終ターゲットの、dsPIC33Fで表示実験をやることに切替えた。
   最初の実験は、WAVPlayerから、そのMPU抜いて、自作オシロ初号機のハードに差替えて実験しようと思う。

   早速、表示テストプログラムを作成し、コンパイルも一応通ったが、以下のワーニングが多数発生。
    @ "array subscriput has "char"
    A "comparison is always false due to limited range of data type"

   Aのワーニングは、フォントテーブル:chrom[dat][i]を、unsigned charで宣言しているのに対し、
   例えば、GLCDに一文字表示する関数:LCD_dat()の中で、その文字パターンを読込んでいる変数
   chptnは、charで宣言されていて、変数の型が異なりますよと言っていることになる。
   本来は、unsigned charでないと駄目なはず。
   直したら、Aのワーニング2点は無くなっが、@は残った。


■ 2015.10.30
  ・@のワーニング:"array subscriput has "char"の意味を調べた。
   「配列の添え字に、charを使うのはNG」
   ※ 使うなら unsigned charを使う。
   ということらしい。
   ところで、添え字て何?
   もしかしたら、配列の要素数([]内の数値)のこと?
   私は昔からそう覚えていたが、同じ意味のようだ。

   ということで、添え字のところも、unsigned char宣言に修正。
   当然だが、プロトタイプ宣言のところも修正しないと駄目。
   また、プロトタイプ宣言している関数の引数のところは、型宣言のところのみを記述し、変数名は
   省略可能であることを初めて知る。

   この修正で、@のワーニングも全て消える。
   これでやっとハードウエアの準備に入れる。

  ・簡単にバラックで、治具を製作し、HEX書込みまでOK。
   表示テストのメニューは、オリジナルのまま(3倍・2倍・標準サイズフォントでのサンプル・デモ)
   だが、この表示は、1発で動く。

  ・表示テストに、本番のデモを、2つ組込むことにした。
    @ 電源ON時の、タイトル表示
    A WAVファイルのリスト表示
   まず、@からやってみる。
   これは上手く行く。


■ 2015.10.31
  ・Aをやるが、おかしい。
   私は、WAVファイル名によくアンダーバー:"_"を使うが、これが次のコードの "`"になってしまう。
   特定のキャラクタで、1つ、読出すフォントデータ(の格納されているアドレス)が、ズレルようだ。
   記号などのフォントを読み出す時におかしくなっているようだ。
   オリジナルのフォントデータは記号などは、幅狭に表示できるように、適当な位置に0xFFを挿入
   して、それを終端コードとして実現しているが、この辺が気になる。


■ 2015.11.1
  ・そこで、どのキャラクタでおかしくなるのか、フォントテーブルにある、ASCIIキャラクタ全96文字
   を表示するプログラムを追加し試してみた。
   1行に16文字表示したら改行を行えば、6行(1画面)に全て表示できる。
   結局、バックスラッシュ:0x5CまではOKだが、0x5D:"] "から、1つズレて
   (0x5Dの時、OX5Eの" ^ "が表示される。)表示していることが分かった。
   下の写真をよく見ると、" ] "が表示されてなく、そこから1つズレていることが分かる。


■ 2015.11.2
  ・昨日の現象よく解らないが、もしかしたら、ソフトウエアSPIの場合、SPI転送スピードが高速
   過ぎて、ギリギリで動いているのでは?
   ちょっと、この液晶のSPIスピードの仕様を調べてみた。
   MAX 20MHz(50nS)なようだ。
   現在、Tcy= 25nSで、1命令は通常2クロックなので、50nSでクロックをトグルすると考えれば
   スペック的には、ギリギリだがOKなはずだが・・・

   ところでオリジナルの岩本さんの、MSSP SPIモードでの設定はどうかというと、
   SSPCON1レジスタの設定値が、0x30となっているので、デフォルトの転送速度
   FOSC/4= 16M/4= 4MHz になっている。
   自分のソフトウエアSPIのクロックスピードを、4M近くに落としてやってみたが、それでも
   同じ現象が起こる。


■ 2015.11.3
  ・オリジナルのフォントデータは記号などは、幅狭に表示できるように、適当な位置に0xFFを挿入
   して、それを終端コードとして実現しているが、この辺がやはり気になる。
   ちなみに、表示されない0x5D:"] "は幅狭まフォントである。

   ところで今回、標準アスキーフォントの他に、特殊フォントキャラクタも使う予定なので、全96フォントでは
   容量不足である。

   この現象を深追いするのはやめ、(単なる逃げ?)フォントテーブルをオリジナルのものから、
   私が自作オシロなどで以前から常用している、後閑さん作成のフォントを元に特殊キャラクタを追加した
   テーブル(全192フォント)に置換え、幅狭ま表示はやめて、全て通常表示にしてみることにした。

   ※ これでソースを修正したら、全てOKになった!!


■ 2015.11.4
  ・自作オシロ初号機のハードを使っての表示テストは上手く行った。
   本番のソフトを検討する前に、WAVPlayer本体のハードでも同じ表示テストが出来るように
   ソースを作成し、HEXまで用意した。
   オシロのハードと異なる部分(クロック構成が主)を変更しただけなので割と簡単に済んだ。
   この時のソースは、このページの末尾にアップしました。

   本体ハードの簡単な改造と、液晶部のサブ基板(接続変換)を作らないといけないが、
   本番のソフトの方が上手く行くか不安だったので、先に本番ソフトの検討に入ることにした。


■ 2015.11.5
  ・本番のソフトを検討した。
   ちょっとフローチャートを書いて頭の中を整理しないと先に進めない感じがする。
   リスト表示・選択方式のプレーヤのソフトは、以前テーマ42(VS1053Bデコーダ使用)で自作して
   いるので、それ(@ SD_File_List_LoopPlayer256_TEST.c)を参照することにした。
   それと、A WAVPlayer.cのソースを上手く組合わせて、1つにまとめる必要がある。

   最初は、@のソフト(VS1053Bデコーダ使用)を骨格とし、これを、44.1kサンプルの、WAVPlayer
   に適合させるようにしようと考えた。


■ 2015.11.6
  ・とりあえず、@ SD_File_List_LoopPlayer256_TEST.c の全体フローをラフ書きして、当時考えた
   動作の流れを思い出して行った。
   どうやって1つにまとめて行くか考えてみた。
    @ 骨格は、このSD_File_List_LoopPlayer256_TEST.cのソースを使う。
    A 主に異なる部分は以下。
      ・再生の方法(VSデコーダを使うのと、DAC割込みを使うのとの違い)
      ・再生の終了処理(VSデコーダを使うのと、DAC割込みを使うのとの違い)
      ・再生の中断処理(VSデコーダを使うのと、DAC割込みを使うのとの違い)
      ・再生曲数のMAXを、256曲から、100曲に変更(WAVファイルのサイズは、1曲≒30Mと膨大なため)
      ・スクロールポイント: 9曲目から、7曲目に変更
      ・液晶が異なるので、記述を変えないといけない。
      ・SWは長押しが有効になるように、レベルセンスでよいような気がするので、それで書く。

  ・それから、以前の、WAVPlayerの、MODE SWの機能の内、テストトーン発生機能は、使わないので
   今回は、ホーム画面に戻って最初の曲から繰返す、HOME SWとして置換えた。

  ・これから先は、プロジェクトを作成して、メインソースを書きながら考えて行けばよいかな・・・


■ 2015.11.8
  ・一応なんとかソース書き上げる。
   出来たソースは、最初考えていた、@ SD_File_List_LoopPlayer256_TEST.c を骨格ではなく
   A WAVPlayer.cのソフトを骨格として、面倒なスクロール表示のルーチンは、1つの関数で
   一括管理するように、まとめ上げた。
   その方が結果的には、すっきりしたシーケンスの流れになった。

  ・FAT16があるので、プロジェクトの設定がやや面倒と思ったが、FAT16関係のファイルが全て
   ルートにあるので、ビルド・オプションの設定は必要なかった。
   コンパイルエラーは出なかったが、またもリンクエラー発生??
   どうもまたメモリ不足らしい。(FSIO.oの関係で、512バイトのスペースが取れない???)


■ 2015.11.10
  ・フォントテーブルの容量を大幅に増やしたので、それで足りないのかと思ったが、
   const指定で配列を宣言しているので、プログラム(フラッシュ)メモリ上に配列されるため
   RAMエリアには関係なかった。(ROMエリアは十分足りている。)
   結局、今回追加した大きなサイズ:1.3Kの、ファイル・ネーム・バッファを、far属性を付けて
   配置したら、リンクエラーが無くなった。
   ちなみに、コンパイル後のメモリ使用量は、以下であった。
   プログラムメモリ: 13538バイト/全22016バイト
   データメモリ   : 14744/全16384バイト

  ・やっとハードの準備に入れる。
   V2用の液晶接続変換基板を作った。

   また本体の改造も済ませる。(2本配線追加と、ピンヘッダ1ヶ追加のみ)


■ 2015.11.11
  ・まず、予め用意しておいたV2ハード用の表示デモHEXを書込み表示テストを行った。
   これは問題なく動いた。
   デモの内容は、自作オシロ初号機のハードでやった時と同様です。

  ・いよいよ本番のHEXを書込みデバッグ開始である。
   いろいろとミス(殆どがイージーミス)があったが、本日3時間ほどのデバッグで、当初考えた通り
   の機能が実現できた。
   もう少し苦戦するかと思ったが、最初に頭を整理してから取り掛かったのが良かったようだ。

   そのデバッグ途中の出たミスを列記してみる。(時系列)
    @ 症状:オープニング画面が出て、緑LED(SDマウント表示)点灯するが、先に進まず。
          (初期ファイル・リスト表示せず。)
       原因・処置:SDカード用SPI信号のピン割付(RP*)が抜けていたため、FSInit()でループ
              していた。→追加する。

    A 症状: a.初期リストが出て再生が始まるが、マーカーが表示されない。
                        b.総曲数は出るが、'Tot'が表示されない。
       原因・処置:a.最初のファイル再生時のマーカー表示が抜けていた。→追加
               b.Y座標値のミス。.→4を、0に修正

    ここで、曲が入っているSDカードだとデバッグが効率よく進まないので、オーディオ・テクニカ
    のテスト・トーンが入っている短か目(各10数秒のトラック・12曲分)のSDカードを使うことにした。
    以下続きです。

     B 症状:SKIP SWを使わない通常のループ再生で以下がNG
          1曲目は、OK。2曲目への移行・再生表示もOK(ただ、Num表示が、1のまま)
          ここから、3曲目へ移行しないで、2曲目の再生を繰返してしまう。
       原因・処置:マーカー表示の時、1つ前のマーカーを消してから、カレントのマーカーを
          表示するが、その時
          FileNo--;
           LCD_posyx(FileNo, 0);
          LCD_dat(0x20);
          としていたため、FileNoが、-1されてしまっていた。
          そのため常にその曲の繰返しになってしまう。
          → これは、上記1行目で、FileNo--;とやらず、2行目で直接、 LCD_posyx(FileNo-1, 0);
             と書けばよいだけ。
             また、曲番表示がNGなのは、初期リスト表示の時、その関数が抜けていただけ。

     C 症状:7曲目からのスクロール表示がNG。但し、曲は、7曲目に送られ再生はしている。
       原因・処置:スクロール表示ルーチンの記述ミス。Y座標のインクリメントが2つおきになっていた。
              → 1つおきに修正。(これで通常のループ再生とSKIP再生はOKになった。)

     D 症状:HOME SWの動きがおかしい。再生中に、HOME SWを押すとマーカーは頭に戻るが、
          表示がチカチカとおかしくなる。
       原因・処置:HomeFlagと、関連変数の初期化が抜けていたため。→ 追加で、HOME SWもOKになる。


■ 2015.11.12
  ・ここまでを整理してドキュメントを公開することにした。
   実際の動作の様子は、このページトップの写真を参照してください。


---<ここから、ソフト・ハード更新(V2→ V3)の記事>-------------------------------------

■ 2016.12.5
  ・現在の液晶(AQM1248A: SPI/ 128x48dot)では、何とか、6曲分のリスト表示を出来るが、
   何せ、超小型なだけに、文字が小さくて読みずらい。(この辺は、妥協して使ってました。)
   これを最近、使った、ノキア液晶5110(SPI/ 84x48dot)に置換えてみる。
   サイズ的に、縦方向が広くなったので、同じ解像度でも、文字高が高くなり読み易くなる。

   SPIの制御信号も、全部で5本(SDA・SCL・CS/(SCE/)・RS(D/C)・RST/)と同じである。
   ただ、
AQM1248Aの方の、RST/ピンは開放・未使用だったが、ノキア液晶5110の方は
   使うので、この出力ポートが必要になる。
   これは、現在、カード検知表示LEDとして使っている、RA1ポートを割り当てることにした。
   ただ、LEDポートにも切り替えられるように、ピンヘッダを立て選択出来るようにしておく。
   また、カード・サーチ中(赤LED点滅)と、カード検知(緑LED点灯)としていたが、今回
   どちらも、液晶の制御信号として使うので、これらのメッセージは液晶に表示することにした。

   問題は、横方向の解像度が、128dotから、84dotに減少したので、ファイル名の表示を
   拡張子(".WAV")を含めて表示出来なくなったことだ。
   これは、省略してファイル名本体(最大8文字)のみを表示する関数を追加して対応した。
   元々WAV再生専用なので、これで問題ない。

   ハード的には、液晶サイズが縦方向に大きくなったので、変換基板の頭が、前面アクリル板
   から約5mmほどはみ出すが、気になるほどでないので、これで行くことにした。

  ・ノキア液晶5110を手配する。


■ 2016.12.6
  ・変換基板の加工と、液晶冶具ケーブルの作成を済ませる。


■ 2016.12.7〜 2016.12.8
  ・ソフト修正作業に入った。
   前記した以外にも細かい修正が必要になる。
   以下、概要を列記した。(詳細は、このページ末尾にアップしたソースを参照してください。)
    @ WAVPlayer のハードに合わせ、液晶制御ポート定義修正
    A 遅延関数は、後閑さん作成のライブラリ(dsPIC33F)のものに置換えた。
       これは、Fcy=40MHz専用なので、源発振の定義は削除した。
    ⓷ 
AQM1248Aライブラリと、ノキア液晶5110ライブラリでは関数名及び、使い方が異なるので
       修正。(例:LCD_clr ();→ LCD_clear(LCD_WIDTH * LCD_BANKS);)

  ・冶具ケーブルに、このあいだ作った、グラフ表示温度計から、液晶を外し、取付けて
   動作確認を行った。
   特に問題なく、殆ど1発で動いた。


■ 2016.12.9
  ・
ノキア液晶5110が届いたので、変換基板に実装した。

  ・これを、本体に組み込み、最終動作確認OKとなる。
   動作の模様は、このページトップの写真を参照してください。


---<ここから、ソフト更新(V3→ V3a)の記事>-------------------------------------


■ 2016.12.13
  ・逆送り再生については、HP未公開であったが、去年の11月と今年10月にチャレンジしている。(この時点ではV2のハード)
   この時(今年10月)は、現Home SWを、Back Skip SW、Skip SWを、Front Skip SWとし
   異なるモードからの途中切替え(順送り→ 逆送り or 逆送り→ 順送り)を目指して
   チャレンジし始めた。
   ところが、上手く行かなく保留にしていた。
   NGな点と、今回、対処した事を整理すると以下である。
    @ 初期画面の1曲目再生中に、Back Skip SWを押すと、最後の曲にマーカーが移動して
       再生する。ここまではOK。
       だが、この時点で、Back Skip SWを押すと、再生は1つ前へ行くが、マーカーは移動しない。
       もう1度、Back Skip SWを押すと、マーカー移動する。
       これは、Y=0の位置まで同じ動きをする。

    → 1曲目に、Back Skip SWが押された場合の、最終曲から上に6曲分ファイルリスト表示
       するwhileループで使っていた、LastFileNoを元の値に戻す時の数が、1つ
       少なかった(+5→ +6)のと、
       FileNoがラストから手前6曲目から、初期画面の2番目の曲までの範囲で、Back Skip SWが
       押された場合の、バックスクロール表示するwhileループで使っていた、FileNoを
       元の値に戻す時の数が、1つ少なかった(-5→ -6)のが原因だった。
       これを修正したら、バックスキップ単独での逆送り再生はOKになった。
       しかし、異なるモードの途中から、切替えると、両者で、表示方法(スクロール等)が異なるので
       再生は順から逆、逆から順と切替えられるが、表示が上手く合わなくなる。


■ 2016.12.15
  ・結局、今回は、途中からのモード切替えは断念して、電源ON時に、Home SW(今回Mode SWとして使う)
   の状態を読込んで、順送り・順方向ループ再生と、逆送り・逆方向ループ再生の切替えを行うことで
   妥協した。(途中で異なるモードへの切替えは、RESET SWを押して、順送りにする以外ない。)
   参考までに、V2→ V2a(AQM1248a液晶版)のソースリストを以下にアップします。
   WAVPlayer_V2a.c


■ 2016.12.16
  ・V2aは、一応うまく行ったので、これを、V3a(ノキア液晶5110版)にも適用してみた。
   最終ソースは、末尾のを参照してください。


<最終回路図>
 ・こちらから、どうぞ→ 「PIC_WAVPlayer_V2 回路図」
                   「PIC_WAVPlayer_V3_回路図」 ※ 161211 更新


<最終ソース及び、ヘッダファイル>
 ・こちらから、どうぞ→ WAVPlayer_V2.c 
                   AQM1248A_Lib.c
                   AQM1248A_Lib.h
                   ASCII_font.h

                  以下、V3(ノキア液晶5110版)の、ソース・ヘッダファイルです。 ※ 161211 更新(ASCII_font.hは、V2のものと同じです。)
                  WAVPlayer_V3.c
                  nokiaGlcdlib_dsPIC33F.c
                  nokiaGlcdlib_dsPIC33F.h

                  以下、V3a(バック・スキップ & バック・ループ再生対応版)の、メインソースファイルです。 ※ 161221 更新(他ファイルの変更はありません。)
                  WAVPlayer_V3a.c

 ※ この他に、以下の、FAT16(MMDファイルシステム)関連のファイルと
    コンパイラの定義ファイルが必要です。
   <FAT16関連ファイル>
      FSIO.c
            SD-SPI.c

            FSIO.h
            FSconfig.h
            FSDefs.h
            GenericTypeDefs.h
            HerdwareProfile.h

   <コンパイラ定義ファイル>
             Compiler.h

<おまけ:AQM1248A表示テスト・ソース>
 ・こちらから、どうぞ→ dsPIC33F_AQM1248A_TEST_2.c


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