背景
タブレットとかで作業してて、しばらくの間タップ続ける必要があるときってありますよね。
でもちょっと別の作業してて手が離せない、とか両手骨折でギブスしてて、とか。
そんなときもタップを代行してくれる「指」になるものをPythonとArduinoとサーボモーターで作ってみました。
これが動けば、次はタブレットの画面をキャプチャして、AIが判断して指に指示を出すやつを作ります。
ArduinoUNOスターターキット購入
まずはマイコンボードを。今回の目的ならArduinoで十分よねーって感じでセンサーとかついてるキット探してたら、Amazonで3000円ちょっとでこんなんが買える!安いですねー。
早速Arduino専用の開発言語SketchのIDEをインストールしてLED点滅の入門編、いわゆる「Lチカ」を試してみました。うんうん、簡単。
Sketchって、PC上でコンパイルして、そのモジュールをArduinoにUSB転送して動かす仕組みなんですね。ふむふむ。
で、指の代行をしてもらうサーボモーターにも登場していただくことに。
こんな感じで3cm四方くらいの大きさで、角度指定するとその角度まで移動してくれるやつ。クルクル回るモーターではないです。
このサーボをコントロールするSketchは下記のような感じでめちゃ簡単。サーボがつながるArduinoのピンを指定して、そこに角度を入力するだけで動きます。適当にディレイ入れて、良い感じに動くことを確認。
指を作る
サーボが動作することが確認できたので、タブレットをタップするための指を製作します。
サーボモーターの先に針金を括り付けて、その先に静電部分をつけます。電気を通して柔らかい感じが指に似てるので、イヤホンのイヤーパッドをアルミホイルで包んでます。そこにジャンパーワイヤーを差し込んで、GNDに接地してます。
サーボモーターは軽いので、大型の鉄のクリップで固定してます。
Pythonでサーボをコントロールするための準備(Firmata)
さて、このままでは動かすプログラムはPC上でSketchIDEを使ってコンパイルしたものをロードするため、いろいろ状況に応じて指示を出すことができません。
そこで、PCとリアルタイムに連携できる仕組みに変えていきます。
そのためのライブラリが「Firmata」になります。これは、PCとやり取りするためのプロトコルのようなもので、Sketchに入っているサンプルのFirmataコードをコンパイルしてArduinoにロードするだけで、PCからの指示待ち状態になります。
今回は「ServoFirmata」というサーボ用のプログラムをロードしました。
Pythonでサーボを動かそう(Pyfirmata)
あとはPythonでサーボを動かすプログラムを書くだけです。
そのためには「Pyfirmata」ライブラリをインポートする必要があります。pipでサクッとインストール。
pip install pyfirmata
インポートさえすれば、あとはArduinoがつながってるポートに接続して、サーボのピンを指定して、そこに角度を書き込むだけです。下記サンプルは適当に動いて、休んで、朝4:50には終了する、みたいなコードになってます。ランダムにスリープしてるのは、人間らしい挙動にするためです。(あくまでも動作確認のためのコードなので、何に使ったかは聞かないでくださいw)
import pyfirmata
import time
import sys
import random
import datetime
# >python servo.py [wait] [loop]
args = sys.argv
wt = 40.0
lp = 15
if len(args) > 2:
wt = float(args[1])
if len(args) == 3:
lp = int(args[2])
# setup servo moter for arduino UNO
board = pyfirmata.Arduino('COM3')
it = pyfirmata.util.Iterator(board)
it.start()
pin9 = board.get_pin('d:9:s')
while True:
loop_n = random.randint(lp, lp + 5)
for i in range(loop_n):
pin9.write(110)
time.sleep(0.25 + random.random() * 0.1)
pin9.write(100)
time.sleep(1.2 + random.random() * 1.0)
time.sleep(wt + random.random() * 5.0 - float(loop_n - lp))
# terminate at 04:50
dt_now = datetime.datetime.now()
if dt_now.hour == 4 and dt_now.minute > 50:
break
終わりに
ここまでで、Pythonを使って指の代わりのサーボを動かすことに成功しました。
あとは、タブレットの状況に応じて指示を自動で変化させるところに着手します。具体的にはタブレット画面をキャプチャしてPCに取り込み、予め学習しておいたAIの分類モデルを通して現在の状況を見極め、的確な指示を出すプログラムを作る予定です。
ここまでできると、目と脳と指を人間から代行することができそうです。意味があるかどうかは別問題ですがw