« [AVR]ハローキティのAVRライター新発売!! | Main | [Arduino]Arduinoでコマンドシーケンサーを作ってみた »

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は不安定なので、こちらの方がいいかも。

|

« [AVR]ハローキティのAVRライター新発売!! | Main | [Arduino]Arduinoでコマンドシーケンサーを作ってみた »