RAPIRO(ラピロ)に赤外線リモコンを装備させる

th_rapiro_gun_1

「ラピロに銃の形をした赤外線リモコンを装備させたらおもしろカッコイイんじゃないか?」

というアイデアは、ラピロを購入して一ヶ月ぐらいした頃に、ぼんやりと思いつきました。ちょうど一年ぐらい前です。その頃は「 Arduinoで赤外線リモコン作ってRaspberry Piから制御すればいけるかなー」とか考えていたのですが、いざやろうとすると色々面倒で、ちょっと仕事が忙しかったこともあって、なかなか手をつけられずにいました。

最近になって、ちょっと時間ができたのと、なんやかんや色々知識が増えたのと、また1年前にはなかった強力な武器を2つ手に入れたこともあって、ようやく実現に漕ぎ着けました。武器の一つは、3Dプリンタ。もう一つは、大宮技研さんの販売しているirMagicianです。

 赤外線リモコンについては過去に自作したこともあるのですが、かなり制約が厳しくて(距離が短く、かつ有効角度がシビア)、ちょっと実運用には厳しいなあという状態でした。

そんなワケで、なんとか距離と角度の問題を解決できないかなあと色々探しているウチに見つかったのが、irMagicianでした。Raspberry Piでの利用実績もあるし、べらぼうに高いワケでもない(←キット版1,980円、完成版3,980円)ので、ちょっとテストしてみるつもりで購入しました(ちなみに購入したのは完成版です。表面実装とかのスキルは持ち合わせておりませんゆえ)。

試してみた結果、部屋の対角線上の真逆にあるエアコンが操作できたので、4mぐらいは飛んでいると思います。これだけ飛んでくれれば自分的には十分です。角度も、厳密には測っていませんが、自分が自作したものに比べるとだいぶ許容範囲が大きくなっている気がします。

というわけで、自作よりもirMagicianベースで、ラピロの赤外線リモコン装備を作成していくことにしました。以下、作業記録です。

ラピロがRaspberry PiとボディのArduino間で通信できる状態であれば、irMagicianをUSBケーブルで接続するだけで認識されます。

 th_rapiro_gun_11

こんな感じで、黄色のLEDが点滅すればOK。黄色LEDや緑色LEDが点きっぱなしの場合は、USBケーブルがしっかり挿さっているかを確認しましょう。特にラピロの頭にRaspberry PiのType B+やPi 2を使っている場合は、USBが挿さりにくくなるので。

ちなみにRaspberry PiとArduinoの通信設定をしていない場合は、先にシリアル・インタフェースの設定を変更しないといけないかもしれません。以下に詳しく書かれています。

さらに、上記にはPythonのサンプルファイル(irm.py)も置いてくださっているので、ありがたく使わせてもらいます。

とりあえずこれだけ動作確認しました。

  • 照明
    • パナソニック: HH-560A (普段/白い色/暖かい色/全灯/常夜灯/消灯)
    • パナソニック: HH-LC463A(普段/白い色/暖かい色/全灯/常夜灯)
    • パナソニック: HHJZ1220(全灯/常夜灯/消灯)
    • シャープ:  型番不明(お気に入り/全灯/常夜灯/消灯)
  • エアコン
    • 三菱: MSZ-EX36TE(電源ON/電源OFF/運転切換)
    • パナソニック: CS-EX223C(電源OFF/自動/冷房/暖房/除湿)
    • 東芝: RAS-221UR(電源ON/電源OFF/自動/冷房/暖房/除湿)
    • 日立: RAS-S40Z(動作せず
  • テレビ
    • パナソニック: TH-42LDT60(電源ON-OFF/消音/音量大小/チャンネル切換/入力切換)
    • 三菱: LCD-26BHR400(動作せず
  • レコーダー
    • パナソニック: DMR-BW680(動作せず

個人的にリビングに置いてある日立のエアコンが制御できなかったのが残念ですが、それでも十分、色々制御できます。

 

さて、irMagician自体の動作確認は済んだので、次はどれだけカッコよくラピロに装備させられるか、です。

とりあえず、irMagicianを収納できる形でシンプルなケースをBlenderでデザインして、3Dプリンタでプリントしてみました。

th_rapiro_gun_2

こんな感じの3つの部品をプリントして。

th_rapiro_gun_3

こんな感じで。

th_rapiro_gun_4

irMagicianを組み込みます。

th_rapiro_gun_5

後方には穴を開けているので、ここからUSBケーブルを接続できます。

 

。。。にしても、うーん、正直イマイチです。ビデオカメラみたい。

th_rapiro_gun_10

ご覧のように、ラピロの正立時に干渉しないようにirMagicianを手に持たせようとすると、どうしても銃身の短い、ハンドガンみたいな形状にしなくちゃいけないんですよね。

irMagicianの赤外線LED部分だけ切って、irMagician本体からリード線で延長するようにすれば、ガンダムの肩にかけるバズーカ的な形にもできたかもしれませんが、それはそれで取り回しが悪そうなので、今回はなんとかハンドガン形状でもうちょっとカッコ良くなるようにがんばってみます。

ということで、「せめて色でも塗ればマシになるんじゃなかろうか」と思い、模型屋さんをウロウロしに行ったところ、

th_rapiro_gun_6

こんなん見つけました。プラモデルを装飾するためのパーツ群。

全然知らなかったのですが、最近はこんなカユイところに手が届くような製品も普通に市販されとるのですね。もちろん、このあたりのディティール込みで3Dモデリングしてプリントすればよいのかもしれませんが、現状ではやっぱり市販品の方が見た目が綺麗なので、売り物があるものについては売り物を使うことにします。どうしてもオーダーメイドしなきゃいけない部分だけ、3Dプリントすることにします。

ちなみにこのシリーズはかなり色々種類があるようなので、他にもラピロに利用できるものがあるかもしれません。

さて、上記の部品を適当に接着剤で貼り付けてみて、マットブラックの塗料スプレーを吹っかけてみた結果、

th_rapiro_gun_8

こんな感じになりました。さっきのビデオカメラ状態よりはだいぶマシになった気がします。まだビデオカメラと言えなくもないですが、まあデルタムーバーみたいなものだと思ってください。

 

あとは、先ほどのサンプルファイルで(irm.py)で操作したい機器の赤外線信号を学習・ファイル出力しておいて、同じくサンプルファイルのplayIR関数を自分のプログラムにコピペしてくれば、自由に赤外線信号を送信できるようになるハズです。自分はbottleフレームワークを使って、Web APIの形で赤外線信号を送信できるようにしました。ポイントだけ抜粋すると、こんな感じです。

import serial
import time
import json
import os

com = serial.Serial('/dev/ttyAMA0', 57600, timeout = 10);
ir_serial = serial.Serial("/dev/ttyACM0", 9600, timeout = 1)

def playIR(path):
  ir_serial.write("L,1\r\n")
  if path and os.path.isfile(path):
    print ("Playing IR with %s ..." % path)
    f = open(path)
    data = json.load(f) 
    f.close()
    recNumber = len(data['data'])
    rawX = data['data']

    ir_serial.write("n,%d\r\n" % recNumber)
    ir_serial.readline()

    postScale = data['postscale']
    ir_serial.write("k,%d\r\n" % postScale)
    #time.sleep(1.0)
    msg = ir_serial.readline()
    #print msg

    for n in range(recNumber):
        bank = n / 64
        pos = n % 64
        if (pos == 0):
          ir_serial.write("b,%d\r\n" % bank)

        ir_serial.write("w,%d,%d\n\r" % (pos, rawX[n]))

    ir_serial.write("p\r\n")
    msg = ir_serial.readline()
    print msg
    #ir_serial.close() 
  else:
    print "Playing IR..."
    ir_serial.write("p\r\n")
    time.sleep(1.0)
    msg = ir_serial.readline()
    print msg
  ir_serial.write("L,0\r\n")

def search_ir_data(place, device, function, parameter):
  path = "/home/pi/bottle/irdata/"
  if place == "living":
    if device == "light":
      if function == "power":
        if parameter == "on":
          path += "S_L_POWER_ON.json"  
        elif parameter == "off":
          path += "S_L_POWER_OFF.json"
      elif function == "mode":
        if parameter == "night":
          path += "S_L_MODE_NIGHT.json"  
        elif parameter == "full":
          path += "S_L_MODE_FULL.json"
    elif device == "tv":
      if function == "power":
        if parameter == "on" or parameter == "off":
          path += "P_T_TH-42LDT60_POWER_ON_OFF.json"  
      elif function == "sound":
        if parameter == "on" or parameter == "off":
          path += "P_T_TH-42LDT60_SOUND_ON_OFF.json"  
      elif function == "input":
        if parameter == "change":
          path += "P_T_TH-42LDT60_input_CHANGE.json"  
      elif function == "volume":
        if parameter == "up":
          path += "P_T_TH-42LDT60_VOLUME_UP.json"  
        elif parameter == "down":
          path += "P_T_TH-42LDT60_VOLUME_DOWN.json"  
      elif function == "channel":
        if parameter == "up":
          path += "P_T_TH-42LDT60_CHANNEL_UP.json"  
        elif parameter == "down":
          path += "P_T_TH-42LDT60_CHANNEL_DOWN.json"  
  return path

@route('/v1/robots/rapiro/appliances')
def control_appliances():
  place     = request.query.place.lower()
  device    = request.query.device.lower()
  function  = request.query.function.lower()
  parameter = request.query.parameter.lower()
  print "Place:" + place + ", Device:" + device + " , Function:" + function + ", Parameter:" + parameter
  com.write("#PS11A078S00A070S01A070S02A130S03A110S06A090S08A105S10A080T008")
  time.sleep(1)
  com.write("#PS04A060T008")
  time.sleep(1)
  path = search_ir_data(place, device, function, parameter)
  print "IR Data Path: " + path
  if path != "irdata/":
    playIR(path)
  time.sleep(2)
  com.write("#PS04A090T008")
  com.write("#M0")

run(host='192.168.24.50', port=10080, debug=True)

これだと、例えば”http://192.168.24.50:10080/v1/robots/rapiro/appliances?place=living&device=light&function=power&parameter=on”でアクセスすれば、リビングの照明をつけることができます。

 

で、実際にラピロに赤外線制御させてみた結果がこちら。

今回は視点を色々動かさなくちゃいけなかったので、ちょっと動画が不安定ですが、ご了承ください。雰囲気だけでも伝わってくれれば幸いです。

個人的には、なんでもかんでも知らないうちに自動で制御してくれるスマート・ホームより、こんな感じで擬人化(?)されたモノを介して、目で見て触れるパートナーとして色々助けてくれるスマート・ホームの方が、方向性としては好きです。多少、見ていてもどかしい部分があったとしても。

 

ちなみに赤外線リモコンと言えば、ウチにはIRKitもあります。

こちらも赤外線リモコンとしてはとても優秀で、デフォルトで宅外からの制御に対応していたり、諸々情報が公開されているので、カスタマイズも容易です。irMagicianでは動かなかったリビングの日立エアコンも、IRKitなら動作したりします。

筐体も基本コンパクトですが、さすがに小型ロボットに組み込むには大きいです。単純に赤外線リモコンを家に追加したいならIRKit、ロボとか電子工作に組み込みたいならirMagician、て感じですかね。

ラピロへのirMagicianの装備について、今回は銃型にこだわって作成してみましたが、手甲に組み込んでみたり、杖の先っぽに取り付けてみるのもいいかもしれないですね。何せir”Magician”ですし。杖なら正立時には前に突き出る形になりますから、銃身を短くするような制約もありません。

 

というわけで、1年越し、ようやくやりたかったことが実現できました。あとはもうちょっと3Dプリントのデザイン&造形スキルを上げて、もっとカッコよくしていけたらいいなあと思います。