2014年12月27日土曜日

コーリニアアンテナを作ってみた

ADS-Bを受信するためにコーリニアアンテナを作ってみました
基本的には 半田最小限改め!半田なしでADS-B用多段コリニアアンテナを作るHP発見(N先輩情報提供)半田なしでも作れます。 の方法です
手持ちのケーブルの関係でS-5C-FB(テレビ用の75Ω)を使用しました
短縮率とか作りやすさとかを考慮し、シールドを残す長さを11mmに変更しました
また、ケーブルは最後まで突き刺すのではなく、メジャーなどで端からの長さがn*11mmになるように調整しました
これは作ってる最中の長さ誤差が積算されるのを防ぐ目的があります
ただし短縮率等の計算が間違っているとコンスタントに誤差がどんどん増えていくので、可能であればパラメータを変更して各種作ってみるのがいいです
仕様としては6段+1/4λの短絡 という感じです
一番下のエレメントに直接BNCコネクタを接続することによりインピーダンスの違いを減らせないかなと考えていますが、実際どうなのかは不明

さて、その能力についてですが
窓から外に向けてこんな感じです
大したことねーじゃんと思うでなかれ、受信地点は富良野のあたりなので最大で160kmくらい受信できています

カーテンにぶら下げているので、窓の方向南西方向しか見えなくて、旭川空港の方はすぐにロストしてしましますが
もうちょっと段数増やして屋根の上に置いておきたいなぁ と思う次第…
長い塩ビパイプに突っ込んでベランダから立てれば屋根より高く上げれそうですが、まぁ暖かくなってからですねぇ

どうせならディスコーンを置いてエアバンドも受信できるように とか QFHを置いてNOAAとかも… と考えてると楽しいですが、どんどん現実的じゃなくなってくるので面倒

mbedでブラックベリーのトラックボールを使う

mbedでブラックベリーのトラックボールを使う方法です


配線が面倒なので、ブレッドボードに直載せです
トラックボールに使用するのをピンヘッダではなくピンソケットにすればブレッドボードすら不要です
トラックボール以外何も載せられなくなりますけどね

下記のソースコードはトラックボールで色を変更するというものです
色はHSVで管理され、横に動かすとHが、S,Vは縦に動かすと変更できます
SとVの選択はボタンを押すことにより行います
LEDはPWMで調光していますが、輝度を直線的に見せる部分の関係でV0にしても完全には消灯されません
また白色LEDは使用していません

とりあえずこんな感じで動くよ 程度なので ソースコードはごちゃごちゃしてますが まぁ参考までに…

また、HSVからRGBへ変換するソースコードはwikipediaより引用しています

2014年12月20日土曜日

緯度、経度、高度から直線の距離、方位、仰角を計算する

GPS等から得られる緯度経度高度から直線距離を計算したい場合は単純に三角関数でxyzの直交座標にしてから計算するだけでいいですが、方位や仰角を求める式はあまり見つかりません

で、いろいろな本を読んでいたのですが、"GPSのための実用プログラミング”(ISBN9784501325503)という本の30ページあたりに書いてありました

この本はGPS衛星から受信した情報から自分の位置を計算する という内容ですが、ソースコードのサンプルを多数掲載しているので色々と参考になります
ただ、amazonのレビューにもありますが、ソースコードには著作権が主張されているので、何かに使う場合は注意が必要です

GPSの仕組み(超低レベルな、衛星の中で何をやっているか、の部分)を知りたい場合はこの本は向いていないと思いますが、読み物としては面白いのでどういう計算をしているのか興味がある人は読んでみると良いと思います

2014年12月15日月曜日

AN/PRC-152ダミーラジオ

EMERSONのAN/PRC-152ですが
思いつきでBNCケーブルを付けてみました


予想以上にいい雰囲気…

とりあえずTNCP-TNCPとTNCJ-BNC-Jアダプタを組み合わせてTNCP-BNCJとしています
車載や基地内での運用では外部に設置したアンテナを使用することによりゲインを確保したりしていますが、そんな感じの雰囲気が出ます

サバゲで使うだけならブレードアンテナ1本で十分ですが、一工夫するだけで自室に置いた時や車に置いた時の雰囲気が向上します

mbedのSerialから1行読み出す

最近mbedでプログラムを作っています
で、ノンブロッキングな1行読み取り関数が欲しかったの、とりあえず作ってみました

本来であればmbedのWebページで公開するべきですが、とりあえずこちらに書いておきます

とりあえずコンストラクタとデストラクタ、それ以外にAdd,Getc,Getsの3個の関数が用意されています
mbedのSerialで使いたい場合はSerialの受信割り込みハンドラで1文字を読み出したらAddに渡す というコードを作っておけば、メインループスレッドでGetcで1文字読み出すこともできるし、Getsで1行読み出すこともできます

現在はASCIIコードの英数しか対応していません 半角カタカナとかも非対応です
また改行コードは\rと\nに対応しており、改行コードしか無い文字列は無視されます

いちおう動作はしていますが、本当に問題なく使用できるかは確認していないので、自己責任でご使用ください


mbedって「コピペでなんでも作れる!」みたいなことを言われているイメージだったんですが、Serialから1行読み出すって何度ググってもやり方が出てきませんでした
やっぱこの程度なら自分で作ったほうが早いよ(´・ω・`)

2014年12月14日日曜日

10HzGPSのステータスLEDについて

10HzGPSから出力した1PPS出力でLEDを光らせていて気がついたのですが、このGPSモジュールのLEDは1PPS出力とは非同期のようです

赤が1PPS信号 黄色がLEDパルスです
PPSは正論理、LEDは負論理です

1PPSを信用した場合、LEDのパルスは約220msec後に50msecの間有効になっているようです

これについてGPS受信チップのデータシートを確認した所、Pin7 GPIO6に
General purpose I/O (Default status indicator. When GPS position fix is available, it output 50ms high per second, otherwise it output low.) 
多目的I/O(デフォルト地位指標。 GPS位置フィックスが利用できるとき、それは1秒につき高さ50msを出力しました、さもなければ、それが低く出力されました。) 
という記述があります(日本語はYAHOO翻訳より)

10HzGPSモジュール自体のデータシートによるとLEDはx.000秒に正確に同期しているようですが、実際にはそのような記述はなく、図による解説だけです

本来であればもう少しオシロなどで確認しておきたいところですが、僕の部屋はPC等のノイズでGPSが受信しづらい状況であまり詳しく確認できていない状況です


さて、1PPSとLED出力 どちらが正しいのか
とりあえずケータイで117に電話して耳と目で同期を確認してみましたが、どちらもずれているような気がします(そもそも117がどれくらい正しいか という問題があります 電話網での遅延とか)
確認には高精度にUTCに同期したクロックソースが必要ですね
トライステートのGPS時計でも買おうかと思ったんですが、時間専用GPSレシーバーとか謳っていながら1PPS出力端子を持っていないようなんですよね なんだかなぁ…

このGPSモジュールとの格闘はしばらく続きそうです
比較的入手性がよく比較的使いやすいGPSモジュール となると数少ない選択肢ですが、缶サットに使った際はあっさり現在位置を見失いやがりましたので、あんまり使えるモジュールでも無いのですよね

早くITAR規制外れた使いやすいGPSが輸入されてこないか…と思う今日このごろです

2014年12月13日土曜日

10HzGPSの出力タイミング

10HzGPSがNMEAデータを出力するタイミングについてです

この画像はGPSのTXとPPSをロジアナで表示したものです

1PPSの立ち上がりはUTCのx.000秒に正確に同期していると予想されます
それに対し、NMEAの出力はかなりズレています
というか1PPSが立ち上がった時点でx-1.900のデータの出力が終わっていません

このタイミングはコンスタントにこの時間分ズレるわけではなく、常に変動しています
もしかしたら捕捉した衛星の数によって処理時間が変わる…という可能性もありますが、そこまでは測定していないです

問題はNMEAの出力がPPSと非同期という点です
NMEAが送られてきた点に同期してマイコン内の時間を校正するといつまでたっても校正が終了しません

±100msec程度でいいならNMEAを受信するだけでもいいですが、±50msec以下でタイミングを合わせたい場合はPPS信号を使用する必要があります

2014年12月12日金曜日

ストリナ10HzGPSの改造

ストリナで売っている10Hz出力なGPSモジュールですが、このモジュールで使用されているGPS受信チップには1PPS出力端子があります
この出力端子は"±11ns high accuracy time pulse"(データシートより)だそうで、正確な時間が必要になる電子工作では十分な精度のタイミングソースとして使えます
しかしこのGPSモジュールではPPS出力はLEDをドライブしているだけで、コネクタには引き出されていません(そもそもコネクタは未実装ですが)
ということでPPSを引き出しつつ、他にもちょっと説明を


まずコネクタですが、4極、5極、6極のいずれかを使用します
4極の場合は電源とデータだけなのでPPSは引き出せません
5極の場合はGND2本を使用してPPSを使わない or GND1本にしてPPSを出力
6極の場合は全てのPADを使用しつつPPSを出力
という感じです

ピンアサインは画像に書いてあるので一目瞭然だと思いますが
「TXってどっちから見た送信だよ!」
と言う人がいるようなので念の為に矢印を書いておきました
GNDの隣にあるTXピンはGPSからマイコン等へ流れる位置情報データ
VCCの隣にあるRXピンはマイコン等からGPSへ流れるコンフィグデータ
となります

PPSピンはGPSデコードチップから直接ジュンフロン線などで引き出します
パターンが狭いので隣のPADと短絡しないように注意してください


それと使用する際の注意点ですが、画像に見て右上にある円形の物体ですが、これがバックアップバッテリで、ちょっと見た感じではちゃんと固定されているような気になるのですが、実際には2箇所の薄い電極で基板に乗っているだけです
なので何かに引っ掛けると簡単に剥がれてしまいます
ということで実際に使う場合はGPSモジュールをテープでグルグル巻にして置いたほうが安心です

それと同じく脆弱な場所として、アンテナの横にあるLEDも簡単に壊れてしまいます
LEDなんていらない!という場合はとっとと壊しちゃってもいいですが、GPSのFIX確認にLEDを残しておきたい場合は接着剤などを盛って保護してやる必要があります


とりあえずハードウェア面はこれくらいでしょうか
ソフトウェア面では、GPSチップに内蔵されたEEPROMの書き換え回数が少ないので頻繁に設定を変えていると設定を焼けなくなる… くらいでしょうか


それではみなさんも快適な測位ライフを!

2014年12月11日木曜日

BNCコネクタの取り付け

秋月で買ったBNCコネクタを使う方法

今回使ったコネクタ
http://akizukidenshi.com/catalog/g/gC-00095/

使った同軸ケーブル
http://akizukidenshi.com/catalog/g/gC-00007/

同軸ケーブルはBNCPが両端についたケーブル
以前アンテナを作った時に半分に切った残り

組み立て方は↓のページにわかりやすく書いてある
http://www.sun-ele.co.jp/explain/bnc_connector.html

BNCコネクタを分解するとこんな感じになっている

左から BNCコネクタ本体・傘(?)・ゴム・円盤・ボルト(?)・ピン という感じ

次に組み立てる準備
ボルト・円盤・ゴムの順番で挿入する
画像で見て右側にBNCコネクタを設置することになる
この3個はケーブルに入っているが、なくしたりしないように両側にテープを貼っておくといい
この3個を通すときはケーブルを切り落としたままで被覆を剥かない状態でやった方がいい

次に被覆をむいて傘を通す
傘は被覆を剥かないと入らない 被覆は余裕を見て10mmくらい剥いておく
被覆を剥くと網線がほどけてくるので、テープで解けないようにすると傘をスルッと入れられる

傘を通したら網線を折り返す
折り返した網線は傘の端で切りそろえる
そして芯の被覆を剥がす
この被覆は傘の折り返しから3mm残して被覆を剥く
そして被覆を剥いたところから芯線を3mm残して切り落とす
全体として、傘の端から芯線の端までが6mm位になる
(長さについては上記URLページの図がわかりやすい)

そしてピンをハンダ付けする
ピンの穴は小さいのでハンダ付けは大変
そもそもピンの外側にどんどんハンダが広がっていくし…
外側はカプトンテープとかで養生しておくといいのかも
予想するにこの部分のハンダ付けがうまくできないとインピーダンスが合わなくて高周波特性が悪化すると思う
とりあえず今回は初めてということで、あまり特性は気にしなかった
引っ張って抜けなければ良い という基準で終わらせた
ピンのハンダ付けが終われば後はねじ込むだけ
ゴムを押しつぶして、左右に広がることによってケーブルの被覆を押し付けて固定する感じだと思う
なのでボルトは締めればどんどん入っていく モンキーレンチで締め込んでいくとなんとなく硬くなるところがある その辺りで終了しておく
とりあえず壊れない程度に締め込んでおく

動作確認はオシロスコープとプローブの間に挿入して行った

時間軸を拡大するとこんな感じ
赤が今回作ったBNCケーブルを使用、水色がプローブを直結
立ち上がりが遅くなっているのがわかる
ケーブルを延長しているためなのか、コネクタの作りなのかは不明

まぁ断線しているわけではないと思うので大丈夫ということにしよう

2014年12月7日日曜日

mbedで正弦波を出力

ちょっとやってみたいことがあり、STM32F1でADCを動かしています
データシートを見る限りでは無理そうですが、ものは試しということで
で、ADCの動作確認にてきとーなサンプルがほしいのですが、うちにはファンクションジェネレータは無いし、それらしいものもありません
ということでmbedから波形を出力してみました

mbedのp18は10bitのDACが接続されており、任意の電圧を出力することができます
波形はSIN関数を使うことでテーブルを持つ必要はありません
今回はテストに使うだけなので波形を出力する機能しかありません

Timerで現在の時間を獲得し、時間にほしい周波数を掛けて、1とのmodを取ることによりほしい周期で0-1になります
あとはこの0-1にPI*2を掛けてやれば0-2piの間を直線で移動します
この直線をsinに渡してやれば-1から1の間を取る波形になるので、これを2で割ってから0.5を足しています

多分ソースコードを見たほうがわかりやすいと思うので、貼り付けておきます

#include "mbed.h"
#include <math.h>

DigitalOut myled(LED1);
Timer tim;
AnalogOut aout(p18);

int main() {
    const float freq = 250;
    tim.start();
    
    while(1) {
        float s = tim.read();
        myled = ((int)s) % 2 == 0; /* LED output(0.5Hz) */
        aout = 0.5 + (sin(fmodf(s * freq, 1) * 3.14159265359 * 2) / 2);
    }
}

このサンプルでは250Hzの正弦波を出しています
三角波とか矩形波が欲しい場合は、もう一工夫が必要ですが、気が向いたら実装します

で、この波をSTMのADCで読んでFFTを通してみました
250Hzのあたりに結構鋭い尖りがあります
結構綺麗な波が出ているようです