ラベル iOS の投稿を表示しています。 すべての投稿を表示
ラベル iOS の投稿を表示しています。 すべての投稿を表示

2016年9月20日

ミニマルなIRKitクローンを作ってiOSから家電を制御する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
どうも、お久しぶりです。生きてます。

さて、iOS 10が配信開始されて新たに登場した「ホーム」アプリのおかげで、日本ではあんまり注目されてなかったHomeKitが熱くなってるみたいです。(個人的感想)

HomeKitではPhilips Hueを操作できたりするのですが、そもそも対応していない家電を対応させるためのDIY的手法も色々存在しています。
例えば、HomebridgeとIRKitを組み合わせた方法。
Raspberry PiにHomebridgeを入れて、homebridge-irkitでIRKitを叩くみたいなお手軽スマートハウスのやり方は検索すれば山ほど出てきます。
そしてここで使われるIRKit、赤外線リモコンの信号を送受信できるオープンソースハードウェアなのですが、大人気なんですね。
在庫切れ入荷予定無しで手に入らないんだけど(キレ)という声も周囲にチラホラあったり。

というわけで、欲しいけど無いなら作りましょう。
自分で作ると安いし、面白いですし...

回路はこんな感じ。

必要な部品は以下の通り。
ESP-WROOM-02でミニマルなIRKitクローンを作る



もしESP-WROOM-02とかブレッドボードとか抵抗とか...持ってるなら、赤外線LEDと赤外線リモコン受信モジュールだけ買っちゃってください。

私はオリジナルのESP-WROOM-02搭載ボードとプロトタイプ・シールド基板を作っているので、これを使ってサクッと作りました。


中身のソフトウェアはIRremoteESP8266とaJSONを使って100行程度で実現しています。
コードはこちら。
9SQ/minIRum: A minimal implementation of infrared sender/receiver like IRKit by ESP8266

Arduino core for ESP8266をArduinoに入れて、コードをビルドしてESP-WROOM-02に書き込んであげてください。

あとは、IRKitみたいに GET /messages で最後に受信したリモコンのコードが取得できるので、これをメモしておいて...
POST /messages にこれを投げてあげれば、リモコンと同じように発光してくれます。
もし、エアコンなどの長めのコードを飛ばすリモコンの場合は、IRremoteESP8266/IRremoteESP8266.hの#define RAWBUF 100を200とかにしてあげれば取れるかも。

あとはHomebridgeと組み合わせれば、このようなことが出来ます。

Raspberry PiにHomebridge諸々を入れるのは、検索すればいっぱい記事が出てくると思います。
ただ、Raspbianはapt-getで取れるnodeが古かったりするので、楽をしたいならArch Linux(RasPi2/RasPi3)をお勧めします...
pacman -S git python2 nodejs npm nss-mdns avahi
systemctl enable avahi-daemon
systemctl start avahi-daemon
npm install -g homebridge
npm install -g homebridge-irkit
mkdir .homebridge
cd .homebridge
nano config.json
config.jsonは以下のような感じで。
irkit_hostは適宜変更してください。
{
    "bridge":
    {
       "name": "Homebridge",
       "username": "B8:27:EB:4D:31:D7",
       "port": 51826,
       "pin": "031-45-154"
    },

    "accessories": [
        {
            "accessory": "IRKit",
            "name": "ライト",
            "irkit_host": "minirum-a492cd.local",
            "on_form": {"format":"raw","freq":38,"data":[3550,1700,500,400,500,400,450,1300,500,1300,500,400,450,1300,500,400,500,400,450,450,450,1300,500,400,500,400,450,1300,450,450,450,1300,500,400,450,1300,500,450,500,400,500,1300,500,400,500,400,450,450,450,450,450,1300,500,400,500,1300,500,1300,450,450,500,1300,500,400,500,400,500,400,450,450,500,1300,500,400,500,450,450,1300,500,400,500,400,450]},
            "off_form": {"format":"raw","freq":38,"data":[3550,1700,500,400,500,400,450,1300,500,1300,450,450,500,1300,500,400,500,400,500,400,500,1300,500,400,500,400,500,1300,500,400,450,1300,500,400,500,1300,450,450,500,400,450,1300,500,400,500,400,450,450,450,450,500,1300,450,1300,450,1300,450,1300,450,450,500,1300,450,450,450,450,450,450,450,1300,500,1300,500,400,500,400,450,1300,500,400,500,400,500]}
        }
    ]
}
ちなみに、この赤外線コードはPanasonic製のシーリングライトのON/OFFです。

homebridgeを立ち上げて、iPhoneとペアリングします。
homebridge
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Loaded plugin: homebridge-irkit
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Registering accessory 'homebridge-irkit.IRKit'
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] ---
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Loaded config.json with 1 accessories and 0 platforms.
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] ---
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Loading 1 accessories...
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] [ライト] Initializing IRKit accessory...
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:
                       
    ┌────────────┐     
    │ 031-45-154 │     
    └────────────┘     
                       
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Homebridge is running on port 51826.

iOS 10のデバイスで「ホーム」アプリを起動して「アクセサリを追加」、Homebridgeが表示されるのでコードを入力してペアリングを完了させます。
Homebridgeを追加したら、configに書いたアクセサリ(上記例では「ライト」)が表示されると思うので、これを追加すれば制御できるようになります。

Raspberry PiでのHomebridgeの自動起動は以下を読むと早いです。
Arch Linuxなら、Running Homebridge on Bootup (systemd)のセクションです。
https://github.com/nfarina/homebridge/wiki/Running-HomeBridge-on-a-Raspberry-Pi

homebridge-irkitではON/OFFの単純操作しかできないので、そのうち色々なコードを叩けるhomebridgeのプラグインでも書こうかな...
ちなみに、Raspberry Piにhomebridge-cmdを入れて、GPIOにSSRを繋いであげれば、リモコンの無いAC100Vの機器もON/OFFできます。

2012年7月1日

GarageBand Mac版からiOS版にプロジェクトデータを持っていく方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

今のところiOS版で作ったプロジェクトデータはMac版で展開できますが、逆にMac版のデータをiOSで展開することは出来ません。

しかし、プロジェクトデータの構造を調べてみたところ、基本的にはMac版とiOS版に違いはなく、色々試してみたところ、以下の方法でMac版のプロジェクトデータをiPadに持っていくことが出来ました。

注意点として、音声データ(リアル音源データ)が含まれるプロジェクトでは試していないので持っていけるかどうか不明。
もう一つ、iOS版に持っていくデータはiOS版GarageBandの都合上、8トラックまでに減らしておくこと。
また、iOS版GarageBandに存在しない音源で鳴らすことは出来ないため、あらかじめMac版でGrand Pianoなどにしておくことをお勧めする。

手順は以下から。

2012年3月2日

SheevaPlugが届いたので遊んでみた(3)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
押し入れから出てきた古いUSBハブを介して接続ちゅう
いよいよ当初の目標「SheevaPlugでAirPrintアダプタを作る」の実現へ。
今回は、A3ノビ対応のEPSON PM-G4500をAirPrint対応化させてみる。

必要な物のインストール
yum -y install tar
yum -y install gcc-c++ libtool rpm-build
yum -y install openssl
yum -y install make automake
yum -y install avahi avahi-autoipd
yum -y install cups ghostscript cups-devel
ここで
依存性の欠落: krb5-libs = 1.7-8.fc12 はパッケージ krb5-devel-1.7-8.fc12.armv5tel (fedora) が必要としています
とでるので
# wget http://ftp.linux.org.uk/pub/linux/arm/fedora/pub/fedora/linux/releases/12/Everything/arm/os/Packages/krb5-devel-1.7-8.fc12.armv5tel.rpm
# rpm -ivh --nodeps krb5-devel-1.7-8.fc12.armv5tel.rpm
で強制的にインストール。これでcups-develがインストール可能。
# yum -y install cups-devel

cups設定ファイルを編集する
# vi /etc/cups/cupsd.conf
以下、viで作業。
#Listen localhost:631//コメントアウト
#Listen /var/run/cups/cups.sock //コメントアウト
Port 631 //追加

<location />
Order allow,deny
Allow localhost
Allow @LOCAL //追加
</location>

<location /admin>
Order allow,deny
Allow localhost
Allow @LOCAL //追加
</location>

<location /admin/conf>
Order allow,deny
Allow localhost
Allow @LOCAL //追加
</location>
最終行に以下を追加
ServerCertificate /etc/cups/ssl/server.crt
ServerKey /etc/cups/ssl/server.key
保存する。
https接続用の証明書を作成する。
# openssl req -new -nodes -x509 -keyout /etc/cups/ssl/server.key -out /etc/cups/ssl/server.crt -days 3650
以下は参考。
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Kumamoto
Locality Name (eg, city) [Default City]:Kumamoto-shi
Organization Name (eg, company) [Default Company Ltd]:Prioris.A.W.
Organizational Unit Name (eg, section) []:Security
Common Name (eg, your name or your server's hostname) []:SheevaPlug
Email Address []:.

Epson Inkjet Printer Driver (ESC/P-R)のインストール
i386やx86_64などの一般的なアーキテクチャ以外は自分でドライバをソースからコンパイルする必要がある。
幸いにもEPSONはソースコードまで公開してくれているので、これを利用する。
# wget http://linux.avasys.jp/drivers/lsb/epson-inkjet/escpr/src/epson-inkjet-printer-escpr-1.1.1-1lsb3.2.tar.gz
# tar zxvf epson-inkjet-printer-escpr-1.1.1-1lsb3.2.tar.gz
# cd epson-inkjet-printer-escpr-1.1.1
# ./bootstrap && ./configure --prefix=/usr
# make
# make install
途中で必要なものは最初にインストールしているが、もしエラー吐いて止まったら足りないものがあるのでyumでインストール。
特に、libtool→automakeの順でインストールしていない場合はautomakeをreinstallする。

CUPSにプリンタを認識させる
SheevaPlugにUSBケーブルでプリンタを接続した状態で
http://SheevaPlugのIPアドレス:631
にアクセスする。我が家の場合、http://192.168.24.63:631
次に、管理者向け->プリンターとクラスの追加を開き、プリンターの追加を選択。
しばらく待つとローカルプリンターの欄にUSBで接続したプリンタが現れるので、選択して「続ける」をクリック。
このプリンターを共有するにチェックを入れて「続ける」をクリック。
先ほどのEPSONドライバーがうまくインストールできていれば、後ろに「Epson Inkjet Printer Driver (ESC/P-R)〜」と付いている機種名がずらずらと表示される。
機種名を選択して「プリンタの追加」をクリック。
これでプリンターが追加される。

Avahi設定ファイルを書く
(参考:AirPrintをCUPSを使ったLinuxサーバーで実現してみた。)

vi /etc/avahi/services/printer.service
ほとんど参考にしたブログの通り。
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name>EPSON PM-G4500</name>
<service>
       <type>_ipp._tcp</type>
       <subtype>_universal._sub._ipp._tcp</subtype>
       <port>631</port>
       <txt-record>txtvers=1</txt-record>
       <txt-record>qtotal=1</txt-record>
       <txt-record>rp=printers/EPSON_PM-G4500</txt-record>
       <txt-record>ty=EPSON_PM-G4500</txt-record>
       <txt-record>note=SheevaPlug</txt-record>
       <txt-record>product=(GPL Ghostscript)</txt-record>
       <txt-record>printer-state=3</txt-record>
       <txt-record>printer-type=0x3056</txt-record>
       <txt-record>Transparent=T</txt-record>
       <txt-record>Binary=T</txt-record>
       <txt-record>Duplex=T</txt-record>
       <txt-record>Copies=T</txt-record>
       <txt-record>pdl=application/pdf,application/postscript,application/vnd.cups-raster,application/octet-stream,image/png</txt-record>
       <txt-record>URF=W8,SRGB24,CP1,RS600</txt-record>
</service>
</service-group>

これでMacのシステム環境設定からプリンタとスキャン→プリンタの追加で検索すると表示されるようになる。
Macからは正常に印刷できるが、このままではiPhoneやiPadから印刷したときに日本語が印刷されなかった。
yum -y install poppler-data
これで日本語が印刷される。
ちなみに、これはiPhone/iPadがPDFを生成してCUPSに送りつけていることが原因。


ページのサイズが大きいと印刷(開始)までに時間がかかるけど、これはiPhone/iPadがPDF生成に時間を要しているからと思われる。(要するにiPhone/iPad側の問題)

というわけで、無事、AirPrintアダプタを作るという目標は達成。
実際に運用するのかという話は... iPadからの印刷はしないので自己満足ということで(*´▽`*)

というか、いい加減、AirMac ExtremeとかAirMac ExpressでAirPrintできるようにしてくれないかな...
ファームウェアで十分対応できることなんだけど、AirPrint対応プリンタを作らせるためにあえて対応しない感じなんだろう。

とりあえず、NASとして使うために、samba入れてハードウェアRAID1の外付けHDDを接続したり、Webサーバとして使うために、ApacheとPHPとMySQL入れて負荷を見てみたりしているところ。