最終更新日:2023/3/10
※2023年3月13日 サンプルスケッチをレタッチしています。
WizFi360-EVB-PICO入手から遅れて一ヶ月、W5500-EVB-PICOを入手しました。DigiKeyに入荷した様で、マルツオンラインにアナウンスがありました。DigiKeyから購入すれば良いのですが、送料無料の閾値の関係でマルツオンラインを愛用しています。
そこそこ流通している商品だから国内在庫を持って欲しいところですが致し方無しです。
※ちなみに商品は5日ほどで届いたのですが、発送先は福井県のマルツオンライン福井営業所 (福井二の宮店)です。早速動作確認しようとW5100S-EVB-PICO用に作成したスケッチを試し書きしたのですが、シリアルポート検索に失敗して書き込めませんでした。もちろんコンパイルの通るスケッチです。その後もシリアルポートの認識まで時間が掛かりました。
- PCにはW5100S-EVB-PICOでシリアルポートが認識されるように仮想ドライバはインストール済みなのですが、共通認識はしないようです。
- UF2ファイルによる操作を検討してまずはシリアルポートが認識出来るようにしないとArduinoIDEでの使用は困難かと思います。
- 工場出荷時の状態が気になるところです。電源供給してもLED_Blinkするわけではありません。
この辺りの情報もメーカ側は提供して欲しいですねまずはこれまでの経験から “adafruit-circuitpython-raspberry_pi_pico-ja-7.2.1.uf2”を使用してcircuitpython環境に更新する事にしました。
結果ですが、ArdinoIDEを起動してシリアルポートの確認をしましたが認識しませんでした。続いて、MicroPython環境の“rp2-pico-20220618-v1.19.1”を試して見ましたが 改善しませんでした。
次に“Blink.ino.elf.uf2”を試したところ、シリアルポートを認識しました。プログラムコードの書込も成功しました。ところが実行しないです。pingが通らないことからW5500の初期化がうまくゆかない事が伺えます。
- “Blink.ino.elf.uf2”はNano RP2040 の工場出荷時ファイルで、Arduinoが提供しています。
https://content.arduino.cc/assets/Blink.ino.elf.uf2- とりあえずBlinkを書き込んでみました。ちゃんと動作したためW5500の初期化方法の間違いだと確認しました。
ちなみに“Blink.ino.elf.uf2”はスケッチを書き込んだ時点でシリアルポートは認識されなくなります。
従って、“Blink.ino.elf.uf2”を書き込んだ後、デバイスマネージャでドライバの更新登録は必須です。さて、W5500のNICポートの動作確認をするにはどうすれば良いのか?というのも、サンプルスケッチでWebServerはあれどWiFi.hをインクルードしている等々W5500-EVB-PICOでは使えないのです。
一方でWiznetが提供しているW5500用のライブラリEthernet3.hだとWebServerのサンプルスケッチはビルドは通るモノの動きません。多分アクセスpinの設定をしないと使えないのだと思います。だからpingさえ通らない状況だと思います。メーカであるWiznetはW5500-EVB-PICO用のサンプルスケッチを提供していないのか、調べて見ました。
Wiznetのフォーラムにw5500-evb-pico arduino IDE, direct ethernet connection not working
というぴったりのスレッドがありました。内容を確認すると、ちょっと的違いでした。
このスレッドはW5500-EVB-PICOをスイッチングHUBを介してTCPソケット通信する分には問題無く実現出来たがHUBを介さず直接LANケーブル接続すると通信できないと云う現象に対し、W5500がAutoMDIXに対応していないという結論で解決としています。クロスLANケーブルを使用して通信を確認出来たためとしています。WiznetのサイトにW5500-EVB-PICO/W5100S-EVB-PICOの初期化に関して、Setup()内でEthernet.begin()の前にEthernet.init(17)を実行するとありました。しかし、実際にコーディングして実行しましたがダメですね。
シリアルポートにIPアドレスを表示されて見たところIPアドレスを取得出来ていないことを確認出来ました。IP unset と表記されました。Ethernet.init(17)が何を意味しているのか考えました。17というのはSPI_CSpinのことのようです。PinMapを確認するとそう考えられます。とするならば、Setup()内でpinの設定をきちんとしておいた方がいいのかと考えました。
#include <SPI.h> #include <Ethernet.h> #define SPI_SCK 18 #define SPI_TX 19 #define SPI_RX 16 #define SPI_CS 17 SPI.setSCK(SPI_SCK); SPI.setRX(SPI_RX); SPI.setTX(SPI_TX); SPI.setCS(SPI_CS); SPI.begin(); Ethernet.init(SPI_CS); Ethernet.begin(mac,ip);結果ですが、やはりIP unsetです。何か間違いがありそうです。
17というのが物理的な17番pinとした場合#include <SPI.h> #include <Ethernet.h> #define SPI_SCK 14 #define SPI_TX 15 #define SPI_RX 16 #define SPI_CS 17 SPI1.setSCK(SPI_SCK); SPI1.setRX(SPI_RX); SPI1.setTX(SPI_TX); SPI1.setCS(SPI_CS); SPI1.begin(); Ethernet.init(SPI_CS); Ethernet.begin(mac,ip);結果ですが、やはりIP unsetです。Pinmapを見る限りEthernet.init(17)の17はGP17と解釈する方が正しいと思うのですが、結果が伴わないので悩んでいます。
#include <Ethernet3.h>
を使う事で解決しないか検討しました。
#include <SPI.h> #include <Ethernet3.h> #define SPI_SCK 18 #define SPI_TX 19 #define SPI_RX 16 #define SPI_CS 17 #define NICReset 20 #define NICInit 21 ・・・ SPI.setSCK(SPI_SCK); SPI.setRX(SPI_RX); SPI.setTX(SPI_TX); SPI.setCS(SPI_CS); SPI.begin(); Ethernet.setCsPin(SPI_CS); Ethernet.setRstPin(NICReset); digitalWrite(NICReset,LOW); delay(10); digitalWrite(NICReset,HIGH); Ethernet.init(SPI_CS); Ethernet.begin(mac,ip);これを実施したところ、PINGが通るようになりました。このことからNICResetPinがLOW固定になってしまっているのでは無いかと考えました。そこで、
#include <SPI.h> #include <Ethernet.h> #define SPI_SCK 18 #define SPI_TX 19 #define SPI_RX 16 #define SPI_CS 17 #define NICReset 20 ・・・ SPI.setSCK(SPI_SCK); SPI.setRX(SPI_RX); SPI.setTX(SPI_TX); SPI.setCS(SPI_CS); SPI.begin(); digitalWrite(NICReset,HIGH); Ethernet.init(SPI_CS); Ethernet.begin(mac,ip);と変更して実行したところPINGが通りました。仮定は合っていたようです。外部モジュールのW5500はResetピンはちゃんとPullUpされているのでは無いかと思われます。しかしW5500-EVB-PICO/W5100S-EVB-PICOはそうはなっていないのでは無いかと思います。
以下は“WebServer”のサンプルスケッチをレタッチして、動作確認できたモノです。AI0..2まで使うようにしています。
/* * 2023/3/8 T.Wanibe W5500-EVB-PICOで動作するWeb Serverレタッチ版です。 * ピン番号はGPxxで指定します。 * SPIは16/17/18/19 * NICRESETピンは20 HIGHにPULLUPするか意図的にHIGHを書き込みます * NICINITピンは21 * AI_0は26,_1は27_2は28です。 * 以下はオリジナルコメントです。 * Web Server * * A simple web server that shows the value of the analog input pins. * using an Arduino Wiznet Ethernet shield. * * Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 * Analog inputs attached to pins A0 through A5 (optional) * * created 18 Dec 2009 * by David A. Mellis * modified 9 Apr 2012 * by Tom Igoe * */ #include <SPI.h> #include <Ethernet.h> #define SPI_SCK 18 #define SPI_RX 16 #define SPI_TX 19 #define SPI_CS 17 #define NICReset 20 // コントローラの MAC アドレスと IP アドレスを以下に入力します。 // IP アドレスは、ローカル ネットワークによって異なります。 byte mac[] = {0x00,0x08,0xDC,0x54,0x4D,0xE0}; //WIZNET byte ip[] = {192, 168, 0, 210}; // 使用する IP アドレスとポートでイーサネット サーバー ライブラリを初期化します。 // (ポート 80 は HTTP のデフォルトです): EthernetServer server(80); //------------- void setup() { pinMode(NICReset,OUTPUT); pinMode(SPI_CS,OUTPUT); // シリアル通信を開き、ポートが開くのを待ちます。 Serial.begin(115200); //while (!Serial) { // ; // シリアルポートが接続されるのを待ちます。 レオナルドにのみ必要 //} // イーサネット接続とサーバーを開始します。 SPI.setSCK(SPI_SCK); SPI.setRX(SPI_RX); SPI.setTX(SPI_TX); SPI.setCS(SPI_CS); SPI.begin(); // Ethernet.init(pin)を使用してCSピンを設定できます // W5500-EVB-PICOのCSピンはGP17です。pinmapで確認しまでょう digitalWrite(NICReset,HIGH); //リセットピンをHIGHに固定します Ethernet.init(SPI_CS); Ethernet.begin(mac,ip); // イーサネット ハードウェアの存在を確認する if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); while (true) { delay(1); // 何もしない、イーサネット ハードウェアなしで実行しても意味がない } } if (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet cable is not connected."); } server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); } //------------- void loop() { // 着信クライアントをリッスンする EthernetClient client = server.available(); if (client) { Serial.println("new client"); // http リクエストは空白行で終了します boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); // 行末まで到達し (改行文字を受信)、行が空白の場合、 //http 要求は終了しているので、返信を送信できます。 if (c == '\n' && currentLineIsBlank) { // 標準の http 応答ヘッダーを送信する client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // 接続は応答の完了後に閉じられます client.println("Refresh: 5"); // 5 秒ごとにページを自動的に更新する client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); // 各アナログ入力ピンの値を出力 for (int analogChannel = 0; analogChannel < 3; analogChannel++) { int sensorReading = analogRead(analogChannel+26); client.print("analog input "); client.print(analogChannel); client.print(" is "); client.print(sensorReading); client.println("<br />"); } client.println("</html>"); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; }else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // Web ブラウザにデータを受信する時間を与える delay(1); // 接続を閉じます: client.stop(); Serial.println("client disconnected"); } }
これで先に進むことが出来ます。
W5500-EVB-PICOでWebserverを構築し、同等の機能を構築したBluePill+Wiz850ioとブラウザでの表示速度を比較したのですが、明らかにW5500-EVB-PICOの方が機敏に反応します。原因は幾つかあるのでしょう。
- RAMサイズ 264KB vs 20KB
- CPUクロック 133MHz vs 72MHz
- SPIのクロック 33MHz vs 8MHz
免責事項
本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。
商標・登録商標
Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。