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をいれた本格的な割込み駆動のスイッチルーチンである。これが順送りは上手く行くのだが、逆戻りが動かない。スイッチのレスポンスはあるのだが一部表示しただけで次に行かない。ロジックを何度も見返す。テストステートメントをいくつも挿入する。それでも解決しない。途方に暮れた。
結局、原因はまた別のところにあった。このピンのピンチェンジ割込み許可が抜けていたのである。Megaや新世代のAVRマイコンは、ピンチェンジ割り込みはピン毎に設定できるが、そのマスク記号の番号はピンの番号と違う。確かめたはずなのだが、動かないピンの設定がされていなかった。動いているように見えたのは、本来マスクされているピンの割り込みでsleepが抜けたことである。どうもピンチェンジ割り込みはグループ単位で割込みを制御しているので割込み禁止にしていても割り込みが起きているようだ。正しく設定し直して何の問題もなくスイッチは機能し、逆戻り表示が出来た。
これで、UART上でLCDで動かす基本部分の開発が終わった。想定どおりの表示がUARTに出る。やれやれである。設計に5日、コーディングに3日かかっている。一段落してこれまで盛大にいれたテストステートメントを削除し、ソースを整理しようとしたときである。今度は突然コンパイルエラーがでた。最後の }(波カッコ)がないというエラーである。試しに最後に }を追加するとエラーがなくなる。
このままコンパイルすると、当然のようにプログラムは動かない。これは困った。ソースはもう600ステップ近くある。ここから探し出すのは大変な作業である。見つける手立てがない。テストステートメントを入れて少しづつ先に進め、コンパイルしては動いているところを探っていく。やっとのことでif文のおしりの }が抜けているところを発見した。テストステートメントを消去するときにバックスペースキーが勢い余って上の行にはみ出し、}を消してしまったらしい。ソースの単位を余り大きくしてはいけないという教訓である。
次の日、ソースを大幅に組み替え、すべての入力をタクトスイッチで行い、LCD表示の部分だけをUARTに出すソースがほぼ完成した。あとはUARTに出している表示をLCDに移し換えるだけである。残る課題は、電源が入っているときSDカードを交換するとおかしくなる不具合解消と、演奏中のカウント表示や、連続再生機能など付加機能の開発である。Mega328のI/OピンはLCDをつけてほぼ使い果たし、SDカードの抜き差し検知のピンが入るかどうか微妙なところである。まあ、そのときはテスト用のUARTのピンを外せばよい。
それにしても、次から次にやりたいことが増えていく。がた老AVR研の電子工作の冒険には終わりがない。(2/12/09)
| 固定リンク
「AVR」カテゴリの記事
- ソフトI2Cはクロックストレッチまで手を出してあえなく沈没(2017.09.02)
- オシロのテストどころかソフト開発で大はまり(2017.07.26)
- 超音波方式の人感センサーI2C化と新しいオシロ(2017.06.29)
- motionの動体検知はRaspi3の電源が安定しない(2017.04.16)
- 赤外線学習リモコンはデータ再現で挫折したまま進まず(2016.07.21)
コメント