💻

Raspberry pi pico w上のArduinoVNCからRaspberry pi 4上のTigerVNCサーバーにアクセスする話

に公開

はじめに

Raspberry pi picoをネットワークに接続して利用する実験を色々行っています。
参考になる資料を探していると、Raspberry pi pico wをVNCクライアントとして活用しているプロジェクトを見つけました。
プロジェクトの作者以外の動作実績の情報がない中、実際の動作に成功したので、その方法を記録しました。

VNC

VNCはVirtual Network Computingの略で、Wikipediaによると、ネットワーク上の離れたコンピュータを遠隔操作するためのRFBプロトコルを利用する、リモートデスクトップソフトと説明されています。
https://ja.wikipedia.org/wiki/Virtual_Network_Computing
Raspberry piのデスクトップにモニターやキーボードをつながずに、他のコンピュータからRaspberry piのデスクトップ環境を利用する際に、よく用いられています。

ArduinoVNC

ArduinoVNCはESP32とILI9341とを組み合わせて作成するVNCのクライアントです。

https://github.com/Links2004/arduinoVNC.git

2019年ごろの公開以降、多くのESP32を搭載したボードでの動作例が報告されています。
無線LANの機能を搭載したRaspberry pi pico wにも移植されています。

https://www.instructables.com/Playing-Pico-W-With-Arduino-IDE/

https://github.com/moononournation/ArduinoVNC

将来、ArduinoVNCのネットワークや描画環境を修正して利用する計画があるので、公開されている情報に従って、再現実験を行いました。

TigerVNCサーバーをインストールする

この記事では、Raspberry pi OSのバージョンがbookwormの環境にアクセスします。
このOSでは、RealVNCサーバーを動かすことが多いのですが、ArduinoVNCがサーバーアクセスの認証に失敗します。
そこで、TigerVNCサーバーをインストールし、TigerVNCサーバーにArduinoVNCでアクセスすることとしました。

ArduinoVNCの修正箇所

公開されている情報だけでは、スケッチをビルドできなかったので、いくつか修正を行いました。
まずは、作者の説明に従って、ライブラリをArduinoIDEに追加します。

https://www.instructables.com/Arduino-Thin-Client/

miniz.hが無いとビルドが止まってしまいます。
以下のzipから「miniz.h」、「miniz.c」をスケッチと同じディレクトリに追加します。

https://github.com/richgel999/miniz/releases/download/2.1.0/miniz-2.1.0.zip

さらに、追加された「miniz.c」の先頭に

#define MINIZ_NO_STDIO

を追記します。
次は、スケッチ関連の修正です。
主にVNC.cppとArduinoVNC-pico.inoの修正です。
修正箇所は、文末にパッチとしてまとめています。

個人の環境に合わせて修正しなければいけないArduinoVNC-pico.inoの箇所は以下の通り。

const char *SSID_NAME = "YourAP";
const char *SSID_PASSWORD = "PleaseInputYourPasswordHere";

"YourAP"には使用するアクセスポイント名を、"PleaseInputYourPasswordHere"には使用するアクセスポイントのパスワードを記入します。

const char *VNC_IP = "192.168.12.34";
const uint16_t VNC_PORT = 5901;
const char *VNC_PASSWORD = "PleaseInputYourPasswordHere";

"192.168.12.34"の部分にVNCサーバーのIPアドレスを、"PleaseInputYourPasswordHere"の部分には、VNCサーバーにアクセスするときに使うパスワードを記入します。

ArduinoVNCの動作

これまでの修正や環境に合わせた設定を書き込んでスケッチをビルドします。
生成したuf2ファイルをRaspberry pi pico wに保存すると、画面に「NO WIFI!」と大きく表示され「Init Wifi」が成功すると、接続先のRaspberry pi OSのデスクトップが表示されます。

サーバーのデスクトップが表示されなくても、シリアルモニタで起動プロセスを確認できるように修正したスケッチを使っているので、起動がどこまで進んだかがわかります。
Pico w側のLCDに画面が映らないときには、起動プロセスのメッセージを確認して、不具合を修正してください。

おわりに

Raspberry pi pico wとLCDの組み合わせでVNCクライアントを作成しました。
修正したスケッチをベースに目的の環境での実験に進む予定です。
今回使用したスケッチはアクセスポイントとVNCサーバーの情報を書き込んだスケッチなので、初回
立ち上げ時に入力して記録する方法に改良する予定です。
さらに、PICO-PICO-USBも使って、文字入力のできるシンクライアントが作成できればと考えています。

https://github.com/sekigon-gonnoc/Pico-PIO-USB

また、bookwormにはwayvncが搭載されているので、こちらへの対応もできればと考えています。
RaspiConnectでDesktopにアクセスできる設定をする課題も残っています。

パッチファイル

Gemini-CLIにパッチファイルを作成してもらいました。
参考にしてください。

# Gemini-CLI Patch File
# Date: 2025-12-07
# This patch summarizes the changes made to solve the VNC connection issue.

--- a/Arduino/libraries/ArduinoVNC-main/src/VNC.cpp
+++ b/Arduino/libraries/ArduinoVNC-main/src/VNC.cpp
@@ -601,11 +601,13 @@
   /* read the protocol version the server uses */
   if (!read_from_rfb_server(sock, (char *)&msg, sz_rfbProtocolVersionMsg))
     return false;
-
+  
+  DEBUG_VNC("VNC Server RAW protocol version: %s", msg);
+  
   // RFB xxx.yyy
-  if (msg[0] != 'R' || msg[1] != 'F' || msg[2] != 'B' || msg[3] != ' ' || msg[7] != '.')
+  if (msg[0] != 'R' || msg[1] != 'F' || msg[2] != 'B' || msg[3] != ' ')
   {
     DEBUG_VNC("[_rfb_negotiate_protocol] Not a valid VNC server\n");
     return false;

--- a/Arduino/ArduinoVNC-pico/ArduinoVNC-pico.ino
+++ b/Arduino/ArduinoVNC-pico/ArduinoVNC-pico.ino
@@ -220,8 +220,8 @@
   DEV_DEVICE_INIT();
 #endif
 
-  Serial.begin(115200);
-  // Serial.setDebugOutput(true);
+  Serial.begin(115200); 
+  Serial.setDebugOutput(true);
   // while(!Serial);
   Serial.println("Arduino_GFX VNC example");

Discussion