“ファービー”とは1998年にアメリカで開発された電気仕掛けのぬいぐるみです。
日本でも世紀末にTOMYから発売され、その愛くるしい容姿とつぶらな瞳で社会現象を起こしました。
発火ドゥルドゥ〜というネットミームが爆誕したりもしました。。
ブームが去り10年が経過した今でもヤフオクでの取引は活発で、700円くらいで手に入れる事が出来ます。(2010年)
電話をかけるとファービーが応答。
「ファービー、踊って?」とか話しかけると電話越しでファービーがダンスする。
発信側の電話機のボタンで任意のコマンドを送り、ファービーを制御。
SLEEPコマンドで電話切断、スリープモードに入る。
3.1 電話越しに制御するために今回はDTMF(ピッポッパ)で制御する事にして、
秋月電子で2個300円で売っている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を検知するとStDがHになるのでそれを割り込みのトリガにして
状態を読み取ったインデックスとして配列から取り出し、putcでUART出力しています。
配列の中身は配線付けのしやすさを優先した順番になっています。
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
無縁社会と揶揄されるこの頃ですが、この作品は電話をすればいつでも相手をしてくれます。
誰がなんと言おうと、癒し系だと思います。
参考サイトを見ると、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:の反応:抜け殻が意外にも好評
HackFurby
Frank's Furby Stimulation Page
Marius's Furby Page