Wiznet makers

Benjamin

Published January 14, 2026 ©

82 UCC

11 WCC

8 VAR

0 Contests

0 Followers

1 Following

Original Link

raspberrypi-pico-eth_wiznet_gps_rs

Embassy フレームワークを使用した Raspberry Pi Pico (RP2040) + W5500 Ethernet + Pico-GPS-L76K GPS モジュールによる TCP API サーバーと ICMP Ping 対応の実装です。

COMPONENTS
PROJECT DESCRIPTION

Raspberry Pi Pico + W5500 + GPS TCP API Server

Embassy フレームワークを使用した Raspberry Pi Pico (RP2040) + W5500 Ethernet + Pico-GPS-L76K GPS モジュールによる TCP API サーバーと ICMP Ping 対応の実装です。

機能

  • ✅ W5500 Ethernet チップによるネットワーク接続
  • ✅ DHCP による自動 IP アドレス取得
  • ✅ ICMP Ping 応答(自動)
  • ✅ TCP API サーバー(ポート 8080)
  • ✅ JSON レスポンス対応
  • ✅ GPS モジュール(Pico-GPS-L76K)サポート
  • ✅ NMEA 0183 プロトコル解析
  • ✅ GPS 位置情報・時刻情報の取得と配信

ハードウェア

  • MCU: Raspberry Pi Pico (RP2040)
  • Ethernet: W5500 モジュール(SPI 接続)
  • GPS: Pico-GPS-L76K モジュール(UART 接続)

ピン配線

W5500 Ethernet モジュール

W5500 ピンPico ピン役割
VCC3V3電源(3.3V)
GNDGNDグラウンド
MISOGP16SPI0 RX
MOSIGP19SPI0 TX
SCKGP18SPI0 CLK
CSGP17チップセレクト
INTGP21割り込み
RSTGP20リセット

GPS モジュール(Pico-GPS-L76K)

GPS ピンPico ピン役割
VCC3V3電源(3.3V)
GNDGNDグラウンド
TXGP1GPS → Pico (UART0 RX)
RXGP0Pico → GPS (UART0 TX)
ボーレート-9600bps

技術スタック

  • 言語: Rust (no_std)
  • フレームワーク: Embassy (非同期組み込みフレームワーク)
  • ネットワークスタック: embassy-net (smoltcp ベース)
  • W5500 ドライバ: embassy-net-wiznet
  • ログ: defmt + RTT

API エンドポイント

エンドポイントメソッドレスポンス
/ or /statusGET{"status":"ok","service":"TCP API Server","version":"1.0"}
/pingGET{"message":"pong","timestamp":"now"}
/api/infoGET{"endpoints":["/status","/ping","/api/info","/api/gps","/api/gps/mode/{log|tcp|both|none}"],"protocol":"HTTP/1.0"}
/api/gpsGETGPS位置情報・時刻情報をJSON形式で返す
/api/gps/mode/logGETGPS出力モードを「ログのみ」に設定
/api/gps/mode/tcpGETGPS出力モードを「TCPのみ」に設定
/api/gps/mode/bothGETGPS出力モードを「ログ+TCP」に設定
/api/gps/mode/noneGETGPS出力モードを「出力なし」に設定

GPS データ形式

/api/gps エンドポイントのレスポンス例:

{
  "gps": {
    "valid": true,
    "position": {
      "latitude": 35.681236,
      "longitude": 139.767125
    },
    "time": {
      "utc": "12:34:56",
      "date": "2024-01-15"
    },
    "satellites": 8,
    "altitude": 45.5,
    "speed_knots": 0.0
  }
}

GPS 出力モード

GPSデータの出力先を制御できます:

  • log: defmtログのみに出力
  • tcp: TCP APIサーバーのみに出力(/api/gpsエンドポイント経由)
  • both: ログとTCPの両方に出力(デフォルト)
  • none: 出力なし

ビルド・書き込み

必要なツール

# Rust ターゲットの追加
rustup target add thumbv6m-none-eabi

# probe-rs のインストール
cargo install probe-rs-tools --locked

ビルド

# デバッグビルド
cargo build

# リリースビルド
cargo build --release

書き込み・実行

# 書き込みとログ表示
cargo run --release

動作確認

ICMP Ping

ping <デバイスのIPアドレス>

TCP API

# ステータス確認
curl http://<IP>:8080/status

# Ping エンドポイント
curl http://<IP>:8080/ping

# API 情報
curl http://<IP>:8080/api/info

# GPS データ取得
curl http://<IP>:8080/api/gps

# GPS 出力モード変更(ログのみ)
curl http://<IP>:8080/api/gps/mode/log

# GPS 出力モード変更(TCPのみ)
curl http://<IP>:8080/api/gps/mode/tcp

# GPS 出力モード変更(両方)
curl http://<IP>:8080/api/gps/mode/both

ポートスキャン

nmap -p 8080 <IP>
# PORT     STATE SERVICE
# 8080/tcp open  http-proxy

プロジェクト構成

src/
├── main.rs          # エントリーポイント、ハードウェア初期化
├── network.rs       # ネットワークスタック初期化、DHCP
├── tcp_server.rs    # TCP API サーバー実装
└── gps.rs           # GPS モジュール通信・NMEA解析

設定変更

MAC アドレス

src/main.rsmac_addr を変更:

let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x01];

TCP ポート

src/tcp_server.rsTCP_PORT を変更:

const TCP_PORT: u16 = 8080;

GPS ボーレート

src/main.rs の UART 設定で変更:

uart_config.baudrate = 9600; // デフォルト: 9600bps

静的 IP(DHCP を使用しない場合)

src/main.rsuse_dhcpfalse に変更し、src/network.rs で静的 IP を設定:

Config::ipv4_static(embassy_net::StaticConfigV4 {
    address: embassy_net::Ipv4Cidr::new(
        embassy_net::Ipv4Address::new(192, 168, 1, 100),
        24,
    ),
    dns_servers: Default::default(),
    gateway: Some(embassy_net::Ipv4Address::new(192, 168, 1, 1)),
})

トラブルシューティング

DHCP でIP が取得できない

  • Ethernet ケーブルの接続を確認
  • W5500 モジュールの電源を確認(3.3V)
  • ネットワーク上に DHCP サーバーがあるか確認

Ping が通らない

  • IP アドレスが正しく取得されているか確認(ログで確認)
  • 同じネットワークセグメントにいるか確認
  • ファイアウォール設定を確認

TCP 接続が拒否される

  • ポート番号が正しいか確認(デフォルト: 8080)
  • デバイスのログで TCP server started on port 8080 が表示されているか確認

GPS データが取得できない

  • GPS モジュールの電源を確認(3.3V)
  • UART ケーブルの接続を確認(GP0: TX, GP1: RX)
  • GPS モジュールが屋外または窓際にあり、衛星を捕捉できる環境か確認
  • ログで [GPS] No fix - searching for satellites... が表示されている場合、衛星捕捉待ちの状態です
  • GPS出力モードが none または log に設定されている場合、/api/gps エンドポイントはデータを返しません

Connection refused エラー

  • accept() が正しくリスニングしているか確認
  • ソケットのタイムアウト設定を確認

依存関係

主要な依存関係(Cargo.toml 参照):

  • embassy-executor: 非同期タスク実行
  • embassy-rp: RP2040 HAL
  • embassy-net: ネットワークスタック
  • embassy-net-wiznet: W5500 ドライバ
  • embassy-time: 時間管理
  • defmt: ログ出力

ライセンス

MIT License

GPS モジュールについて

本プロジェクトは Pico-GPS-L76K モジュールを使用しています。このモジュールは:

  • チップ: MediaTek MT3339
  • プロトコル: NMEA 0183
  • ボーレート: 9600bps(デフォルト)
  • 対応センテンス: GPRMC, GPGGA(解析済み)

GPSモジュールは以下の情報を提供します:

  • 緯度・経度(度単位)
  • UTC時刻・日付
  • 衛星数
  • 高度(メートル)
  • 速度(ノット)
  • 位置情報の有効性(Fix状態)

参考資料

Documents
Comments Write