平成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/

平成23年11月5日 土曜日

mbedメモ1 http経由で情報を取ろう!

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

ガイガーのファーム弄りで味をしめたので秋月でmbedをもうひとつ買ってきました。
秋葉じゃ最安なのかな?5200円。
ついでにパルストランス内臓のetherコネクターも買ってきた。

とりあえず、http経由で情報を取ってきて、VFDに出力するのでもやってみようという備忘録。

プロジェクトを作成すると雛形のmain.cppが出来るので、プロジェクトを右クリックし(FireFoxだとダイアログが被るのでescを1回押す)、Import Library・・・を押す。
そして「HTTPClient」をインポートし、次に「EthernetNetIf」をインポートするんだけど、これが同名のが沢山あるようで「Donatien Garnier」さん作の「2010年8月05日」版を取得。
これ>http://mbed.org/users/donatien/programs/EthernetNetIf/5z422
これ以外のをインポートするとcore/net.h辺りでエラーがでてにっちもさっちも行かない?

平成23年10月16日 日曜日

若松ガイガーカウンターとmbed事始

Filed under: プログラミング — とめくぎ @ 6:41:36

さて、先月買った若松で売ってるガイガーカウンターキットですが、近々自宅以外の遠隔地に設置しようと計画中です。
せっかくイーサー付いてるわけですから、自宅以外の場所を計測させてネット経由で報告させるのが筋ってもんでしょう。

というわけで、先日のb-mobileルータとwebcamのセットで県内某所の施設に設置予定。

しかし、デフォルトのファームだと海のものとも山の物ともつかぬ、パッチョベイとやらに登録して云々と面倒くさい。
twitterで投げたのを拾ってくるのは訳無いからそっちで・・・・、と思ったら、こっちもTwitter以外のどっかのASPに登録して云々と、面倒くさい。

できれば直接サーバのスクリプトに投げたいんだけどー。
とガイガーカウンターの公式サイトを眺めてると、公開されているソースを弄ってGPSやらhttpに投げる改造をされている方が居るのを発見した。
確かにmbedの開発ボードとしての側面もあるこのキット。せっかくなのでmbedでプログラムに挑戦だ!
挑戦して初めて知ったのだけど、これブラウザがあれば開発環境はすべてWebの統合開発環境(IDE)上。すっごい導入が楽。
ソースをweb上の開発環境に投げて、ブラウザ上で実行されるIDEでコンパイル。コンパイルが完了すると、ダウンロードダイアログがでるので、mbedのフォルダにコピるだけ。なんともエレガント。

というわけで、作者のプロジェクトをインポートして早速改造開始!
まずは要らないパッチベイやらGPSの機能を除去。メモリを少しでも空けたい。
元々付いてるtwitterのコードを参考に、CFGファイルに書いたURLにPOSTするメソッドを作成してパッチベイの変わりに初期化部分とmainループに設置するだけ。
あっさりと出来てしまった。

今まではtcpipの低レベルなところから実装して云々と、Webに直接マイコンを繋ぐのは大変だったけど、mbedには強力なツールやみんなが作ったソースがある。
ソースをインクルードして呼ぶだけで簡単にWebに踏み出せるのがすごい。

イーサー付きのH8マイコンボードで放り投げてしまっている、サーバアラート灯もコレで作りたいね!
あと秋月VFDをネットに直結も出来るし!
夢は膨らみまくりんぐ。

■追記
Webアップデート試してみたんだけど、ファイルをダウンロードしたところで表示がズっコケで失敗するなぁ。
メモリ不足かしらん?mbed上にはgeiger.b_、geiger.t_、geiger.m_が出来てる。
遠隔地にあるんで、アップデートできたらなぁと思ったのですが、残念です。

■さらに追記
webアップデートを調査してみたんだけど、既存ファームをバックアップする仕組みの部分でコケている様子。
mbed上のdirを開き、ファイルリストを取得して既存binファイルをリネームする処理なんだけど、どうもそこいらがメモリを食うようで、ストップしてしまう様子。
まあ、その前にファイルの整合性チェックのためのmd5でも結構食っているので、そっちが問題なのかもしれない。
遠隔地で計測させるため、リモートアップデートが失敗すると取り返しが付かないので、この機能は省く事にした。

あと、起動時にetherが刺さってないかDHCPの取得に失敗したときにデータをPOSTするタイミングで再度IPの取得を試みるはずが取得できてない模様。
ウチのファームだけかな?
とりあえず
//これを if (noInternet==1 && eth0.link()==1){
if (noInternet && eth0.link()){//←こうした

以上のようにしたら直った。たぶん「if (noInternet==1 && eth0.link()){」でも良いんじゃないかな?
停電からの復帰時にルータの起動完了より先にガイガーが起動してしまうので、DHCPからIPもらい損ねたり、etherのUPLINKもらい損ねたりするので結構重要。

開発元
http://diytec.web.fc2.com/mark2r2/

mbed
http://mbed.org/

平成23年4月3日 日曜日

白箱の連動シャットダウン

Filed under: たわごと, プログラミング — とめくぎ @ 16:10:14

原発が被災し電気が足らない訳で、計画停電になりました。
齢60の親父は昔はしょっちゅう停電したぞ!1週間ぐらい!と言っているが・・・・。(それは電気代払えなくて停められてただけじゃ)
引込み線の電線盗まれて停電したこともあったそうで。

そんなわけで、自宅サーバやファイルサーバを動かすUPSをキチンと設定すると共に
ファイルサーバの連動シャットダウンに挑戦します。

サーバのOSはFreeBSD、UPSは三菱のなので、portsに純正のツールがあるのでそれをインストールする。
cd /usr/ports/sysutils/freqsdwn
make install clean
で設定をして終わり。
ケーブルは指定の物とは弱冠違うが動作した。ポート名称を間違えないように。

続いてファイルサーバである白箱を連動シャットダウンする。
白箱の中身はDebianなので、少々の小細工で連動シャットダウンできそう。

とりあえず、白箱にシャットダウン用アカウントを作成し、UPSの繋がるFreeBSDのサーバから
そのアカウントにパスなしでログオンしてシャットダウンコマンドを実行するという流れ。

以下にざっと手順をメモる。間違いとか有るかも。
(more…)

平成21年5月18日 月曜日

続ETC

Filed under: プログラミング — とめくぎ @ 3:24:06

なにはともあれ、解析に成功。w
試作ソフト

19200bpsのパリティ偶数であった。
パリ有りに気づくまでえらく時間が掛かってしまった。
プロトコルアナライザを買うべきか。いやいや、USBシリアル二挺拳銃で良いんでないかい。

これを元にマイコンに移植予定。

次のページ »

HTML convert time: 0.241 sec. Powered by WordPress ME