ZED-F9P RTK開発用ボードの試作
u-bloxのRTK-GNSS受信用IC 「ZED-F9P」を使用したシステムを開発するためのボードで、良く使われているのは次の4種類でしょう。
1.Sparkfun製 Qwiic - ZED-F9P搭載 GPS-RTK-SMAモジュール
2.Eltehs GNSS OEM Store.(旧csg-shop)製 ZED-F9P RTK InCase PIN GNSS receiver board with SMA and USB
3.ardusimple製 simpleRTK2B
4.u-blox製 C099-F9P application board
これらの製品の基板画像や回路図を見るとアンテナ用の電源回路はシンプルな構成で、アンテナ端子がショートしていたり、アンテナが接続されていない、または断線していたりして、オープンになっているなどの不具合を検知する機能は無いように見えます。
アンテナに関する不具合が起きていても、ZED-F9Pからは単に測位できないというだけで、アンテナに関する問題が起きているというエラーメッセージは出てきません。
測位できない場合、システムの事が良く分かっている人なら原因を探る事もできますが、一般のユーザには難しく、扱う台数が多くなるとサポートも大変になります。
そのサポートを少しでも楽にするためにはアンテナの不具合を検知できる機能が必要で、そのために今回新しく基板を試作しました。
次の回路図で中央の赤の細い線で囲んだ部分がアンテナへの電源供給とオープン・ショート検知のための回路です。
Q1,R12,R13,D6,D7は電流制限回路で約80mA以上は流れないようになっています。
IC9,R23,R24はアンテナが接続されていない事を検知する回路で、短絡はZED-F9Pの6番ピンで検知しています。
上記の既存のボードでは電流制限は10Ω~17Ω程度の抵抗で行っています。この場合の問題はアンテナにより40mA程度流れるものがあり、供給電圧が3.0Vより低くなります。
実測したところ、2.7V程度しか供給できないボードもありました。
多くのアンテナの動作電圧は3.0V以上で、仕様を満たさなくなります。ただ、通常はマージンがあるので動作しますが、上記の回路のように3Ω程度に抑えた方が無難です。
アンテナのオープン・ショート検知の回路を付加しても、すぐにZED-F9Pからのデータとしてエラー報告がされる訳でなく、設定が必要でした。
少し試行錯誤しましたが、u-centerで次の設定を行ったところ、正常に検知できました。
UBX > CFG > ANT
1. Enable supply voltage control signal << これをチェックしないとUBX>MON>RFで
状態が返ってきません。
2. Enable short circuit detection
3. Enable open circuit detection
をチェックします。
この設定を行うと、UBX > MON > RF の画面で Antenna State Status: の欄がアンテナ端子の状態に応じて、OK、OPEN, SHORTと表示されました。
この状態検知は UBX > MON > RF 以外に UBX > MON > HW3でも取得可能です。
アンテナが接続されているかどうかはPinID=270、ショートはPinID=271の値で検知できます。
次の画像は作成した基板で、赤の枠内がアンテナ関係の回路です。多くの部品が並んでいますが、先日のブログで紹介しましたGPS/GNSSアンテナ用パワースイッチを使うと1個のICと2個の抵抗で置き換える事も可能です。
基板にはアンテナ用のSMAコネクタ、USBコネクタとI2C用のGroveコネクタがあります。
最近のマイコンボードにはGroveコネクタを搭載しているものが増えていて、半田付けしなくてもケーブルを接続するだけで使う事ができます。
次の画像はスイッチサイエンスのESPr Branchと接続した例です。
この接続では、次のコードで動作確認を行う事ができます。
実行するとZED-F9PからのNMEAセンテンスがシリアルモニタに表示されます。
#include <Wire.h>
#define MAX 256
char buff[MAX];
void setup() {
// serial
Serial.begin(115200);
Serial.printf("i2c test start\r\n");
// I2C
Wire.begin(19,21); // SDA:19,SCL:21 Switch Science Espr developer
}
void loop() {
byte bytes[2];
int nret = i2cRead( 0x42, 0xFD, 2, (char*) bytes, 2 );
if ( nret != 2 ) return;
int numBytes = bytes[0] * 256 + bytes[1];
if ( numBytes >= MAX ) numBytes = MAX - 1;
if ( numBytes > 0 ){
nret = i2cRead( 0x42, 0xFF, numBytes, buff, MAX-1 );
if ( nret > 0 ){
buff[ nret ] = '\0';
Serial.printf( buff );
}
}
}
int i2cRead( int address, int registerNum, int numBytes, char* buffer, int maxBytes )
{
int nret;
if ( registerNum >= 0 ){
Wire.beginTransmission( address );
Wire.write( registerNum );
Wire.endTransmission(false);
}
Wire.requestFrom( address, numBytes );
int bytes = Wire.available();
if ( bytes > maxBytes ) bytes = maxBytes;
if ( bytes == 0 ) nret = 0;
else {
for( int i=0; i < bytes; i++ ){
buffer[i] = Wire.read();
}
nret = bytes;
}
return nret;
}
i2C用のGroveコネクタの電源や信号の電圧は3.3Vと5Vの2種類あります。
今回の試作にあたってはどちらでも使えるようにGroveコネクタの電源端子にはDC-DCコンバータを入れてあります。
その事により、PWR端子への入力電圧は1.8~5Vの範囲で動作できるようになりました。