マイコン工作実験日記

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

WCA-009頒布について

  • WCA-009頒布希望の方は、この記事を読んでから申し込み願います。
  • WCA-009の動作確認には、トラ技2011年9月号の記事、またはこのブログ記事を参照されることをお勧めします。
  • iWRAP4.0.0ファームウェアでは、iOS5とのAVRCP接続に問題があることがわかっています。対処方法についてはこの記事を参照してください。
  • iWRAP 4.0.1がリリースされました。AVRCP接続問題が修正されています。

Arduino Due

2012-05-22 21:19:52 | Weblog
先週、San Mateo Maker FairでATMELが新しい Arduino Dueのデモをしたらしい。Arduinoには興味無いので気に留めていませんでしたが、ATMELのプレスを読んだらDueはSAM3X8ベースだったんですね。これでSAM3シリーズも少しはメジャーになれるんでしょうか?やはり、新製品でもメジャーなのはATmega32U4ベースのArduino Leonardoでしょうかね。国内代理店でもLeonardoの予約が始まっており、6/1には出荷可能な様子もうかがえますし。

と、ちょっと自虐的になっていたところで気づいたことが。。Dueって、イタリア語では の意味なんですね。現在メジャーなArduinoボードはUnoだと思うんですが、こちらは1の意味です。ということは、DueはUnoを継いで次世代を切り開く製品になるのかも知れませんね。Dueは昨年すでに製品概要が発表されていたようですが、その時点ではSAM3Uを使用することになっていました。製品の販売開始を送らせたことでSAM3Uに代えてSAM4X8を使うことになったようですね。

コメント (0) |  トラックバック (0) | 

libjpegを使ってExif情報を書き込む

2012-05-21 22:51:45 | Weblog
これまでは、画像中にRTCの日時を埋め込んでSDカードに保存していました。しかし、JPEGを生成することができるようになったので、次の段階としてExif情報として撮影日時を記録することにします。

IJGのlibjpegを普通に使って生成したJPEGファイルは、色空間としてYCbCrを使った場合には上図左側に示したようにSOIマーカーに続いてAPP0マーカのセグメントを持つJFIF形式となっています。一方、デジカメで生成されるExif情報を持つJPEGファイルではAPP0の代わりにAPP1マーカのセグメントを持ち、この中にExif情報が書かれています。つまり、Exifの規格にそったファイルを生成するためには、
  1. JFIFをもつAPP0セグメントを出力しないようにする。
  2. Exif情報を持つAPP1セグメントを代わりに出力する。
という、2つの処理を行う必要があります。libjpegを調べたところ、これらの処理をおこなうためのAPIがちゃんと用意されていました。コードはこんな感じになります。
 struct jpeg_compress_struct cinfo;
 uint8_t raster_buffer[QVGA_WIDTH*2];
 JSAMPLE jwbuffer[QVGA_WIDTH*3];
 JSAMPROW jrow;

 .....
 jpeg_create_compress(&cinfo);
 .....
 cinfo.input_components = 3;
 cinfo.in_color_space = JCS_YCbCr;       /* 入力の色空間をYCbCrに設定 */
 jpeg_set_defaults(&cinfo);
 jpeg_set_colorspace(&cinfo, JCS_YCbCr); /* 出力の色空間をYCbCrに設定 */

 cinfo.write_JFIF_header = FALSE;    /* JFIFヘッダ(APP0)を出力しない */

 jpeg_set_quality(&cinfo, 90, TRUE);
 jpeg_start_compress(&cinfo, TRUE);

 /* Exif情報 (APP1)を出力 */
 jpeg_write(marker(&cinfo, JPEG_APP0+1, &exif_info, sizeof(exif_info));

 jrow = jwbuffer;
 for (i = 0; i < cinfo.image_height;i++) {
    /* 1ライン分データをFIFOから読み出し */
    read_fifo(raster_buffer, cinfo.image_width);
    /* カメラからのYCbCr4:2:2データを YCbCr4:4:4に変換 */
    ycbcr422_to_ycbcr444(raster_buffer, jw_buffer);
    /* Libjpegを使って1ライン分を圧縮 */
    jpeg_write_scanlines(&cinfo, &jrow, 1);
 }
 jpeg_finish_compress(&cinfo);
 jpeg_destroy_compress(&cinfo);

まず、jpeg_compress_struct構造体の中のwrite_JFIF_headerをFALSEに設定します。これでJFIFを含むAPP0セグメントが出力されなくなります。入力/出力する色空間としてYCbCrを選択、ファイルサイズが16KBを超えるようにqualityとして90を指定しておいて、jpeg_start_compress()を呼びだします。そして、jpeg_write_marker()を使ってAPP1マーカーを持つセグメント情報(すなわちExif情報)を書き出します。この後で、jpeg_write_scanlines()を呼ぶ事でExif情報ならびに圧縮関連情報の後に圧縮画像データが続くことになります。



こうして作られたのが上の画像です。見かけ上はこれまでと変わりありませんが、Exif情報が追加されています。次のような情報を追加していますが、ほとんどのタグ情報は固定値であり動的に変化するのは撮影日時だけとなっています。
タグ名意味
Makeメーカ名sirius506
Model</rd>モデルsirius506 ov7670
DateTimeOriginal原画像データの生成日時YYYY:MM:DD HH:MM:SS
ExifVersionExifバージョン0230
MeteringMode測光方式不明
LightSource光源不明
ExposureMode露出モード露出自動
WhiteBalanceホワイトバランス自動

いやはや役に立たない値ばかりです。撮影データとしてはシャッタースピードとか絞りとかの値が欲しいところですが、どうやって求めればいいのかわかりません。Eye-FiでGoogle+に自動アップロードされたアルバム画像を見れば主要Exif情報を確認できますが、このように空欄が目立ちます。


コメント (0) |  トラックバック (0) | 

近日登場予定

2012-05-16 22:46:11 | Weblog
毎週恒例、Mouser の新製品紹介ページをチェックしていたら、SAM4S近日登場!との記載が目に飛び込んできました。Mouserで買えるようになるのは嬉しいニュースではありますが、「まずはSAM3S在庫してくれよ!!」と突っ込みたいのが個人的な感想。

Digikeyを確認してみるも、SAM4Sについてはまだ音沙汰無い模様。しかし、7月出荷予定となっていたSAM3A/SAM3Xの出荷予定日がいつの間にか5月24日になっています。ていうか、来週じゃねーか。自分が使うとしたら、SAM3Aの100pinが物理的な限界かな。これが64pinだったら迷わずに買っておくところなんですが、100pinとなるとそれだけで心理的障壁が高くなっていまいます。
コメント (0) |  トラックバック (0) | 

Eye-FiカードへのJPEGファイル書き込み

2012-05-15 12:27:32 | Weblog
前回の記事にも書いたように、Eye-Fiカードへの書き込まれた画像がWiFi経由で転送されるためには、いくつかの条件があります。これまでの経験から習得した、Eye-Fiカードを使ううえでの注意点を整理しておくことにします。
  1. 消費電力
    Eye-Fiカードは無線LAN機能内蔵なので、普通のSDカードと比べて当然消費電力が多くなります。Eye-Fiは1分周期で無線アクセスポイントと新しい画像の有無をチェックする仕様となっているようです。無用の場合には、カードへの電源供給を断った方が好ましいので、今回製作したボードではFETスイッチを設けてこれを制御できるようにしてあります。ところが、このスイッチを入れたとたんに、マイコンにリセットがかかるという問題に遭遇しました。原因は、カードへの電源供給開始にともなう突入電流によって電圧降下が発生し、BODがかかるためです。対策として手もちの47μHのインダクタをSDカードへのVccに追加することで、問題解決。普通の2GB SDカードを使っていた時は問題なかったので、Eye-Fiカードの違いを痛感。
  2. DCFに従う
    前回の記事にも書いたとおり、カードへのJPEGデータ保存に際してはDCFに従ったディレクトリ構造、ファイル名を持つ必要があります。最初、ファイル名の番号付けを間違えていたためにファイル名が8文字であるべきところが7文字になっていたために、ちっとも画像が転送されずハマってしまいました。
  3. ファイル長
    やはり16KB以下のサイズのファイルは転送されないという推測は当たっているようです。16KB以上のサイズの画像は全て転送されることが確認できました。圧縮時のqualityを80から90に変更することで対応しました。IJGライブラリを用いて生成しただけのシンプルなJPEGファイルでも転送できています。このファイルにはExif情報は全く含まれていませんが、Eye-Fiカードもそこまではチェックしていないようです。

Eye-Fi対応カメラであれば画像転送中であることの判別ができるようなので、できればその方法が知りたいところです。しかしながら、現状ではQVGA画像を圧縮しているため、ファイルサイズは20KB〜30KB程度でしかなく、転送にも時間を要しません。撮影後2分も待てば無線LANを見つけて転送を完了できるでしょうから、カードへの電源供給を断ってもいいかと思われます。
コメント (0) |  トラックバック (0) | 

Eye-Fiは16KB以下の画像を転送できない?

2012-05-12 19:01:13 | Weblog
カメラからの画像をJPEGファイルを書き込めるようになったので、Eye-Fiカードを使うことで自動アップロードの実験中です。

Eye-Fiカードは、カードに書かれたどんなファイルでも転送できるわけではありません。写真であれば、DCF規格に沿って作成されたカメラ画像を転送するようになっているようです。例えば、ルートディレクトリに書き込まれたJPEGファイルは転送されません。DCF規格が定めるディレクトリ構造配下にあるJPEGファイルでないと転送しません。ファイル名にも規則がありますので、これに従った名前を付けてやる必要があります。

このように、DCF規格に沿った構造、名前を付けてカードへJPEGファイルを書き込むことで、アップロードができるようになりました。ところが、撮影したファイルの一部しかアップロードできていません。連番でファイル名を付けているにもかかわらず、転送されるファイルもあれば、転送されないファイルもあります。どのファイルも、PC上では通常のJPEGファイルとして見ることができるのですが、Eye-Fiが確認する条件を満たさないものがあるようです。きょう試した画像を調べたことろではどうやらファイルサイズが16Kバイトに満たないものが転送されていないようです。あくまでも想像ですが、16KB以下のファイルはデジタルカメラで撮影した画像としては小さすぎと判断されているのではないでしょうか?

撮影対象や条件によっても異なりますが、現在撮影したQVGA画像のサイズはおおむね15KBから25KB程度のサイズになっています。圧縮時のQualityパラメータを80に設定していますが、この値をもう少し大きくすることで画像品質を高めてやれば、出力されるファイルサイズも大きくなるでしょうから、この問題を回避できるかもしれません。
コメント (0) |  トラックバック (0) |