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.6 | systemd | systemd-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 Compiler | Raspberry Pi Pico 用 C 言語コンパイラ |
| Visual Studio Community | C 言語開発環境 |
| CMake | C 言語ビルド自動化ツール |
| Git | ソースコードのダウンロード |
| Python | Python 開発環境 |
いずれもフリーソフトウェアです。数が多いので、環境構築は少々タフかと思います。
ダウンロードとインストールの方法については、次のページをご参照くださいませ。

Make New W6300-EVB-PICO2 Projects using VS Code | WIZnet Document System
このページでは、VS Codeを使ってW6300-EVB-PICO2用プロジェクトを作成する方法を紹介します。
作成手順
機材の下準備
- 拡張ボードにピンヘッダの長い方を差し込み、ピンヘッダの短い方を拡張ボードのピン穴に合わせて置きます。
- マスキングテープで互換ボードと拡張ボードを固定し、ピンヘッダと互換ボードをはんだづけします。
機材の初期動作確認
- 互換ボードから拡張ボードを外します。
- 拡張ボードの小さな GPS 端子と GPS アンテナの大きな端子を、付属の変換コネクタを用いて接続します。
- 拡張ボードの「USB」の文字の上に 互換ボードの USB-C 端子が向くようにして、2つのボードを接続します。
- USB-C ケーブルを互換ボードに差し込み、パソコンと接続します。
- 互換ボードの 「PWR」LED が点灯することを確認します。
- 拡張ボードの 「PWR」LED が点灯、「RXD」LED が点滅することを確認します。
- 拡張ボードの「FORCE」ボタンを1秒間押して40秒待つと、「PPS」LED が点滅することを確認します。
- パソコンから USB-C ケーブルを抜きます。
- 互換ボードの「BOOTSEL」ボタンを押しながら、USB-C ケーブルをパソコンに差し込みます。
- パソコンで互換ボードが外部ストレージとして認識されることを確認します。
ソースコードのコンパイル
- 任意のフォルダを作成します。
- 任意のフォルダを開き、GitHub からソースコードをクローンします。
$ git clone –recurse-submodules https://github.com/enbaku10/WIZnet-PICO-C_NTP.git - 「[任意のフォルダ]/WIZnet-PICO-C_NTP/examples/ntp/wizchip_ntp.c」に NTP サーバの IP アドレスを設定します。変数「g_net_info」にネットワーク情報を書き込みます。
- Build を実行します。エラーで止まることなく、コンパイルが終了することを確認します。
- 「[任意のフォルダ]/build/examples/ntp/wizchip_ntp.uf2」が生成されていることを確認します。
NTP サーバの動作確認
- Windows のエクスプローラで互換ボードを開き、wizchip_ntp.uf2 をドラッグ・ドロップします。
- 互換ボードのウィンドウが自動で閉じられ、互換ボードが再起動することを確認します。
- 60秒待ちます。互換ボードの初期処理と、拡張ボードの位置測位衛星の捕捉に必要な時間です。
- NTP サーバに問い合わせを行い、正しい時刻に同期することを確認します。
