質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

7937閲覧

arduino イーサネット通信時のipアドレスが割りつかない事象について

beansan

総合スコア13

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2017/07/09 02:20

編集2017/07/20 12:11

arduinoにてウェブサーバーをつくることを第一目標にしています。
そのためにarduinoのwebserverサンプルプログラムを起動しましたが、うまく動きません。
(プログラム起動後にarduinoにPCからpingを飛ばしてもタイムアウトになる。)
どうやらEthernet.localIP()の出力が0.0.0.0となるのが悪いようです。

そのため、わかりやすいように下記プログラムを外部サイトから拾い、原因追及を行っています。
(このプログラムでも出力IPアドレスは0.0.0.0となっています。)
ipアドレスをうまく設定する方法はありますでしょうか。
ご回答いただけると幸いです。

#include <SPI.h> #include <Ethernet2.h> #include <EthernetUdp2.h> // MACアドレスの定義 byte mac_address[] = { 0x90, 0xA2, 0xDA, 0x10, 0xFA, 0x64 }; // IPアドレスの定義 byte IP_address[] = { 192, 168, 100, 100 }; // DNSサーバアドレスの定義 byte dns_address[] = { 192, 168, 100, 1 }; // ゲートウェイアドレスの定義 byte gateway_address[] = { 192, 168, 100, 1 }; // サブネットマスクの定義 byte subnet[] = { 255, 255, 255, 0 }; void setup() { // put your setup code here, to run once: Serial.begin(9600); // MACアドレス、IPアドレス、DNSサーバ、 // ゲートウェイサーバ、サブネットマスクを設定する。 Ethernet.begin(mac_address, IP_address, dns_address, gateway_address, subnet); Serial.print("IP Address: "); Serial.println(Ethernet.localIP()); Serial.print("Subnet Mask: "); Serial.println(Ethernet.subnetMask()); Serial.print("Gateway IP Address: "); Serial.println(Ethernet.gatewayIP()); Serial.print("DNS Server Address: "); Serial.println(Ethernet.dnsServerIP()); } void loop() { // put your main code here, to run repeatedly:

シリアルモニタの出力↓

IP Address: 0.0.0.0 Subnet Mask: 0.0.0.0 Gateway IP Address: 0.0.0.0 DNS Server Address: 192.168.100.1

なお、開発環境等は下記となります。
・マックアドレスはイーサネットシールドに記載されているものと同等のものを記載。
・PC、イーサネットシールド2、ルータ(WIMAXグレードル)をSWHAB(100Mbps)を介してT型に接続。
・IPアドレスは各種下記となる。
PC(192.168.100.102)
ethernetシールド(192.168.100.100)
ルータ(WIMAX)(192.168.100.1)
・arduino-SWHAB、swHAB-ルータ間はストレートケーブル、SWHAB-PC間はクロスケーブルを使用
・SWHABは極性判別機能有
・arduinoIDEは1.8.3を使用
・Ethernet2をライブラリに追加し、ドキュメントフォルダ内に格納されていることを確認(下記URLと同等の処置)
http://uecs.org/blog.html
・イーサネットシールドはMegaと同じ名称のピンにつないている。
・ソースコード内のサブネットマスク・DNSサーバーはコマンドプロンプトでipconfig/allを打ち、PC側のipアドレスと同じ欄に出力されたものと同一のものを使用
・PC側のOSはwindows10
・arduinoは共に純正(互換品ではない。)
arduino Mega2560(2014.7.20購入)
ethernetシールド2(2017.7.9購入)

〇こちらでも原因追及を行っていますが、現状を追記します。
・arduinoIDEをダウングレードして動作するかどうかを試しています。
IDE 1.7.0 1.7.7 1.7.11 では動作しない旨確認済み。

DHCPで動作するか確認
ソース↓

arduino(C++)

1#include <SPI.h> 2#include <Ethernet2.h> 3#include <EthernetUdp2.h> 4 5byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0xFA, 0x64 }; 6EthernetServer server = EthernetServer(23); 7 8void setup() { 9Serial.begin(9600); 10Serial.print("1"); 11if (Ethernet.begin(mac) == 1) { 12Serial.print("IP Address: "); 13Serial.println(Ethernet.localIP()); 14Serial.print("Subnet Mask: "); 15Serial.println(Ethernet.subnetMask()); 16Serial.print("Gateway IP Address: "); 17Serial.println(Ethernet.gatewayIP()); 18Serial.print("DNS Server Address: "); 19Serial.println(Ethernet.dnsServerIP()); 20} else Serial.println("Error"); 21} 22 23void loop() { 24}

シリアルモニタ↓

1

どうやらEthernet.begin(mac)でフリーズしているようです。

9日22時半追記
SDカードを用いてSPI通信がうまくできているか確認しました。結果SDカードは通信できませんでした。
このサイトを確認する限り、SPI通信がうまくいっていないようです。
https://forum.arduino.cc/index.php?topic=347658.0
arduino mega2560 R3と、イーサネットシールド2を用いてSPI通信がうまくいった方はいらっしゃいますか?
いらっしゃれば成功例をぜひとも伺いたい・・・。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2017/07/20 04:24

「arduino-SWHAB、arduino-ルータ間はストレートケーブル、SWHAB-PC間はクロスケーブルを使用」だと、[ルータ = arduino = SWHAB = PC] という直列接続になって、質問に書かれているようなT型の接続になりません。 接続は正しいですか??
beansan

2017/07/20 12:10

ご指摘ありがとうございます。記載が間違っていましたので修正いたします。現物はswHABを介したT型の接続となっています。
guest

回答1

0

ベストアンサー

関係があるかどうかわかりませんが
SPI通信をするときArduinoの初期設定が必要ではありませんでしたっけ

Ethernet.begin()の中身を見たわけではないので,もしこれの中でSPIの設定がなされていれば
この回答は読み飛ばしてしまってかまいません.

SPI.begin() ;
SPI.setBitOrder(MSBFIRST) ;
SPI.setClockDivider(SPI_CLOCK_DIV4) ;
SPI.setDataMode(SPI_MODE0) ;
あたりが必要だったような気がします

投稿2017/07/10 07:29

ElecDove

総合スコア254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beansan

2017/07/10 13:37

ご回答ありがとうございます。 上記コードを追加してみましたが、変化なしです。 よろしくお願いいたします。
ElecDove

2017/07/11 01:24 編集

ぇっと、確認ですがSPI通信の仕組みなどはご存知でしょうか いわゆるクロック同期通信ですが、4本のケーブルで接続します(シールドなのでケーブルではなく重ねることで接続しますが) SCLK,MOSI,MISO,SSの四本ですね この中でSSについては個別に出力設定にしてやらないといけないはずです(Ethernet.begin()がやってくれないなら) まと、私が例示したソースはどこに入れましたか Ethernet.begin()よりも前に入れなければ意味はないでしょう みた、私が例示したのはあくまで例なので、イーサネットシールドに合わせてパラメータを変える必要がある可能性はありますよ。 SPI通信自体ができていないとのことなのでよりハードに近いところの問題だと思います。
beansan

2017/07/12 14:32

ご教授ありがとうございます。 ご提示いただいたコードですが、Ethernet.begin()より前のsetup()の中に記載していました。 なお、イーサネットシールド2の買い付け元に問い合わせましたが、検証をしていただき上記プログラムは正常に動作したようです。(SPIの記載も特に不要だったようです。) ただ、 Leonardoで検証を行ったようなので、mega2560特有の設定がある等の可能性は排除できていませんが・・・。 検証に使用したイーサネットシールドと交換することになりましたので、そちらが届き次第再度検証してみます。(交換後動かなかった場合は、mega2560特有の設定が必要か、mega2560のSPI通信箇所の故障でしょう。) 分かり次第再度ご返信いたします。
ElecDove

2017/07/13 09:55

SPIの記載は不要だったのですね,失礼いたしました >交換後動かなかった場合は、mega2560特有の設定が必要か、mega2560のSPI通信箇所の故障 私もそう考えるのが自然だと思います. Arduinoは一応,同じソースコードを複数種類のArduinoで使えるように工夫はされていますが,ソースコードを工夫する必要があります(#ifdefでCPUを判別して切り替えるなど) その場合は,Ethernet.begin()内で宣言されていると思われるSPI通信系の設定をやはり自力で覗いて適切に書き換える必要があるかもしれませんね
ElecDove

2017/07/13 10:24 編集

少し気になったのでEthernet2のソースを軽く読んでみました w5500.cppの340行目でSS端子の設定がなされていました そして,w5500.hの133行目で ss_pin=10となっていました. もちろん,SPI.begin()等も呼ばれていました. 10番ピンはMegaもLeonardoも同じ場所にあるので特に書き換えは不要のはずですし,pinMode関数で出力設定がなされているので,コンパイルオプション(Mega2560を選択する)が間違っていなければ適切にコンパイル,動作するはずですね 動かないのはやはり変ですね・・・
beansan

2017/07/17 15:15

イーサネットシールド2の買い付け元から代替品が届いたので、動作検証しました。 結果状況は改善しませんでした。 arduino mega2560R3の不具合か、特殊な設定が必要なのですかね・・・? イーサネットシールド2の買い付け元にイーサネットシールド2とarduino mega2560R3の組み合わせで動くのかどうか検証してもらおうと思います。
ElecDove

2017/07/18 14:28

そうでしたか,残念でしたね ArduinoMegaとUNOの回路図,イーサネットシールドの回路図もにらめっこしてみましたが,特にジャンパが必要とかそういうハードの類の箇所は見つけられませんでした あとは仰るとおり,特殊な設定かなぁというきもしますが,SPI.hライブラリを使えば大丈夫だとは思うんですよね. あ,念のため確認ですが,Arduinoのコンパイルは「Mega 2560」に設定されていますよね? (設定されていなければそもそも書き込みできないとは思いますが(笑) あとは,原因の切り分けとして「SPI通信自体はできているのか」を試すほうが早いかもしれないですね.イーサネットシールドにはSDカードもさせるので,SDカード(SSピンは4番?)や,別のSPI通信を使う適当なセンサを使ってみるとか,ですね 買い付け元が検証をしてくれるということでしたら,ソレの結果を待ちたいところですね 結果が出ましたらまたご報告いただけるとこのページを参照される方にとって益になると思いますのでよろしくお願いいたします
beansan

2017/07/22 09:56

イーサネットシールド買い付け元での検証結果が届きました。 結果、正常に動いたとのことでした。 そのため、新しいarduino mega2560を購入し、交換してみましたところ、サンプルプログラムは正常に動作しました。 原因はarduino mega2560の故障だったようです。 原因追及にご協力いただきましたElecDove様、イーサネット2買い付け元の業者様、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問