マイコン工作実験日記

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

MMcodec01

2009-05-10 18:18:49 | MP3プレーヤ
停滞しているLPC2388の実験を再開すべく、先月仕入れておいた新ネタに手を出そうかと思います。いつものPropoxから購入したMMcodec01です。



TIのTLV320AIC23Bを使用したI2Sでつながるオーディオ・コーデックです。LPC2388のI2Sにつなげて、MP3を再生してみようという魂胆です。AT91SAM7のAPノートEmbDec.netのプロジェクト紹介ページでも、このコーデックを使ったMP3プレーヤーがあるので、一度試してみたいと思っていたのでした。このコーデックは今となっては古いチップのようですが、SOPパッケージがあるのでアマチュアでも手はんだできそうです。わたしは、Propoxにモジュールがあることに気がついて、安易にこいつを使うことにしました。

AT91SAM7の場合にはSSCをI2Sインタフェースとして機能させることが可能なので、上記の作例でもそのようにしてTLV320AIC23Bをつなげています。ところが、AT91SAM7ではフラッシュからコードを実行していると命令実行速度が遅いので、MP3のデコードが苦しくなるようです。上記の作例では、サンプリングレートを8KHzに制限してデコードの際のCPU負荷を低減したり、MP3デコーダーの部分のコードをRAM上に配置することにより命令実行速度を最適化することでこの問題の解決を図っているようです。このように、MP3デコードはAT91SAM7にとってはちょっと苦しい処理なのですが、LPC2388であればクロックも60MHz/72MHzと早いですし、フラッシュにコードを配置してもMAMの機能により、AT91SAM7ほどには実行速度が低下せずに済むのではないかと期待しているわけです。

さて、Propoxからの荷物にはいつもポーランドの切手が貼られているのですが、ちょっと不思議な図案だったのでパチリと一枚撮ってみました。どういう意味なんだろう?


プレビュー機能 -- その2

2009-05-06 21:35:58 | CMOSカメラ
CMOSカメラOV9650からの画像を連続してLCDに表示するようにしてみました。つまり、カメラのモニタ表示です。



OV9650はVGA画像を30fpsで出力しますが、これをAT91SAM9260のISIでQVGAにサイズ変換して、2つのフレームバッファ領域に交互に転送させています。転送が終了するとISIからの割り込みがかかるので、LCDへの表示のためにソフトウェアでの転送を開始させています。前回の記事で書いたように、色空間の変換もサイズの変換もISIがハード的に処理してくれるので、ソフトはホントに簡単でした。

OV9650はSXGAでの撮像もできますが、この場合は15fps。試しにモニタ表示してみましたが、やはりかなり画面の変化が遅く感じて違和感ありました。

プレビュー機能

2009-05-05 16:00:42 | CMOSカメラ
CMOSカメラで撮像した画像は、AT91SAM9260のISIがもつプレビュー機能を用いてLCDに表示しています。きょうは、この機能について簡単に説明しておこうと思います。



CMOSカメラが出力する信号形式はレジスタの設定で選択できるようですが、サンプルに従って設定するとYCbCrのコンポーネント信号の形式で出力されます。そこで、この形式での入力を受け付けて処理するようにAT91SAM9260のISIを設定してやります。すると、ISIではYCbCr形式をLCD表示に適したRGB 5:5:5の形式に変換します。カメラが撮像する際の画素数は、リセット時には1.3M画素のSXGAになっていますが、これをVGA (640X480)に変更して使っています。LCDの画素数はQVGA(320X240)ですのでサイズ変換が必要となりますが、ISIにはこのサイズ変換機能が用意されているので、この機能を利用しています。こうして、RGB5:5:5形式でのQVGA用画像データが出力されますが、この出力はISIで設定したフレームバッファメモリの領域に展開されます。フレームバッファ領域は、リンクされたリスト形式で指定することができるので、複数のバッファを指定することが可能です。こうすることで、VSYNC/HSYNC信号に合わせて順次出力されてくる画像を順番にフレーム・バッファに格納していくことができます。ここまでの処理はすべてハードがやってくれるので、ソフトではフレームバッファに書き出されたデータだけを扱えばいいことになります。

使用しているLCDにはRGB 5:6:5で出力する必要がありますので、フレームバッファの内容をそのまま出力することはできませんが、ソフトとしてはバッファの内容にこの変換を施してLCDに書き出せば画像が見えることになります。カメラの撮像画素数はをQVGAに設定すればサイズ変換は不要になるのですが、VGAで撮ったものをQVGAに変換した方が出力された画がきれいに見えるので、VGAを使っています。

CMOSカメラとISIの双方が出力/入力する信号の形式や画素数の選択/設定ができるようになっていますので、両方が一致するように正しい設定をしてやることが必要になりますが、いったんその設定させわかってしまえば、あとはハードに全ておまかせで、画像データが取り出せます。

カメラはVGAの場合で30fpsを出力することができます。したがって、これを順次LCDに出力することでデジカメのようにカメラ画像をLCDでモニタすることができます。LCDへの出力はソフトで処理せねばなりませんが、30fpsくらいなら問題なく処理できそうですので、次はこれを実験してみることにします。

きれいに撮れていた

2009-05-03 17:58:50 | CMOSカメラ
ようやくカメラで撮った画像が見えるようになったものの、暗めにしか写っていなかったのですが、LCDに表示する際の処理に間違いを発見。修正したところ、少し明るくなってきました。



それでもまだ色がヘンです。これまで主として文字表示やGoogle Mapsの地図表示にしか使っていなかったので、実は写真画像を表示したのはInterfaceのLPC2388をつなげた時が初めてだったりします。この時も色の出が良くなかったので、カメラでの撮影の際の問題なのではなくて、LCDへの表示の際の色再現性が悪いのではないかと思いいたりました。

そこで、カメラで撮影した画像をPCに吸い上げて、画像を確認してみることにしました。FatFsを以前動かしたので、SDカードに画像を書き込んでPCに持ってくるつもりだったのですが、いつの間にかSDカードへのアクセスが動かなくなっています。コントローラからコマンドを発行してもカードからの応答が無い状態です。ショック! MCIのインタフェースがおかしくなってしまったのか、あるいはSDカードのコネクタの接触が悪くなってしまったと想像されます。

しょうがないので、急遽別の方策を模索。いったんボードをリセットしてSAM-BAを起動した後、SAM-BAのもつメモリデータ読み出し機能を利用してSDRAM内部に残っている画像データを読みだすことにしました。AT91SAM9260がカメラから読みだした画像データはPreview path機能を使ってLCD表示に利用できるR5G5B5 (RGBそれぞれ5ビットが16ビットに収められており、最上位の1ビットは未使用)の形式でメモリ上に展開されています。これを次の手順で処理してやりました。
  1. LCDのサイズは320X240ドットのQVGAですので、320X240X2 = 153600バイトの画像データをPCに転送。
  2. PC上で、画像データを24bitのBMPファイル形式に変換するプログラムを作成し、形式変換。
  3. ブログに載せるためにMicrosoftペイントを利用してさらにJPEG形式に変換。

こうして得られたのが、この↓画像です。



なぁんだ、とってもきれいに撮れているじゃありませんか。カメラはちっとも悪くなくて、LCDの発色にかかわる初期設定が良くないようです。撮影パラメターのチューニングは一切無し。TechToysのサンプルにあった設定を使っていますが、基本的にはAGC (Auto Gain Control), AEC (Auto Exposure Control/自動露出), AWB (Auto White Balance)機能をすべて有効にしてあり、早い話がカメラにおまかせのオートモードということのようです。うーん、素晴らしい!一転して、このカメラの画像には大満足です。

でも、SDカードが動かなくなってしまったたのはイタイ。これから本格に使いたいところなのに。。。

ようやく画を撮れた

2009-05-01 00:12:36 | CMOSカメラ
なんとかCMOSカメラからの画像を取得してLCDに表示することができました。



どうも画像が暗くなってしまっており、色調も気に入らないのですが、どうすれば良くなるのかを調べるのも大変そうです。OV9650にはI2Cで操作できるレジスタがいくつもありますが、これらについての詳しい解説資料がないので、使いこなすにしても試行錯誤してみるしかなさそうです。上掲の写真は、TechToysのサンプルプログラムに含まれているソースコードが使用している初期設定を手本として、若干の変更を加えて初期化して撮影したものです。ところがこの初期化シーケンスでは、データシートでは「予約済み」と記された詳細不詳のレジスタをいくつも操作しており、何しているのだか良くわかりません。何か別の資料なりプログラムが使用している設定を流用しているようにも思われます。

ともあれ、画像が表示できたのは嬉しいですね。実はAT91SAM9260のISI (Image Sensor Interface)にはLCDへの表示処理を支援するための機能も用意されており、それを利用してLCDへの表示を実現しているのですが、そのあたりについては別の記事として書くことにします。