SL4Aを使ってAndroidとArduinoでシリアル通信をする

はじめに

AndroidとArduinoでPythonを使ってシリアル通信をしたかった
Android上でPythonを実行するアプリはいくつかあるけどQPythonのserialモジュールでは失敗した
QRコードでコード読み込めたりして便利だったけど残念

SL4A

Android上でスクリプト言語で開発できるソフト、RubyとかPythonとかその他諸々に対応してる

インストール

SL4Aのインストール

昔はここで配布してたけどGoogle Codeはサービスを終了してるので拾えない
こちらの方が使えるapkファイルをビルドされているので対応するアーキテクチャのものをダウンロードしてAndroid端末にインストールしておく
https://github.com/kuri65536/sl4a/releases

SL4Aで使うPythonのインストール

アプリ内からインストールすることもできるがこの時インストールされるのはPython2.6です
特に理由がなければ先ほどの方がPython2.7のapkファイルをビルドされてるので借りてくるのをオススメ
https://github.com/kuri65536/python-for-android/releases

Pythonモジュールのインストール

今回の記事で必要なものはないですが地味に引っかかるところなのでメモ代わりに

eggファイルでのインストールしか対応してないのでzipとか投げてもダメです
eggで配布されてなかったらeggファイルを予め作っておく必要があります

1$ python setup.py bdist_egg

dist/hoge.eggと出力されるのでそれを端末にコピってインストールします(Python2.6使用時)
2.7を使用する場合は逆に.eggだとダメなのでこれを.zipに名前を変更して使用します

テスト

適当にハローワールドとか書いて試す
サンプルスクリプトが入ってるはずなのでその辺で試す

Androidとシリアル通信をする

https://github.com/kuri65536/sl4a/blob/master/android/USBHostSerialFacade/samplescripts/testusbserial.py
基本的にはこれの通りです
Arduinoの場合は47行目のloads後のリストの最後がArduinoになるのでこのコードを書き換えて使用します

 1# -*- encoding=utf-8 -*-
 2import android as _android
 3import json
 4import time
 5
 6android = _android.Android()
 7l = android.usbserialGetDeviceList().result.items()
 8print l
 9 
10h = json.loads(l[0][1])
11ret = android.usbserialConnect(h[-1])
12print ret
13
14uuid = json.loads(ret.result)[-1]
15print uuid
16time.sleep(5)#すぐ通信を開始すると失敗する
17while True:
18	time.sleep(1)
19	#読み込み
20	print android.usbserialRead(uuid)
21	#書き込み
22	android.usbserialWrite("hoge".uuid)

メモ

この環境でPyro4を使用しようとするとエラーになります
上記と同様の方法でserpentモジュールをインストールすることで解決できます