マイコン工作実験日記

Microcontroller を用いての工作、実験記録

FMラジオ画面

2009-10-18 23:45:16 | MP3プレーヤ
先週の作業ですが、MP3プレーヤ画面だけでなくFMラジオ用画面も作りました。とは言っても、MP3プレーヤの時のボタン2つを流用しているだけなんですけど。。。周波数表示だけだと、あまりにも画面が寂しいので右肩に時刻表示も入れました。局名表示を入れてもいいかもしれません。



いちおう、ボタンをタッチすることで周波数の低い方、あるいは高い方に向かってシークして選局するようにしてあります。LCDの下側についているメニュー・アイコンをタッチすることで、時計表示、MP3プレーヤ画面、FMラジオ画面の3種類の機能を切り替えられます。



もちろん、リモコンからも左右ボタンを使って選局できます。機能選択には、ダッシュ+前進/後進ボタンを使うことにしました。写真の手前にあるのがダッシュボタンです。

アンテナはビニル線を使っているのですが、先日きなこにカジられた結果、短くなってしまいました。それいらい、ガクンと感度が落ちたように思われます。

音量調節機能

2009-10-16 07:01:34 | MP3プレーヤ
連休中に音量調節機能を入れました。スライダーで操作しようかとも思っていたのですが、リモコンでの操作のこともあるので、左右のボタンで10段階の調節としました。中央のバーは音量の表示だけ。



リモコンからは、前進/後進ボタンで音量調節です。もちろん再生操作もサポートせなばならないので、ボタン押下時間を3段階に分けて判断することで画面上の5つのボタンの機能を左右ボタン2つで提供することとしました。

右短クリック再生/一時停止のトグル
右中押し次の曲
右長押し次のアルバム
左短クリック再生中は一時停止。停止中は曲の始めに
左中押し前の曲
左長押し前のアルバム

ようやくとアルバム機能も入れました。

リモコンの前進/後進ボタンは、もちろん音量調節として機能します。

プレーヤの操作処理は、タッチパネルの操作ボタンによって生じるイベントで駆動するようにしています。リモコンの処理では、検出されたボタン信号とボタンが離されるまでに連続して信号が検出された回数から、対応するパネル操作ボタンを決定し、そのイベントに変換しているだけです。

けっこう、Q-STEERのリモコン気に入っています。

リモコン機能を追加する -- その2

2009-10-12 00:03:26 | MP3プレーヤ
リモコン機能のドライバ編です。

赤外線受信モジュールは、CAP0.0とCAP0.1端子の両方に接続してあります。受信モジュールからの信号は反転出力となっており、信号が検出できた期間だけLレベルが出力されます。そこで、次のようにしてLが出力される時間を計測してやることにしました。

  • CAP0.0で立下り検出して、CR0にタイマ値をロード
  • CAP0.1で立上がり検出して、CR1にタイマ値をロード
  • CAP0.1で立上がり検出時に割り込み生成


割り込み処理で、CR1 - CR0 を計算してやれば、Lレベルの時間が計れることになります。Q-STEERの信号は、このページで解説されているように、ヘッダーに続く6ビットで構成されていますので、これを割り込み処理の中で解析し、その結果を上位に通知することとしました。

簡単な実験結果の表示は次のようになりました。



ir_countが割り込み回数。ir_dataが最後に検出されたリモコンからのボタン信号です。そして、ir_gotがボタン信号として判別された回数。最初の表示の段階では、一度もリモコンのボタンを押していないのに800回も割り込みが入っています。1回のボタン信号の検出に必要な割り込み回数はヘッダと6ビットデータの合計7回ですから、けっこうノイズをたくさん拾って割り込みがかかっていることがわかります。信号の長さを確認して不正と判断したものは読み捨てているので、ボタンの検出は問題なくできてはいます。

ボタンを押し続けていると、繰り返し同じ信号が出力されます。ボタンが離されると停止信号が出てきます。同じ信号を受信した回数をカウントすることで、ボタンの長押しを判断することにしようと思います。

不要な割り込みの回数を減らしたいと思い、タイマのクロックを落としてみたりしたのですが、ほとんど変化なし。こんなにノイズ拾うものなのでしょうか?

リモコン機能を追加する -- その1

2009-10-09 22:19:12 | MP3プレーヤ
再生/停止程度の操作はタッチパネルでできるようになったMP3プレーヤですが、リモコン機能を追加することにしました。先週LPC2388の周辺機能で使っているものを洗い出しましたが、どうせならもう少しシャブリ尽くしてやろうと考えた次第です。

先月、簡単にIrDAの実験をしましたが、IrDAは仮想COMポート通信やファイル転送には向いていますが、リモコン用途には向いていないようです。以前から、SparkfunのNordic FOBがカッコイイなぁとは思っているのですが、たかがリモコンにnRF24を使っているので値段高すぎです。テレビのリモコンじゃデカ過ぎなので、何か小型でスマートなリモコンがないだろうかと思案しておりましたが、いいものがあったことを思い出しました。コイツ↓です。



昨年、DWMおまけ基板でQ-STEERリモコンを作りましたが、そのQ-STEERに付属していたリモコンです。これなら普通に38KHzで変調かけているだけですから、秋月の赤外線リモコン受信モジュールが使えます。その気になってきたら、このボタン構成だってプレーヤ向きに見えてきました。十字になっていないのは、ちょっと残念ですが、上下でボリューム、左右でPlay/Pause と Next/Prevという感じでしょうか。

と、いうわけで SPS-444-1を買ってきて付けてみました↓。秋月にはいくつもリモコン受信モージュールがありますが、どれも仕様的には同じようなものなので、どういうふうに使い分けたらいいのか、よくわかりません。とりあえず、150円とお値段が高い方が、ご利益もあるのではないかと期待して選んできました。



秋月のリモコン受信モジュールはいずれも電源、出力レベルが5V系になっていますが、LPC2388は5Vトレラントで動いてくれるので、タイマのキャプチャ端子(CAP0.0とCAP0.1)に直結です。Timer0は、これまでTOPPERSのシステムタイマに使っていたのですが、端子の都合上Timer0はリモコン受信に使うこととし、システムタイマは Timer1に移動させることにします。

ようやく足を上げた

2009-10-06 00:09:19 | MP3プレーヤ
先日動画で示したように、MP3プレーヤは起動すると時計として動くようにしてあるのですが、バッテリでのバックアップが無いために、起動の度ごとに日付/時刻の再設定が必要です。いいかげん面倒になってきたので、ようやくとバックアップ電池を取り付けることとしました。

みなさん、それぞれの方法で電池を取り付けられているようで、参考にさせていただきました。結果、電池フォルダとその取り付け方法についてはネムイさんに倣って、タカチのフォルダを両面テープで貼り付けて使うことにしました。ただし、面倒なのでダイオードは省略してVCCはつなげずに、VBATは常時電池駆動することにしました。

いざ27番ピンのVBAT端子の足上げ作業をやろうとしたところ、すでに各種端子や32Kクリスタルをとりつけた後であったため、とても作業しにくいことが判明。わたしの技量では足上げできそうもないので、秋葉の書泉ブックタワー2階のCQ出版コーナーに出かけて2枚目の基板を調達してきました。先月くらいまでは、5月号がまだ数冊平積みされて残っていた記憶があるのですが、きょうは本棚に2冊しか残っていませんでした。



無事、足上げと電池フォルダ取り付け作業が完了。めでたく時計の日時設定がバックアップされるようになりました。

忘れていたPWM

2009-10-03 17:34:17 | MP3プレーヤ
今頃になって、LCDの輝度制御をやっていなことに気が付きました。輝度を調節できるようにと考えPWM2をLCDのEN端子につながていたのですが、常にHレベルを出していただけでした。いちおうPWMデューティを変えてちょっと暗くしてみましたが、やはりアイコンの表示が黒っぽく出る症状には変化なし。

まぁ、いちおうPWMも使ってみたということで、現時点で使っているLPC2388の周辺機能を列挙してみると。。。

機能用途
UART0TOPPERS/JSPログ出力、ならびにデバック・コンソール
Timer0TOPPERS/JSP用タイマ
SSP0タッチパネル ADS7846
I2C1FMチューナ AR1010
I2C2コーデック TLV320AIC23B
I2Sコーデック TLV320AIC23B
PWM2LCD輝度制御
MCISDカード
USBホストUSBスピーカ
RTC日付、時刻表示
GPIOLCD表示

いろいろと使ってみたつもりでしたが、まだこんなもんでした。とてもじゃないけど、豊富な機能は使いきれそうもありません。現時点でRAMの総使用量は64KBを超えているので(もちろん削ることはできるのですが)、もはやEthernetは使うことはなさそうな予感。Ethernet用のRAM領域にはまだ残りがあるのですが、TCP/IP用のバッファが足りなくなりそうです。それよりも、PHYを追加するのが面倒ですし。


タッチパネルを使った再生操作

2009-09-30 01:06:12 | MP3プレーヤ
タッチパネルが使えるようになったので、アイコンのボタンを使っての再生操作ができるようにしてみました。再生、一時停止とスキップ機能がタッチで使えるようになたので雰囲気出てきました。



最初の時計表示からMP3プレーヤ表示への切り替えは、LCD画面下部に最初から用意されているメニューアイコンをタッチすることでおこなっています。この領域はLCDの表示領域外ではありますが、タッチパネルのアクティブ領域になっています。

タッチパネルをつなげた

2009-09-12 22:30:29 | MP3プレーヤ
アイコン並べた画面を見るとかなり雰囲気でてきた感じがしてきましたので、つづいてタッチパネルの接続です。もともとLCD画面にタッチパネルが貼ってありますので、モジュールの未配線だったタッチパネル関連の線をつなぐだけです。使用しているLCDモジュールでは、1)4線式パネルの信号をマイコン側のADCにつなげて利用する方法と、2)モジュール上のコントローラADS7846をSPIでつなぐ方法の2つの方法を選択可能ですが、昨年と同じようにADS7846を利用することにしました。

ADS7846を使用する場合でも、X座標とY座標を別々に読みだして座標変換する処理が必要なので、ある程度の手間がかかります。ただし、ペンダウンにより割り込みを生成できるのが大きなメリットです。ADCを使う場合は、常時XY座標を測定していないとペンダウンが発生したことを検出できませんので、それだけCPUサイクルを消費することになります。ADS7846を使えば、割り込みが発生したら、XY座標の測定を開始すれば良く、ペンが離されたことが検出できたらその後は休んでいることができます。

LPC2388には、SPIをサポートする周辺機能として、SPIという名前のインターフェースと、SSPという名前のインタフェースが用意されています。どちらかというとSSPの方が高機能のようなので、今回はSSP0を使って接続。SPIではSSEL端子が入力端子としてしか使えないのに対して、SSP0ではSSEL0を出力として使えますので、マスター動作時にCS信号を自動的に出力できて便利です。ADS7846からはペンダウンを通知する割り込み信号/PENIRQも出力されてきます。LPC2388基板側のIRQ端子は他の用途に使われていたり、ヘッダに出ていなかったりしますので、GPIO割り込みを使うつもりでP2[8]につないでおきました。



配線ができたので、さっそく動作確認です。ADS7846はSPIで送った8ビットのコマンドに応じて、続くクロック中の10ビットあるいは12ビットで測定した座標を返してくれます。まずはX座標の測定から。下の画面では0xd1が送信しているコマンドで、X座標の測定を要求しています。矢印の右側の3バイトがSPIの受信結果です。最初の1バイトは、コマンド送信中のデータですので関係無し。後ろの2バイト中の12ビットが測定結果です。Valの値は12ビットを抜き出して10進数で表示しています。



タッチしていない状態では値として0が読めています。タッチして左から右に行くにしたがって、測定値が小さくなっていきます。続いて、Y座標の確認。同様に、0x91が送信しているコマンドです。



今度はタッチしていない状態では2047が読めています。そして上から下へ移動するにしたがって、測定値が小さくなっていきます。このように、測定される値は、画面右はじの方が値が小さく、オフセットをもった値になっていますので、これを画面描画の時に使用する座標に変換してやる必要があります。この変換処理は、/PENIRQ信号の処理と合わせて、ひとつ新たなタスクを設けて処理してやる予定です。

アイコンを準備する

2009-09-09 23:29:37 | MP3プレーヤ
MP3プレーヤの再生画面も日本語化できたので、次のステップとしては操作用ボタン使ってのGUIを用意しようかと思っています。そのためのアイコンを探してみました。適当に検索してみていくつかのサイトを見てみましたが、サイズ的にも良さそうたったのが、このサイトの無料アイコンです。そこで、ここのToolbar Icon Starter Kitのプレーヤ用ボタンを使ってみることにしました。どういうわけか、ストップ・ボタン用のアイコンが含まれていないのですが、いざとなれば適当に他のもので間に合わせることにします。

アイコン用のイメージはPNG形式で用意されていました。αチャンネル情報を持つことができる画像ファイル形式なので、アイコン用には都合がいいのでしょう。しかし、マイコンで処理するには、ビットマップとして埋め込んだ方が使いやすいので、いったんBMPファイルに変換して、そのビットマップ情報を配列データとして吐き出してやって、それを利用することにしました。試しに画面上に並べてみると。。。



なんだかボタンが妙に黒いです。もともとの画像はこうなのですが。。アイコン画像の表示ルーチンを確認したり、LCDの初期化時のガンマ補正の値を変えてみたりとかしてみたのですが、やはり黒いままです。どうやらわずかに暗い部分が、ほんらいあるべき明るさよりも暗く表示されてしまっているようです。これまでも、CMOSカメラでとった画像がやけに暗くしか表示されなかったりしていましたが、どうやら同じ原因でこのように見えてしまっているのではないかと思われます。

わざとデータを読み替えて少し明るめに表示してみたりとかもしてみたものの、あまり良い結果も得られず、どうしてこんな風にしか表示できないのかこの何日かずっーと悩んでいたのですが。。。

ヒョンなことから、ちょっと左横から画面を見てみたら。。。



あれっ?! なんか、ボタンがさらに黒っぽくなってしまったではないですか? どうして? と、いうことは、もしかして。。ひょっとすると。。



うわっ! やっぱり!! この向きなら、かなり良く見えるじゃん!!!

ハイ、斜め右方向から見れば、まっとうな色/明るさに見えるようです。画面に貼ってある液晶保護シートが悪さしているのかと思い、はがしてみましたが。変化なし。もともとのLCDの発光が不均一ということなのでしょうか。。。

問題の発生個所の切り分けはできたものの、これでは修正することもできません。しょうがないので、このまま使い続けるつもりではいますが、そのうちに違うLCD買ってつなげ換えようかなぁ。

再生画面を作ってみた -- その2

2009-09-05 19:41:35 | MP3プレーヤ
ふたたびLPC2388のMP3プレーヤの作業に戻ってきました。NANDフラッシュに焼いたIPAフォントが使えるようになったので、再生画面表示を変更して日本語の曲名/演奏者であっても表示できるようになりました。



MP3ファイルはWMP (Windows Media Player)の取り込み機能で作成していますが、この機能をつかってMP3ファイルを作成すると基本的にファイル名は曲名を使うようです。FatFsとしてはR0.07をLFNサポート無しで使っていたのですが、ファイルによってファイルをオープンしようとしてエラーが発生するという問題に遭遇してしまいました。どうやら、シフトJISファイル名の2バイト目に '[' が入っているとエラーになっている様子です。気がつくとFatFsがR0.07c になっているので、新しいコードに入れ替えるとともに、再度設定しなおしたところ問題解決してしまいました。どうやら、ちゃんと_CODE_PAGEを指定していなかったのが原因だったようです。LFNを使わない場合でも、ファイル名にSJISが混入する場合にはちゃんと_CODE_PAGEが指定されていないといけないということですね。