Arduinoの状態をim.kayac.comに送信してiPod touchで確認する

iPhone OS 3.0以降に搭載されているApple Push Notification Service機能について、日本語版ヘルプには書かれていないが、英語版の方に、TCP Portの5223番を解放しろ、と書いてある。

im.kayac.comを使いたくて、ちょっとテストしてみたら上手くPushされず、ヘルプの存在を知らずに、Twitterで出来ないなあとつぶやいたところ、すぐに中の人が教えてくれた。心から感謝。

さて。

PythonスクリプトでWebにある情報をPush出来ても面白くないので、現実世界の情報を自分のiPod touchにPushすることを考えた。そこで、Arduinoを用いる。

適当なセンサが無かったので、可変抵抗器を使って、電流の値が一定値以上になったら、im.kayac.comを通して、iPod touchにメッセージをPush配信する。

こんな感じで繋いで、Arduinoの0番ピンに電流を送る。

ArduinoとPCをUSBで繋いでおく。

int value = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  value = analogRead(0);
  Serial.println(value);
  delay(100);
}

Arduinoプログラムも単純明快。0番ピンの値を読んで、シリアルに流す。

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
im.kayac.com
"""

import hashlib  # for SHA-1
import urllib

def send_message(message):
    user = "laclefyoshi"
    secret_key = "ORE_NO_HIMITSUKEY"
    url = "http://im.kayac.com/api/post/" + user

    signature = hashlib.sha1(message + secret_key).hexdigest()
    opt = urllib.urlencode({
        "message": message,
        "sig":signature,
    })
    res = urllib.urlopen(url, opt)
    print res.read()

"""
Arduino Observer
"""

import serial  # pySerial
import sys

arduino = serial.Serial(3, 9600)
while(True):
    value = arduino.readline().strip()
    if(int(value) > 512):
        send_message((u"イクーッ: %s" % value).encode("UTF-8"))
        sys.exit()

Arduinoを繋いだPCで、Pythonスクリプトを動かす。シリアルポート(ここではCOM4)に流れてくる値(0から1024の範囲)を読み、512以上であればim.kayac.comにメッセージを送信して終了する。

確認はしていないが、http://pyserial.sourceforge.net/pyserial.html#requirementsによるとpySerialはJython(with Java Communications API)でも使えるらしいので、このプログラムも大きな変更無しでJython 2.5以降(hashlibを使っているから)で動作する筈。

適当に可変抵抗器を回すと、im.kayac.comに送信したメッセージがiPod touchにPush配信されてくる。

こんなサービスを無料(アプリ含めて)で公開しているim.kayac.comは素晴らしい。

iPhoneと違い3Gネットワークに繋がらなくて、いちいち無線LAN環境を探す羽目になるiPod touchにもやもやしていた時期もあったが、D25HWを買い、Push配信の手段を得、どんどん夢が広がる。