ファービーに任意のコマンドを送り、電話越しに戯れるヤツ!
2010/05/23 7M4MON

1.   ファービーとは

ファービーとは1998年にアメリカで開発された電気仕掛けのぬいぐるみです。
日本でも世紀末にTOMYから発売され、その愛くるしい容姿とつぶらな瞳で社会現象を起こしました。
発火ドゥルドゥ〜
という断末魔はあまりにも有名です。
ブームが去り10年が経過した今でもヤフオクでの取引は活発で、700円くらいで手に入れる事が出来ます。

 

2.何が出来るの?


電話をかけるとファービーが応答。
「ファービー、踊って?」とか話しかけると電話越しでファービーがダンスする。
発信側の電話機のボタンで任意のコマンドを送り、ファービーを制御。
SLEEP
コマンドで電話切断、スリープモードに入る。


3.
制作


3.1   
電話越しに制御するために

今回はDTMF(ピッポッパ)で制御する事にして、
秋月電子で2300円で売っているDTMFレシーバーCM8870を使う事にしました。

ハードウェアをの写真を下記に示します。

右下のトランジスタはPCから送られたコマンドを赤外線でファービーに送るための物(2SA1005)で、
真ん中上のダイオードはファービーをスリープから解除するための物です。

電話機から送出されたDTMFトーンをCM8870にてデコード、PICマイコン(16F648A)で文字に変換し
秋月のUART-USB変換モジュール
にてPCに送ります。

PICマイコンのソースを下記に示します。

 1 #include <16F648A.h>
 2 #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR
 3 #use delay(CLOCK = 4000000)
 4 #use rs232(baud=4800,parity=N,xmit=PIN_B2,rcv=PIN_B1) //ハードウェアUART
 5
 6 const byte dtmf[16]={'d','4','8','#','1','5','9','a','2','6','0','b','3','7','*','c'};
 7
 8 #int_ext
 9 ext_isr(){
10   byte code;
11   delay_ms(5);
12   code = input(pin_a0)+input(pin_a1)*2+input(pin_a2)*4+input(pin_a3)*8;
13   putc(dtmf[code]);
14 }
15
16 void main() {
17   enable_interrupts(int_ext);
18   enable_interrupts(GLOBAL);
19   ext_int_edge(L_to_H);
20
21   while(1)
22   {
23   }
24 }


main
関数は割り込みを許可しているだけで何もしません。
CM8870
DTMFを検知するとStDHになるのでそれを割り込みのトリガにして
状態を読み取った物を配列に突っ込み、putcUART出力しています。
半田付けのしやすさを優先したので配列の中身がごちゃごちゃです。
ハードとソフトを同時に開発するから出来る芸当ですね。

3.2    ファービーを制御する

ファービーには赤外線入力があり、任意のコマンドで制御できます。
用意されているコマンドは下記のとおり。

00 - Hello

08 - Hello

01 - Boo Koo-Doh / Sneeze

09 - Wee-Tee / Sing

02 - Noh-Lah / Party

10 - Noh-Lah / Dance

03 - Who-Bye / Hide

11 - Who-Bye / Hide

04 - Hello

12 - Hello

05 - Loo-Loo / Joke

13 - Twinkle Twinkle

06 - Mmm... OK

14 - Noh-Lah / Dance

07 - Way-Loh / Tired

15 - Way-Loh / Sleep

今回は前述のDTMF制御でマイコンも使用したのでファービー制御をマイコンでやるかVBでやるか迷ったったのですが、
今回はデバッグの容易さと、DTMFデコードモジュールの今後の汎用性を考慮し、PC側で制御する事にしました。

アプリケーションのスクリーンショットを下記に示します。開発環境はVB2008です。

ボタンをクリックすると、それに応じたコマンドを赤外線経由でファービーに送出します。
右上のボックスに数値を入力しても同様です。
また、電話機とファービー・DTMFの制御もこのアプリケーションが担当します。
ソースコードはこちら

3.2.1  電話機の制御

電話機とは serialport1 にて通信します。
電話がかかってくる(RINGコマンドを受ける)とATAコマンドで通話を開始します。
スリープの指示を受信するとファービーにスリープコマンド送って電話をATHコマンドで切断します。
 

3.2.3  ファービーの制御

ファービー・DTMFデコードモジュールとは serialport2 にて通信します。
DTMF
を受信した時とボタンを押された時は、その文字列を FurbyCode 関数に投げます。
ファービーがスリープ状態になっている場合は赤外線でのコマンドを受け付けませんので、
SerialPort2のRTS線を制御してファービーを叩き起こします。
RTSはファービー本体の傾きセンサーに繋がっています。ハードウェアの写真中央上のダイオードがそれに当たります。

3.3  ファービーの改造

ファービーの赤外線受信部に赤外線LEDを固定します。
スリープ解除用の配線をファービーの傾きセンサーに接続します。
分解したついでに目に青色LEDを仕込みました。
これがなかなか好評で子ども達が怖がってくれました(w


 

4.  おわりに

無縁社会と揶揄されるこの頃ですが、この作品は電話をすればいつでも相手をしてくれます。
誰がなんと言おうと、癒し系だと思います。

5.  余談

参考サイトを見ると、11110000を4回投げろって書いてあるので、しばらく0xF0を4回送っていて動かねー!と難儀してました。
同時に昨日は動いていた病を発症したために、ef ef ef ef ff ff ff ff が正解だと気づくのに3時間かかってしまいました。
持ってて良かったストレージオシロ。が、ef ef ef ef ff ff ff ff がたまたまスリープコマンドだったために、またハマる。

携帯電話は各機種により受け付けるATコマンドが違うようです。H11Tとか805scでは駄目。
平型端子とIMT2000コネクタの両方が付いて、素直なATコマンドを受け付ける705Pは当たりでした。
通信するときはバッファが悪さをするようなので、SerialPort1.ReadLineではなくSerialPort1.ReadExistingを使うのが正解。

MAKE Tokyo Meeting 05に出展して、
体よく電話番号をゲットするはずだったのですが、掛けてくれたのは男性か彼氏持ちの人ばかり。
あまりに電話を掛けてくれる人が少ないので、お客さんがテンキーで操作できるように急遽改造を決意。
しかし、Extensibility DTE オブジェクトを使用できません。というエラーでVBを再インストールするハメに(泣

機能追加自体は3行3分で完成だったんですけどね。。再インストールに3時間…

しげしげと眺めているところで急に動かすとびっくりしてくれる。
MAKER:の反応:抜け殻が意外にも好評

 


6.
  参考サイト

HackFurby
Frank's Furby Stimulation Page
Marius's Furby Page