raspberrypi-pico-eth_wiznet_gps_rs
Embassy フレームワークを使用した Raspberry Pi Pico (RP2040) + W5500 Ethernet + Pico-GPS-L76K GPS モジュールによる TCP API サーバーと ICMP Ping 対応の実装です。
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 ピン | Pico ピン | 役割 |
|---|---|---|
| VCC | 3V3 | 電源(3.3V) |
| GND | GND | グラウンド |
| MISO | GP16 | SPI0 RX |
| MOSI | GP19 | SPI0 TX |
| SCK | GP18 | SPI0 CLK |
| CS | GP17 | チップセレクト |
| INT | GP21 | 割り込み |
| RST | GP20 | リセット |
| GPS ピン | Pico ピン | 役割 |
|---|---|---|
| VCC | 3V3 | 電源(3.3V) |
| GND | GND | グラウンド |
| TX | GP1 | GPS → Pico (UART0 RX) |
| RX | GP0 | Pico → GPS (UART0 TX) |
| ボーレート | - | 9600bps |
- 言語: Rust (no_std)
- フレームワーク: Embassy (非同期組み込みフレームワーク)
- ネットワークスタック: embassy-net (smoltcp ベース)
- W5500 ドライバ: embassy-net-wiznet
- ログ: defmt + RTT
| エンドポイント | メソッド | レスポンス |
|---|---|---|
/ or /status | GET | {"status":"ok","service":"TCP API Server","version":"1.0"} |
/ping | GET | {"message":"pong","timestamp":"now"} |
/api/info | GET | {"endpoints":["/status","/ping","/api/info","/api/gps","/api/gps/mode/{log|tcp|both|none}"],"protocol":"HTTP/1.0"} |
/api/gps | GET | GPS位置情報・時刻情報をJSON形式で返す |
/api/gps/mode/log | GET | GPS出力モードを「ログのみ」に設定 |
/api/gps/mode/tcp | GET | GPS出力モードを「TCPのみ」に設定 |
/api/gps/mode/both | GET | GPS出力モードを「ログ+TCP」に設定 |
/api/gps/mode/none | GET | 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データの出力先を制御できます:
- 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 --releaseping <デバイスのIPアドレス># ステータス確認
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/bothnmap -p 8080 <IP>
# PORT STATE SERVICE
# 8080/tcp open http-proxysrc/
├── main.rs # エントリーポイント、ハードウェア初期化
├── network.rs # ネットワークスタック初期化、DHCP
├── tcp_server.rs # TCP API サーバー実装
└── gps.rs # GPS モジュール通信・NMEA解析
src/main.rs の mac_addr を変更:
let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x01];src/tcp_server.rs の TCP_PORT を変更:
const TCP_PORT: u16 = 8080;src/main.rs の UART 設定で変更:
uart_config.baudrate = 9600; // デフォルト: 9600bpssrc/main.rs で use_dhcp を false に変更し、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)),
})- Ethernet ケーブルの接続を確認
- W5500 モジュールの電源を確認(3.3V)
- ネットワーク上に DHCP サーバーがあるか確認
- IP アドレスが正しく取得されているか確認(ログで確認)
- 同じネットワークセグメントにいるか確認
- ファイアウォール設定を確認
- ポート番号が正しいか確認(デフォルト: 8080)
- デバイスのログで
TCP server started on port 8080が表示されているか確認
- GPS モジュールの電源を確認(3.3V)
- UART ケーブルの接続を確認(GP0: TX, GP1: RX)
- GPS モジュールが屋外または窓際にあり、衛星を捕捉できる環境か確認
- ログで
[GPS] No fix - searching for satellites...が表示されている場合、衛星捕捉待ちの状態です - GPS出力モードが
noneまたはlogに設定されている場合、/api/gpsエンドポイントはデータを返しません
accept()が正しくリスニングしているか確認- ソケットのタイムアウト設定を確認
主要な依存関係(Cargo.toml 参照):
embassy-executor: 非同期タスク実行embassy-rp: RP2040 HALembassy-net: ネットワークスタックembassy-net-wiznet: W5500 ドライバembassy-time: 時間管理defmt: ログ出力
MIT License
本プロジェクトは Pico-GPS-L76K モジュールを使用しています。このモジュールは:
- チップ: MediaTek MT3339
- プロトコル: NMEA 0183
- ボーレート: 9600bps(デフォルト)
- 対応センテンス: GPRMC, GPGGA(解析済み)
GPSモジュールは以下の情報を提供します:
- 緯度・経度(度単位)
- UTC時刻・日付
- 衛星数
- 高度(メートル)
- 速度(ノット)
- 位置情報の有効性(Fix状態)
