Raspberry Pi Pico WでWebMiteを使う〜Telnet、NTPを利用する

# はじめに

PicoMiteにはインターネット接続機能がないのでRaspberry Pi Pico WやPico 2 WのWi-Fiによるネットワーク接続を利用するにはPicoMiteの別バージョンのファームウェアWebMiteを利用する。（Raspberry Pi PicoでPicoMite(MMBasic)を使う〜インストール参照）
ファームウェアの書き換えは[[Raspberry Pi PicoでPicoMite(MMBasic)を使う〜インストール]]を参照。
ここではRaspberry Pi Pico 2 Wを利用してWebMiteの機能を確認する。

# Wi-Fiアクセスポイントへの接続

WebMiteでWi-Fi機能を利用するには`OPRION WIFI`コマンドを使う。このコマンドでWebMiteのWi-Fi機能が有効化され、WebMite（MMBasic）でネットワーク機能が利用できるようになる。

`OPTION WIFI`コマンドの構文は次の通り。

```
> OPTION WIFI ssid password
```

- ssid ： 接続するWi-Fiアクセスポイント（AP）のSSID文字列
- password ： APのパスワード文字列

ssidがAP-hogehoge、passwordはpasswordの場合は次のように入力する。ssidとpasswordは文字列なので"で囲むか、文字列型の変数を利用する。

```SHELL
> OPTION WIFI "AP-hogehoge", "password"
PICO0123456789A connecting to WiFi...
Connected 192.168.10.20
>
```

コマンドを実行するとRaspberry Pi Pico WまたはPico 2 Wは再起動し、APへの接続を試みるメッセージが表示される。上記のPICO0123456789Aの0123456789AはRaspberry Pi Pico WまたはPico 2 WのIDである（`PRINT MM.INFO(ID)`で確認できる）。

SSIDとパスワードが正しければ、APに接続され、上記のようにAPから割り当てられてたIPアドレスが表示される（上記の例では192.168.10.20）。

ssidやパスワードを間違ったりで接続に失敗した場合には下記のように接続失敗のメッセージが表示される。SSIDやパスワードを確認し、再度試す。

```SHELL
> OPTION WIFI "AP-hogehoge", "xxxxxxx"
PICO0123456789A connecting to WiFi...
failed to connect.
>
```

## 割り当てられたIPアドレスの確認

APからRaspberry Pi Pico WまたはPico 2 Wに割り当てられたIPアドレスは`MM.INFO(IP ADDRESS)`コマンドで取得できる。コマンドプロンプト下記のように実行する。

```
> PRINT MM.INFO(IP ADDRESS)
192.168.10.20
```

# Telnetによるリモートコンソールアクセス

WebMiteはTelnetによるリモートアクセスをサポートしているが有効化されていないので`OPTION TELNET CONSOLE`コマンドで有効化する。Telnetの有効化は次のコマンドを実行する。

```
> OPTION TELNET CONSOLE ON
```

このコマンドを実行するとWebMiteが再起動し、クライアントからの接続が可能になる。このコマンドは一度実行しておけば削除するまで消えない。

コマンドの引数は`ON`、`ONLY`、`OFF`のいずれかを指定する。それぞれの出力先を下表に示す。

|引数|コンソール出力先|
|:-:|-|
|ON|USBとTelnet|
|ONLY|Telnetのみ|
|OFF|USBのみ|

TelnetクライアントはmacOSの場合、macOS 10.13 High Sierraから削除されたので`Homebrew`などで別途インストールする必要がある。Windowsの場合、TeraTermを利用すればよい。

```
$ brew install telnet
```

macOSでTelnetによるアクセス例を以下に示す。

```SHELL
$ telnet 192.168.10.20  <- MacからPicoへのアクセス
Trying 192.168.10.20...
Connected to 192.168.10.20.
Escape character is '^]'.　<- Picoと接続を抜けるキー操作

> files
A:/
   <DIR>  .
   <DIR>  ..
00:00 01-01-2024          4  bootcount
18:58 09-04-2025          0  mand.bas
19:07 09-04-2025      38358  out.bmp
2 directories, 3 files, 2191360 bytes free
>     <- CTRL+]で切断
telnet> Connection closed. <- CTRL+DでTelnet終了
$ <- シェルに戻った
```

1. telnetコマンドの引数にRaspberry Pi Pico WまたはPico 2 WのIPアドレスを指定する。
2. Returnキーを押すとWebMiteのプロンプト＞が表示される
3. コマンドを実行
4. `CTRL+]`でWebMiteとの接続を切断する
5. `CTRL+D`でtelnetコマンドを終了

USB接続に比べると入力操作などが少しもっさりとした感じです。

# TFTPによるファイル転送

PicoMiteはXMODEMでのファイル転送のみだったがWebMiteではTFTPでのファイル転送も可能になっている。WebMiteはWi-Fiに接続するとTFTPサーバが起動するため特段の操作はありません。

※ TFTPはUDPを使用したコネクションレスの軽量なファイル転送プロトコルです。

## TFTPサーバの無効化・有効化

WebMiteのTFTPサーバは`OPTION TFTP`コマンドで無効化・有効化できます。
TFTPサーバの無効化はコマンドの引数に`OFF`を指定します。

```
> OPTION TFTP OFF
```

TFTPサーバの有効化はコマンドの引数に`ON`を指定します。ONがデフォルトで設定されています。

```
> OPTION TFTP ON
```

macOSには`tftp`コマンドが標準でインストールされているのでインストール不要です。

TFTPによるファイル送受信はmacOS側の操作のみでできます。ただし、tftpコマンドにはローカルおよびWebMite内のファイル一覧を取得する機能がないのでlsコマンドやWebMite内のファイル一覧はUSBあるいはTelnet接続したコンソールで`files`コマンドを実行して取得する必要があります。

## ファイルのアップロード（Mac → Pico）

MacからPico（WebMite）へのファイルのアップロードの手順は以下の通りです。USB接続コンソールを開いている場合は別のターミナルを開いて操作する。

1. `cd`コマンドでカレントディレクトリをアップロードするファイルのあるディレクトリに移動
2. `tftp`コマンドでWebMiteが動作しているRaspberry Pi Pico WまたはPico 2 Wに接続
3. 転送モードを`ascii`に変更（改行コードを変換）
4. `put`コマンドでファイルをアップロード
5. `quit`コマンドでtftpコマンドを終了

接続先のIPアドレスは192.168.10.20、Macでファイルの保存先ディレクトリが~/Documents/PicoCalcKit/src、転送するファイルがASCII-Table.basの場合の実行例を示します。

```SHELL
$ put ~/Documents/PicoCalcKit/src
$ tftp 192.168.10.20
tftp> mode ascii
tftp> put ASCII-Table.bas
Sent 89 bytes during 0.0 seconds in 1 blocks
tftp> quit
```

ファイルアップロード時にUSB接続のコンソールを開いていると下記のファイル作成要求と転送完了のメッセージが表示される。

> TFTP request to create ascii file : ASCII-Table.bas
> TFTP transfer complete

TFTPでアップロードされたファイルはフラッシュファイルシステムに保存されるので実行するときはプログラムメモリに`LOAD`コマンドでロードして実行か、`RUN`コマンドでファイル名を指定するか実行する。

```
> LOAD "ASCII-Table
> RUN

> RUN "ASCII-Table
```

## ファイルのダウンロード（Pico → Mac）

Pico（WebMite）からMacへのファイルのダウンロードの手順は以下の通りです。`get`コマンド以外はアップロード時と同じ操作です。

1. `cd`コマンドでカレントディレクトリをダウンロードするファイルを保存するディレクトリに移動
2. `tftp`コマンドでWebMiteが動作しているRaspberry Pi Pico WまたはPico 2 Wに接続
3. 転送モードを`ascii`に変更（改行コードを変換）
4. `get`コマンドでファイルをダウンロード
5. `quit`コマンドでtftpコマンドを終了

接続先のIPアドレスは192.168.10.20、Macでファイルの保存先ディレクトリが~/Documents/PicoCalcKit/src、転送するファイルがASCII-Table.basの場合の実行例を示します。

```SHELL
$ put ~/Documents/PicoCalcKit/src
$ tftp 192.168.10.20
tftp> mode ascii
tftp> get ASCII-Table.bas
Sent 82 bytes during 0.0 seconds in 1 blocks
tftp> quit
```

アップロードの場合と同様にファイルのダウンロード時にUSB接続のコンソールを開いていると下記のファイル読み出し要求と転送完了のメッセージが表示される。

> TFTP request to read ascii file : hat_mm.bas
> TFTP transfer complete

## バイナリファイルの転送

ファイル転送の多くはMMBasicのプログラムのテキストファイルとなので転送モードはASCIIを指定するが画像などのバイナリファイルを転送する場合には転送モードを`binary`にする。

TFTP接続された状態でモードの変更、Pico上にあるビットマップファイルhat.bmpをダウンロードする例を示す。

```
tftp> mode binary
tftp> get hat.bmp
Received 38358 bytes during 0.4 seconds in 75 blocks
```

USB接続のコンソールには以下のメッセージが表示される。

> TFTP request to read binary file : hat.bmp
> TFTP transfer complete

# NTPからの時刻取得

WebMiteはインターネットアクセスできるので`WEB NTP`コマンドを使用してNTPサーバから時刻を取得しPicoの時刻を設定できる。

`WEB NTP`コマンドの構文は次の通り。

```
WEB NTP [timeoffset [,NTPserver$]
```

|オプション|説明|
|-|-|
|timeoffset|タイムゾーンの指定で、日本の場合は9（JST）を指定する。省略時はUTCとして設定される。|
|NTPserver$|時刻取得に利用するNTPサーバのIPアドレスまたはサーバ名。省略時はpool.ntp.orgが使用される。|

pool.ntp.orgのIPアドレスは世界中に分散したNTPサーバを仮想的にまとめて一つのプールとして提供されたもので`WEB NTP`コマンドを実行するたびに利用するNTPサーバが変わるようになっている。

タームゾーンを+9（JST）、NTPサーバは指定しない場合の実行例を示す。

```
> WEB NTP +9
ntp address 139.162.81.45
got ntp response: 24/05/2025 10:38:25
```

タイムゾーンを+9、NTPサーバをnpt.nict.jp（独立行政法人情報通信研究機構のNTPサーバ）を使う場合の実行例を示す。

```
> WEB NTP +9,"ntp.nict.jp"
ntp address 133.243.238.244
got ntp response: 24/05/2025 10:42:51
```

`WEB NTP`コマンドを`MM.STARTUP`サブルーチンに組み込んで日時を取得することはできないようです。MM.STARTUPサブルーチンがWi-Fiへの接続が確立する前に実行されることが原因のようだ。

手動で実行するか、実行するプログラムの冒頭に記述することになる。
プログラムレイト実行例を示す。

```BASIC:NTP-test.bas
Print 'Date & time test'
Print Date$;Time$
Print 'Get datetime from NTP'
WEB NTP +9
Print Date$;Time$
```

このプログラムを実行すると時刻が設定されることが分かる。

```
RUN

01-01-202400:00:07

ntp address 162.159.200.123
got ntp response: 24/05/2025 10:53:29
24-05-202510:53:29
```

# 参考サイトなど

- [UKTailwind/PicoMiteAllVersions](https://github.com/UKTailwind/PicoMiteAllVersions/blob/main/MMntp.c)
- [NTP Pool Project](https://www.ntppool.org/ja/)
- [PicoMite User Manual](https://geoffg.net/Downloads/picomite/PicoMite_User_Manual.pdf)