USB-IOを動かしてみる(後編)

USB-IO(秋月版)へのアクセスをプログラムにまとめてみました。プログラムとしてはポート1のビット0につないだLEDを点滅させるだけのものです。ついでにデジタル入力データも表示しているので、ポート2をGNDに落としたり離したりするとそのようすもHEXデータとして見えてきます。

プログラムとしては、ほとんど参考にさせていただいたサイト(プログラム中を参照)とほとんど同じことをしているだけですので、完全コピペの部分は抜いてあります。追試される場合はリンク先から引用してください。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/hidraw.h>

// 下記関数は右記サイトより引用:http://www.magical-technology.com/hiroya/blog/2008-04-05T22_15_41.html
int hidraw_open(int vendor, int product, int mode)
{
<<途中省略>>
}

#define VendorId 0x1352
#define ProductId 0x0121

int main(int argc,char *argv[])
{
	int fd = hidraw_open(VendorId, ProductId, O_RDWR);
	char led_on[] = { 0x00, 0x20, 0x01, 0x01 };
	char led_off[] = { 0x00, 0x20, 0x01, 0x00 };
	char sts[65];
	int i,j;

	for(i=0;i<10;i++){
		// LED点灯
		write(fd, led_on, sizeof(led_on));
		read(fd, sts, sizeof(sts));
		for(j=0;j<8;j++) printf("%02X ",sts[j]);
		printf("\n");
		sleep(1);
		// LED消灯
		write(fd, led_off, sizeof(led_off));
		read(fd, sts, sizeof(sts));
		for(j=0;j<8;j++) printf("%02X ",sts[j]);
		printf("\n");
		sleep(1);
	}
	close(fd);
}

動かすには普通にコンパイルして、ルート権限で実行(sudoをつけて実行)すればOKです。

ただ、実行前に

# printf "\x00\x0f9\x00\x00\x00\x00\x0fe\x0f\x00\x00\x00\x00" > /dev/hidraw3

として、ポート1のビット0を出力に設定したあと一旦USBケーブルを抜いて、差しなおしておく必要があります。(hidraw3の部分も環境に応じて修正が必要)

USB-IOを動かしてみる(前編)

秋月でUSB-IOなるものをゲットしました。本来の目的は「PIC14K50を動かすための基板を作るのが面倒くさい」ということで、速攻でROMを書き換えてしまおうと思ったのですが、その前に少しだけ動かしてみました。なお、動かすにあたっては、こちらのページを参考にさせていただきました。

この基板をLinuxMint11のマシンに接続して、dmesgコマンドを叩くと、

$ dmesg
(途中略)
[16763.641868] generic-usb 0003:1352:0121.0009: hiddev0,hidraw3: USB HID v1.11 Device [Km2Net Inc. USB-IO2.0] on usb-0000:00:13.2-2.3/input0 $  

となって、hiddev0とhidraw3というデバイスファイルができてそうな雰囲気であることがわかります。

そこで、ターミナルを2つ開いて、

$ sudo bash

として、rootのシェルを2つ起動します。root権限のシェルなのは、/dev/hidraw3 へのアクセスにroot権限が必要なためです。

この状態で一つ目のシェルで

# od -x /dev/hidraw3

として、hidraw3からの出力を監視します。その状態でもう一つのシェルで、

# printf “\x00\x20” > /dev/hidraw3

とすると、

000xx00 0020 000f 0000 000f 0000 0000 0000 0000
000xx20 0000 0000 0000 0000 0000 0000 0000 0000
*
000xx60 0000 0000 0000 0000 0000 0000 0000 1000

という内容がもう一つのシェルに出力されます。赤文字の部分はレポートID、コマンド、ポート1の値、ポート2の値です。基板上のポート2(J2)を抵抗でGNDに落としてやると、落としたポートに応じて0fの部分が変化しました。(コマンドについてはこちらを見てください。いまひとつわかりにくい仕様ですが、「何バイト目にどんなデータが置かれるか」というフォーマットになっているようです。)

さらに、

# printf "\x00\x0f9\x00\x00\x00\x00\x0fe\x0f\x00\x00\x00\x00" > /dev/hidraw3

として、ポート1のビット0を出力に設定します。ここで一旦USBケーブルを抜いて、差しなおします。その後、監視側の od コマンドを再実行したあと、

# printf "\x00\x20\x01\x01" > /dev/hidraw3

とすると、ポート1のビット0がH出力になるので、そこに接続されたLEDが点灯します。次に、

# printf "\x00\x20\x01\x00" > /dev/hidraw3

とすると、LEDが消灯します。

badblocksによるディスクの検査

最近、マシンの入れ替えをやっているので古いHDDが出てきたりします。3.5inch PATAの低容量のHDDは使い道がないのですが、2.5inchの場合には1000円程度で売っているケースに入れて外付けのポータブルHDDとしています。これをUSBブートでいろんなディストリビューションのLinuxをインストールしてみたりしています。

ただ、古いHDDなので故障が心配だったりしますので、検査できないかを調べてみました。

UbuntuやLinuxMintに入っているディスクユーティリティでのチェックでは論理的な検査だけなので、物理的な障害は見つけられません。物理的なテストを行うには、全領域の書き込み/読み出しテストを実施するしかありません。

このテストを行う方法の一つとして、「badblocks」コマンドを使う方法がありそうです。

具体的には、

$ sudo badblocks -c 1024 -w -v -s -o bad.txt /dev/sdb

とすることで、書き込み/読み出しテストを行えます。指定しているコマンドラインパラメータは順に

  • 「-c 1024」は一度に扱うブロックの数。デフォルトのブロックサイズ(-bオプションで変更可能)は1024なので、この設定では1024バイト×1024ブロックで1MBになるはず。標準は64とのこと。
  • 「-w」は書き込みテストを指示する
  • 「-v」は詳細な表示を指示する
  • 「-s」は途中経過を表示する
  • 「-o bad.txt」は不良ブロックのリストを出力するファイル名を指定する
  • 「/dev/sdb」は試験対象のデバイスファイル

となります。

clamtkを試す

最近はすっかりUbuntuを離れてLinuxMint11ばかり使っているのですが、LinuxMintにはKlamAVがありません。
なので、ClamTkを入れてみることにしました。

「ソフトウェアの管理」からClamTkを検索してインストールします。インストールはほどなく終わりました。

起動ですが、「Menu」の中の「すべてのアプリケーション」にインストールされてしまうようで、他のカテゴリには分類されていません。探すのが面倒なので「ウイルススキャナ」のアイコンを「デスクトップにコピー」でデスクトップ上にランチャを作ってしまいました。

起動するとこんな画面がでますが、GUIバージョンの標識(?)のところにカーソルを持っていくと、「新しいバージョンが入手可能です」という表示が出ます。つまり、レポジトリにあるのは最新ではないようです。

SourceForgeのページ(http://sourceforge.net/projects/clamtk/)に行ってみると、最新版は4.36のようです。リリース版のページ(http://sourceforge.jp/projects/sfnet_clamtk/releases/)から、Debianのパッケージ clamtk_4.36-1_all.deb をダウンロードします。ダウンロードしたパッケージは、

$ md5sum clamtk_4.36-1_all.deb
e58f2a383979c60ef0b4a513391db309  clamtk_4.36-1_all.deb

として、MD5のチェックサムが正しいことを確認します。

正しいことを確認したら、Nautilsで右クリックして「GDebiで開く」を選択します。「ソフトウェア・チャンネルから古いバージョンがインストールできる」という表示が出ますが、無視して「パッケージのインストール」に進みます。インストールはほどなく終わります。

再度、起動しなおすと、

このような画面になりました。

次に、設定を進めます。

  1. 「拡張」→「セットアップウィザードの再実行」でシグネチャの自動更新をするかどうかが設定できます。(デフォルトは自動更新ありになっているようです)
  2. 「拡張」→「設定」でいろいろ設定しますが、Sambaディレクトリのスキャン以外はすべてチェックを入れました。
  3. 「拡張」→「スケジュール」でスケジュールスキャンの設定ができるようなので、設定しておきます。

が、一旦終了してみると、設定が保存されていません。ランチャのプロパティを開いて、「コマンド」の部分に「gksu」を書き足して「gksu clamtk %F」に修正してやると管理者モードで起動するので、スケジュールスキャンの設定等も保存されるようになりました。

久しぶりにUSBメモリにLinuxをインストール

以前、超小型のUSBメモリ(というより、SDHCカードリーダ)にLinuxをインストールして使っていましたが、結局カードリーダ側が4個すべて壊れてしまいました。かなり熱を持っていたのと、どう考えても放熱できないので、そのせいで壊れたような気がします。まあ、そもそも連続運用するような想定で作られていないでしょうが。

すべて壊れてしまったので、追加で買ってもまた壊れるだけだと思いましたので、それ以降はUSBでの運用はHDDに限定していました。しかし先日、100円ショップダイソーでMicroSDHCカードリーダ(105円)を見かけました。100円なら壊れても動かなくても諦めがつく、ということで、これに先のカードリーダに挿していた8GBのMicroSDHC(class10)を挿して、LinuxMintを普通にインストールしてみました。

今回はRemasterSysで構築済みの環境のDVDを作成して、これでインストールしてみました。手順は、例によってオンボードのSATAを禁止して/dev/sdaがUSBメモリになるような状態をつくって、HDDへのインストールと同じ手順です。

インストール自体は何ら問題なく完了し起動も問題ありませんでしたが、今回インストールに使ったマシンはメモリを4GB搭載していたせいか、SWAP領域が4GB以上取られていて、起動後アラームが発生しました。これについては SystemRescueCD を起動して Gparted でSWAP領域と拡張領域のサイズを縮小し、その分基本領域を広げて対処しました。

さらに、少しでも遅いのを補う目的で、アクセス時間の記録の禁止し、一時ファイルをRAMに置くため、/etc/fstabを以下の通り変更しました。赤字部分が追加箇所です。

# / was on /dev/sda1 during installation
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /     ext4  noatime,errors=remount-ro 0  1
# swap was on /dev/sda5 during installation
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none  swap  sw  0  0
# tmpfs
tmpfs /tmp tmpfs defaults,noatime 0 0

起動時間は長いですが、動き始めたら快適に動くようになりました。

Linuxでインターネットラジオを楽しむ

最近(といってもずっと前からですが)のWebは動画などを別にすると音がなくて非常に寂しいです。そのため、ラジオを聴くことが多いです。

以前は秋月で買ってきたインターネットラジオキットで聴いていたのですが、東日本大震災と同じ時期に壊れてしまいました。物理的な破損はないのですが、設定した内容が保存されなくなってしまったのです。おそらく搭載されているEEPROMが壊れているのでしょう。ただの偶然だとは思いますが、なぜ東日本大震災と同じ時期に壊れたのかは謎です。寿命に達するにはこの程度の使い方ではファームウェアにバグがない限り早すぎますので。

で、せっかくなのでLinuxで聴くことにしました。

1.インストールと起動

LinuxMintのソフトウェアの管理で「radio」と打ち込んで検索すると最上位に上がってくるのが radiotray です。評価も高そうなので、これをインストールしてみます。

さくっとインストールして、「サウンドとビデオ」のメニューから起動すると、右下のアイコン表示領域に上の画像の左上のアンテナマークがアイコンとして収まります。操作はそのアイコン領域からジャンル別に並んだ放送局を選択するだけです。

やや難があるとすると、音量の設定が「設定」→「Volume Up/Down」で5%ずつ変化するだけだということです。初期値100%なので、半分にするには10回繰り返さなければなりません。

2.放送局の追加

「設定」→「Configure Radiostation」(多分。途中から切れている)を選ぶと、ブックマークの編集画面になります。「追加」を押すと、タイトルとURLを入力するウインドウが開きます。

ここに入力するURLが問題ですが、ここには SHOUTcast のアドレスを入れれば良いようです。

http://www.shotcast.com を開くと、Webラジオの放送局リストが出てきますが、ここで好きなものを選びます。最終的に放送局を選ぶ際に、右クリックで「新しいタブで開く」を選ぶと、別のタブで再生が始まりますが、その時に、

http://yp.shoutcast.com/sbin/tunein-station.pls?id=1269641

というような id 付きのURLがアドレスバーに表示されます。これをURLとして設定すれば良いようです。

3.その他

設定した内容(放送局リスト)は、

~/.local/share/radiotray/bookmarks.xml

に保存されるようです。

同じディレクトリにある config.xml を弄ると通知の有無やボリュームのステップなども変えられそうです。

使用した感じは上々です。これでしばらくは大丈夫そうです。

APTonCDによるDVD作成

前回の続きです。

apt-mirrorによってリポジトリを作成したら、パッケージファイルをキャッシュディレクトリに移動します。このあたりは、こちらを参考にしました。(LinuxMintなので、ルート権限の扱いのところだけ修正してあります)

$ cd /var/spool/apt-mirror #ミラーの格納用ディレクトリに移動
$ find mirror/ -iname *.deb | sudo xargs mv -t /var/cache/apt/archives #パッケージファイルを検索して、各ファイルをキャッシュディレクトリに移動

処理は1分くらいで終わりますので、APTonCDを起動します。

多分リストアップ処理をしているのでしょうが、かなり時間がかかります。

完了すると、ディスクに書き込むパッケージを選択する画面が出てきますが、ここまでの手順ですと、トータルで36901ファイルで40.4GB、選択されたものだけでも33859ファイルで35.8GBとの表示が出ています。容量に差があるのは、同じパッケージが複数ある場合には、バージョンが古いほうが除外されるためです。

で、このままBurnを押すと・・・・DVD9枚という表示が出ました。さすがにちょっと・・・ですねぇ・・・。

 

USB顕微鏡をLinuxMint11につないでみた

ジャンク箱を漁っていたら、USB顕微鏡が出てきました。

Windows用のドライバCDROMがついているのですが、確かウイルスチェックで引っかかるのでどうしようもなくて放置してあったものです。で、今回、Linuxで動くなら試してみようと思います。

とりあえず、LinuxMint11のマシンにつないでみました。

$ lsusb
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 009: ID 046d:c526 Logitech, Inc. Nano Receiver
Bus 004 Device 003: ID 04d9:1400 Holtek Semiconductor, Inc. PS/2 keyboard + mouse controller
Bus 004 Device 002: ID 0557:7000 ATEN International Co., Ltd Hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 093a:2620 Pixart Imaging, Inc.
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$

デバイスとしては認識しているようです。デバイスIDの093a:2620を元に検索していくと、こちらのページにたどり着きました。こちらの記載によれば、kernel 2.6.33 以降だと対応しているように見えます。dmesg を見ると、

$ dmesg | tail
[76788.780056] usb 2-2: new full speed USB device using uhci_hcd and address 2
[76789.122045] Linux video capture interface: v2.00
[76789.138157] gspca: v2.12.0 registered
[76789.143388] gspca: probing 093a:2620
[76789.148267] input: pac7302 as /devices/pci0000:00/0000:00:1d.0/usb2/2-2/input/input16
[76789.148685] gspca: video0 created
[76789.148788] usbcore: registered new interface driver pac7302
$

ということで、確かに認識していて、video0 というデバイスファイルが生成されているように見えます。

そこで試しにWebcamで写真を撮るツールの Cheese(サウンドとビデオの下に標準でインストールされています)を起動してみたところ、なんと動いてしまいました。所詮はVGA解像度ですし、明るさの自動補正がなにかおかしいですが、何もせずに動いてしまったのは驚きです。回路図をインクジェットプリンタで印刷したものを撮ってみるとこんな感じです。

apt-mirrorによるリポジトリの取得

LinuxMintやUbuntuは非常に使いやすいし、いろんなOSSベースの作業環境になっています。ただ、インターネットが使えない環境ではパッケージの追加もままならないので、途端に利用のハードルが上がってしまいます。

しかしながら、そんな環境で役立ちそうなのがapt-mirrorとAPTonCDを使ったリポジトリのコピーを作成することです。

今回は、LinuxMint11の環境で実際に試してみることにしました。

1.LiveCDの準備

使用する環境を構築し、まずはRemasterSysでライブDVDを作成します。インストール時にはこれを使ってターゲット環境を構築します。

2.ソフトウェアの準備

APTonCDはデフォルトでインストールされているようですので、パッケージマネージャでapt-mirrorを追加インストールします。

3.apt-mirrorの設定

/etc/apt/mirror.lst を編集します。Synapticパッケージマネージャのリポジトリの設定を見ながら、必要なリポジトリを追加していきます。ソースパッケージは大きくなるだけなので、コメントアウトしました。

############# config ##################
#
# set base_path /var/spool/apt-mirror
#
# set mirror_path $base_path/mirror
# set skel_path $base_path/skel
# set var_path $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads 20
set _tilde 0
#
############# end config ##############
deb http://archive.ubuntu.com/ubuntu natty main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu natty-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu natty-updates main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu natty-proposed main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu natty-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu natty partner
deb http://extras.ubuntu.com/ubuntu natty main
deb http://packages.medibuntu.org natty free non-free
deb http://archive.getdeb.net/ubuntu natty-getdeb apps
deb http://dl.google.com/linux/chrome/deb stable main
#deb-src http://archive.ubuntu.com/ubuntu natty main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu natty-security main restricted universe multiverse
#deb-src http://archive.ubuntu.com/ubuntu natty-updates main restricted universe multiverse
##deb-src http://archive.ubuntu.com/ubuntu natty-proposed main restricted universe multiverse
##deb-src http://archive.ubuntu.com/ubuntu natty-backports main restricted universe multiverse
clean http://archive.ubuntu.com/ubuntu

4.ミラー開始

# sudo apt-mirror

でミラーを開始します。

・・・が、取得するサイズが40.3GiBと出ました・・・。
DVD-Rでも現実的なサイズではないですねぇ・・・。Blue-Rayになら2枚で収まるのでなんとか現実的な範囲ですが・・・。

Atom230を復活させました

余っていたGA-GC230Dマザーを自宅サーバの実験用に復活させました。

Mini-ITXのケースは大きさの割に高かったり、レイアウトが苦しかったりいろいろあるのですが、Amazonで見つけたJX-FX100Bというケースは大きさも手頃で、150Wの電源付きで価格も4880円と安く、しかも(当たり前ですが)Amazonで配達してくれます。

なので、ポチッとしてしまいました。

Amazon.co.jpから画像を借りました

5000円程度のケースの割に、見た目はまあまあです。側面および上面のカバーはよくある塗装ではなく、ヘアライン加工風のシートが貼ってあるようで、振動抑制に効いているのかもしれません。写真に写っているフロントのCDドライブベイはフタではなく、中にCDドライブを設置してイジェクトすると、手前に開くタイプです。つまり、CDドライブを設置した状態で上記の写真の状態になります。

で、早速余っていたGA-GC230D、2GBのDDR2-800のDIMM、320GBのSATA-HDD、4倍速のDVD-RW(RAMじゃないのが使いにくい・・)を組み込みました。中のスペースはMini-ITXにしては余裕があり、取り回しは楽な方です。背面にはフルハイト(=LowProfileではない)のスロットが一つあるので、何かのカードを増設することも可能ですが、電源ケーブルの長さなどから言ってちょっと苦しかったです。5インチベイを使わなければ、5インチベイにHDDを取り付けて、スペースを空ける手もありそうです。

で、組み立て完了して電源投入しますが、背面のファンが8センチということもあって、かなり静かです。これなら24時間運転してもあまりうるさく感じることはなさそうです。また、5インチベイと3.5インチシャドウベイにそれぞれHDDを入れて、ミラーリングやストライピングに使ってみる、という手もありそうです。安価な5000円のMini-ITXケースですが、値段の割にはお勧めです。