2015年9月27日日曜日

Raspberry PiにUSBカメラを接続してみた

以前ビデオ通話用に購入したカメラを使わずに放置したままになっていて、もったいなかったので、Raspberry Piに接続して監視カメラ化してみました。

手順は簡単3ステップです。

  1. USBカメラ接続
  2. MJPG-streamerをインストール&起動
  3. ブラウザからアクセス

1.USBカメラ接続

ELECOMのUCAM-DLE300T Seriesと印字されたカメラを使いました。
ちょっと心配でしたが、Raspberry PiにUSB接続したら認識してくれました。

pi@raspberrypi ~ $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 008: ID 056e:700e Elecom Co., Ltd

lsusbコマンドの実行結果4行目にElecomの文字が表示され、認識されていることがわかります。

2.MJPG-streamerをインストール&起動

MJPG-streamerはパッケージ化されていないので、まずはsubversionと画像処理ライブラリをインストールします。

$ sudo apt-get install -y subversion libjpeg-dev imagemagick

次にMJPG-streamerのソースをダウンロードしてインストールします。

$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer
$ make
$ sudo make install

インストール後、mjpg-streamerディレクトリ内に起動スクリプトを作成します。
ここでは「start_stream.sh」とします。また、アクセス先ポート番号を8080、さらにアクセス時にID/PWの入力が必要なように設定します。

#!/bin/sh

PORT="8080" #ポート番号
ID="user" #ID
PW="passward" #パスワード
SIZE="320x240" #画面サイズ
FRAMERATE="10" #フレームレート
export LD_LIBRARY_PATH=/usr/local/lib
./mjpg_streamer \
-i "input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y" \
-o "output_http.so -w /usr/local/www -p $PORT -c $ID:$PW"

保存後、実行権限を付与します。

$ chmod 755 start_stream.sh

そして、スクリプトを実行します。

$ sudo sh start_stream.sh

3.ブラウザからアクセス

別のマシンでブラウザを立ち上げて、http://<Raspberry PiのIPアドレス>:8080にアクセスすると以下のようにページが表示されます。Streamタブでは動画を確認することができます。


また、Staticタブからは静止画像を取得することができます。

2015年9月26日土曜日

GalileoでやっとLチカできた

■Intel Galileo

Intelが発売したx86 CPUを搭載したLinuxボードで、Arduinoでもあります。登場時は雑誌で特集が組まれたり、結構話題になっていた印象でしたが、Raspberry Piにとってかわるようなことはなく、今ではあまり賑わっている印象はありませんね(キャッチアップできていないだけで、実は賑わっているのかもしれませんが...)。

私は、発売当時に第1世代Galileoを購入したものの、MacでArduino IDEが起動せずじまいで1年以上放置してしまっていたのですが、最近になってやっとLチカまでこぎ着けました。

■Lチカまでの道のり

結構苦労しました。成功までの流れを以下に記載しておきます。

①OS X Yosemite on MacBook Late 2009
→Arduino IDE 1.6.0、FirmwareUpdate 1.0.4が起動せず失敗。
↓
②Windows 7 64bit on ThinkPad T61
→デバイスドライバインストール
  (ドライバはIDE1.6.0を解凍してできたフォルダ内のdriversに入っている)
 →Arduino IDE 1.6.0は起動し、Lチカのスケッチを実行したもののLチカせず失敗。
  →[ツール] > [ボード] > [Intel® Galileo]を選択
  →[ボード] > [Galileoが認識されたCOM番号]を選択
 →FirmwareUpdate 1.0.4でファームウェアアップデートを試みるものの失敗。
  →怖いけどUSBケーブル引き抜いてGalileo再起動させました。
  →Java7(x64)の状態で止まっていたので、Java8(x86)に更新して、
   環境変数JAVA_HOMEを変更。
  →x86版Java8になったのはオンラインアップデータを使用したため
 →この状態でファームウェアアップデートを実行したら成功しました。
  →成功したのはJava更新のおかげか、タイミングなのかは分かりません。
 →Arduino IDE 1.6.0で[ファイル] > [スケッチの例] > [01.Basics] > [Blink]を
  実行したところLチカ成功!

Windowsではできたけど、Macでできないままなのは悔しいので、マシンを変えてチャレンジ。
↓
③OS X Yosemite on MacBookPro Mid 2014
→Arduino IDE 1.6.0を起動したら、レガシーサポート用の
  Java6(Java for OS X 2015-001)をインストールせよという画面が
  表示された(MacBook Late 2009ではなんで表示されなかったんだろう...)。
 →https://support.apple.com/kb/DL1572?locale=ja_JP から
  javaforosx.dmgをダウンロード。
↓
④OS X Yosemite on MacBook Late 2009
→ダウンロードしたjavaforosx.dmgをこっちに持ってきてインストール。
 →インストール後Arduino IDE 1.6.0を起動したら、起動成功
  (環境変数JAVA_HOMEの設定等は一切していない)。
 →[ツール] > [ボード] > [Intel® Galileo]を選択
 →[ボード] > [/dev/cu.XXXXX]を選択(/dev/tty.XXXXXを選択してはダメらしい)
 →Blink実行でLチカ成功!

【Lチカ成功時の写真(GPとプリントされた横のLEDが点灯しています)】

2015年8月2日日曜日

Gnuplot連携ライブラリ(C言語)

大学時代から数値計算結果のプロットは、もっぱらGnuplot(http://www.gnuplot.info/)を使っています。なんだかんだお手軽で便利なんですよねGnuplot。

C/C++から呼び出すときには、popen(3)でGnuplotを呼び出して要件に合わせてプロットするコードを書きますが、毎度毎度書くのは面倒で、いつかはライブラリ化しようと思いつつも、大学時代に自分用に作ったプロット用関数群を使用し続けていました。

最近久しぶりにコード書いてて、コードからGnuplot呼び出そうとしたときに、せっかくだからライブラリ化しよう思いました。大学時代の自分なら闇雲にいきなりコードを書いてしまったでしょうが(車輪の再発明が大好きだったのです)、当時よりは少しだけ冷静に行動できるようになっていますので、既に公開されているライブラリはないか探してみました。そして探してみたら、あっさり見つかりました。

gnuplot interfaces in ANSI C(http://ndevilla.free.fr/gnuplot/)

まだ、サンプルコードいじった程度ですが、シンプルで使いやすそう。自分で必要な機能を追加するにしても、これをベースに作っていこうかなと思いました。

/*
 * Examples of gnuplot_i.c usage
 */

#include <stdio.h>
#include <stdlib.h>

#include "gnuplot_i.h"

#define SLEEP_LGTH  2
#define NPOINTS     50

int main(int argc, char *argv[]) 
{
    gnuplot_ctrl    *   h1,
                    *   h2,
                    *   h3,
                    *   h4 ;
    double              x[NPOINTS] ;
    double              y[NPOINTS] ;
    int                 i ;

    /*
     * Initialize the gnuplot handle
     */
    printf("*** example of gnuplot control through C ***\n") ;
    h1 = gnuplot_init() ;

    /*
     * Slopes
     */
    gnuplot_setstyle(h1, "lines") ;
    
    printf("*** plotting slopes\n") ;
    printf("y = x\n") ;
    gnuplot_plot_slope(h1, 1.0, 0.0, "unity slope") ;
    sleep(SLEEP_LGTH) ;

    printf("y = 2*x\n") ;
    gnuplot_plot_slope(h1, 2.0, 0.0, "y=2x") ;
    sleep(SLEEP_LGTH) ;

    printf("y = -x\n") ;
    gnuplot_plot_slope(h1, -1.0, 0.0, "y=-x") ;
    sleep(SLEEP_LGTH) ;
    

    /*
     * Equations
     */

    gnuplot_resetplot(h1) ;
    printf("\n\n") ;
    printf("*** various equations\n") ;
    printf("y = sin(x)\n") ;
    gnuplot_plot_equation(h1, "sin(x)", "sine") ;
    sleep(SLEEP_LGTH) ;

    printf("y = log(x)\n") ;
    gnuplot_plot_equation(h1, "log(x)", "logarithm") ;
    sleep(SLEEP_LGTH) ;

    printf("y = sin(x)*cos(2*x)\n") ;
    gnuplot_plot_equation(h1, "sin(x)*cos(2*x)", "sine product") ;
    sleep(SLEEP_LGTH) ;


    /*
     * Styles
     */

    gnuplot_resetplot(h1) ;
    printf("\n\n") ;
    printf("*** showing styles\n") ;

    printf("sine in points\n") ;
    gnuplot_setstyle(h1, "points") ;
    gnuplot_plot_equation(h1, "sin(x)", "sine") ;
    sleep(SLEEP_LGTH) ;
    
    printf("sine in impulses\n") ;
    gnuplot_setstyle(h1, "impulses") ;
    gnuplot_plot_equation(h1, "sin(x)", "sine") ;
    sleep(SLEEP_LGTH) ;
    
    printf("sine in steps\n") ;
    gnuplot_setstyle(h1, "steps") ;
    gnuplot_plot_equation(h1, "sin(x)", "sine") ;
    sleep(SLEEP_LGTH) ;

    /*
     * User defined 1d and 2d point sets
     */

    gnuplot_resetplot(h1) ;
    gnuplot_setstyle(h1, "impulses") ;
    printf("\n\n") ;
    printf("*** user-defined lists of doubles\n") ;
    for (i=0 ; i<NPOINTS ; i++) {
        x[i] = (double)i*i ;
    }
    gnuplot_plot_x(h1, x, NPOINTS, "user-defined doubles") ;
    sleep(SLEEP_LGTH) ;

 printf("*** user-defined lists of points\n");
    for (i=0 ; i<NPOINTS ; i++) {
        x[i] = (double)i ;
        y[i] = (double)i * (double)i ;
    }
    gnuplot_resetplot(h1) ;
    gnuplot_setstyle(h1, "points") ;
    gnuplot_plot_xy(h1, x, y, NPOINTS, "user-defined points") ;
    sleep(SLEEP_LGTH) ;


    /*
     * Multiple output screens
     */

    printf("\n\n") ;
    printf("*** multiple output windows\n") ;
    gnuplot_resetplot(h1) ;
    gnuplot_setstyle(h1, "lines") ;
    h2 = gnuplot_init() ;
    gnuplot_setstyle(h2, "lines") ;
    h3 = gnuplot_init() ;
    gnuplot_setstyle(h3, "lines") ;
    h4 = gnuplot_init() ;
    gnuplot_setstyle(h4, "lines") ;

    printf("window 1: sin(x)\n") ;
    gnuplot_plot_equation(h1, "sin(x)", "sin(x)") ;
    sleep(SLEEP_LGTH) ;
    printf("window 2: x*sin(x)\n") ;
    gnuplot_plot_equation(h2, "x*sin(x)", "x*sin(x)") ;
    sleep(SLEEP_LGTH) ;
    printf("window 3: log(x)/x\n") ;
    gnuplot_plot_equation(h3, "log(x)/x", "log(x)/x");
    sleep(SLEEP_LGTH) ;
    printf("window 4: sin(x)/x\n") ;
    gnuplot_plot_equation(h4, "sin(x)/x", "sin(x)/x") ;
    sleep(SLEEP_LGTH) ;
    
    /*
     * close gnuplot handles
     */


    printf("\n\n") ;
    printf("*** end of gnuplot example\n") ;
    gnuplot_close(h1) ;
    gnuplot_close(h2) ;
    gnuplot_close(h3) ;
    gnuplot_close(h4) ;
    return 0 ;
}

またやってしまった

前回の投稿をしてから1年以上経ってしまった・・・

この1年以上の間にいろいろなことがありました。MDM(Mobile Device Management)製品(※)にどっぷりだったり、MacBook Pro 15-inch, Mid 2014を購入したり、プライベートでもいろいろあったりと、とにかく色々あったのでした。

プログラミング関連の知識・スキルを高めたいと思っていたけど、仕事が忙しかったりして全然できず、むしろ錆び付いてしまったけど、また徐々にやっていこうと思って投稿を再会しました。

(※)市場を牽引するベンダーがEMM(Enterprise Mobile Management)って言葉をつくってたりします。

2014年5月10日土曜日

自作Androidアプリの実機確認

自分メモ.
root化したAndroid端末では実行できなかった(実行してもアクティビティが表示されない).

root化した端末でも実行する方法はあるんだろうけど別に困っていないからいいや.

iPhoneアプリに挑戦

年明けにiPhone4Sから5Sに機種変更して早くも5ヶ月目.
3ヶ月目でアスファルトの上に落っことしてしまったので, 既に傷だらけになってしまった.
・・・まぁそんなことはどうでもいいや.

眠くて文章まとめるのが面倒なので, なんで今更iPhoneアプリに挑戦しようと思った経緯をプライベートと仕事に分けて書いてみる.

プライベート

自宅PCが老朽化してきて, 『買い替えようかなぁ』とネットでPCを選んでたけど, どれもイマイチ.
↓
そういえば以前買ったiMacが1回しか電源入れずに2年近く沈黙していることに気づく.
↓
『もったいないし, この際Macに移行するか』と思い立つ. 割とスムーズにMacに移行できた.
↓
どうせXcode入れるし, せっかくだからiPhoneアプリ作ってみたいな〜
iPhone5Sに機種変更して4Sを実機確認用に使えるしちょうどいいや.

仕事

DBセキュリティの仕事がなくて将来不安〜
↓
今年度は, MDMできるようになっておまんま食べられるようにしよう.
↓
iPhone/Androidのアプリの動きがわかってるとMDM製品の理解に役立つだろうな〜

とまぁこんなわけです.
GW中にiOS Developer Programにも登録したった.
お金払ったらすぐにアクティベートされると思ったら, 2日くらいステータスがPendingのままでちと焦った.
それと実機で動作確認するまでに結構ややこしかったから後でまとめておこうと思う.

2013年12月7日土曜日

CentOSにmDNSを設定する

ノートPCにインストールしたCentOSに, mDNSに設定したときのメモ.

経緯

このCentOSは, 持ち運び可能なサーバとして運用している. ポータブルな環境に固定IP設定するのは微妙だし, IPアドレス直打ちでアクセスするにしても, 毎回IP確認するのは面倒くさい.
そこで, mDNSを設定して「ホスト名.local」でアクセスできるようにした.

ホスト名の設定

まずは, ホスト名を設定する.
NETWORKING=yes
HOSTNAME=hoge.local

nss-mdnsのインストール

nss-mdnsパッケージは, CentOSの標準リポジトリにないのでEPELを追加する.

◆EPELのインストール
$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -ivh epel-release-6-8.noarch.rpm
nss-mdnsをインストールするだけなので, 普段はEPELを有効にしないようにしておく(/etc/yum.repos.d/epel.repoの[epel]セクションで「enable=0」にする).

◆nss-mdnsのインストール
$ sudo yum --enablerepo=epel install nss-mdns

nss-mdnsの設定

名前解決の手段として使用するには, /etc/nsswitch.confの修正が必要だが, nss-mdnsをインストールすると自動で修正されているはず.
hosts:      files mdns4_minimal [NOTFOUND=return] dns

Firewallの設定

system-config-firewall-tuiを起動して, 「マルチキャスト DNS (mDNS)」を信頼したサービスに追加しておく. 追加すると, 224.0.0.251:5353宛のUDP通信が許可される.

再起動

いろいろ設定を変更したので, rebootして設定を反映させる(もちろん各サービスの再起動でも可).