最終更新日: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
このためビルド可能なコードがすぐに構築出来ました。
実際に実行するとなると、改めてレタッチが必要になります。
- サンプルスケッチはアナログ入力値をブラウザ表示していますが、RP2040の場合3chまでしか使えません。そして入力信号アサインもA0,A1,A2とする必要があります。
- SPI0を使うとしてpinアサインの定義は必要になります。
/* * 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")); } } |
これで動くようになりましたので、先に進む事が出来ます。
免責事項
本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。本ソフトウエアの著作権は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社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。