平成24年10月8日 月曜日

Webカメラを作ろう

Filed under: プログラミング — とめくぎ @ 13:14:23

と言う事で、作成めも。

機材はすべて自宅にあるものを活用する。
OSはFreeBSD 9.0で。
CPU&マザーは死蔵しているVIA EPIA-V
キャプチャはbt848搭載のが昔から転がってるのでそれ。
HDDとかはあり合わせので40GB。出来ればSSDにしたいなぁ。
でもとりあえずPATAのHDD。あっちんちん。

■OSのインストールまでは普通に。
SSDやCFにインストールするなら、LOGとか書き込みをさせない小細工をするといいかも。

■具体的な作業の前にportsを最新に。
# portsnap fetch
# portsnap extract
# portsnap fetch update

■このままだと、キャプチャが認識しないの以下の設定をする。
vi /boot/loader.conf
bktr_load=”YES”

■再起動で以下のように認識するはず。
# dmesg | grep bktr
bktr_mem: memory holder loaded
bktr0: <brooktree 848A> mem 0xe3401000-0xe3401fff irq 11 at device 20.0 on pci0
bktr0: [GIANT-LOCKED]
bktr0: Detected a DPL34-1@-@0 at 0×84
bktr0: Intel Smart Video III/VideoLogic Captivator PCI, <no> tuner, dpl3518a dolby.

■kldstatで動的にリンクされているか確認する。
# kldstat
Id Refs Address Size Name
1 5 0xc0400000 e9ece4 kernel
2 1 0xc129f000 126e8 bktr.ko
3 2 0xc12b2000 1eec bktr_mem.ko

■portsからcamservをインストール
# cd /usr/ports/multimedia/camserv
# make install clean

■設定ファイルを雛形からコピー.
# cd /usr/local/share/camserv/
# cp camserv.cfg.dist camserv.cfg

■設定変更
変更箇所のみ列挙。
vi /usr/local/share/camserv/camserv.cfg

[video_fbsd_bttv]
port            0
channelset      6
channel         1

[time_stamp]
x               10
y               0

[video]
video_section           video_fbsd_bttv

ココまで。
最後の「video_section video_fbsd_bttv」は必ず変更する事。
video_basicのままだと、寝ても暮らせど表示できません。色んな色がでるだけ。

最後にIE向けの表示ページとFireFox向けのページを作成する。
FireFox向け

<html>
<head>
</head>
<body>
<img src="http://192.168.0.145:9192/"/>
</body>
</html>

IE向け

<html>
<head>
<title>for Internet Explorer</title>
<meta http-equiv="Content-Type" content="text/html; CHARSET=x-euc-jp">
<script LANGUAGE="JavaScript">
<!-- hide
// "var speed" is the refresh rate adjustment in seconds.
var speed = 1;
var y = 1;
var x = speed + y;
var time = x - y;
var now;
campicture = new Image();
function stopClock() {
	x = "off";
	document.form0.clock.value = x;
}
function startClock() {
        if (x != "off") {
	x = x - y;
	document.form0.clock.value = x;
	if (x <= 1)
        {
          reload()
        }
	timerID = setTimeout("startClock()", 1000);
        }
}
function reload() {
	now = new Date();
	var camImg = "http://192.168.0.145:9192/singleframe/" + "?" + now.getTime();
	document.campicture.src = camImg;
    x = speed;
    document.form0.clock.value = x;
              	  }
//end hide -->

</script>

</head>

<body onload="startClock()">

<FORM action="JScam.html" name="form0">
<IMG src="http://192.168.0.145:9192/webcamstream.jpg" name="campicture" alt="Picture" border=0 reload="60" height=300 width=400>
<INPUT type="hidden" name="clock" size="3" value="">

</FORM>
</body>
</html>

■起動スクリプト
毎度ログインして起動するとかやってられないので起動スクリプトを作る。
#vi /usr/local/etc/rc.d/camserv

#!/bin/sh

# PROVIDE: hoge-script
# REQUIRE: LOGIN

. /etc/rc.subr

name="camserv"
rcvar=`set_rcvar`

# read configuration and set defaults
load_rc_config "$name"
: ${camserv_enable="NO"}

command="/usr/local/bin/${name} &"
command_args=""

run_rc_command "$1"

rc.confに追記
vi /etc/rc.conf
camserv_enable=”YES”

■電動雲台コントロール作成
雲台はAC100Vのモータで動く物をジャンクで入手した。
何らかのI/Oでリレーを制御し、モータをコントロールする。
プリンターポートをパラレルIOとして使う案と、パトライト社から出ているether接続のリレーボックスを使う案の2通りある。

まずはプリンターポート。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <dev/ppbus/ppi.h>

int main(int argc, char* argv[])
{
    int fd;
    u_int8_t ct, dt;
    char *p;

    if (argc != 2) {
        puts("An argument is lacking. n");
        return 1;
    }
    p = argv[1];

    if( (fd = open( "/dev/ppi0", O_RDWR )) < 0 )
    {
        perror( "ppi Open ERR" );
        return 1;
    }

    ct = 0x0b;                     /* OUT configure */
    ioctl( fd, PPISCTRL, &ct );

    dt = 0x00;                     /* OUT Data */
    if(*p=='L'){
        dt = 0x01;
        printf( "Leftn" );
    }
    if(*p=='R'){
        dt = 0x02;
        printf( "Rightn" );
    }
    if(*p=='U'){
        dt = 0x04;
        printf( "Upn" );
    }
    if(*p=='D'){
        dt = 0x08;
        printf( "Downn" );
    }
    if(*p=='I'){
        dt = 0x10;
        printf( "Zoom Inn" );
    }
    if(*p=='O'){
        dt = 0x20;
        printf( "Zoom Outn" );
    }
    ioctl( fd, PPISDATA, &dt );

    close( fd );
    return 0;
}

#gcc -o iotest iotest.c
iotest L
でLeftに首振りするように結線する。
D-Sub25の25ピンがGND、2ピンから順に
2:Left、3:Right、4:Up、5:Down、6:Zoom In、7:Zoom Outです。
ソリッドステートリレーを使うか、トランジスタと逆起電力吸収用ダイオードとコイルリレーを使って回路を組んで完了です。

参考サイト (作者様に感謝!)
http://www.geocities.jp/kinput3/2007/bttv/fxtv.html
http://bakuretsu.atso-net.jp/bakuretsu/freebsd/freebsd-camserv.html
http://www.youko-house.ne.jp/~hirohito/memo/ppi/

コメント (0) »

この記事にはまだコメントがついていません。

コメント RSS トラックバック URL

コメントをどうぞ

HTML convert time: 0.084 sec. Powered by WordPress ME