2014-07-03

ArduinoからChatter投稿してみる【シリアル通信編】

前回はWeb proxyを介してChatter投稿しましたが、

今回はWebではなくシリアル通信でproxyとやりとりしたいと思います。

 

フローとしては

Arduinoから出力したデータをシリアル通信でPCにデータ転送

→データを受け取ったPC側のプログラムがデータを検知したらChatterに投稿

って感じです。

 

今回は光センサ(CdSセンサ)を使って、電気を消したらChatterに自動投稿されるというモノを作ってみます。

 

0. 準備

必要な物は以下になります。イーサネット関連がいらなくなるので前回より手軽です。

Arduino Uno R3

CdSセンサ

・ジャンプワイヤ、抵抗、ブレッドボード

 

1. 電子回路組み立て

回路は以下のようになります。今回はアナログ入力ピンを使ってます。

cds

CdSセンサには光を当てると抵抗値が下がるという特徴があります。

また、V = R * I のオームの法則から

5(V) = (R1[CdSセンサの抵抗値:] + R2[右の抵抗値]) * I

となります。

CdSセンサの抵抗値によって電流値(I)が変わってきますが、全体としての電圧は5Vで固定です。

アナログ入力値は R2 * I でR2の値は固定なので、電流の値が大きい=全体の抵抗値が少ないということから

センサに光を当てるとアナログ入力値が高くなり、光を当てないとアナログ入力値が低くなります。

今回はこの電気を消した時、つまりアナログ値が低くなったタイミングでArduinoからPCにシリアル通信をします。

 

実際につなぐとこんな感じ

arduino-cds

 

2. Arduinoにプログラムを書き込む

アナログ入力値を読み込んで、しきい値を越えたらシリアル通信をするだけのシンプルなプログラム。

int val = 0;

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

void loop(){
  val = analogRead(0);
  if (val < 10) {
    Serial.println(val);
    delay(5000);
  }
  delay(10);
}

 

3. proxyとなるPC側に設置するプログラムを設置

今回はpython(pyserial)を使いました。

$ pip install pyserial

でインストール。

 

import serial
import urllib.request
import json

CLIENT_ID = "input your client_id"
CLIENT_SECRET = "input your client_secret"

#chatterにポストする
def postFeedItem(val):
    try:               
        chatter_param = {
            "body" : {
                "messageSegments": [{
                    "type":"Text",
                    "text": "value = " + str(val)
                }]
            }
        }

        chatter_headers = {
            "Content-Type": "application/json",
            "Authorization": "Bearer " + token["access_token"]
        }

        chatter_req = urllib.request.Request(
            url=token["instance_url"] + "/services/data/v30.0/chatter/feeds/news/me/feed-items",
            data=json.dumps(chatter_param).encode(),
            headers=chatter_headers
        )
        chatter_res = urllib.request.urlopen(chatter_req)
        print(chatter_res.read().decode())
    except urllib.error.HTTPError as e:
        print(e.read())

#access_token等を取得
request_param = {
    "grant_type" : "password", 
    "client_id" : CLIENT_ID, 
    "client_secret" : CLIENT_SECRET,
    "username" : "input your username",
    "password" : "input your password"
}

headers = {
    "Content-Type": "application/x-www-form-urlencoded"
}
req = urllib.request.Request(
    url="https://login.salesforce.com/services/oauth2/token", 
    data=urllib.parse.urlencode(request_param).encode(),
    headers=headers
)
res = urllib.request.urlopen(req)
token = json.loads(res.read().decode())

#シリアルで転送されてきた値を読み取って処理を行う
#以下はシリアルポートはCOM3の例
ser = serial.Serial(2)
while True:
    line = ser.readline()
    val = int(line.decode())
    if val < 10:
        postFeedItem(val)

 

これで、暗闇になるとChatterに投稿されるという謎の仕組みを作ることが出来ます!

arduino-chatter

ちなみに、このプログラムのままだと電気消して次の日になったら

自分のフィードが自動投稿で溢れかえるというホラー現象が体感できそうです。

 

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