2008.12.07

[Arduino][Chumby]Chumby、Arduino、リモコンをつないで定時に照明を点灯/消灯

ChumbyとArduinoをつないで何かできないかと検討中に目に飛び込んできたのが、照明のリモコン。 これを制御して、決まった時間に照明のON/OFFをしてみたい。目覚ましと同時に照明が点灯、などという使い方が想定できる。

Chumbyarduino11

まずは照明のリモコンを、Arduinoで制御できるよう改造。 リモコンのスイッチにフォトカプラを仕込み、Arduino接続用の端子を設ける。

免責

ここに書いたことを実行したことによる結果の責任を負いません。

試す場合は自己責任にてお願いします。

リモコンの改造

Chumbyarduino9

▲リモコンはNOATEK NE-747N。以前東急ハンズで買ったもの。既に生産中止のようだ。現行品としてはNE-657Nというものがあるそう。別に今回の用途を想定したわけではないけれども、電波式ということで選んだもの。

Chumbyarduino2

▲タクトスイッチの四つある端子のうち、二つは同じもの。普段は端子間の幅の狭い方が不導通状態になっており、スイッチを押すと導通状態になる。テスターで調べるとすぐ分かる。常に導通状態にある幅の広い端子間にフォトカプラを仕込んでも意味が無いので注意。

Chumbyarduino3_2

▲基板上にあるタクトスイッチの端子間に、フォトカプラのトランジスタ側をつなぐ。フォトカプラのエミッタ側がスイッチのGND側になるようにする。

Chumbyarduinoschimatic

▲全体の接続図。フォトカプラはPC817Cを使用。

Chumbyarduino1

▲フォトカプラのアノード側に抵抗を入れる。220Ω。できるだけ電流は少なくした方が寿命が長くなるそうなので、動作する最大の抵抗を入れるといいかも。

Chumbyarduino5_2

▲組み付け。ショートしないよう、熱収縮チューブでカバーした。

Chumbyarduino6

▲スイッチの端子配列が線対称になっているので、二つあるフォトカプラは表裏向きを逆に取り付けている。

Chumbyarduino4

▲ケースにソケット用の穴を開ける。ドリルで穴を開けて、ニッパでつなぐという定番の工法を取った。

Chumbyarduino7

▲ソケットはホットボンドで固定。ちなみに、このソケット、eZ430-F2013用に鈴商で買った1.27mmピッチのもの。

Chumbyarduino8

Arduino側の準備

Arduinoには以下のファームウェアを転送しておく。9600bpsでシリアル通信を開始。「a」が来たら2番ピンを500ms HIGHにし、「b」が来たら3番ピンを500ms HIGHにする、という単純なもの。 今回は2番ピンにリモコンのONスイッチにつないだフォトカプラを、3番ピンにOFFスイッチにつないだフォトカプラをつないでいるので、これであたかもリモコンのボタンを押したかのように制御できる。

byte res;
#define ledPin 13
#define onPin 2
#define offPin 3

void setup()
{
  Serial.begin(9600);
  pinMode(onPin, OUTPUT);
  pinMode(offPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(onPin, LOW);
  digitalWrite(offPin, LOW);
  digitalWrite(ledPin, LOW);
}

void loop()
{
  if(Serial.available())
    while(Serial.available() > 0)
    {
      res = Serial.read();
      if (res == 'a')
      {
        digitalWrite(onPin, HIGH);
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(onPin, LOW);
        digitalWrite(ledPin, LOW);
      }
      if (res == 'b')
      {
        digitalWrite(offPin, HIGH);
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(offPin, LOW);
        digitalWrite(ledPin, LOW);
      }
    }
}

Chumby側の準備

ChumbyとArduinoの間で通信をするには、カーネルモジュールをインストールする必要がある。 Chumbyの最近のファームウェアには、最初からArduinoで使えるカーネルモジュールが入っているので、スクリプトを書けばOK。

以下のスクリプトを、ArduinoをChumbyのUSB端子につないでから実行するか、Arduinoを接続し、USBメモリのルートディレクトリにファイル名「debugchumby」としてコピーしておいて、そのUSBメモリを挿入したまま一度Chumbyを立ち上げ直せばArduinoが使えるようになるはず。

#!/bin/sh

regmod () {
    lsmod | grep "${1}" >/dev/null   
    if [ $? -eq 1 ]; then               
        insmod /drivers/${1}.ko
    fi
}

regmod usbserial
regmod ftdi_sio

sleep 5

if [ -e "/dev/ttyUSB0" ]; then
    ps | grep gett[y] >/dev/null
    if [ $? -eq 1 ]; then
        /sbin/getty 9600 /dev/ttyUSB0 &
    fi
fi

ChumbyにSSHでログインし、以下のコマンドを実行するとArduinoにつないだリモコンを操作できる。

# echo 'a'> /dev/ttyUSB0
# echo 'b'> /dev/ttyUSB0

ちなみに、今回は使っていないが、Arduino側からシリアル通信で送られた文字を参照したくば、以下のようにする。

# dd if=/dev/ttyUSB0 bs=1 count=5 2>/dev/null

(5バイト受信して標準出力へ)

スケジュールを組んで制御するには、Chumbyで最初から動作しているcronを使う。 Custom Alarmでスクリプトを実行できたような気がするのだけど、情報が出てこない。 cronにスケジュールを登録するには、ChumbyにSSHでログインして以下のコマンドを実行。

# crontab -e

viが起動して編集状態になるので、以下のようなエントリを追加すると、今回の例では毎朝8:30に照明が点灯することになる。

30 8 * * * echo 'a'> /dev/ttyUSB0

viの操作は次の通り。「Goecho 'a'> /dev/ttyUSB0[Esc]:wq」cronについての詳しくはGoogleなどで調べてください。

次のようにすれば、15分後に消灯する。

30 8 * * * echo 'a'> /dev/ttyUSB0
45 8 * * * echo 'b'> /dev/ttyUSB0

Chumbyに接続したArduinoをネットワーク経由でコントロール

Fenrir's BLogさんの「ChumbyでArduino等をFlashからコントロールする方法 (XMLSocketが使える?)」で公開されているserproxyのパッチを適用したものをChumby用にビルドしたので置いときます。

「chumbyserproxy-0.1.3.tar.gz」をダウンロード

これを実行しておくと、Chumbyのシリアルポートをネットワークに転送できる。 つまり、ChumbyにつないだArduinoをネットワークから制御できるようになる。

Chumby側の操作

# cp serproxy serproxy.cfg /psp
# cd /psp
# ./serproxy &

母艦側の操作

$ telnet [chumbyのIP] 5331
a
b

デフォルトでは19200bpsでポートを初期化しているので、Arduino側では「Serial.begin(19200); 」するファームウェアを焼いておくか、serproxyの設定をArduino側のbpsに合わせる必要がある。

これを使わなくともSSH経由で操作できるが、Chumbyのsshdは不安定なので、こちらの方がいいかも。

|

2008.07.08

[chumby]chumbyにUSBカメラをつないでみた

手近にEyeToyがあったので、chumbyに接続してみました。

果敢にも試してみる

以下のファイルをダウンロードします。
素人の仕事ですので、何が起こるか分かりませんというか、実際動作が不安定です。無保証です。

「chumby_eyetoy_set.tar.gz」をダウンロード

scpでchumbyの/pspに転送した後、sshでchumbyにログインして、解凍すれば準備OK。
「192.168.0.4」は、うちのchumbyのIPです。違う場合は読み替えてください。

$ scp chumby_eyetoy_set.tar.gz root@192.168.0.4:/psp/
$ ssh -lroot 192.168.0.4
# cd /psp
# tar xvzf chumby_eyetoy_set.tar.gz

/pspに以下のファイルが展開されます。
上書きされて困る場合は何も無いディレクトリの中に解凍して、子細検討してください。

rfs1/rcS
cjpeg
drivers/videodev.ko
drivers/ov51x-jpeg.ko
capture-V4L
libjpeg.so.62
cgi-bin/capture

chumbyの電源を落とし、起動し直します。
EyeToyを接続後、Mac/PCのブラウザから以下のようなURLをブラウズします。

http://192.168.0.4/cgi-bin/custom/capture

すると、こんな感じの画質でブラウザに表示されるはずです(chumbyに接続したEyeToyでchumby自身を撮影)。

ただ、自分のやった範囲ではちょっと不安定で、実用にはなりませんね。
しばらく使っているとストールしてしまいます。
きっちり知識のある方がやらないとダメでしょう。
cgiはstdoutに出力した画像を直接表示していますが、一度ファイルとして書き出してからなら、安定するかもです(それはそれでFlashの寿命うんぬんという話になりますが)。

EyeToyは数百円で入手できるそうですが、このために買うほどではないと思います。

やったことなどメモ

自分は素人なので、間違ったことを書いている可能性があります。
何かありましたらご指摘ください。

ドライバはov51x-jpegを使いました。オリジナルのov51xをビルドしてみたのですが、うまく通らなかったからです。

Kernelのビルドの方法はchumby WikiのBuilding and Installing a new chumby kernelに書いてありますが、自分が使っているubuntu 7.1だと失敗しました。

困って一度はあきらめたのですが、ISHさんのchumby関連のエントリがアップされて救われました。
ISHさんは凄いですね。僕も、chumbyはホームオートメーションセンターとして使うべきだと思います。

ISHさんのブログで紹介されているharadatさんのエントリによると、ubuntuにはKernelのビルドに必要なものが入っていないとのこと。以下の追加インストールが必要だそうで、

  • build-essential(これがなくては/usr/includeすらない)
  • kernel-package
  • libncurses5-dev(make menuconfigを行うために必要。本来kernel-packageに入っていると良いような気がする)
  • subversion, subversion-tools(TOMOYOのレポジトリの参照用)
  • quilt(もともとはAndrew Mortonが作成したパッチ管理用ツール。自分で使うことはないだろうけれども一応。依存関係でgawkとdiffstatが導入された)

今回はbuild-essential、libncurses5-devをインストールしました。

今回のものには関係無いですが、USB Serialに関連するモジュールを作っておくと便利なので、ISHさんのサイトにある通り、kernelを展開したディレクトリにある.configに以下を追記しました。
.configからはUSB Serialに関する記述が割愛されているので、USB Serial Converter supportの辺りに追記することになります。USB Serial関係のKernel Moduleは「linux-2.6.16-chumby-1.5.0/drivers/usb/serial」にできます。

#
# USB Serial Converter support
#
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_CONSOLE=m
# CONFIG_USB_SERIAL_GENERIC is not set
# CONFIG_USB_SERIAL_AIRPRIME is not set
# CONFIG_USB_SERIAL_ANYDATA is not set
# CONFIG_USB_SERIAL_BELKIN is not set
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
CONFIG_USB_SERIAL_CP2101=m
# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
# CONFIG_USB_SERIAL_EMPEG is not set
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_USB_SERIAL_VISOR=m
CONFIG_USB_SERIAL_IPAQ=m
# CONFIG_USB_SERIAL_IR is not set
# CONFIG_USB_SERIAL_EDGEPORT is not set
# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
# CONFIG_USB_SERIAL_GARMIN is not set
# CONFIG_USB_SERIAL_IPW is not set
# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
# CONFIG_USB_SERIAL_KEYSPAN is not set
# CONFIG_USB_SERIAL_KLSI is not set
# CONFIG_USB_SERIAL_KOBIL_SCT is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set
CONFIG_USB_SERIAL_PL2303=m
# CONFIG_USB_SERIAL_HP4X is not set
# CONFIG_USB_SERIAL_SAFE is not set
# CONFIG_USB_SERIAL_TI is not set
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_XIRCOM is not set
# CONFIG_USB_SERIAL_OMNINET is not set

カーネルをビルドしたら、Ov51x JPEG hacked Wikiからソースをもらってきます。

tar xvzf ov51x-jpeg-1.5.8.tar.gz
$ cd ov51x-jpeg-1.5.8
$ vi Makefile

MakefileのKDIRをchumbyのカーネルソースを展開したディレクトリに、CCとLDをそれぞれtoolchainのものを指定します。

CC = /usr/arm-linux/bin/gcc
LD = /usr/arm-linux/bin/ld
KDIR := /path/to/linux-2.6.16-chumby-1.5.0

でもってmake。

$ ARCH=arm CROSS_COMPILE=arm-linux- make

libjpegのソースパッケージをDebianからもらってきます。でもってビルド。.libs/の中に共有ライブラリが出来ます。

$ tar xvzf libjpeg6b_6b.orig.tar.gz
$ gzip -d libjpeg6b_6b-13.diff.gz
$ patch -p0 <libjpeg6b_6b-13.diff
$ cd libjpeg6b-6b
$ CC=/usr/arm-linux/bin/gcc ./configure  --host=arm-linux
$ make

capture-V4Lのソースをもらってきます。Makefileを編集してmake。

$ tar xvzf capture-V4L-v1.2.tgz
$ cd capture-V4L
$ vi Makefile

CCとCFLAGSを編集します。

CC            = /usr/arm-linux/bin/gcc
CFLAGS        = -O4 -Wall -fsigned-char

makeします。

$ make

キャプチャした画像を出力するcgiを書きます。
詳細はchumby_eyetoy_set.tar.gz内のcgi-bin/captureを参照。

|

2008.07.06

[chumby]chumbyを各種インターネット共有/WMWifiRouter経由でネットにつなぐ

2008.07.07: Windows XPのインターネット接続の共有の説明で、ファイアウォールをOFFにすることを説明し忘れていたので追記しました。



chumbyのデモを出先でする場合、無線LANによる通信経路の確保を模索することになりますが、デフォルトでは無線LANのアクセスポイントのみを検索する仕様であることが問題になります。

chumbyからアクセスできる無線LANのアクセスポイントが、必ず存在するとは限らないからです。

かといって、PCやWindows Mobile等のデバイス経由でどうにかしようと思っても、chumbyはAd-Hocモードの相手を見付けてくれないのでつながりません。

Mac OS Xのインターネット共有で「相手のコンピュータが使用するポート」をAirMacにした場合、Macの無線LANはアクセスポイントとしてふるまうのでchumbyから見付けることができるのですが、ネットワークの設定がうまくいかず「unreachable」のエラーで終わるはずです。

現状ではPHS300などを用意しないと、出先では通信経路の確保がままならないということになります。

ググったり何だりした結果、Mac OS Xのインターネット共有をchumbyから使うためのTIPS、chumbyと相手デバイスとを無線LANでAd-Hoc接続しつつ、chumbyが接続相手のDHCPを引く設定が分かりましたので、ここに書いておきます。

紹介している手順全般に言えるのは、セキュリティ無しの内容になっていることです。
まずは接続を確認してからセキュリティをかけてみてください。

西尾さんのChumbyをMacBookのインターネット接続共有で動かす方法に情報があります。

Mac OS X Leopard (10.5.4)のインターネット共有を使う

  • 「システム環境設定>共有>インターネット共有」を選択して、隣のペインにインターネット共有の設定を表示させます。
  • 「共有する接続経路」のドロップダウンリストから、インターネットに接続する経路を選択します。(W-ZERO 3 Modem Port、Bluetooth PANなど)
  • 「相手のコンピュータが使用するポート」の「AirMac」のチェックボックスをONにします。
  • 「AirMac オプション...」ボタンを押し、「ネットワーク名」を「chumby」などに変更します。「チャンネル」は「自動」、「暗号化 (WEPを使用)」のチェックボックスはOFFに設定。セキュリティが気になる向きは後で設定してください。OKボタンで終了。
  • 「インターネット共有」のチェックボックスをONにして、インターネット共有を開始します。
  • 「Terminal.app」を起動し、以下のように操作します。
$ cd /etc
$ sudo cp bootpd.plist _bootpd.plist
$ sudo vi _bootpd.plist
  • viが起動しますので、ファイルの最後の方にあるreply_threshold_secondsを4から0に編集します

オリジナル


<key>reply_threshold_seconds</key>
<integer>4</integer>

変更後


<key>reply_threshold_seconds</key>
<integer>0</integer>

  • 「インターネット共有」のチェックボックスをOFFにして、インターネット共有を停止します。
  • 引き続き以下のように操作します。
$ sudo mv _bootpd.plist bootpd.plist
$ sudo chmod 644 bootpd.plist
$ ls -l bootpd.plist
-rw-r--r--  1 root  wheel  1048  7  6 06:32 bootpd.plist

「インターネット共有」は起動時に/etc/bootpd.plistを生成、インターネット共有の停止時に/etc/bootpd.plistを削除します。編集内容がリセットされないように、リードオンリーにするわけです。

  • 再度、「インターネット共有」のチェックボックスをONにして、インターネット共有を開始します。
  • chumbyの「Scanning or wireless connections...」の後の「Choose a wireless connection」に、さきほど設定したネットワーク名「chumby」が見えているはずですので、それを選択します。
  • 「Choose IP allocation method」は「Automaic (recommended)」を選択、後は流れ通りでOKなはずです。chumbyに振られるIPは「10.0.2.n」になると思います。

64kでつなぐと遅くて、スライドショー系、ストリーミング系は実用になりません。
W-ZERO3を使い、高速化サービスが有効になるような設定だと64kでも結構大丈夫です(即ち、Bluetooth PAN経由か、WMWifiRouterなど経由か)。

WMWifiRouterを使う

Windows Mobile上で動作するソフトウェアWiFiルータ、WMWifiRouterが使えます。

  • WMWifiRouterをインストールします。詳細は割愛します。
  • ファイル名「debugchumby」でテキストファイルを作ります。改行コードはLFにしておきます。内容は以下のようなものです。WMWifiRouterで使うessidが"WMWifiRouter"である必要があります。違う場合は書き換えてください。
#!/bin/sh
ESSID="WMWifiRouter"
LOG=/mnt/usb/adhoc-status.txt
fbwrite "connecting to Ad-Hoc Wi-Fi network ${ESSID}...."
echo >>${LOG}
date >>${LOG}
iwconfig rausb0 mode Ad-Hoc essid ${ESSID} key off >>${LOG} 2>&1
udhcpc -t 5 -n -p /var/run/udhcpc.rausb0.pid -i rausb0 >>${LOG} 2>&1
ifconfig rausb0 >>${LOG} 2>&1
  • テキストファイル「debugchumby」をUSBメモリのルートディレクトリにコピーし、chumbyのUSBポートに挿入します。
  • WMWifiRouterを起動し、接続準備を完了させます。
  • chumbyが起動中であれば一度電源を落としてから、chumbyを(再度)起動します。

起動シーケンス中に液晶の上の方に"connecting to Ad-Hoc Wi-Fi network WMWifiRouter...."と表示された後、WMWifiRouter経由でインターネットと通信しながら起動するはずです。
おかしい場合はUSBメモリに出来ているはずの「adhoc-status.txt」の内容が参考になるかもしれません。

Windows XPのインターネット接続の共有を使う

chumby側の手順はWMWifiRouterと同様。debugchumby内ESSIDを、PC側のそれに書き換えるだけです。

普通にWindows XPでインターネット接続の共有の設定をすればいいのですが、ハマるポイントがいくつかあるので念のため書いておきます。

W-ZERO3をUSBモデムとして使いインターネットに接続するダイヤルアップ接続を、無線LAN経由で共有する例です。
ダイヤルアップ接続の名前を「dialup01」という名前にしていると仮定して説明します。
「dialup01」でインターネットに接続できることを確認しておきます。
Bluetooth PANの場合でも、有線LANでも接続先が違うだけでほぼ同様です。

なお、自分が使っているのは、Windows XP Home SP2です。SP3だとちょっと違うかもしれません。

こっちも現状セキュリティ無しなので、気になる向きは設定をお願いします。

  • 「コントロールパネル>ネットワーク接続」を起動します。
  • ダイヤルアップ「dialup01」のプロパティを表示します。
  • 「詳細設定>インターネット接続の共有>ホーム ネットワーク接続」のドロップダウンリストから「ワイヤレス ネットワーク接続」を選択します。
  • 「詳細設定>インターネット接続の共有>ネットワークのほかのユーザーに、このコンピュータのインターネット接続をとおしても接続を許可する」のチェックボックスをONにします。
  • また、その下にある「ネットワークのコンピュータがインターネットにアクセスを試みるたびにダイヤルアップ接続を確立する」のチェックボックスもONにします。
  • 「OK」ボタンを押してプロパティを閉じます。
  • 「コントロールパネル>ネットワーク接続」の中にある「ワイヤレス ネットワーク接続」のプロパティを表示します。
  • 「全般>この接続は次の項目を使用します>インターネット プロトコル (TCP/IP)」のプロパティを表示します。
  • 「全般」タブの「次の IP アドレスを使う」のラジオボタンをON、「IP アドレス」を「192.168.0.1」に、「サブネットマスク」を「255.255.255.0」に。
  • 「ワイヤレス ネットワーク」タブの「追加」ボタンを押します。
  • 「アソシエーション>ネットワーク名 (SSID)」を「chumby」に、「データの暗号化」を「無効」にします。
  • 「これはコンピュータ相互 (ad-hoc) のネットワークで、ワイヤレス アクセス ポイントを使用しないのチェックボックスをONにします。
  • さらに「OK」ボタンでプロパティを閉じます。
  • 「ワイヤレス ネットワーク」タブに戻ったので、「詳細設定」ボタンを押します。
  • 「アクセスするネットワーク」を「コンピュータ相互 (ad-hoc) のネットワークのみ」に、「優先でないネットワークに自動的に接続」のチェックボックスをOFFにします。
  • 「閉じる」ボタンで「詳細設定」のダイアログを閉じます。
  • 「詳細設定(タブ)>Windows ファイアウォール」の「設定」ボタンを押し、「無効 (推奨されません)」を選択してファイアウォールを切り、「OK」ボタンを押して「Windows ファイアウォール」のダイアログを閉じます。さらに「OK」ボタンを押して、「ワイヤレス ネットワーク接続のプロパティ」を閉じます。
  • ファイル名「debugchumby」のテキストファイルをテキストエディタで作ります。改行コードはLFにしておきます。内容は以下のようなものです。SSIDを「chumby」にしたので、「ESSID="chumby"」という記述になっています。変えた場合は書き換えてください。
#!/bin/sh
ESSID="chumby"
LOG=/mnt/usb/adhoc-status.txt
fbwrite "connecting to Ad-Hoc Wi-Fi network ${ESSID}...."
iwconfig rausb0 mode Ad-Hoc essid ${ESSID} key off >>${LOG} 2>&1
udhcpc -t 5 -n -p /var/run/udhcpc.rausb0.pid -i rausb0 >>${LOG} 2>&1
ifconfig rausb0 >>${LOG} 2>&1
  • 「debugchumby」をUSBメモリのルートディレクトリにコピーし、chumbyのUSBポートに挿入します。
  • chumbyが起動中であれば一度電源を落としてから、chumbyを(再度)起動します。
  • 起動シーケンス中に液晶の上の方に"connecting to Ad-Hoc Wi-Fi network chumby...."と表示された後、PC側でダイヤルアップが始まって、インターネットと通信しながら起動するはずです。
  • おかしい場合はUSBメモリに出来ているはずの「adhoc-status.txt」の内容が参考になるかもしれません。

PC側の無線LANを固定IPかつ「192.168.0.n」にするところがミソです。
こうしないとICSが機能しないそうです。
普段のDHCPを使う設定との切り換えをスムーズにする手段が必要ですね。

複数のプロファイルを持てる機能があるかどうかよく知りませんが、ひょっとしたらこういうのはnetコマンドでやるもんなんでしょうか。

また、PC側の無線LANのファイアウォールをOFFにしておかないと、chumbyがICSのDHCPを引けません。これもハマりポイント。
より選択的にファイアウォールをOFFにする方法があるかと思います。ご存知の方がいらしたら教えてください。

|

2008.05.25

[Chumby]Chumbyで日本語読み上げ音声時計(Japanese voice clock for Chumby)

Zaurus用にコンパイルしたCMU FliteChumbyで動いたので、時刻を読み上げる音声時計スクリプトを書いてみました。

CMU Fliteは英語しか読み上げできませんが、カビパン男と私さんの素晴らしい発音テーブルのおかげで、日本語読み上げもできるようになりました。

Chumbyではcronが最初から動いてますので、それに登録して動かします。

とりあえず、僕は壁掛け時計よろしく30分間隔で動かしています。

ダウンロード

「jvoiceclock-0.1.tar.gz」をダウンロード

「flite-1.3_arm-linux.tar.gz」をダウンロード

「sox-12.17.3_arm-linux.tar.gz」をダウンロード

インストール

前出の三つのファイルを解凍し、USBメモリのルートディレクトリにコピーします。

コピー先をいじる場合は、jvoiceclock.plの冒頭にあるConstantsを適宜いじってください。

USBメモリはVFATでしょうから実行権は関係無い(デフォルト777)と思いますが、特殊な環境の方はパーミッションに注意してください。

ChumbyにSSHでログインし、以下のようにcrontabを実行します。

# crontab -e

起動したviで、以下のようなエントリを加え、保存終了します。

*/30 * * * * /mnt/usb/jvoiceclock.pl

以降、30分ごとに時刻を読み上げてくれると思います。 最初はテストで以下のように登録して1分毎に読み上げさせてみるといいかもしれないですね。

*/1 * * * * /mnt/usb/jvoiceclock.pl

ソース

一応ソースを貼っておきます。

#!/usr/bin/env perl

# Title: Japanese voice clock for Chumby
# Version: 0.1
# Author: moyashi 
# License: Free

##### INSTALL

# Copy flite, sox, jvoiceclock.pl to USB Flash memory, like this:
#
# $ scp flite sox jvoiceclock.pl root@192.168.0.10:/mnt/usb
#
# Then, register to crontab (On Chumby):
#
# # crontab -e
#
# */30 * * * * /mnt/usb/jvoiceclock.pl
#

# You can get flite, sox (run on Chumby) from my site:
# http://moyashi.air-nifty.com/hitori/2008/05/chumbychumby_e1da.html

##### Constants

*FLITE_PROG = \"/mnt/usb/flite";
*SOX_PROG = \"/mnt/usb/sox";
*TMP_FILE = \"/tmp/speak$$.wav";

#####

&speak(&time_pho((localtime(time))[1, 2]));

sub speak {
    my($arg) = @_;
    $cmd1 = $FLITE_PROG." -t \"".$arg."\" -o ".$TMP_FILE;
    $cmd2 = $SOX_PROG." -r 4000 ".$TMP_FILE." -t ossdsp /dev/dsp";
    system($cmd1.";".$cmd2.";rm ".$TMP_FILE);
}

sub ampm_pho {
    my($hour) = (localtime(time))[2];
    if ((localtime(time))[2] > 12) {
        return "go go";
    } else {
        return "go zeh unn";
    }
}

sub time_pho {
    my($min, $hour) = @_;
    if ($hour > 12) { $hour = $hour - 12; };

    @min = split(/ */, sprintf("%02d", $min));

    $ampm_pho = &m_pho();

    @hour_arr = ("re ee", "ee chee", "ni", "sa unn",
        "yo", "go", "ro koo", "shi chee",
        "ha chee", "koo", "joo oo",
        "joo oo ee chee", "joo oo ni");

    @tenth_arr = ("", "joo oo", "ni joo oo", "sa unn joo oo",
        "yo unn joo oo", "go joo oo");

    @one_arr = ("", "ee chee", "ni", "sa unn",
        "yo unn", "go", "ro koo", "na na",
        "ha chee", "kyoo oo");

    $hour_pho = $hour_arr[sprintf("%d", $hour)]." ji";

    $fun_pho = $min ? " foo unn" : "";

    $min_pho = $tenth_arr[sprintf("%d", $min[0])]." ";
    $min_pho = $min_pho.$one_arr[sprintf("%d", $min[1])];
    $min_pho = $min_pho.$fun_pho;
    return $ampm_pho." ".$hour_pho." ".$min_pho." deh soo";
}

|