やっとW5500-EVB-PICOを入手したのですが、認識しません。
【解決】NICのRESETピンがPULLUPされていないことが原因でした。

最終更新日:2023/3/10

2023年3月23日 ModbusTCPSlaveの構築

2023年3月13日 サンプルスケッチをレタッチしています。

WizFi360-EVB-PICO入手から遅れて一ヶ月、W5500-EVB-PICOを入手しました。DigiKeyに入荷した様で、マルツオンラインにアナウンスがありました。DigiKeyから購入すれば良いのですが、送料無料の閾値の関係でマルツオンラインを愛用しています。
そこそこ流通している商品だから国内在庫を持って欲しいところですが致し方無しです。
※ちなみに商品は5日ほどで届いたのですが、発送先は福井県のマルツオンライン福井営業所 (福井二の宮店)です。

早速動作確認しようとW5100S-EVB-PICO用に作成したスケッチを試し書きしたのですが、シリアルポート検索に失敗して書き込めませんでした。もちろんコンパイルの通るスケッチです。その後もシリアルポートの認識まで時間が掛かりました。

まずはこれまでの経験から “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の初期化がうまくゆかない事が伺えます。

さて、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の方が機敏に反応します。原因は幾つかあるのでしょう。


戯言(nonsense)に戻る


問い合わせ頁の表示


免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権は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社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。