Raspberry Pi Pico 2 互換ボードで作る NTP サーバ

Raspberry Pi Pico 2 の互換ボード WIZ-net「W6300-EVB-Pico2」と、GNSS 拡張ボード Waveshare 「Pico-GPS-L76K」を C 言語でプログラミングして、NTP サーバを作成しました。

リポジトリ:WIZnet-PICO-C_NTP
リリースノート:WIZnet-PICO-C_NTP Release Notes

こちらのページでは、仕様と作成方法をご紹介します。

仕様

主な仕様

こちらの NTP サーバは、GPS単体または複数種類の位置測位衛星の信号から現在時刻を取り出し、NTP プロトコルに準じた UDP による問い合わせを通じて現在時刻を配信します。

現在時刻の取得には、位置測位衛星からの電波を利用します。GNSS アンテナを位置測位衛星からの電波が受信できる場所、できれば空の見える窓際に設置する必要があります。

配信する現在時刻の精度は、1秒単位です。1秒単位以上の精度を確保したい場合は、既製品の利用をおすすめします。

検証環境

Windows 11、macOS 26、Debian 13 にて、NTP プロトコルを通じて現在時刻を同期できることを確認しました。検証環境は、次の通りです。

OSアプリコマンド
Windows 11 Pro 25H2コマンドプロンプトw32tm
macOS Tahoe 26.5.2ターミナルsntp
Debian 13.6systemdsystemd-timesyncd

作成する前に

最低限必要な技術

作成にあたり、次の4つの技術が最低限必要です。

  • C 言語によるプログラミング
  • ネットワーク(LAN)の設定
  • Visual Studio Code の基本的な操作
  • はんだづけ

仕組みの理解に必要な知識

ソースコードを理解するためには、次の4つの知識が必要です。

  • Raspberry Pi Pico 固有の関数
  • WIZ-net ネットワークチップ固有の関数
  • NMEA-0183 ZDA メッセージの構造
  • NTP のサーバとクライアントによる時刻同期の方法

作成の準備

必要な機材

機材名役割備考
WIZ-net「W6300-EVB-Pico2」有線ネットワーク機能付きの Raspberry Pi Pico 2以降互換ボードと呼称
Waveshare 「Pico-GPS-L76K」GNSS 受信機能を追加する Raspberry Pi Pico HAT 基板以降拡張ボードと呼称
USB-C ケーブル互換ボードへの書き込みおよび給電C-C もしくは C-A
ピンヘッダ互換ボードと拡張ボードの接続端子20 pin x 2
はんだとはんだごて互換ボードにピンヘッダを固定
Windows 11 のパソコンソースコードのコンパイルおよび互換ボードへの書き込みコンパイル環境を整えられるなら、ほかの OS でも可

必要なソフトウェア

ソフトウェア名役割
Visual Studio Code統合開発環境
ARM GCC CompilerRaspberry Pi Pico 用 C 言語コンパイラ
Visual Studio CommunityC 言語開発環境
CMakeC 言語ビルド自動化ツール
Gitソースコードのダウンロード
PythonPython 開発環境

いずれもフリーソフトウェアです。数が多いので、環境構築は少々タフかと思います。

ダウンロードとインストールの方法については、次のページをご参照くださいませ。

Make New W6300-EVB-PICO2 Projects using VS Code | WIZnet Document System
このページでは、VS Codeを使ってW6300-EVB-PICO2用プロジェクトを作成する方法を紹介します。

作成手順

機材の下準備

  1. 拡張ボードにピンヘッダの長い方を差し込み、ピンヘッダの短い方を拡張ボードのピン穴に合わせて置きます。
  2. マスキングテープで互換ボードと拡張ボードを固定し、ピンヘッダと互換ボードをはんだづけします。

機材の初期動作確認

  1. 互換ボードから拡張ボードを外します。
  2. 拡張ボードの小さな GPS 端子と GPS アンテナの大きな端子を、付属の変換コネクタを用いて接続します。
  3. 拡張ボードの「USB」の文字の上に 互換ボードの USB-C 端子が向くようにして、2つのボードを接続します。
  4. USB-C ケーブルを互換ボードに差し込み、パソコンと接続します。
  5. 互換ボードの 「PWR」LED が点灯することを確認します。
  6. 拡張ボードの 「PWR」LED が点灯、「RXD」LED が点滅することを確認します。
  7. 拡張ボードの「FORCE」ボタンを1秒間押して40秒待つと、「PPS」LED が点滅することを確認します。
  8. パソコンから USB-C ケーブルを抜きます。
  9. 互換ボードの「BOOTSEL」ボタンを押しながら、USB-C ケーブルをパソコンに差し込みます。
  10. パソコンで互換ボードが外部ストレージとして認識されることを確認します。

ソースコードのコンパイル

  1. 任意のフォルダを作成します。
  2. 任意のフォルダを開き、GitHub からソースコードをクローンします。
    $ git clone –recurse-submodules https://github.com/enbaku10/WIZnet-PICO-C_NTP.git
  3. 「[任意のフォルダ]/WIZnet-PICO-C_NTP/examples/ntp/wizchip_ntp.c」に NTP サーバの IP アドレスを設定します。変数「g_net_info」にネットワーク情報を書き込みます。
  4. Build を実行します。エラーで止まることなく、コンパイルが終了することを確認します。
  5. 「[任意のフォルダ]/build/examples/ntp/wizchip_ntp.uf2」が生成されていることを確認します。

NTP サーバの動作確認

  1. Windows のエクスプローラで互換ボードを開き、wizchip_ntp.uf2 をドラッグ・ドロップします。
  2. 互換ボードのウィンドウが自動で閉じられ、互換ボードが再起動することを確認します。
  3. 60秒待ちます。互換ボードの初期処理と、拡張ボードの位置測位衛星の捕捉に必要な時間です。
  4. NTP サーバに問い合わせを行い、正しい時刻に同期することを確認します。
タイトルとURLをコピーしました