ウェアラブルデバイス開発
下記記事の続きです。
karaage.hatenadiary.jp
開発は大げさですね、ちょっとした工作です。
使うのは以下の部品
回路図(配線図)は以下のRT Robot Shop Blogのneko-tter組み立て方の記事を参照しましょう。
neko-tterキットの組み立て方 | RT Robot Shop Blog
nekotterのサイトの回路図は変なところがショートしていたりするのでちょっとまずいです。気をつけましょう。
ピン配置はマイコンに付属しています
基板に配置。全然ウェアラブルに見えないね
配線を半田付け。あんまりうまくないので拡大してみないでください
ソフト
最初はnekotterそのままでいいじゃんと思っていたのですが、色々うまくいかなくて結局ほとんど自分で作り直すはめになってしまいました。
今回は母艦としてRaspberry Piを使用したので、以下は全てRaspberry Pi上での操作です。Raspberry Piのセットアップに関しては、以下など参考にしてください。
cuインストール
2015/07/25追記:
Raspberry PiがToCoStickとシリアル通信できるようにcuをインストールしてあげます。
$ sudo apt-get install cu
ソフト作成
スクリプト作成
$ 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を接続して電源を入れましょう。後は、ウェラブルデバイスを激しく左右に振りましょう。うまくいけば加速度がツイートされるはずです。
ツイートテスト 加速度x:0285 加速度y:0424 Tue May 26 23:33:06 JST 2015
— からあげ (@karaage0703) 2015年5月26日
こんな感じね
まとめ
これだけだと「だから何?」という人も多いかもしれませんが、もうちょい基板をコンパクトにまとめてうまく使えば面白いアプリケーションができるんじゃないかなと思っています。自分が何をするかはまたそのうち紹介します(多分)。