昨日までは、SDカードへのLOGGERとセンサ接続でした。
本日は、BlueTooth SPPモードで接続するプログラムを動作確認しました。これで、クランクからのBTデータをスマホで受信できる見込みがつきましたので、スマートなパワーメーターが開発できると思います。
●BlueTooth接続実験の準備
RN42評価ボードをPCに接続して、動作確認します。
これは、以前の記事を参考にしてやります。
この記事で使ったアプリは、PC側がTeraTermで
Android側がBlueTermというアプリでした。今回は、
Andoroid側のアプリをprocessingのサンプルプログラムで動作確認しました。
●スマホの準備
中古スマホでもSIMロックされていてSIM Free対応してない古い機種は、格安で販売されてます。私が使用しているFUJITSU ARROWS NX F01Fは、1万円以上で購入したのですが、今回中古機で1280円で購入できました。さらに、アウトドア用に、KYOCERA TORQUE G01も購入したのですが、これも2千数百円で購入できました。マイコン1個分の価格で、センサとDISPLAY付のガジェットとなるので、使う目的によっては、抜群のコストパフォーマンスを発揮できると感じてます。
左がTORQUEG01,Arrows F01F白、ArrowsF01F赤(使用中)
●KetaiのBluetooth Exampleの場合
Processing 3.3.6に付属しているKeta iライブラリに
BluetoothCursorというサンプルプログラムがありますが。
これは、カーソルの座標値をPCへ送るプログラムなので
目的であるセンサーデータをスマホで受信するプログラムではありませんでした。KetaiでSPP受信できるのか心配になってKetaiの詳細ページを見るとhttp://ketai.org/reference/net/ketaibluetooth/
protected UUID MY_UUID_SECURE = UUID .fromString(“00001101-0000-1000-8000-00805F9B34FB”)
と書いてあったので、このUUIDはSPPモードなので、Ketaiの
BlueToothもSPPを使って通信していることが分かりました。
別のサンプルを検索して探しました。
●Prof.TAKAYAのブログにあったExample
ArduinoとProcessing Android modeでBlueTooth接続例です。
Processingのandroid mode の記事自体が少ない中
(検索すると私の記事が上位に検索されてしまう始末です)
何とか、1件だけ見つかりました。高屋教授のブログという
ここにたくさんProcessoing Android modeのサンプルがあります。
http://prof-takaya.blogspot.com/
学者先生がサンプルプログラムを公開して解説してくれてありました。
http://prof-takaya.blogspot.com/2013/02/connecting-android-and-arduino-by.html
ここで、ソーステキストがあったので、コピーしてskechを作りました。
2回目の解説がここです。
http://prof-takaya.blogspot.com/2013/02/connecting-android-and-arduino-by_8.html
ーーーーーprocessing android modeのソース備忘録----
/* A simple example to controll your arduino board via bluetooth of your android smartphone or tablet. Tested with Android 4. Requirements: Arduino Board Bluetooth shield Android Smartphone (Android 2.3.3 min.) Ketai library for processing Jumper D0 to TX Jumper D1 to RX Set bluetooth, bluetooth admin and internet sketch permissions in processing. Processing Code: */ //required for BT enabling on startup import android.content.Intent; import android.os.Bundle; import ketai.net.bluetooth.*; import ketai.ui.*; import ketai.net.*; PFont fontMy; boolean bReleased = true; //no permament sending when finger is tap KetaiBluetooth bt; boolean isConfiguring = true; String info = ""; KetaiList klist; ArrayList devicesDiscovered = new ArrayList(); //******************************************************************** // The following code is required to enable bluetooth at startup. //******************************************************************** void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bt = new KetaiBluetooth(this); } void onActivityResult(int requestCode, int resultCode, Intent data) { bt.onActivityResult(requestCode, resultCode, data); } void setup() { size(displayWidth, displayHeight); frameRate(10); orientation(PORTRAIT); background(0); //start listening for BT connections bt.start(); //at app start select device… isConfiguring = true; //font size fontMy = createFont("SansSerif", 40); textFont(fontMy); } void draw() { //at app start select device if (isConfiguring) { ArrayList names; background(78, 93, 75); klist = new KetaiList(this, bt.getPairedDeviceNames()); isConfiguring = false; } else { background(0,50,0); if((mousePressed) && (bReleased == true)) { //send with BT byte[] data = {'s','w','i','t','c','h','\r'}; bt.broadcast(data); //first tap off to send next message bReleased = false; } if(mousePressed == false) { bReleased = true; //finger is up } //print received data fill(255); noStroke(); textAlign(LEFT); text(info, 20, 104); } } void onKetaiListSelection(KetaiList klist) { String selection = klist.getSelection(); bt.connectToDeviceByName(selection); //dispose of list for now klist = null; } //Call back method to manage data received void onBluetoothDataEvent(String who, byte[] data) { if (isConfiguring) return; //received info += new String(data); //clean if string to long if(info.length() > 150) info = ""; } // Arduino+Bluetooth+Processing // Arduino-Android Bluetooth communication
ここで、データを読み込む関数は、dataバイト配列で提供されるのでそれを加工して表示保存すればいいと理解しました。
void onBluetoothDataEvent(String who, byte[] data)
●プログラムの実行
例によってBlueToothを使うにあたりPermissionを2行ほどAndroidManifest.xmlへ追加しました。ここに説明が詳しくのってました。(ただし、ProcessingではなくAndroid Studio JAVA用ですがprocessingのライブラリはJAVAなので、AndroidManifestは同じ設定でいいと思います)
1
2
|
<uses-permission android:name=“android.permission.BLUETOOTH”></uses-permission>
<uses-permission android:name=“android.permission.BLUETOOTH_ADMIN”></uses-permission>
|
●接続時に困ったこと
BlueToothなど無線IFは、つながっているのかどうなのか確認方法が定かでなくて、ちょっとした変化でつながらなくなっても原因がなんだかわからなくなってしまいます。
上記に記事「BlueTooth受信側いじる」で間違いなく接続できていることを確認してから、Processingのプログラムを動作させて確認すれば確実です。さらに、データ送受信時にNR42評価ボードの赤いLEDが点滅するのを確認できればデータがきていることが分かります。
スマホ3台で確認したのですが、白いF01Fだけは、画面が真っ白になってしまてエラーがでました。AndoroidもPCと同様に環境によってプログラム動作が影響をうけるので、現在動作している環境を管理しておかないといけないことが分かりました。
●動作結果
赤いF01Fでは、PCのキーボード入力を改行付で1文字ずつ表示します。また、緑の画面をタップするとPCへSswitchという文字を転送します。
KYOCERA TORQUEG01でも同様に動作しました。
●以後
2018年からスマホをマイコンの無線IFデータの出力表示として使える見込みがたったのが2018年正月の成果でした。
ここ2年来、やりたかったことが意外と簡単にできてしまったことは、MSLABO様、さかのぼっては、夏から秋にご指示いただいたDgradeDIY様など、先駆者がいらしたからこそと感謝しております。