UIの続き。
いろいろ構造的に考えなきゃならないんだが
一時停止/再開の方法がわからなかったので、ほかの人のソースを漁る。
ELM/ChaN さんの所に運良くソースが転がってたので解読。
この人のソースコードはいつも効率がいい。構造的にもシンプル。
当然FatFSを使うにも、コールバック関数で直接転送するようになってる。
割り込み内での処理とメインループ内での処理がうまく回るようにフラグ変数をいくつか用意して
つじつまが合うように書かれてる。
見本はたまたまシングルタスクだから、関数内をループするように書いてあるが
そこはこちらにはそぐわないので、多少アレンジしなければ。
割り込み処理を、ChaNさんのコードとおなじような(笑 構造になるようにコードを追加。
タスク内のループも同様にフラグとボリュームとデータ転送をそれぞれフラグを元に動作するように書く。
もちろん、メインループに毎回処理を戻す構造。
大きいほうの基板はこれで一応、一連の動作を出来るようになった。
つぎは、これをベースに小さいほうの基板用に直しを入れる。
つづく。
ここまでのコード移植で、
絵も出て音もなるようになった。
ひとまず、原状回復と言ったところか。
ファイル名は相変わらずテーブル持ちだけど。
そうすると、次は入力関係、UIですな。
試作の時点では基本的に無視していたので、ここからは書き起こしになる。
まず、スイッチ入力。
まあ、タイマーリモコンを作ったときに基本的なキー入力処理関数の構成は決まっているので
それを持ってくるところから。
今回のキー入力は、
シングルクリック、ダブルクリック、長押し
とした。
シングル
一定時間(T1)、ON状態を維持し、最大待ち時間(T0)以内でOFF状態になり、
なおかつ最大待ち時間が経過するまでOFF状態が変化しなかった場合を「シングルクリック」として扱う。
ダブルクリック
一定時間(T1)、ON状態を維持し、最大待ち時間(T0)以内でOFF状態になり、
なおかつONだった時間(T1)の4倍の時間が経過するまでに再度ONになり、
その状態が初回の(T1)と同等もしくはそれ以上の時間継続、後にOFFになり、
その状態が(T1)の4倍の時間が経過するまで変化しなかった場合を「ダブルクリック」として扱う。
長押し
ON状態になり、最大待ち時間(T0)を超えてその状態が継続、後にOFFになった場合を
「長押し」として扱う。
うわwww文章で書くのが難しすぎる。
図で考えてたんで、なんとかコードになった感じ。
今回のプログラムで一番難しかったのはこの辺だね。
デバック環境を用意せずに盲目デバック。
いちいちUSART環境を作るのがめんどい。
まあ、これとは別に、再生やら一時停止やら、その他機能に関する処理があるんだけどね。
これもこれで、構造的にちょっと面倒。
なので
つづく。
基板が出来たので、コードの移植。
まずは、ATmega128からXMEGAーA4に向けて、I/O周辺の移植。
ポートの違い、接続の違い、初期化の違い。
FatFSの修正。
タイマー割り込みの初期化。
LCD周辺コードの追加。
SPIもVS1011Eも、あわせこむ。
関数名の整理、レイヤー化。
結構いろいろある。。。ね。
それなりに時間掛けることに。
とはいえ、低レベル部分が出来てしまえば、あとはコードを持ってくるだけだ。
とりあえずは・・・絵を出すことかな。
実験段階では、ほかにタスクはなかったけど、今回はMP3のデータ転送があるので
細かく細分化しなくてはいけない。
1ライン読む度にバッファに展開し、転送。
これを最小1単位として、毎回処理をメインループに戻す。
MP3データ転送タスクもほぼ同様。
VS1011Eからの要求があれば30byte程度を転送する。
そう、ここで実は重大なことに気がついた。
先に書いた記事で、ビットレートにあわせてデータを転送しないとダメだ、と書いたが
実は、VS1011Eからの要求ピンの設定が出力になっていて、常に1が設定されていた、
つまり、常に転送要求が来てる状態。
ちゃんと入力設定にしたら、データがつぶれる事もなく再生されている。
そうすると、余計なことを考えずに転送するというのは間違いではないようだ。
これだと、実は結構、間隔が開くんじゃない?だいぶメインループに余裕がでるかも。
そんな感じで、まだまだデバッグは続く。
タッチセンサーはひとまず忘れる。
というか、メインはこっち。MP3のプレーヤー。
実装が終わって、電源を繋いで電圧を測ると、ショートしてる。
あれれ?
QFP周辺を何度も確認したけど、どこもブリッジはしてない。
それ以外にショートするような細かい部分はないので、原因がつかめない。
仕方が無いので、全部のチップ部品をはずす。
それでも、ショートが直らない。
残ってるのはQFPと24.576MHzの発振器だけ。
う、う---ん!?前にもあった気がするぞ。
発振器の表面がフレームグランドで・・・・!!!!!
この部品マクロ、前回手ハンダでかなり苦労したんだっけ。
やっぱり。
はずしたらショートが治った。
で、これをつけろと。
細心の注意を払って、というか、電源繋いで発振が確認できるまで、
根気よく付け直す。やらなきゃ進まないんだから、やれって。
・・・・・・ふぅ。何とか波形が出た。
これで全部部品を戻せば、実装完了。
とりあえず、第一段階。
プログラムの書き込みまで確認。
まあ、こっからが長いんですがね。
つづく。
実は、M氏を召喚するのは、2回目。
1回目は、基板の設計段階で「こういうことをやろうと思ってるんだけどさー」と
かる~く、話を振ってあった。
センサー部分の造りに、一抹の不安があったので、
こちらの見た資料一式とPSoCに関する資料を提示しつつ、
センサー部分の基板パターンがなぜこうなってるか、についての根拠を説明してある。
「じゃあ、すこし調べてみますよ」と言ってくれるあたりは、さすが頼りになる。
で、2度目の召喚で基板が実装済みで上がってきてる、と。
じつは、単独ならうまくいくけど、マトリックスにするとだめっぽい、と。
動作を見せながら、彼の知識をフル動員してもらって(笑)
デバックするには道具としてのオシロが必要、と納得させる。
B:「持ってるよね?」
M:「ええ。ありますよ」
B:「(ニヤリ)じゃあお願い!もって帰っていいからww」
M:「そうですね。。。・・・うっ!。。。。はめられた(笑)」
そんな感じで、彼に託してきた。
なので、一旦この大きいほうのタッチセンサーは忘れることに。
さてさて。
人を巻き込むと決めた以上、いろいろと事実確認が必要だし、
説得する材料も必要だな。
そんな感じで、小さいほうの基板。
実装に2パターンあるので
こっちは、LEDがついてるので動作結果がわかりやすいだろう。
基本的なプログラムを用意するために、まずはUSBのテンキーとして、基板を実装する。
プログラムの手順としては、大きいほうの基板のプロジェクトを基本として
センサー入力のピンを設定しなおし。
あとは、判定処理をセンサーひとつづつに対して行うように直す。
LEDを点灯するように処理を追加。
キーコードの変換テーブルも用意。
さあて。
これでどうかな。
おぉぅ!光った。キーコードもちゃんと返ってくる。
動作状況はこの辺
なぜかFLVしか受け付けないので、荒いですけど。
さて、問題はケースを介したときにどうなるか。
写真がないので動作状況をこの辺に。
こっちはちゃんと動いてはいるようですね。
やはり、回路構成の違い、でしょうね。
ここまで見せて、違いを理解してもらえれば、任せられるでしょう。
当然、実機は持っていくんですけどね。
そんな感じで。
まずは、タッチセンサーの基板から。
今回はじめて使うPSoCの様子をみないとね。
まずはMLFパッケージを難なくクリア。
ほかの部品も問題なくハンダ付け。
ISP用コネクタが結局一番大きかったね。
このままだとケースに入らない。
とはいえ、どうにもならないので、ほっとくか。
次に、動作確認のためにコードをでっちあげる。
とはいえ、これには元ネタがあるので、それをまず模写するところから。
元ネタのPSoCの型番が今回のとは違うので、プロジェクトを新規で作って設定を模写し、コードを移植する。
なるべく原型を留めて、なおかつ構造的に変更が可能な形に。
センサー入力のピンがまったく違うのでそれを直すのと、キーコードをテーブル化する。
テンキーというか、キーボードとしてのディスクリプタは他でやってるので、なんとかなった。
とりあえず、そんな感じでコンパイル、書き込み。
センサー入力の一部がISPのピンとかぶってるので、動作確認時はISPのケーブルを抜かないといけない。
いやらしい。Port0がまとめて使えない。
基板直接触る分には、ちゃんと反応した。これは回路的にもソフト的にもOKってことか。
これを、Mintiaのケースを介して触ると。。。反応しない。
う、うーむ。
基板実装、雛形のソフトウェア、一応の動作確認。
ここまで終わってるけど、これ以上はわかる人間に解析しながら調整してもらおう・・・・かな・・・・っと。
ちょうど、MTM05の会場で遭遇したM氏を捕まえてあったのさwww
このM氏、数年前から、
幕張メッセのイベントへ行った時に駅でばったり
秋葉原の某店に居るところにばったりx2
などなど、
かなりの確率で遭遇する。
私と行動パターンが似てるらしく、同じ新潟出身で鉄道マニア・・・あ、これはどうでもいいけど。
その上、MTM05でも遭遇するという、彼にとっては不幸な(?)関係。
さらに、PSoCのCapSensに関しては情報源を握ってるとあれば
巻き込まない手はないwww
なので、サクッとメールして「じゃあ、土曜日にはんだ付けカフェで」ってことに。
マトリックス接続の基板はこんな感じ。
もう一種類の方も試さないとね。
と、いうわけで。
無事、製造されて、届きました。
まあ、はしょって書いてる分があって実際にはもうちょっと手間かかってるんですが。
なぜか一枚余分に入ってる。
曰く、「歩留まりを考えて余分に製造するので、余った分をオマケで付けている」とのことでした。
まあ、余分に作るのはどこの業者も同じですが、オマケで付けてくれるのは、ここだけですね。
・・・・・・今のところ、かな。量が増えたらそんな余裕もなくなるんだろうな・・・・
月曜日に発注して、金曜のぎりぎりに発送になった。
本当に5日で出荷された。
おかげでDHLで届くはずがUPSで発送されてしまい、
翌土曜日に入関して国内にあるのはわかってるのに配送されない、という不遇を受ける。
しかも、入関代行業者はヤマト運輸だとのことで。
・・・なんでそのまま配達しねーんだYo!
DHLなら土曜日入関したものは可能な限り配送するって言ってるから、土曜日には受け取れるつもりで居たのに。
国際便を扱う業者が、ローカル国の土日祝祭に影響されるってのは
怠慢以外の何者でもないよね >Fedex and UPS
いい加減にして欲しいねまったく。
JETPCBはとりあえず、日本語が通るのがすべてにおいてイイ。
それもカタコトではなく、流暢な日本語が返ってくる。
基板の質もソコソコ良い。すばらしい。
できれば、内緒にしておきたいぐらいだ(笑
出来はまあ、これから細かく見ていくけどね。
つづく。
ネタが揃ったので、サクッと面付けしてしまいましょう。
あまり凝った面付けをすると
+2000円のルーター加工と+2000円のV-CUT処理で
プラス4000円コースとなってしまうので
その辺を踏まえて。
・・・・というか、V-CUTの0.5mmのクリアランスしか
基板寸法の検討に入れてないんですけど・・・
要は、捨て板の分を予定に入れてないので、
全部V-CUTで処理する、
もしくはルーターで基板を削り込んでしまわないような
配置を考えろ、ってことね。
・・・・・・って。
横に繋いだだけかよ!
昔のCADは面付けする機能が貧弱で、苦労します。
というか、面付けなんてガーバーのレベルでやってた事なんですよね。
要は基板製造側の仕事だったわけです。
そのほうが間違いのない基板が出来上がりますから。
ガーバーまで来ると、次は物理的な板とか加工機との兼ね合いになるので
物理的な関係がわかってないとCAD上だけで間違いのないデータが作れるとは限らない。
まあ、基板設計業者に出せば、その辺のことも全部考えてやってくれるんだけどね。
そんなわけで。
サクッとしすぎな面付けになりましたが。
これで行ってしまいまショー
こういうつながりは、初めてだな(笑
個人で基板作るときに、ほかの基板との接続を意識したり、
機能的に分けたり、といったことは
殆どしたことがなかったんですが。
今回はどういうわけか、かなり連鎖的に来てますな。
44mm x 30mm のスペースがもう一枚分、空いてるよね。
縮小版のMP3プレーヤーと同じサイズだよね。
・・・・・・・・・・タッチセンサーも縮小版、作ればいのか!
二つの基板をぴったり重ねて、繋げば、入力になるんじゃね?
おぉぉぅ!
場所の都合で7キーしか作れないけど、まあいいやね。
今回は、単独にしてみよう。
同じにしたんじゃ、実験の意味がないし、第一、マトリックスがうまく行かなかったら
タッチセンサー全滅じゃん。それだけは避けないと。
多少はアレンジしないとね。
基板裏から付けるタイプのLEDを使って、押されたら光るようにしよう。
このくらい遊ばないと。
基板同士の接続は、LCD用のピンもスイッチ用のピンもそのまま余ってるんだし
それをコネクタに全部出してやればいいかな。
PSoC側もピン数的には余裕で受けられる。
最低でも8bitで接続して、将来的には入力に従ったコードを
PSoCからXMEGAにバンバン投げるだけにすればいい。
デバック用の逃げ道として、PCに接続できるようにしておく。
そのへんは、変わらない。
CAMOUT寸前に気づいたのは、USBからは5Vだけど、MP3プレーヤーからは3.3Vだってこと。
PCと繋ぐときはいいけど、MP3プレーヤーに繋ぐときは???
この辺はちょっと、切り離せるように細工しておこう。
そんな感じで、予定枠が全部埋まりました。
うまく行くかはわからないけどね。
一応、マニュアル通りなのだが。
つづく。