(日々の記録)デジタルオシロを買った。(木)LCD版SDカードPCMプレーヤーの開発DC-DCコンバーターはもう準備してある(2/5/09)ポータブルの実装化でのもうひとつの課題が、5V駆動のLCDを3Vリチウムバッテリーでどうやって動かすかという問題がある。3VではLCDのコントローラーが動いても液晶のコントラストが出ないのだ。これは当がた老AVR研究所では以前検討して準備済みである。DC-DCコンバータを買ってあるのだ。最初に手がけた温度ロガーにLCDを付けようと計画したとき、秋月電子で入手した小電流用のDC-DCコンバーターLTC1144である。¥300もしたがそのときは高いと思わなかった。データシートには最大電流が記載されていないが、50mAくらいまで流せそうだ。LCDの消費電流は1mA以下なので全く問題ない。追加部品も電解コンデンサー2つですむ。その後、情報を集めているうち、インバーターで簡易に負電圧を得る方法が見つかってこれも試したくなった。ChaNさんのホームページにも詳しく載っている。原理はどちらもチャージポンプ方式。アナログ回路があるのでノイズが気になるが、音源装置にも使っている人もいるし、発振周波数をあげれば影響はあまりないだろう。手元にインバーターがあったので早速ブレッドボードに組んでみた。うむ、リチウムバッテリーの3.7Vでも、-3.5Vが出る。無負荷なのでこのまま使えるわけではない。LCDは1mA程度で動くことなので、LEDを負荷にしてみる。3mAも流すと、-0.5Vまで下がってしまう。電圧の調整が難しそうだ。それと部品点数がLTC1144がコンデンサー2つで済むのに較べると少し多すぎる(6点)。どちらにするか迷ったが、LTC1144を遊ばせておくのも何なので、こんどの実装にはこちらを使うことにする。肝心のソフトの方である。オブジェクト指向的設計でだいたいの骨格が見えたが、まだ検討するところが多くてなかなか実際のコーディングに入れない。タクトスイッチの制御が結構難しい。ロジアナやオシロで見ると、マイクロスイッチなどに較べるとチャタリングは殆ど起きないことが確認された。いえ、ないという前提でプログラムを組むのは不安だ。それと連続再生を指示するのに2つのスイッチの同時押しでやろうと考えているが、スイッチが2つ押されたことを確実に検知するのに単にスイッチのピンをループして見ているだけで出来るのか、これも自信がない。それと電池駆動なのでなるべく消費電力を抑えたい。sleepを使って割込み駆動にしたいが、タイマーも併用しないと正確なスイッチ状態の確認ができない。メモ用紙を何枚も使って簡便な方法を模索する。それとファイルのアクセスでのエラー処理をどうするかも大事な問題である。SDカードは時たまI/Oエラーが起きる(特に起動時)のでそのたびにリセットするのも芸がない。プログラムをLCD版に作り直す前に、スイッチ制御の練習のつもりで現在のソースに、タクトスイッチで演奏中のpauseと中止する機能を組み込んだ。これが結構手こずって正確に動くまで半日かかった。一応動くのだがミスが多い。タクトスイッチのチャタリングはないと思っていたが、やっぱり時たま起きるようである。それぞれのタイミングで少しづつ待ち時間をとり状態を確認することでやっと安定するようになった。1秒長押しで中止にする機能には、既にファイルアクセスのために組み込んである10msのタイマーを利用してこれは一発で通った。スイッチのハンドリングは色々な方法があるが、ここは演奏中の処理なので気を遣う。人のソースを見たくないので、まあ自己流である。それにしてもスイッチの制御は人間の感覚と、マイコンの速度がかけ離れているので正確に押したことを確認するのは手間がかかるものだ。ソフトの開発に予想外に苦戦(2/9/09)LCD版のコーディングにえらい時間がかかっている。ディレクトリを少しづつ読み込み、出来上がったメモリ上のファイルリストを元にスイッチで表示する範囲を上下させる機構が思ったようにすっきり作れない。擬似コーディングのレベルに落とすのにメモを書き散らす。A4用紙(印刷の裏紙)で5枚以上になった。SDカードにはWAVファイル以外のファイルや、ディレクトリが入る可能性がある。これを除きながらWAVファイルだけの中でファイルリストを処理するのは思ったより面倒である。最後のWAVファイルと、本来のディレクトリの最後のファイルが違うときどうするかなど、最後の処理が難しい。ファイル名を選ぶのだったら、常に頭からディレクトリを読んで数だけ読み飛ばしていけばそのファイル名を知ることが出来るが、何か無駄なことをやっているようだし、これだけでは余りにも面白みがない。いうので画面のスクロールのようにバッファーに入れ、上下端でディレクトリファイルを読み直すなどの凝った仕掛けにしたが、これが仇になっている。プログラムに懲りすぎる傾向がある。これがアマチュアの特権でもあるのだが、生産性から言えばとても昔、職業プログラマーをしていたと自慢できるレベルではない。これまでの経験から言えば、始めに時間をかければかけるほど、プログラムの完成度は上がるし、バグも取りやすい。適当にコーディングを始めてどうしてもバグがとれず、結局そのソースを放棄し作り直したことは何度もある。新しくプロジェクトファイルを起こすのでなく、これまでのプログラムに追加していく。念入りに擬似コーディングをしたおかげで、実際のコーディング作業はそれほど時間はかからなかった。コンパイルしてテストに入ったが、これがまた全く思うように動かない。考え違いが沢山見つかる。ディレクトリを読み進むときは問題ないのだが、表示範囲が戻って前のディレクトリを読み戻す処理が難しい。悪戦苦闘の末、コマンドプロンプトに数字を入れると、SDカードに入っているWAVファイルを頭から数え、そのあとのファイル名が所定のファイルリストに入る仕掛けが出来上がった。前のオブジェクト指向設計で3つに分けた、ブロックA「ディレクトリを命じられたところから一定数読み出しメモリに入れる」のところである。これだけで2日もかかってしまった。次の、B「そのメモリにあるディレクトリから、指示に基づき一部をLCDに表示する」ブロックとC「スイッチが押されたことを検知して意味を解釈しその指示を出力する」ブロックは、合わせてメインルーチンに吸収し一緒に開発する。これがロジックもさることながら、前にテストしたはずのタクトスイッチが思うように動作しない。今度のスイッチロジックは、あとで機能に加えたい連続再生やランダム再生のモード切替えにスイッチの同時押しを考えて作ってある。これを単なるWAITではなく、省電力化のためピンチェンジ割込みを使った本格的な構造にしたのだが、想定どおり動かないのである。始め作ったロジックでは全く同時押しを検知できなかった。ロジアナで調べてみて理由が良く分かった。人間の二重押しは、どんなに同時に押したと思っていても5ms以上の差ができる。普通の感覚で二重押しをすると20~40ms位は平気で違う。片やマイコンの処理はマイクロセカンドオーダーである。最初の待ち時間が短すぎた(数ms)。ファイルアクセスに使う10ms単位の待ち時間をたっぷりつかって(50ms)やっと同時押しを認識できるようになった。ピンチェンジ割込みの落とし穴(2/11/09)スイッチでファイルリストを2行づつ表示するテストに入る。sleepをいれた本格的な割込み駆動のスイッチルーチンである。これが順送りは上手く行くのだが、逆戻りが動かない。スイッチのレスポンスはあるのだが一部表示しただけで次に行かない。ロジックを何度も見返す。テストステートメントをいくつも挿入する。