はじめに (対象読者・この記事でわかること)

この記事は、高性能なSpresenseボードとArduino IDEを活用した開発に興味がある方、特にIoTデバイスで安定した有線ネットワーク通信を実装したいと考えている方を対象としています。また、組み込みシステムでのネットワーク構築に初めて挑戦する方にも、具体的な手順を通じて理解を深めていただける内容となっています。

この記事を読むことで、Spresense-Arduino環境でW5500イーサネットモジュール(またはW5500を搭載したイーサネットシールド)を効果的に設定し、簡単なネットワーク通信(Webサーバーの実装)を行う方法がわかります。具体的には、必要なハードウェアの準備、W5500モジュールとSpresenseボードの正確な配線、Arduino IDEでのライブラリ導入とサンプルコードの修正、そして一般的なトラブルシューティングの手順を習得できます。これにより、安定性と信頼性が求められるIoTプロジェクトにおいて、有線LAN通信を自信を持って導入できるようになるでしょう。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - Arduino IDEの基本的な操作(ボードの選択、書き込みなど) - Spresenseボードの基本的な使い方 - 電子部品の基本的な知識(ブレッドボード、ジャンパー線、抵抗など) - ネットワークの基本的な知識(IPアドレス、MACアドレス、TCP/IPの概念)

Spresenseとイーサネット:なぜ有線通信を選ぶのか

Sony製のSpresenseは、低消費電力でありながらGPS、ハイレゾオーディオ、カメラといった多機能を提供する、IoT開発に非常に強力なボードです。Arduino IDEに対応しているため、手軽にプログラミングを始めることができます。一般的にIoTデバイスではWi-Fiのような無線通信が主流ですが、安定性やセキュリティが求められる特定の環境では、有線LAN(イーサネット)が優れた選択肢となります。

有線LANが選ばれる理由

無線LAN(Wi-Fi)は手軽で柔軟な配置が可能というメリットがありますが、以下のようなデメリットも存在します。 - 電波干渉: 他の無線機器や電子レンジなどから影響を受けやすく、通信が不安定になることがあります。 - セキュリティ: 無線通信ゆえに盗聴や不正アクセスのリスクが有線に比べて高まります。適切な暗号化設定が必須です。 - 通信速度・遅延: 混雑状況によっては通信速度が低下したり、遅延が発生したりする可能性があります。

一方、有線LAN(イーサネット)はこれらの課題を克服できます。 - 安定性・信頼性: 物理的なケーブルで接続されているため、電波干渉の影響を受けず、非常に安定した通信が可能です。 - 高速性: 一般的に無線LANよりも高速で、大容量のデータ転送やリアルタイム性が求められるアプリケーションに適しています。 - セキュリティ: ケーブルに物理的に接続しない限り、外部からのアクセスが困難であり、無線に比べてセキュリティリスクが低減されます。 - リアルタイム性: 遅延が少なく、正確なタイミングでのデータ送受信が求められる産業用IoTや制御システムに最適です。

このような背景から、工場内のセンサーネットワーク、監視カメラシステム、医療機器、データセンターなど、安定性、セキュリティ、リアルタイム性が極めて重要視されるIoTアプリケーションでは、有線LANが積極的に採用されています。 W5500イーサネットモジュールは、SPIインターフェースを通じて簡単にイーサネット機能を追加できるICであり、Arduino互換ボードで広く利用されています。SpresenseでもこのW5500モジュールを使用することで、手軽に有線LAN通信を実現できます。

Spresense-ArduinoでW5500イーサネットモジュールを使う手順

ここでは、SpresenseボードにW5500イーサネットモジュールを接続し、Arduino IDEで簡単なWebサーバーを構築するまでの具体的な手順を解説します。

ステップ1:ハードウェアの準備と配線

まず、必要な部品を準備し、SpresenseボードとW5500イーサネットモジュールを接続します。

必要なもの

  • Spresenseボード (メインボード、および拡張ボード)
  • W5500イーサネットモジュール (またはW5500搭載のイーサネットシールド)。今回はSPIインターフェースを持つ汎用モジュールを想定します。
  • ブレッドボード (配線補助用、任意)
  • ジャンパー線 (オス-オス、オス-メス)
  • Micro USBケーブル (Spresenseの電源供給とPC接続用)
  • LANケーブル (イーサネットモジュールとルーター/ハブを接続用)
  • PC (Arduino IDEがインストール済み)

W5500とSpresenseの接続

W5500モジュールはSPI(Serial Peripheral Interface)通信を利用してSpresenseとデータをやり取りします。Spresense拡張ボードのピン配置を確認しながら、以下のピンを接続してください。

W5500モジュールピン Spresense拡張ボードピン Spresenseメインボードピン (GPIO番号) 機能
VCC 3.3V (電源) - 電源 (3.3V)
GND GND (GND) - グランド
SCK D41 SP_GPIO08 SPIクロック
MISO D43 SP_GPIO10 SPIデータ入力
MOSI D40 SP_GPIO07 SPIデータ出力
CS D32 (任意) SP_GPIO00 (任意) チップ選択
RST D33 (任意) SP_GPIO01 (任意) リセット

接続の注意点: - 電源: W5500モジュールは通常3.3Vまたは5Vで動作しますが、Spresenseのロジックレベルに合わせて3.3V電源を使用することをお勧めします。Spresense拡張ボードの3.3Vピンから供給してください。 - CSピン (Chip Select): D32 (SP_GPIO00) を使用していますが、これは任意のデジタルピンで構いません。使用するピンに合わせて後でコードを修正します。 - RSTピン (Reset): D33 (SP_GPIO01) を使用していますが、これも任意のデジタルピンで構いません。このピンを使用することで、プログラムからW5500のリセットを制御できます。もしモジュールにRSTピンが存在しない、または使用しない場合は、配線は不要です。

配線が完了したら、W5500モジュールにLANケーブルを接続し、もう一方をルーターまたはハブに接続してください。

ステップ2:Arduino IDEの設定とサンプルコード

Spresenseボードのセットアップ

Arduino IDEにSpresenseボードマネージャーをインストール済みであることを前提とします。もし未導入の場合は、以下の手順でインストールしてください。 1. ファイル -> 環境設定 を開きます。 2. 「追加のボードマネージャーのURL」に https://raw.githubusercontent.com/sonydevworld/spresense-arduino-compatible/master/package_spresense_index.json を追加します。 3. ツール -> ボード -> ボードマネージャー を開きます。 4. 検索窓で「Spresense」と入力し、表示された「Spresense」をインストールします。

Ethernet2ライブラリのインストール

W5500チップは標準のEthernetライブラリではなく、Ethernet2ライブラリを使用するのが一般的です。 1. Arduino IDEの スケッチ -> ライブラリをインクルード -> ライブラリを管理… を開きます。 2. 検索窓で「Ethernet2」と入力します。 3. 表示された Ethernet2 ライブラリを選択し、「インストール」ボタンをクリックします。

サンプルコードの準備と修正

インストールしたEthernet2ライブラリには、W5500モジュールを使ってWebサーバーを構築するサンプルコードが含まれています。 1. ファイル -> スケッチの例 -> Ethernet2 -> WebServer を開きます。 2. 開いたスケッチを以下のように修正します。

Cpp
#include <SPI.h> #include <Ethernet2.h> // W5500に対応したEthernet2ライブラリを使用 // W5500のCSピンとRSTピンを定義 (Spresenseに接続したピン番号に合わせる) #define ETHERNET_CS_PIN 32 // SpresenseのD32に接続 #define ETHERNET_RST_PIN 33 // SpresenseのD33に接続 (使用しない場合はコメントアウトまたはピン番号を変更) // MACアドレスを設定 // 各デバイスで一意なアドレスを設定してください。 // 通常は0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED などのテスト用アドレスが使われますが、 // ネットワーク内で競合しないように注意してください。 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // IPアドレスを設定 (ルーターのDHCP範囲外の固定IPを推奨) // ご自身のネットワーク環境に合わせて変更してください。 IPAddress ip(192, 168, 1, 177); // 例: 192.168.1.xxx // イーサネットサーバーをポート80で初期化 // EthernetServer server(80); // DHCPを使用する場合はこれを使用 void setup() { Serial.begin(115200); while (!Serial) { ; // シリアルポートが開くまで待機 (Leonardo, Esplora, Micro, Dueの場合) } // W5500のリセットピンを制御する場合 pinMode(ETHERNET_RST_PIN, OUTPUT); digitalWrite(ETHERNET_RST_PIN, HIGH); delay(10); digitalWrite(ETHERNET_RST_PIN, LOW); delay(10); digitalWrite(ETHERNET_RST_PIN, HIGH); delay(100); // SPIバスの初期化 (SpresenseではデフォルトのSPIポートを使用) // 必要であれば、SPI.setClockDivider()などで速度調整が可能ですが、W5500は高速SPIに対応しています。 // Ethernetモジュールの初期化 // イーサネットチップのCSピンを指定して初期化します // Ethernet.begin(mac, ip); の前に、Ethernet.setCsPin(ETHERNET_CS_PIN); を呼び出す Ethernet.setCsPin(ETHERNET_CS_PIN); // CSピンを設定 // DHCPを使用しない固定IPアドレス設定 Ethernet.begin(mac, ip); // DHCPを使用する場合は以下のコメントを解除し、上記のEthernet.begin(mac, ip); をコメントアウト /* Serial.println("Attempting to get an IP address using DHCP"); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // DHCP失敗時に固定IPを設定することも可能 Ethernet.begin(mac, ip); } */ // サーバーの開始 EthernetServer server(80); // begin()の後で定義が必要 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); if (c == '\n' && currentLineIsBlank) { // HTTPヘッダーの終わり // HTTPレスポンスを送信 client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head><meta charset='UTF-8'><title>Spresense Web Server</title></head>"); client.println("<body>"); client.println("<h1>Hello from Spresense!</h1>"); client.println("<p>This is a simple web server running on Spresense with W5500 Ethernet module.</p>"); client.println("<p>Current Uptime: "); client.println(millis() / 1000); // 起動からの秒数を表示 client.println(" seconds</p>"); client.println("</body></html>"); break; } if (c == '\n') { // 改行が来たら新しい行 currentLineIsBlank = true; } else if (c != '\r') { // 改行でもなく復帰でもなければ、行は空ではない currentLineIsBlank = false; } } } // クライアントが切断されるのを待機 delay(1); client.stop(); Serial.println("client disconnected"); } }

修正ポイント: - #define ETHERNET_CS_PIN#define ETHERNET_RST_PIN で、Spresenseに接続したCSピンとRSTピンの番号を正確に定義します。 - byte mac[] で、デバイス固有のMACアドレスを設定します。ネットワーク内で重複しないように注意してください。 - IPAddress ip() で、Spresenseに割り当てる固定IPアドレスを設定します。ご自身のネットワーク環境に合わせて、ルーターのDHCP範囲外のIPアドレスを選んでください。DHCPを使用する場合は、コメントアウトされている部分を参考にコードを修正します。 - setup() 関数内で、Ethernet.setCsPin(ETHERNET_CS_PIN); を呼び出して、W5500のCSピンをライブラリに教える必要があります。この行は Ethernet.begin() の前に記述してください。 - EthernetServer server(80); のインスタンスは Ethernet.begin() の後に定義するように移動しました。これは、Arduino IDEの特定のコンパイラバージョンやライブラリの内部動作によっては、イーサネットコントローラが初期化される前にサーバーが初期化されると問題が生じる場合があるためです。

Spresenseへの書き込み

  1. Arduino IDEの ツール -> ボードSpresense を選択します。
  2. ツール -> ポート で、Spresenseボードが接続されているCOMポートを選択します。
  3. 書き込みボタンをクリックして、スケッチをSpresenseボードにアップロードします。

書き込みが完了したら、シリアルモニタを開いてSpresenseが取得したIPアドレスを確認してください。PCのWebブラウザでそのIPアドレスにアクセスすると、「Hello from Spresense!」というメッセージが表示されるはずです。

ハマった点やエラー解決

SpresenseとW5500イーサネットモジュールを使っていて、よく遭遇する問題とその解決策をいくつか紹介します。

  • Pingが通らない、Webページにアクセスできない:
    • 配線ミス: 最も多い原因です。特にSPI通信のSCK, MISO, MOSI, CSピン、そしてVCC/GNDの接続を何度も確認してください。ジャンパー線の緩みがないか、ピンが正しく挿入されているかチェックしましょう。
    • CSピンの指定ミス: コード内の ETHERNET_CS_PIN の定義が、実際にW5500のCSピンを接続したSpresenseのデジタルピン番号と一致しているか確認してください。
    • IPアドレスの衝突または設定ミス:
      • ネットワーク内の他のデバイスと同じIPアドレスを設定していないか確認します。
      • 設定したIPアドレスが、ご自身のルーターのDHCP範囲外であり、かつルーターと同じサブネット内にあるかを確認します(例: ルーターが 192.168.1.1 なら、Spresenseは 192.168.1.xxx)。
    • MACアドレスの競合: 複数のイーサネットデバイスが同じMACアドレスを使用していると通信できません。各デバイスで一意なMACアドレスを設定してください。
    • Ethernet2ライブラリの使用: W5500モジュールはEthernetではなくEthernet2ライブラリを使う必要があります。正しいライブラリがインクルードされているか確認してください。
    • W5500モジュール自体の故障: 他のArduinoボードなどでモジュールが正常に動作するかテストしてみるのも一つの方法です。
    • LANケーブルの接続不良: ケーブルが奥までしっかりと差し込まれているか、ケーブル自体が断線していないか確認してください。モジュールのLEDが点灯しているかどうかも確認ポイントです。
    • SpresenseのSPIバスの初期化: SpresenseのSPIポートが正しく初期化されているか確認します。通常、SPI.begin()Ethernet2.begin()の内部で呼び出されますが、まれに明示的に呼び出す必要がある場合もあります。
  • Arduino IDEでのコンパイルエラー:
    • ライブラリの競合: EthernetライブラリとEthernet2ライブラリが同時にインストールされていると、競合が発生する場合があります。不要な方をアンインストールしてみてください。
    • ボード設定ミス: ツール -> ボードSpresenseが選択されているか確認します。
  • シリアルモニタに何も表示されない:
    • Serial.begin(115200); のボーレートがシリアルモニタの設定と一致しているか確認してください。
    • Spresenseボードの電源が入っているか確認してください。

解決策

上記の問題に遭遇した場合の具体的な解決策は以下の通りです。

  1. 徹底的な配線チェック: まずは落ち着いて、電源オフの状態で全ての配線を一つずつ再確認します。特にSPIピンのMOSIとMISOが入れ替わっていないか、CSとRSTが正しいピンに接続されているかを確認してください。可能であれば、ブレッドボードを使わずに直接ワイヤーで接続し、接触不良のリスクを減らします。
  2. シリアルモニタでのデバッグ: スケッチに Serial.println() を追加し、プログラムの実行状況、特にIPアドレスの取得状況やエラーメッセージを出力するようにします。例えば、Ethernet.begin() の戻り値を確認するなど、段階的に情報を出力させることで、どこで問題が発生しているかを特定しやすくなります。
  3. ネットワーク環境の確認:
    • コマンドプロンプトやターミナルで ipconfig (Windows) や ifconfig (Linux/macOS) を実行し、PCのIPアドレスとサブネットマスクを確認します。Spresenseに設定するIPアドレスが同じサブネット内にあることを確認します。
    • ルーターの設定画面にアクセスし、DHCPで割り当てられるIPアドレスの範囲を確認します。Spresenseに固定IPを設定する場合は、この範囲外のIPアドレスを選びましょう。
    • ping <SpresenseのIPアドレス> コマンドをPCから実行し、Spresenseがネットワーク上で応答するか確認します。
  4. W5500のリセット処理: setup() 関数内で、W5500のリセットピンを一時的にLOWに落とし、HIGHに戻す処理(上記サンプルコード参照)を確実に行うことで、モジュールが正常に初期化される可能性が高まります。
  5. サンプルコードからの段階的な変更: もし自分で書いたコードでうまくいかない場合、一度Ethernet2ライブラリの最もシンプルなサンプル(例: DHCPAddressPrinterStaticAddressPrinter)を試してみて、IPアドレスが正常に取得できるか確認します。そこから段階的にWebサーバーのコードを追加していくと、問題の切り分けがしやすくなります。

これらの手順を踏むことで、ほとんどの通信問題を解決できるはずです。

まとめ

本記事では、Spresense-Arduino環境において、W5500イーサネットモジュールを利用して堅牢な有線LAN通信を確立する方法を解説しました。安定性と信頼性が求められるIoTプロジェクトにとって、有線通信は非常に有効な選択肢となります。

  • SpresenseとW5500の物理的な配線方法: SPI通信の各ピンと電源、GNDを正確に接続する手順を説明しました。特にCSピンとRSTピンの適切な設定が重要です。
  • Arduino IDEでのEthernet2ライブラリの導入とサンプルコードの修正: W5500に対応したEthernet2ライブラリをインストールし、既存のWebServerサンプルコードをSpresenseと自身のネットワーク環境に合わせて修正する方法を示しました。
  • 有線ネットワーク通信を安定的に確立するためのデバッグとトラブルシューティング: 配線ミス、IPアドレスの衝突、ライブラリの競合など、よくある問題とその具体的な解決策を提示しました。

この記事を通して、読者の皆様はSpresenseで堅牢なネットワーク通信を構築するスキルを習得し、IoTデバイスの可能性をさらに広げる知識を得られたことでしょう。Wi-Fiではカバーしきれない環境や、高い信頼性が求められるアプリケーションにおいて、Spresenseとイーサネットモジュールの組み合わせは大いに役立ちます。

今後は、今回構築したWebサーバー機能の拡張(例:センサーデータのリアルタイム表示)、MQTTなどのIoTプロトコルを利用したクラウド連携、複数のSpresenseデバイス間での通信など、さらに発展的な内容についても記事にする予定です。

参考資料