【L-RTK】スマホRTK-Monitorバージョンアップrev06備忘録<衛星数とiTow追加>

場所によって、精度が大きく変化するので、捕捉衛星数を表示するようにしました。ビデオの時刻と同期させるために時刻表示としてiTow時間も表示しました。

●プログラム作成用資料保存(SSD不調のため消失しないようにここに保存しておきます)

備忘録資料名 リンク
ublox-F9Pセンテンス仕様書 u-blox_ZED-F9P_InterfaceDescription_(UBX-18010854)
NAV-PVTテーブル http://shinshu-makers.net/shinshu_makers/wp-content/uploads/2020/01/NAV-PVT_frame.pdf
NAV-RELPOSNEDテーブル http://shinshumakers.net/shinshu_makers/wpcontent/uploads/2020/01/RELPOSNED_frame.pdf
UBXバイナリー変換アドレス行 Excel  ファイル(VBA付)  

http://shinshu-makers.net/shinshu_makers/?attachment_id=7000 ZIP

 

●LunchBox内マイコンNucleoF446RE用プログラム
F9Pから460800bpsで受信してバッファして、スマホ用のパラメータをバイナリーからDECに抽出してBlueToothで115200bpsで送信
mbedオンラインコンパイラ使用、
■追加点
PVTの6,7,8,9バイトにあるiTowをINTに換算してスマホへ送信
iTows=(iTow/1000)%86400として24時間を秒で表示するようにしてあります。
PVTの衛星補足数 numSV 1バイトをINTに換算してスマホへ送信

0000_BT_RELPOSNED_Calc_rev03_LunchBox
#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.62MHz
Timer t;
DigitalOut myled(LED1);
//==================UBX_DEC parameters==========================
long relN;
long relE;
long relD;
long Length;
long Long;
long Lati;
long Seah;
long Acc2d;
char numSV;//satellite number
long iTow;
int iTows;
long su;
int sNo;//pvt start
int rNo;//relposned start
int i=0;
int j=0;
char sen[]={};
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};
//================================================================================================================
long B2L(char b4 , char b3 , char b2 , char b1 ) {
//pc.printf(“B2L IN=%s,%x,%x,%x,%x,b4&0x80=%d\n\r”,sen,b4,b3,b2,b1,b4 &0x80);
//pc.printf(“B2L IN=b4&0x80=%d\n\r”,b4 & 0x80);if ((b4 & 0x80) && 0x80){//最上位ビットたっていればマイナス
su = -(256-(int)b1)+(255-(int)b2)*256+(255-(int)b3)*65536+(255-(int)b4)*256*256*256;
//pc.printf(“B2L-:sen=%s,%d,%d,%d,%d,%d\n\r”,sen,b4,b3,b2,b1,su);
}
else {
su=(int)b1+(int)b2*256+(int)b3* 65536+(int)b4*256*256*256;
//pc.printf(“B2L+:sen=%s,%d,%d,%d,%d,%d,%d\n\r”,sen,b4,b3,b2,b1,su);
}

return su;
}
//================================================================================================================
void ubx_dec(){
//for (i=0;i<172;i++){
//if (bData[0]==0xB5){
sNo=0;//Default 0 PVT startNo
rNo=100;
pc.printf(“st:%d\n\r”,t.read_ms());
//}
//}
//pc.printf(“Long_sNo+33,32,31,30=%d,%d,%d,%d\n\r”,bData[sNo+33],bData[sNo+32],bData[sNo+31],bData[sNo+30]);
//sen[0]=’L’;sen[1]=’o’;
iTow=B2L(bData[sNo+9],bData[sNo+8],bData[sNo+7],bData[sNo+6]);
iTows=(iTow/1000)%86400;
numSV=bData[sNo+29];
Long=B2L(bData[sNo+33],bData[sNo+32],bData[sNo+31],bData[sNo+30]);//上位ー>下位
//pc.printf(“Lati_sNo+37,36,35,34=%d,%d,%d,%d\n\r”,bData[sNo+37],bData[sNo+36],bData[sNo+35],bData[sNo+34]);
//sen[0]=’L’;sen[1]=’a’;
Lati=B2L(bData[sNo+37],bData[sNo+36],bData[sNo+35],bData[sNo+34]);
//pc.printf(“Seah_sNo+45,44,43,42=%d,%d,%d,%d\n\r”,bData[sNo+45],bData[sNo+44],bData[sNo+43],bData[sNo+42]);
//sen[0]=’S’;sen[1]=’h’;
Seah=B2L(bData[sNo+45],bData[sNo+44],bData[sNo+43],bData[sNo+42]);
//pc.printf(“Acc2d_sNo+49,48,47,46=%d,%d,%d,%d\n\r”,bData[sNo+49],bData[sNo+48],bData[sNo+47],bData[sNo+46]);
//sen[0]=’A’;sen[1]=’c’;
Acc2d=B2L(bData[sNo+49],bData[sNo+48],bData[sNo+47],bData[sNo+46]);
//pc.printf(“relN_rNo+17,16,15,14=%d,%d,%d,%d\n\r”,bData[rNo+17],bData[rNo+16],bData[rNo+15],bData[rNo+14]);
//sen[0]=’r’;sen[1]=’N’;
//==============RELPOSNED==================================================
relN=B2L(bData[rNo+17],bData[rNo+16],bData[rNo+15],bData[rNo+14]);
//pc.printf(“relE_rNo+21,20,19,18=%d,%d,%d,%d\n\r”,bData[rNo+21],bData[rNo+20],bData[rNo+19],bData[rNo+18]);
//sen[0]=’r’;sen[1]=’E’;
relE=B2L(bData[rNo+21],bData[rNo+20],bData[rNo+19],bData[rNo+18]);
//pc.printf(“Length_rNo+29,28,27,26=%d,%d,%d,%d\n\r”,bData[rNo+29],bData[rNo+28],bData[rNo+27],bData[rNo+26]);
//sen[0]=’L’;sen[1]=’e’;
relD=B2L(bData[rNo+25],bData[rNo+24],bData[rNo+23],bData[rNo+22]);
Length=B2L(bData[rNo+29],bData[rNo+28],bData[rNo+27],bData[rNo+26]);

//pc.printf(“Long=%d,Lati=%d,Seah=%d,Acc2d=%d\n\r”,Long,Lati,Seah,Acc2d);

pc.printf(“et:%d,\n\r”,t.read_ms());

}

//=======================================================================================================
int main() {
pc.baud(115200);
F9P.baud(460800);
BT.baud(115200);
t.start();
while(1){
//===========PVT SEARCH================================
if(F9P.getc()==0xb5){
bData[0]=0xb5;
bData[1]=F9P.getc();//0x01
bData[2]=F9P.getc();//0x62
bData[3]=F9P.getc();//0x07
if (bData[3]==0x07){
for(i=4;i<172;i++){
// pc.printf(“%x:%x\n\r”,i,bData[i]);
//pc.putc(bData[i]);
bData[i]=F9P.getc();
}
}
}
//===============PVT,RELPOSNED CalResult BT send===========
ubx_dec();
BT.printf(“%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n”,j,(int)Long,(int)Lati,(int)Seah,(int)relN,(int)relE,(int)relD,(int)Length,(int)Acc2d,(int)numSV,(int)iTows,j);
j++;
wait(0.05);
//}
}
}


●スマホ側プログラム Processing Androidモード
BlueTooth受信は、KETAIライブラリーを使ってます。
Processing IDE 3.5.3使用 コピペする時は、全角記号が入ってしまう場合があるのでコンパイラエラーでてしまうので、全角スペース全部消してください。

RT_PVT_RELPOSNED_rev06_numSV
//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.*;
PrintWriter output;
//***************************BT定義***********************************
int i=0;
int j=0;
int k=0;
int n=0;
int n_1=1;
int m=0;
int startNo=0;
int endNo=0;
int datasu=100;
byte b;
int np=0;//受信data連番 リングバッファ絶対値カウンタsampN=np%1500となる
int sampN=0;//累計サンプリング連番0-1499
//===================================PVT RELPOSNED data=========================
int kosu;
float Long;
float Lati;
float Seah;
float relN;
float relE;
float relD;
float Length;
float Acc2d;
int numSV;
float iTow;
char[] cData=new char[1000];
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=””;
//String ndata=””;
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() {
String fileName = createFileName();
output=createWriter(fileName);
size(1340, 700);
frameRate(10);
// orientation(PORTRAIT);
orientation(LANDSCAPE);
background(0);

//start listening for BT connections
bt.start();
//at app start select device…
isConfiguring = true;
//font size
fontMy = createFont(“SansSerif”, 40);
textFont(fontMy);
}
//@@@@@@@@@@@@@@@@@@@@@@ DRAW @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void draw() {
//at app start select device
if (isConfiguring)
{
ArrayList names;
background(78, 93, 75);
klist = new KetaiList(this, bt.getPairedDeviceNames());
isConfiguring = false;
}
background(0,50,0);
//Table item
textSize(36);
text(“Longtitude(deg)”,200,50,300,40);
text(“Latitude(deg)”,750,50,300,40);
text(“relN(cm)”,110,250,300,40);
text(“relE(cm)”,360,250,300,40);
text(“relD(cm)”,660,250,300,40);
text(“Length(cm)”,960,250,300,40);
text(“SeaHeight(m)”,110,470,300,40);
text(“numSV”,410,470,300,40);
text(“iTow(sec)”,660,470,300,40);
text(“Acc2D(mm)”,960,470,450,40);
//text(“numSV”,

// data value
textSize(64);
text(str(Long),150,120,550,200);
text(str(Lati),700,120,550,200);
textSize(96);
text(str(relN),50,320,300,200);
text(str(relE),350,320,300,200);
text(str(relD),650,320,300,200);
text(str(Length),950,320,300,200);
textSize(64);
text(str(Seah),150,520,300,200);
text(str(numSV),450,520,300,200);
text(str(iTow),660,520,300,200);
text(str(Acc2d),950,520,300,200);

 

}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
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) {
//println(isConfiguring);
if (isConfiguring )// 1st rimte isConfig==True after 2nd isCofig=False
return;
else
for (int i = 0; i <data.length; i++) {
j++;
cData[j]=char(data[i]);
println(“data[“+i+”]=”+char(data[i])+”,”+hex(data[i]));
if ((char)data[i]==0x0A && j>36 ){
String sData = new String(cData);
output.println(sData);
println(“sData=”+sData);
int [] rData= int(split(sData,’,’));
kosu=rData[0];
Long=rData[1];
Lati=rData[2];
Seah=rData[3]/1000;
relN=rData[4];
relE=rData[5];
relD=rData[6];
Length=rData[7];
Acc2d=rData[8];
numSV=rData[9];
iTow=rData[10];
println(“relD=”+relD+”,”+”numSV=”+numSV+”,”+”iTow=”+iTow);
j=0;
}

}

}

String createFileName() {
String fileName=”//sdcard/DCIM/”+ nf(year(), 2) + nf(month(), 2) + nf(day(), 2) +”-“+ nf(hour(), 2) + nf(minute(), 2) + nf(second(), 2);
fileName += “.ubx”;
return fileName;
}

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です