2012年5月8日火曜日

USBカメラをmbedに繋げてみた(1)

USBのアイソクロナス転送を理解するためにmbedにUVCのUSBカメラVX-700を繋げてみた。
USBホスト機能はNetServicesSourceに含まれていたUSBホストのプログラムにアイソクロナス転送を追加しました。
本来は転送完了を割り込みで検出するのだろうけど、アイソクロナス・トランスファ・ディスクリプタ(ITD)のコンディションコード(Condition Code)をポーリングしていてNOT ACCESSEDでなくなったら転送完了、つまりカメラからデータが来ているだろうとしています。
まだ全然安定してませんがなんとか撮れるようになったのでプログラムはmbedサイトに上げました。

LifeCam UVC(USB Video Class) host

mbedで撮影した画像です。mbedのRAM容量の都合で画像サイズは160x120です。
サイズを2Kバイト以内に抑えているので欠けているところもあります。
USBエリアを活用すればもう少し大きい、画質の良い画像が撮れるかもしれない。

使用例:
#include "mbed.h"
#include "uvc.h"
Serial pc(USBTX, USBRX);
LocalFileSystem local("local"); 

int main()
{
    pc.baud(460800);

    uvc* lifecam = new uvc;
    lifecam->setup();
    uint8_t buf[2048];
    for(int n = 0; n <= 9; n++) {
        int len = lifecam->get_jpeg(buf, sizeof(buf));
        char path[24];
        snprintf(path, sizeof(path), "/local/usbcam%02d.jpg", n);
        printf("%s %d\n", path, len);
        if (len > 0) {
            FILE *fp = fopen(path, "wb");
            for(int i = 0; i < len; i++) {
                fprintf(fp, "%c", buf[i]);
            }
            fclose(fp);
        }
     }
    exit(1);
}
---

0 件のコメント: