Pocket SDRハードウェア制作(第1報)

categories: gnss
tags: pocketsdr

はじめに

GPSなどの測位衛星信号を受信するハードウェアを制作しています。このPocket SDRは、東京海洋大学の高須知二先生がGitHubに公開されている珠玉のオープンソースのソフトウェア無線で、ハードウェア部分とソフトウェア部分からなります。この記事は、そのハードウェア部分に関するものです。

私の制作したハードウェアでは、まだ信号受信はできていませんが、あと一歩だと思いますので、今までの作業をまとめます。

実は、私には正しい方法がわからない部分もあって、以下の記述に誤りがあるかもしれません。しかしながら、Pocket SDRのハードウェア制作を志す方にとって役立つと思い、私の方法を公開します。自己責任でお願いします。ちょっと長いですが、お付き合いください。

事前準備

ハードウェア作成に必要なリフロー炉準備部品調達をしながら、Windows PCの設定や設計資料の確認を行います。

なお、最後まで入手できなかったメモリIC Microchip AT24C128C-XHM-Tの代わりに、ROHM BR24S128FVT-Wを購入しました(参考: 高須先生の記事 128Kbits EEPROM (AT24C128C-XHM-T) の互換品)。また、基板取付SMAコネクタは、海外通販では購入困難でしたが(何故?)、秋月電子にて簡単に購入できました

Windows PCについては、以下を行います。

  1. MSYS2インストール(参考: 高須先生の記事 Pocket SDR用ホストAP開発環境の構築
  2. MSYS2ターミナルでの必要ソフトウェアインストール
    pacman -S base-devel git gcc vim mingw-w64-x86_64-libusb mingw-w64-x86_64-fftw
  3. MSYS2ターミナルでのPocket SDRのダウンロード
    git clone https://github.com/tomojitakasu/PocketSDR pocketsdr
  4. FX2LP USBドライバ CyUSBのダウンロード
  5. 汎用USBドライバ zadigのダウンロード Pocket SDR v.0.8からはWindows用ドライバとしてCyUSBを使用します(参考: 高須先生の記事 2022-09-052022-04-14更新

なお、手順4のCyUSBダウンロードでの、リンクがわかりにくいので、以下を参考にしてください。

CyUSB download link

次に、基板図面の印刷と、有極性部品のピン確認をします。Autodesk EAGLEでレイヤー選択し、さらに白黒反転して作成したpocketsdr-production-first-report.pngを印刷しました。

Pocket SDR on EAGLE

購入した部品の袋には、マジックでU1 U2, AR1などの部品番号を書いておきます。

Marking part numbers

また、MAX2771やLEDなどの向きを確認します。部品表面に印字されたドットマークが1番ピンを表すことが多いのですが、仕様書と基板図面と回路図とでクロスチェックして部品設置方向を決定します。私は資料を普段利用のパソコンにダウンロードし、必要に応じて4Kモニタに表示しました。

Determining parts orientation

基板制作

プリント基板に部品ハンダづけを行うために、金属マスク(ステンシル)の穴をプリント基板の端子面(ランド)と一致させて、クリームハンダを塗布します。ステンシルとプリント基板との間に隙間ができないように、余分なプリント基板を用います。

Fixing print circuit board

その後、クリームハンダをホームセンタで購入したヘラでかき混ぜてステンシルに塗り、はんだ塗布用ヘラ(スキーザ)でステンシルの穴に均一に流し込みます。

Pasting solder paste to print circuit board

Squeeging solder paste

このプラスチックスキーザMINISQUEEGE-1は、価格が400円くらいと割高で、しかも届いた製品にはバリが残っていてちょっと雑な感じですが、なぜか綺麗にクリームハンダを塗れるのです。これは、ただのプラスチック板に見えますが、実はノウハウ製品なのかもしれません。

クリームハンダを塗った基板写真を以下に示します。後から思えば、はんだ量が多かったです。クリームハンダを使用直前まで冷蔵庫に冷やしておくべきでした(参考: 高須先生の記事 自作リフローで実装コツ)。

print circuit board

その後、部品を基板の上に載せます。IC、有極性部品、無極性部品、大きな部品(バイアスティやUSBコネクタ)の順にプリント基板に載せますが、多くを占める無極性部品は内側に配置される部品から外側に配置される部品の順に載せます。Digi-Keyから届く部品は、部品項目ごとに袋に入っています。袋をハサミにて開封する際、C35など、部品番号を声に出してから部品を配置すると、誤配置を防げます。

MAX2771やFX2LPなどの大きな部品は吸着スポイト(私はHAKKO 393を使いました)を、抵抗やコンデンサなどの小さな部品はピンセットを使って、基板に載せます。

部品の袋や基板の汚れがピンセットに付着して、ピンセットを開いても部品が吸着したままになることがあります。ひとつ部品を載せるごとに、または、部品を2つ載せるごとに、無水エタノールとキムワイプでピンセットの先を拭き取りました。また、手の汚れを感じたら、手を石鹸で洗います。

有極性部品のマーク確認には、TFTモニタつきの顕微鏡(GVDA GD7010)を使いました。この顕微鏡は、後のリワーク(プリント基板のはんだ付け修正作業)にも、とても役立ちました。LEDにはアノードからカソードへ向かう矢印があるので、その向きを基板面印刷マークと一致させます。

print circuit board

水晶発振子(XTAL)には、特にマーキングがありませんが、裏面を見ると一部に切り欠きがあります。この切り欠きが1番ピンを表すので、型番が読める向きにしたとき、その左下のパッドが基板の丸マークの方向に合うようにします。

print circuit board print circuit board

次に温度補償水晶発振子(TCXO: temperature compensated crystal oscillator)には、1番ピンを表す丸マークが付いていました。

print circuit board

アンテナに電源供給する部品バイアスティ(BIAS-T)にも極性があります。これには、上部に丸マークがありました。すべての部品を載せたら、リフローします。

Reflow process

今回、2式を同時に作りました。部品位置確認や、作業効率向上のためにも、2式同時制作がおすすめです。リフロー後の写真は以下の通りです。これは、有極性部品の配置確認に役立つと考え、私が正しいと信じているものです。

print circuit board

ご覧の通り、FX2LPやMAX2771の端子ピンにはんだブリッジをおこしています。悲しい思いでいっぱいです。

リワークと残り部品取り付け

しかしながら、高須先生の記事自作リフローで実装コツの(3)

ブリッジ修正はフラックスたらして、少し大容量のコテをすっとあてれば大体直る。

を試したら、本当だ! 直りました。こて先を綺麗にして、フラックスを塗り、はんだごてをピンの奥から手前にゆっくりを動かすと、はんだブリッジがなくなりました。その後、無水エタノールをつけたキムワイプをピンセットつまみ、それを使ってフラックスを除去し、顕微鏡でそこにブリッジがなくなったことを確認します。すべてのブリッジした端子に対して、このフラックス塗布、はんだごてによる修正、フラックス除去、確認、のステップを行います。

Rework soldering

キムワイプを無水エタノールに浸すために、アズワンのハンドラップ200を使っています。このハンドラップは、ふたが硬いことで有名ですが、カッターナイフでつめを少し削れば使いやすくなります。キムワイプを使っても、依然として繊維が残ってしまうことの対策は、今後の検討課題です。

はんだごてとして、太洋電機産業(グットgoot)のPX-280を新たに調達しました。使い始めるまでの昇温がとても早く、本体の振動センサーにより使っていないときには自動的に温度を下げてくれて、とても便利です(参考: イチケンさんのYouTube 【買え】最強のハンダゴテが決定した。レビュー【goot, PX-280】)。

曲がって基板についてしまったチップ部品については、一旦、取り外して、付け直します(参考: Aquchin工房さんのYouTube チップ抵抗の外し方や交換方法)。これらは、1005サイズ(1ミリメートルと0.5ミリメートルの長方形)ですので、米粒よりも小さく、修正にはとても苦労します。実は、制作した2枚のプリント基板のうちの1枚は、チップコンデンサの取り付け修正に、功を急いて力が入り、ランド(銅箔面)を剥がすという失態をやらかしました。この入手困難なMAX2771、FX2LP、TCXO、メモリICは再利用します。

Rework failed

また、LDO(low dropout、5ボルト電源から少しだけ電圧降下させた3.3ボルト電源を作る部品)の4番ピンを5番ピンと接続するゼロオーム抵抗を取り付けました(参考: 中部大学 海老沼拓史先生の記事 PocketSDRのLDOレギュレータ)。

Pocket SDR LDO modification

さらに、アンテナ端子の電源供給オンオフを決めるジャンパ端子J2ポリスイッチをつけました。例えば、衛星測位モジュールu-blox ZED-F9Pでもアンテナ電源のオンオフをコマンドで制御できますが、私は初期状態のオンのままで変更したことがなく、むしろオンのままの方が使いやすいと思ったからです(参考: 高須先生の記事 アンテナ給電回路 (5V) に過電流保護)。

Pocket SDR antenna power supply

最後に、SMAコネクタをこの基板に取り付けました。まだ、シールドケースはつけません。

パワーオンとファームウェア書き込み

大型コンピュータ(メインフレーム)やスーパコンピュータに初めて電源を入れるイベントをパワーオンと呼ぶそうです。パワーオンだから明日は帰れない、のように使います(日立用語でしたらすみません…)。

制作したPocket SDR基板をパワーオンします。テスターで電源やアンテナ端子に短絡のないことを確認して、基板USB端子をUSB電源に接続します。USB電源には、万が一の電源短絡時にも電源カットが期待でき、安全だと思うからです。通電を示す緑色LEDの点灯と、LDOの端子に5ボルトと3.3ボルトがあることを確認し、USB電源から基板を取り外します。

その後、ジャンパ端子J2(EEPROM)を短絡させて、基板のUSB端子をWindows PCにつなぎ直します。私は、ジャンパピンをたくさん持っているから、購入しなくても大丈夫と思っていました。しかし、ここで必要なジャンパピンは、電子工作で多用する2.54ミリメートル間隔のものではなく、2ミリメートル間隔のものでした。とりあえず、このJ2テストワイヤーで短絡しました。

PCにPocket SDR基板を接続し、30秒くらい待ってから、 デバイスマネージャを起動します(私はキーボードからdevmgmt.mscを入力し起動しています)。このユニバーサルシリアルバスコントローラ欄を見ると、Cypress FX2LP No EEPROM Deviceとして、このUSBコントローラICのFX2LPが認識されていました。不明なデバイスになったら、右クリックし、デバイスドライバの更新を選んだ上で、先のUSBドライバCyUSBのディレクトリを指定します。

Pocket SDR antenna power supply

その後、このFX2LPに、Pocket SDRのファームウェア(FW)を書き込みます。Pocket SDRのディレクトリFW/cypress/の中にあるCyControl.exe(USB Control Center)を起動して、Program、FX2、64KB EEPROMの順に選択し、ファイル選択ダイアログにてFWディレクトリにあるファームウェアバイナリpocket_fw.iicを選択します。

Cypress USB Control Center

そのまま待つと、USB Control Center画面の左下にProgramming succeededの文字が表示されます。実は、最初にJ2ジャンパをオープンのままでファームウェア書き込みをしようとしたところ、Programming failedとなっていました。

Cypress USB Control Center

ここで、一旦、Pocket SDR基板をPCから取り外し、再びPCに接続して、30秒程度、待つと、上部のLEDの2つが明るく光りました。

Pocket SDR with firmware

Pocket SDRファームウェアコードによると、LED1がUSBのバルク転送モードオン、LED2が2つのMAX2771のデータ転送の様子を表すようですので、ファームウエア起動で両方のLEDが点灯するのが正しい動作だと思います。起動には、いつも30秒程度の時間が必要なようです。 (起動に30秒程度の時間を要したのは、部品の一部が正しく接続されていなかったためでした。2022-09-14更新

FW/pocket_fw.c

#define LED1         6          // EZ-USB FX2 PD6  -> LED1
#define LED2         7          // EZ-USB FX2 PD7  -> LED2
...
static void start_bulk(void) {
  ...
  digitalWrite(LED2, 1);
}
...
void setup(void) {
  ...
  start_bulk();
}
...
void loop(void) {
  // update LEDs
  digitalWrite(LED1, digitalRead(STAT1) && digitalRead(STAT2));
}

FX2LPへのファームウェア書き込みに成功すると、デバイスマネージャのユニバーサルシリアルバスコントローラでのデバイス名がCypress FX2LP No EEPROM DeviceからCypress FX2LP Sample Deviceになります。

続けて、このデバイスドライバをアンインストールし、代わりに汎用デバイスドライバzadigをインストールして、Pocket SDRのアプリケーションからこの基板を利用できるようにします(参考: 高須先生の記事 Pocket SDR用ホストAP開発環境の構築)。この右クリックでデバイスのアンインストールを選び、さらに、ドライバソフトウェアを削除を選びます。 Pocket SDR v.0.8からはWindows用ドライバとしてCyUSBを利用しますので、以下の手順は不要です。2022-09-14更新

Uninstallation of Cypress USB driver Uninstallation of Cypress USB driver

Cypress USBデバイスドライバのアンインストールが終わると、「ほかのデバイス」に、エラーマークとともにEZ-USBのデバイスが現れます。

EZ-USB device

そして、先にダウンロードしたzadigを起動して、このUSBドライバをPCにインストールします。USB ID 04B4 1004を確認して、Install Driverボタンを押します。

zadig

zadigのデバイスドライバのインストールに成功すると、デバイスマネージャ上の警告マークが消えます。

EZ-USB device

Pocket SDRアプリケーションからのハードウェア制御

ここまでできたら、MSYS2コンソールやPowerShellなどからPocket SDRのアプリケーションを起動できるようにパスを通します。

私の好みは、あらゆる機種で動作するシェルスクリプトやPythonコード類をホームディレクトリのbinにおき(gitで同期)、特定CPUで実行するバイナリをホームディレクトリのexecにおくことですので(scpでコピー)、Pokcet SDRのbinディレクトリの内容をホームディレクトリのexecに、pythonディレクトリの内容をホームディレクトリのbinディレクトリに、それぞれコピーして、これらにパスを通しました。

そして、pocket_scan.exeを実行し、Pocket SDR基板の接続を確認します。

poket_scan.exe

この画面から、BUS=1, PORT=3にPocket SDR基板(Cypress EZ-USB)が認識されています。

次にpocket_conf.exeを実行しましたが、No device found.と表示されました。このコードは、オプションをつけなければ、USB ID 04B4 1004のデバイスを探し、設定を表示するものです。オプション-p 1,3にてバス番号とポート番号を指定し、再びpocket_conf.exeを実行しましたが、これでもデバイスを発見してくれませんでした。

まだ、MAX2771の動作確認までできていませんが、きっと、あと一歩です。近いうちに動作させたいです。第2報を待っていてください。

Pocket SDRには、高度なノウハウがつまっています。ハードウェアやコードを追いかけるだけで、さまざまな知識が身に付くのです。必ず近いうちにPocket SDRハードウェアを完成させ、所定のスキルをもつ、選ばれしもののみが入会できるPocket SDRオーナーズクラブ(なんてあるのかわかりませんが)への入会が認められるよう、修行を積む所存です。

まとめ

部品が揃いましたので、Pocket SDRのハードウェア制作を行いました。ハードウェア作成には、段取りと予備調査がとても大事だと感じました。良い工具を持つことも大切です。高度知識の習得は自己責任で行い、自らの失敗を人のせいにしてはいけません。自らのPocket SDRで測位衛星信号が取得できる日を楽しみにしています。Pocket SDRすごいです。


関連記事