フィールドでの測定で、リアルタイムに測定データを確認しながら観察するためにスマホでRTK MovingBase出力をモニターするプログラム作り始めました。
●ベースはProcessing KETAIライブラリーです。
Androidスマホのプログラミングは、AndroidStudioが普通なのですが、私は、JAVA落ちこぼれ人なので、いじれません、その代わり、JAVAベースで一般ユーザー向け言語Processingを使ってスマホプログラムを開発してきました。
●今まで作ってきたスマホプログラム
①スキー活動量計(2017~2018)
機能:スマホ内蔵センサ(加速度、気圧、GPS)のデータをログ表示
プログラム概要:Processing ketaiのMultipleSensorサンプルプログラムに
タッチUIを追加、スマホログ中の誤操作防止仕様に苦労した
➁ロードバイク パワーマネジメントメーター(PMM2018)
機能:ロードバイクの自作パワーメーターのログをBlueTooth経由でスマホで表示ログするシステム(パワーメーター、風速センサ、心拍センサ、速度センサ全て自作)
プログラム概要:Ketai BlueToothでセンサデータを受信したが、割り込みタイミングでバッファエラーが多発でバグが治らず終わった。
=>BlueToothのバッファの制御ができてなかったみたいです。
●RTK用スマホモニタープログラム開発の環境作り
①Processing Android Mode
Procesing自体は、PC上でIDEで動作します。ArduinoIDEとよく似た構造なので
ArduinoIDEを使ったことがある人なら簡単に使えます。JAVAというよりはC++に近い記述です。MSLABO様の入門記事から入るとよいです。
Processingのandroidモードの入門はMSLABO様に教えていただきました。
こちらのブログが親切で丁寧です、質問にも丁寧に回答いただけます。
「Processingを Android端末で動かすには(4.0版)」
Processingは、以前のバージョンのまま3.5.3を使ってます。スマホUTILITY用ライブラリーKETAIも入っているので、ライブラリー登録しておけば自由に使えます。KETAIのHPhttp://ketai.org/
https://processing.org/download/
➁BlueTooth送信用シミュレータ
パワーメーターでBlueTooth受信でのバッファトラブルで敗退したことがあったので、対策として、BlueTooth送信シミュレータを作って、送信データ、速度、タイミングをシミュレートしながらデバッグして開発する環境を作りました。
MovingBase LUNCH-BOXに仕込んであるのと同じNUCLEO F446REでシミュレータ組みました。シリアルポートPA_9,PA_10とBluetoothモジュールRN42評価キットを接続しただけです。
●シミュレータプログラム概要
F9P出力の代わりに変数にUBX-NAV-PVT100バイト、UBX-NAV-RELPOSNED72バイトを
bDATA[]配列に定数定義してあります。
bData[]をPCとBlueToothに送信するだけのプログラムです。
■注意1:休みなしでBlueToothへ230400bpsで送信しているとスマホのバッファがオーバーしてフリーズしてしまいました。そこで、実際のF9Pの動作と同様に100msec休みをいれて、スマホのBlueToothバッファに余裕を持たせたら、連続送信でフリーズしなくなりました。以前ロードバイクパワーメーターでトラブルった件もこのバッファが問題でしたので、スマホのBluetToothで高速通信する場合は、休み休み使わないといけないみたいです。
■注意2:スマホモニタは、ログが目的でないため、UBXデータはバイナリ-なのですがASCIIに変換してCRLFまでつけて、BlueTooth送信してます。これは、スマホ側プログラムがASCII CRLF受信がデフォルトの設定なので、それに合わせました。
UBXの生ログは、バイナリーでLUNCH-BOX内のF446REのSDカードに保存しようと
思います。
mbed オンラインコンパイラでNucleoF446reでコンパイルすれば動作します。
#include “mbed.h” #include “SDFileSystem.h” Serial pc(USBTX,USBRX); Serial F9P(PC_6,PC_7);;//F9P uart1 TX,RX-F446RE Serial6 TX,RX 5.62MHz Serial BT(PA_9,PA_10);//Xbee TX,RX F446RE Serail TX,RX 5.62MHzDigitalOut myled(LED1);int i=0; unsigned char c; unsigned char bData[]={0xB5,0x62,0x1,0x7,0x5C,0x0,0x60,0xDA,0x2D,0xB,0xE4,0x7,0x2,0x4,0x4,0x5,0x24,0x37,0x1,0x0,0x0,0x0,0x28,_ 0xBD,0xDD,0x17,0x3,0x83,0xEA,0x15,0x35,0x7,0x30,0x52,0x6E,0x95,0xEB,0x15,0xE6,0xF2,0xD,0x0,0x0,0x65,0xD,0x0,0x88,0x0,0x0,0x0,_ 0x86,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0xFA,0xFF,0xFF,0xFF,0x8,0x0,0x0,0x0,0xB,0x0,0x0,0x0,0xF2,0x4A,0x18,0x0,0xDA,0x0,0x0,0x0,0x80,_ 0xA8,0x12,0x1,0x7B,0x0,0x0,0x0,0xBA,0x65,0x43,0x2C,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x35,0x5D,0xB5,0x62,0x1,0x3C,0x40,0x0,0x1,_ 0x0,0x0,0x0,0x60,0xDA,0x2D,0xB,0xE8,0xFF,0xFF,0xFF,0x3F,0x0,0x0,0x0,0xA,0x0,0x0,0x0,0x44,0x0,0x0,0x0,0x5A,0x37,0xAA,0x0,0x0,_ 0x0,0x0,0x0,0xA8,0x0,0x24,0x34,0x64,0x0,0x0,0x0,0x64,0x0,0x0,0x0,0x64,0x0,0x0,0x0,0x64,0x0,0x0,0x0,0x6A,0x4A,0x1,0x0,0x0,0x0,_ 0x0,0x0,0x37,0x1,0x0,0x0,0x1A,0xCD}; int main() { /*for(i=0;i<172;i++){ |
●スマホプログラム作りProcessing Ketaiベース
機能 | 内容 | 課題、注意点 |
BlueTooth受信 | F9P LUNCH-BOXからのBlueToothSPP230400bpsを スマホで受信して、UBX ASCII データ配列を抽出する |
ハングしないように、余計な仕事をいれないようなLOOP構造にする |
データ表示UI | 受信開始タップ、受信停止タップ、保存オンオフタップなど タッチUIとデータ更新モニターを作る |
UIがつかいにくいとフィールドで失敗するので、使いながら改良が必要 |
ファイル保存 | UBXのASCIIファイルを保存して、直後に呼び出してモニターできるようにする 読み書きUI | いつの時点でファイルをFLUSH、CLOSEするかUIで決めるか自動FLUSHでいくか決める |
軌跡ベクトル表示 | 上記UBXデータから緯度経度から軌跡、RELPOSNEDから相対変位でスキーの横滑り角をグラフィック表示する | 保存データを呼び出して、その場で軌跡とベクトルチェックしやすいUIとグラフを作るが絵の構成が大変、座標軸の回転機能も必要なので1カ月かかるかも |
//required for BT enabling on startup
import android.content.Intent; //******************************************************************** void onCreate(Bundle savedInstanceState) { } void onActivityResult(int requestCode, int resultCode, Intent data) { void setup() { //start listening for BT connections void draw() { } void onKetaiListSelection(KetaiList klist) { //Call back method to manage data received } } // Arduino+Bluetooth+Processing
|
/** * <p>Ketai Sensor Library for Android: http://Ketai.org</p> * * <p>KetaiSensor Features: * <ul> * <li>handles incoming Sensor Events</li> * <li>Includes Accelerometer, Magnetometer, Gyroscope, GPS, Light, Proximity</li> * <li>Use KetaiNFC for Near Field Communication</li> * </ul> * <p>Updated: 2017-08-29 Daniel Sauter/j.duran</p> */ import android.content.Intent; import android.os.Bundle; import ketai.sensors.*; import android.location.Location.*; //import ketai.ui.*; //import ketai.net.*; //required for BT enabling on startup//import android.content.Intent; //import android.os.Bundle; //import ketai.sensors.*; //import android.location.Location.*; import ketai.net.bluetooth.*; import ketai.ui.*; import ketai.net.*; //=========BT=================== int j=0; int k=0; int np=0;//受信data連番 リングバッファ絶対値カウンタsampN=np%1500となる int sampN=0;//累計サンプリング連番0-1499 int[] startN=new int[1500];// int[] endN=new int[1500];// PFont fontMy; boolean bReleased = true; //no permament sending when finger is tap KetaiBluetooth bt; boolean isConfiguring = true; String info = “”; char[] pinfo=new char[100]; String p1=””; KetaiList klist; ArrayList devicesDiscovered = new ArrayList();void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bt = new KetaiBluetooth(this); } void onActivityResult(int requestCode, int resultCode, Intent data) { //=========================================== // Create a new file in the sketch directory textAlign(CENTER, CENTER); void draw() int tim=0; void onPressureEvent(float p) void onAccelerometerEvent(float x, float y, float z, long time, int accuracy) void onMagneticFieldEvent(float x, float y, float z, long time, int accuracy) void onLightEvent(float v) void onProximityEvent(float v) rect((width/3)*2, 0, width/3, 100); fill(255); //void mousePressed(){ * void onSensorEvent(SensorEvent e) – raw android sensor event |
●以後
過去プログラムを合体すれば出きるのですが、忘却してしまっているので、動作させながら一歩一歩いくので最初から作るのとあまり変わらない時間がかかりそうです。
今回新たに挑戦するのは、グラフィックでスキー軌跡とベクトルをその場で表示する点が特に時間がかかりそうです。