MotionJPEGをMPEGに変換する

動画ファイルをアップロードしようと思ったのですが、SP-560UZではMotionJPEGで記録されるので、ちょっとした動画でも大きなサイズになってしまいます。

そこで、Linuxで簡単に動画サイズを圧縮する方法を探していたら、MJPEG Toolsで圧縮できそうなのがわかりました。(もちろん、本格的に圧縮するなら handbrake なのですが、ここではちょっとしたファイルなので簡単に済ませます)

  1. MJPEG Toolsのインストール
    Synapticパッケージマネージャで「mjpegtools」を選択してインストールします。
  2. 映像の圧縮
    $ lav2yuv foo.avi | mpeg2enc -o foo.m1v
    -b オプションでビットレートが設定できるようです。
  3. 音声の圧縮
    $ lav2wav foo.avi | mp2enc -o foo.mp2
    同じく -b オプションでビットレートが設定できるようです。
  4. 映像と音声の統合
    $  mplex foo.mp2 foo.m1v -o foo.mpg

Chromeブラウザをデフォルトでシークレットモードで起動する

起動や動作が早いこと、Ubuntu上でもほとんど問題を感じることなく動作することからすっかり常用のブラウザと化してしまった Chrome ブラウザですが、Chromeブラウザには履歴などを残さないシークレットモードがあります。

変にトラッキングされたりするのは嫌なので、普段訪れるサイト以外はできればシークレットモードにしたいものですが、これまで起動してから「Ctrl+Shift+N」で新しいWindowを開く方法しか知りませんでした。

しかし、起動用のショートカットのプロパティを開いてコマンドの部分に「–incognito」を書き足してやると起動時からシークレットモードになることがわかりましたので、ショートカットの類をすべて書き換えました。

やっぱり基板作ろうかな・・・・

何かと思いつきで作るので、いつもユニバーサル基板への実装になってしまいます。しかし、ArduinoベースやAVRベースだと同じような基板ばかりになるので配線が面倒くさい。ということで、やっぱり基板をつくろうか悩んでます。ただ、基板を作ろうとすると、ライブラリの問題があって、これまた面倒くさい。

まあ、とにかく、まずは基板屋さんをちょっと調べてみたのでメモ。

  1. OLIMEX
    日本におけるホビーの基板作成の定番といえばOLIMEX。ブルガリアの会社。設計ルールが厳しいのがしんどいところ。
  2. PCB CART
    中国で製造? 枚数が増えると激安という話も。
  3. Silver Circuits(旧称 Custom PCB)
    マレーシアの会社。距離が近い分、輸送期間や輸送費用が安いらしい。
  4. P板.com
  5. EzPCB
    中国にあるメーカー?
  6. Fusion PCB
    中国の深センにあるメーカーとのこと。格安らしい。

参考になりそうなホームページ(ブログ)はこんなところでしょうか。(自分がググった結果で記録に残したいものです)

  1. PICマイコンを便利に使うページ
    PIC中心のページ。番外編に「海外へ基板を注文して見た」というのがあって、 そこにOLIMEX、SilverCircuits、PCB CARTへの発注記があって、参考になりそう。
  2. unos.biz(でいいのだろうか?)
    ブログのタイトルがどれなのかよくわからないのですが、 SilverCircuitへの発注をされています。その他にもP板.comやアルミ加工会社へのリンクなども。
  3. なんでも作っちゃう、かも。さんのFusion PCBに発注
  4. すzのAVR研究さんのFusionPCB
  5. 日本総サラリーマンデビルマン化計画さんのプリント基板メーカーのリンク集

気圧計・温湿度計を製作

台風2号(が変わった温帯低気圧)が接近してきているので、急遽気圧計と湿度計をまとめてみました。

気圧センサの方は以前確認したSCP1000で、湿度センサも以前確認したHS-15Pです。湿度測定に必要な温度センサはSCP1000の出力を使用することで削除しました。

今回は、AVR周りを作るのが面倒だったので、3.3V版秋月Arduino基板に1.27ミリピッチのユニバーサル基板を利用してシールド形式でセンサを載せてみました。3.3V電源はUSBの電源をオンボードの3.3Vレギュレータで生成しています。まだまだ隙間がありますので、センサの追加も可能です。ソフトウェアも以前作ったものを統合してシリアル出力するように改めました。

で、測定結果ですが、気圧は自宅から10km程度にある気象庁の大手町の観測値よりも2ヘクトパスカル程度低い値が出ます。これは自宅が6階(約20m)ですので、その標高分(10mで1ヘクトパスカル下がる)の差だと思います。
温度の方は室内だとどうしても外気温に比べて温度が高くなってしまいます。当然、温度によって変化する湿度も低めに出ています。この手のセンサはやはり屋外に設置するしかないようなのですが、屋外に設置するとなると電源と通信の確保が問題です。

照度計を基板にまとめてみました

しばらく前のS9706を使った照度センサを基板にまとめてみました。

結局、ケースは作らず、裸の基板のままで裏面にナット2段を挟んでもう1枚基板をつけて背面だけ保護することにしました。

センサは先の記事に加えて、S9705カラーセンサ(クロック同期シリアル出力)、手持ちのPH102フォトトランジスタを抵抗負荷で受けてA/D変換した物を追加して表示しています。

LCDは2行の小型のものに変更しています。1行目の左半分にS9706で取得した照度(lx)とその棒グラフ、1行目の右半分にPH102で取得した照度(lx)とその棒グラフ、2行めの1キャラクタ目に電池の電圧、その後にS9705で取得したRGBのそれぞれの照度(lx)を表示しています。電源は単4電池2本からHT7750Aで5Vを生成しています。

CPUは当初ATmega88としていたのですが、センサの数が増えるに従ってROM容量が収まらなくなり、ATmega168に変更しました。ソフトウェアはタイマ割り込みを使いたかったのでArduinoではなくAVR-GCCで作りました。表示にはChaNさんのキャラクタLCD制御モジュールを4bitモード時に下位側のポートを使うように改造して使わせていただきました。

作ってみてわかったのですが、理論値からはオーダーレベルでは合うものの、表示がバラバラになってしまいます。分光感度特性も異なる3種類のセンサなので、ある程度は当たり前のような気もしますが、これでは目安程度にしかなりません。やはり基準となる測定器がないとつらいですね。

玄箱debianバージョンアップ

古いノートPCにdebianを入れてUSB機器を監視しようとおもっていたのですが、そのノートPCがお亡くなりになってしまいました。2000年に購入したものですが、さすがに前半はモバイルのメインマシンとして酷使、後半はdebianで宅内サーバ、監視サーバとして酷使したので仕方がないでしょう。

で、監視サーバの代役として玄箱(無印)が余っているので、なんとかならないかと思いました。USBシリアルを使うためにはある程度カーネルバージョンが上がっていないといけないのですが、この玄箱、lennyにアップデートすると立ち上がらなかったので、Debianのバージョンはetchのままアップデートしていません。いまさらながら調べてみると、lennyはubootでなければならないようです。なので、その辺をやってつけて、アップデートをかけていくことにしました。

作業内容(後から書いたので、抜けや間違いがあるかもしれません)

1.すでにetchになっていたので、uboot化

注意深く /dev/mtdblock にファームウェアデータを流し込み

# cat u-boot-hd.flash.bin > /dev/mtdblock1

どのブロックかはカーネルによって変わる?ので、全部ダンプしてみてそれっぽいのを探した。

2.再起動せずにカーネル差し替え

ubootで起動できるカーネルをおいとかないと、立ち上がるわけがないので、先に用意しておく。

# cd /boot
# tar xvfz (置いてある場所のパス)/kernelimage-2.6.20-kuroBOX-uImage.tgz
# cd /lib/modules
# tar xvfz (置いてある場所のパス)/modules-2.6.20-kuroBOX.tgz

3.再起動

時間がかかるけど、たちあがる。
立ち上がったら再度 telnet で接続

4.lenny化実行

・/etc/apt/sources.list を修正
“etch” の部分を “lenny” に書き換え
・lenny化実行

#apt-get update
#apt-get safe-upgrade
#apt-get dist-upgrade

5.再起動

たちあがらねぇ・・・というか、立ち上がってるけどIPアドレスがわからない感じ
Linuxマシンで nmap をかけてもみつからない
nc.exe を使ってもつながらない

6.シリアルコンソール接続

最後の手段、シリアルコンソール接続とします。Webで調べるといろいろ情報は出てきますが、R76はシリアルの信号と直列に入っている保護用?の抵抗なので、115200bpsという速度を考え、適当に470オームとした。・・・が実際の接続の速度は 57600bps/8N81だった。

ubootの環境変数やsttyで速度は変えられるけど、カーネルは57600bpsでコンパイルされているようなので、実質57600bps以外の選択肢はない。

で、IPアドレスを調べてみたら、変わってない。
telnetでもつながる。なんだったんだろう?

7.squeeze化

・/etc/apt/sources.list を修正
“lenny” の部分を “squeeze” に書き換え
・squeeze化実行

#apt-get update
#apt-get safe-upgrade
#apt-get dist-upgrade

8.再起動

問題なく起動。

9.カーネルバージョンアップ

某所でsqueezeにバージョンアップしてもカーネルのバージョンは古いまま
(確かに 2.6.20 のまま)

# sudo apt-get install linux-image-2.6-powerpc

でカーネルバージョンアップとか書いてあったので試してみたが、ubootでロードするファイルとあってないのでロードされない。ubootを手動でコマンドを打ちながら起動してみたが、「linkstation用のカーネルじゃない」と蹴られる。どうしょうもない。

なので、

# cd /boot
# tar xvfz (置いてある場所のパス)/kernelimage-2.6.25.20-kuroBOX.tgz
# cd /lib/modules
# tar xvfz (置いてある場所のパス)/modules-2.6.25.20-kuroBOX.tgz

で 2.6.25.20 まではバージョンアップした。

10.電源落ちない対策

ここで、shutdownコマンドやrebootコマンドで最後の最後にフリーズする対策を見つけたので、追加。

/etc/init.d/haltのpathの行の後ろにecho -n “EEEE” > /dev/AVR00を追加

これでシャットダウン時に電源が切れるようになった・・・が、その後電源SWを押しても起動しない。結局一度プラグを抜かなきゃいけない。うーん。

<まとめ>
結局、カーネルのバージョンは 2.6.25 のまま。うーん。

照度計として動かしてみる

引き続き、秋月で売っている浜松ホトニクスのS9705という照度センサを使った照度計の製作です。

HT7750Aの負荷を下げるべく、省電力関係を調べて実装しました。

基本的には、Timer2でパワーセーブモードからの復帰が可能なので、Timer2の割込みで周期的に起こすことにして、通常はパワーセーブモード(スリープモード)に落としておくことにしました。これで5Vの消費電流は約15~16mAまで下がりました。本当はATmega88ではなくてATmega88Pを使えばいいのでしょうが、それでは手持ちの部品が減らないのでここまでにします。

また、Timer0とTimer1を使って、センサ出力の周波数をカウントする仕掛けを作りました。

で、適当にソフトウェアを作って動かしてみたのが上の写真です。左の数字が照度(ただし、この表示は飽和してます)、右がそのバーグラフです。

ソフトウェアを作るためにデータシートをあらためて眺めていて気がついたのですが、このセンサは1000lx程度までしか測定できません。で、この写真を取るために照明をあてたら飽和してしまいました。もともとはこの写真撮影用の光源に使っているクリップライトのランプを電球型蛍光灯からLEDランプに変えたら結構明るかったので、どのくらい差があるのか調べてみたかった、ということが発端で照度計を作り始めたので、ちょっとがっかりです。

そんな状態なので、単独の基板にするか、さらに、ケースに入れるかどうか迷ってます。ケースに入れるとなると、今回は光センサがありますので、透明なケースを使うとしても外に出してやらなければなりません。また、スイッチもどうやって外に出すかが課題です。ケースの加工って面倒くさいですからね。できれば、小型ボール盤、卓上フライス、卓上旋盤とそれを設置する場所が欲しいところです。(場所が一番課題ですね・・・)

ATmega88でLCDを動かす

秋月で売っている浜松ホトニクスのS9705という照度センサを使って、LED電球の明るさを測ってみたいと思っています。

このセンサは照度を周波数にリニアに変換して出力しますので、受け側では単純に周波数を測定して定数をかけてやれば照度計のできあがりです。

Arduinoでは周波数の測定はちょっと面倒そうなので、今回は手持ちのATmega88をそのまま使うことにしました。表示系はLCDを使いますが、照度しか表示しないので1行のLCDを使います。また、基本的には持ち歩いて使うことになりますので、電池駆動でなければなりません。電池は9Vではなく、単3/単4を1本にしたいと思いましたので、HT7750Aによる昇圧回路を組んであります。で、実験してみたところ、1本では昇圧してLCDを駆動できる5Vで20~30mAの電流を流すのは難しいようでしたので2本を前提にしています。

で、バラックでLCDのテストをするところまで組んでみたところ、こんな感じになりました。

LCDの表示にはChanさんが公開されているキャラクタLCD制御モジュールおよび組み込み用printfモジュールを使わせてもらうことにしました。この状態ですと、5Vの消費電流は内蔵8MHzオシレータ使用時で25mA程度でした。

Ubuntu11.04をインストール中

今、5月1日にリリースされたUbuntu11.04 Desktop 日本語 Remix CDを例によってUSBメモリにインストールしています。

最初はVMwareServer上でUSBメモリを認識させてインストールしようとしていたのですが、途中で止まってしまいます。それに、後で気づいたのですが、USBメモリが/dev/sda3とか/dev/sda4とかになってしまうので、ブートローダの書き込んだあと、修正が必要になってしまいます。

で、いまは、CD-ROMを実際に作成し、Core2Duoのマシンを使ってUSBメモリにインストール中です。HDDがSATA、CD-ROMがATA(パラレルATA)のマシンなので、USBメモリへのインストールは簡単です。

  1. BIOS設定メニューでSATAをDisableにする。
    (これができるマシンだと簡単なのです)
  2. CD-ROMから起動するようにBIOSを設定する。
  3. Ubuntu11.04 Desktop 日本語 Remix CDをCDROMにセットして起動
  4. ブートが始まったらUSBメモリを挿入
  5. しばらくするとライブCDとして動かすか、インストールするかを聞かれるので、インストールを選択
    (10.04ではインストール後に改めて実施だったのが改良されて楽になってます)
  6. インストール中にアップデートを参照するか、サードパーティ製のソフトをインストールするかを聞かれるので、両方ともチェックする
  7. 表示に沿って、ホスト名、ユーザー名、キーボード、タイムゾーンなどを設定する。
  8. 指示に従って再起動すると、Ubuntu11が起動します。

起動中はアクセスが遅いためか、やはり表示のない期間が長めです。ハングアップしたと思わないで、耐えることが必要です。

力技(fork)でブザーを鳴らす

コマンドラインからbeepコマンドでブザーを鳴らすことができたのですが、プログラムから鳴らす方法がわかりません。

しかたがないので、サブプロセスを生成して、そこから system() でブザーを鳴らすという力技で鳴らすことにしました。

先にサブプロセスが終了して何もしないでいると、サブプロセスがゾンビとして残ってしまいますので、次に鳴らす前に waitpid() で回収してます。これだと常にゾンビが1つ残ることになってしまいますので、もっといい方法があるのではないかと思うのですが、今回初めての fork() なのでこの辺で妥協します。

#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h> 

pid_t child_pid = 0;
int child_sts;
int buzzer(void)
{
	/* ゾンビ回収 */
	if(child_pid > 0)waitpid(child_pid,&child_sts,WNOHANG);

	/* 子プロセス生成 */
	child_pid = fork();

	if(child_pid==-1) {
		/* fork()失敗 */
		printf("fork failed.\n");
	}
	else if(child_pid==0) {
		/* 子プロセス */
		system("/usr/bin/beep -f 2000 -l 20");
		_exit(0);
	} else {
		return(0);
	}
}

int main(void)
{
	int i;
	for(i=0;i<10;i++){
		buzzer();
		usleep(500000);
	}
}

よく見ると、要らないヘッダを include してたりしますが、メモなのでこのままということで。