PicoをLAN接続するためNIC接続したい

最終更新日:2022/3/22
作成日:2022/3/7


いろいろ検討しましたがArduino環境で使用出来るCPUモジュールでコストパフォーマンスが一番高いのはRaspberryPiPicoかと思います。\550(スイッチサイエンス)、\600(秋月電商)、その他、、、、

Wiz5100がはじめから割付られている開発ボードが存在しました。W5100S-EVB-PICO WIZnetがリリースしたモノで$9.95です。安い!
国内価格も¥1500前後のようです。

とはいうものの、自分がこのスレッドを書いたときの思いはWiz5500を使いたいという考えがありました。
と云う事で上記を参考にWiz5500が採用されたモジュールUSR-ES1とRaspberryPiPicoをSPI接続して見たいと思います。

RaspberryPiPicoにはSPIポートが2系統あります。W5100S-EVB-PICOを見るとSPI0を利用しているみたいです。そして、hackster.ioで紹介されている記事ではSPI1を採用しています。


とはいうものの配線は不便です。W5100S-EVB-PICOをGrove Shield for Pi Picoに接続したスマートな状態を画にして見ました。

UART0に M5Stack用GPSユニット を接続すれば GPS/NTPサーバが構築出来ます。
I2Cポートには様々なセンサユニットが接続出来ます。この形態でテストコードを書く事にしました。STM32miniShieldで作成したコードの移植ですが。


W5100S-EVB-PICOが入手困難なため、まずはW5500+PiPico+PicoShieldで動かしてみることにします。基本W5100S-EVB-PICOの接続に近づけます。
WizNet社はW5100S-EVB-PICOのArduino-Pico用サンプルスケッチを提供しています。
https://github.com/WIZnet-ArduinoEthernet/arduino-pico
このためビルド可能なコードがすぐに構築出来ました。
実際に実行するとなると、改めてレタッチが必要になります。

/*
 * 2022/03/22 T.Wanibe PiPico+W5500でWebServerを構築してみる。
 * WizNet社のサイトからサンプルスケッチが入手出来、ビルド出来る事を確認しました。
 * ただ、実機環境にあわせたレタッチは必要です。
 * 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
 * modified 02 Sept 2015
 * by Arturo Guadalupi
 * 最大2093056バイトのフラッシュメモリのうち、スケッチが69744バイト(3%)を使っています。
 * 最大262144バイトのRAMのうち、グローバル変数が11592バイト(4%)を使っていて、ローカル変数で250552バイト使うことができます。
 */
#include <SPI.h>
#include <Ethernet.h>           //Ethernet3.hはコンパイルエラーとなってしまう
int     count = 0;
char    buf4[4];
// コントローラのMACアドレスとIPアドレスを以下に入力します。
// IPアドレスは、ローカルネットワークによって異なります。
//byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte    mac[]           = {0x00,0x08,0xDC,0x54,0x4D,0xD7};              //WIZNET
//IPAddress ip(192, 168, 0, 207);
byte    ip[]            = {192, 168, 0, 207};
// 使用するIPアドレスとポートを使用してイーサネットサーバーライブラリを初期化します
//(ポート80はHTTPのデフォルトです):
EthernetServer  webServer(80);
//---------------------------
void setup() {
        //SPI0のpinアサインを設定
        SPI.setSCK(2);
        SPI.setRX(4);
        SPI.setTX(3);
        SPI.setCS(5);
        Ethernet.init(5);
        // Ethernet.init(pin)を使用してCSピンを設定できます
        //今回はPiPIcoShieldのSPI0を使うのでGPIO5が割り当てられます。
        //Ethernet.init(10);    // Most Arduino shields
        //Ethernet.init(5);     // MKR ETH shield
        //Ethernet.init(0);     // Teensy 2.0
        //Ethernet.init(20);    // Teensy++ 2.0
        //Ethernet.init(15);    // ESP8266 with Adafruit Featherwing Ethernet
        //Ethernet.init(33);    // ESP32 with Adafruit Featherwing Ethernet
        //Ethernet.init(17);    // WIZnet W5100S-EVB-Pico ※SPI1を使っている
        //
        pinMode(LED_BUILTIN, OUTPUT);
        digitalWrite(LED_BUILTIN, HIGH);
        // シリアル通信を開き、ポートが開くのを待ちます。:
        Serial.begin(115200);
        while (!Serial) {
                ;               // シリアルポートが接続するのを待ちます。 ネイティブUSBポートにのみ必要
        }
        Serial.println(F("Ethernet WebServer Example"));
        //
        // イーサネット接続とサーバーを起動します。
        Ethernet.begin(mac, ip);
        //
        // イーサネットハードウェアが存在するかどうかを確認します
        if (Ethernet.hardwareStatus() == EthernetNoHardware) {
                Serial.println(F("Ethernet shield was not found.  Sorry, can't run without hardware. :("));
                while (true) {
                        delay(1);       // 何もしない、イーサネットハードウェアなしで実行しても意味がない
                }
        }
        if (Ethernet.linkStatus() == LinkOFF) {
                Serial.println(F("Ethernet cable is not connected."));
        }
        // サーバーを起動します
        webServer.begin();
        Serial.print(F("server is at "));       Serial.println(Ethernet.localIP());
}
//---------------------------
void loop() {
        if(count++ % 2){
                digitalWrite(LED_BUILTIN, HIGH);
        }else{
                digitalWrite(LED_BUILTIN, LOW);
        }
        // 着信クライアントをリッスンする
        EthernetClient client = webServer.available();
        if (client) {
                Serial.println(F("new client"));
                // httpリクエストは空白行で終了します
                bool currentLineIsBlank = true;
                while (client.connected()) {
                        if (client.available()) {
                                char c = client.read();
                                Serial.write(c);
                                // 行の終わりに到達し(改行文字を受け取った)、行が空白の場合、httpリクエストは終了しています。
                                // 返信を送信できます
                                if (c == '\n' && currentLineIsBlank) {
                                        // 標準のhttp応答ヘッダーを送信します
                                        client.println(F("HTTP/1.1 200 OK"));
                                        client.println(F("Content-Type: text/html"));
                                        client.println(F("Connection: close"));         // the connection will be closed after completion of the response
                                        client.println(F("Refresh: 5"));                // refresh the page automatically every 5 sec
                                        client.println();
                                        client.println(F("<!DOCTYPE HTML>"));
                                        client.println(F("<html>"));
                                        // 各アナログ入力ピンの値を出力します RP2040は3ch
                                        int sensorReading;
                                        for (int analogCh = 0; analogCh < 3; analogCh++) {
                                                switch(analogCh){
                                                        case 0:
                                                                sensorReading   = analogRead(A0);
                                                                break;
                                                        case 1:
                                                                sensorReading   = analogRead(A1);
                                                                break;
                                                        case 2:
                                                        default:
                                                                sensorReading   = analogRead(A2);
                                                                break;                
                                                }
                                                client.print(F("analog input A"));
                                                client.print(analogCh);
                                                client.print(F(" is "));
                                                client.print(sensorReading);
                                                client.println(F("<br />"));
                                        }
                                        client.println(F("</html>"));
                                        break;
                                }
                                if (c == '\n') {
                                        // あなたは新しい行を始めています
                                        currentLineIsBlank = true;
                                } else if (c != '\r') {
                                        // あなたは現在の行にキャラクターを持っています
                                        currentLineIsBlank = false;
                                }
                        }
                }
                // Webブラウザにデータを受信する時間を与えます
                delay(1);
                // 接続を閉じます:
                client.stop();
                Serial.println(F("client disconnected"));
        }
}

これで動くようになりましたので、先に進む事が出来ます。


戯言(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社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。