Category tech.

秋月で売っているGYSFFMANC(MT3333) GNSSモジュールがおかしい。

中央下のグラフを見るのがわかりやすいが、定期的に (衛星が見えているにも関わらず) 一切受信できなくなり、しばらくすると回復するという挙動をする。なので全く安定して受信できない。

  • 少しずつ SV Used が減少しはじめ、3D Fix を維持できなくなる。SV View はほぼ変化しない
  • リセットから3〜4時間経過すると一切受信できなくなる
  • そこからしばらくすると、再び受信できるようになる
  • 上記の挙動を繰替えす
  • 一切受信できなくなったタイミングで手動でリセット・ホットスタートすると即座に 3D Fix される。これよりアンテナの問題ではないと考えられる
  • ほぼ同じ位置に別のアンテナをつけ、別の受信機(ublox NEO M8N) をつかって測位しているが、そちらではこのような現象は起きない。衛星の見える環境の問題ではないと考えられる

その他の情報

  • バージョンは AXN_5.1.2_3333_17113000
  • GPSとGLONASS で測位。SBAS の有効・無効は関係なく再現する。
  • GLONASS は表示にはでるが測位に使われている形跡がないように思う。

考察

ゴミなのでは? とりあえず使用に耐えないので買って損してイライラするが、挙動について考えてみる。

  • 衛星のエフェメリス情報の有効期限が4時間なので、周期と似ていて怪しい
    • 3D Fix した状態だと捕捉している別の衛星の情報を一切処理しないとか?
  • 特定の環境でだけ再現する可能性がある?
    • 受信環境が悪い、かつ既に 3D Fix 状態だと他の衛星を無視するとか?
  • ファームのバグ (メモリリークみたいな?)
    • メモリリークとかでスタックするならリセット後にメッセージが出て、それが記録されると思うが、それは観測できない

よくわからんけど、とりあえずこのモジュールはおすすめできない。中国の怪しい GNSS モジュールのほうがはるかに安定している……

  1. トップ
  2. tech
  3. GYSFFMANC(MT3333)が定期的に受信できなくなる

データシートにまさにこれという値は載っていないので計算する必要がある。VCC などによって出力インピーダンスが変わってくる。

たとえば Toshiba の TC74HCU04 の場合、「出力電圧」は以下のようになっている。

または

で出力インピーダンス(最小)がわかる。H レベルのときは 4.5V のときだと (4.5 - 4.18) / 4e-3 = 80,、6.0V のときだと (6.0 - 5.68) / 5.2e-3 = 61。5V で中間ぐらいとすると 71Ω ぐらいか。

  1. トップ
  2. tech
  3. 74HC04 の出力インピーダンス

  • PWM 信号は普通 0-5V などだが、1.5V-3.5V とかに変換したい
  • その際、電源ソースを変更したい。
    • PWMソースとは別の安定した電源から 1.5V-3.5V をとりだしたい

このようにMOSFETのレベルシフタと分圧抵抗でオフセットさせる。

出力を計算する

回路シミュレータ使って試行錯誤するのが一番簡単だが、一応自分で計算して、直接抵抗比を求められるようにしておく。

入力電圧 を図のような回路に入力したときの を求める。


テブナンの定理を使って計算していく。 で分圧されている部分を内部抵抗のある電圧源に置き換える。このため、 を外した状態での の値 と、その内部抵抗 を求める。 で分圧された値なので、 。内部抵抗を求める場合、既存の電圧源はショートして考えれば良いので、 の並列合成抵抗

これで下の図のような等価回路とみなせるようになる。

ここで によって分圧された出力なので、

以下の通り

出力電圧範囲と中心電圧から抵抗値を求める。

入出力関数 を以下のようにする

入力電圧の最小・最大がそれぞれ のとき、出力電圧範囲 と中心電圧 はそれぞれ以下のようになる。

連立方程式を適当に計算すると、 を決めたときのほかの抵抗の値は以下のようになる。

入力電圧の最小値 が0の場合は

JS

JS のコードにするとこういう感じ

const V_center = 2.5;
const V_range = 1;
const V_SS = -5;
const V_DD = 5;
const V_min = 0;
const V_max = 5;
const R_1 = 11e3;
const R_2 = ((2*R_1*V_SS-2*R_1*V_DD)*V_range)/((V_min+V_max-2*V_SS)*V_range+(2*V_center-2*V_SS)*V_min+(2*V_SS-2*V_center)*V_max);
const R_3 = -((2*R_1*V_SS-2*R_1*V_DD)*V_range)/((V_min+V_max-2*V_DD)*V_range+(2*V_center-2*V_DD)*V_min+(2*V_DD-2*V_center)*V_max);
// re-calculate R_23 V_23 for reference
const R_23 = (R_2 * R_3) / (R_2 + R_3);
const V_23 = (V_DD - V_SS) * (R_3 / (R_2 + R_3)) + V_SS;
console.log({R_1, R_2, R_3, R_23, V_23});
for (let V_in of [0, 2.5, 5]) {
	const V_out=(R_2*R_3*V_in+R_1*R_2*V_SS+R_1*R_3*V_DD)/(R_2*R_3+R_1*R_3+R_1*R_2);
	console.log({V_in, V_out});
}
  1. トップ
  2. tech
  3. PWM や DAC の出力範囲を変える