ウェアラブルデバイスを自作してみる「腕を振るとツイートするデバイスを作る」

ウェアラブルデバイス開発

 下記記事の続きです。
karaage.hatenadiary.jp

 開発は大げさですね、ちょっとした工作です。

 使うのは以下の部品


 回路図(配線図)は以下のRT Robot Shop Blogのneko-tter組み立て方の記事を参照しましょう。
neko-tterキットの組み立て方 | RT Robot Shop Blog

 nekotterのサイトの回路図は変なところがショートしていたりするのでちょっとまずいです。気をつけましょう。

 ピン配置はマイコンに付属しています


 基板に配置。全然ウェアラブルに見えないね


 配線を半田付け。あんまりうまくないので拡大してみないでください

ソフト

 最初はnekotterそのままでいいじゃんと思っていたのですが、色々うまくいかなくて結局ほとんど自分で作り直すはめになってしまいました。
 今回は母艦としてRaspberry Piを使用したので、以下は全てRaspberry Pi上での操作です。Raspberry Piのセットアップに関しては、以下など参考にしてください。

karaage.hatenadiary.jp


cuインストール

 2015/07/25追記:
 Raspberry PiがToCoStickとシリアル通信できるようにcuをインストールしてあげます。

$ sudo apt-get install cu

twインストール

 nekotterデフォルトだと、色々ツイートの設定面倒くさいのでtwという手軽なソフトを入れてやります。以下のサイトを参考にしましょう。

arms22.blog91.fc2.com

ソフト作成

 スクリプト作成

$ sudo vi /usr/local/bin/wearable.py

 中身は以下。nekotterのスクリプトで最初にはまったのは、シリアル通信のデータを正しく取得できないこと。timeoutの数字を0から10に増やしてやると、エラーなく受信できるようになりました。変更しないといけなかったのはRaspberry Pi2だからかな?

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

import serial
import sys
import time
from time import sleep
 
import subprocess

argv = sys.argv
argc = len(argv)

#	グローバル変数
accelX = [ "" ]
accelY = [ "" ]
thAccel = 200
tweet_state = 0

def tweet():
    tweet_state = 1

    cmd ="tw ツイートテスト 加速度x:" +accelX[0]+ " 加速度y:" +accelY[0]+ " `/bin/date` --yes"
    subprocess.call(cmd, shell=True)
 
    tweet_state = 0


#	UARTの出力を読み込んで様々な処理を行う(実質メイン関数)
def readSerial( ser ):
	while True:
		#	UARTを読み込んでリスト化(配列に代入)
		line = ser.readline()
		field = line.strip()
		sline = field.split(';')
		length = len(sline)

		#	猫(が使っているセンサ)から来たデータの場合処理を行う
                if length == 16 and  sline[11] == "X":
		#if length > 1:
			print("line=")
			print(line)
                if int(sline[12]) > thAccel or int(sline[13]) > thAccel:
                    print("run")
                    accelX[0] = sline[12]
                    accelY[0] = sline[13]
                    if tweet_state == 0:
                        tweet()

#	引数がある場合、引数で指定したデバイスを用いる
if argc != 2:
	ser = serial.Serial( "/dev/ttyUSB0", 115200, timeout=10 );
else :
	ser = serial.Serial( argv[1], 115200, timeout=10 )

#	シリアルデータを読み込み関数を別スレッドで実行
while True:
	try:
		readSerial( ser )
	except KeyboardInterrupt:
		break
	except:
		continue

ser.close()

 実行権限を与えて実行してみましょう。

$ sudo chmod 755 /usr/local/bin/wearable.py
$ /usr/local/bin/wearable.py

自動起動するように設定

 プログラムが自動起動するように設定しましょう。

$ sudo vi /etc/init.d/wearable

 中身は以下ね。スーパーユーザだとうまくツイートできなかったので、一般ユーザ権限で実行しています。理由は調べたけどよくわからなかったです…

### BEGIN INIT INFO
# Provides: wearable
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Wearable at boot time
# Description: Start Wearable at boot time
### END INIT INFO
#! /bin/sh
# /etc/init.d/wearable
NAME=wearable
case "$1" in
  start)
        echo -n "Starting wearable"
        su - pi -c "/usr/local/bin/wearable.py"
        ;;
  stop)
        echo -n "Stopping wearable"
        killall $NAME
        ;;
esac
exit 0                                                                                                

 実行権限を与えましょう

$ sudo chmod 755 /etc/init.d/wearable

 以下のコマンドで正しく起動すること確認しましょう。実はstopで停止は正しくできません。これもとりあえず諦めてます。プロセス確認してkillで一個ずつ殺してください。

$ sudo /etc/init.d/wearable start

 以下のコマンドで自動起動設定。 

$ sudo update-rc.d wearable defaults


 自動起動やめたくなったら以下ね

$ sudo update-rc.d -f wearable remove

実行結果

 Raspberry Pi2にnekotterのファームを書き込んだToCoStickを接続して電源を入れましょう。後は、ウェラブルデバイスを激しく左右に振りましょう。うまくいけば加速度がツイートされるはずです。


 こんな感じね

まとめ

 これだけだと「だから何?」という人も多いかもしれませんが、もうちょい基板をコンパクトにまとめてうまく使えば面白いアプリケーションができるんじゃないかなと思っています。自分が何をするかはまたそのうち紹介します(多分)。

関連記事

karaage.hatenadiary.jp