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

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

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

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

Q&A

1回答

3875閲覧

Arduino MEGA2560 と ESP8266 で Milkcocoa のデータストアと接続したい

moa

総合スコア10

Arduino

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

0グッド

0クリップ

投稿2016/11/19 08:52

編集2016/11/19 13:15

###前提・実現したいこと
Arduino MEGA2560 と ESP8266(ESP WROOM-02) で Milkcocoa のデータストアと接続し、データーやりとりをしたいのですが・・・

###発生している問題・エラーメッセージ
Wifiには接続できているようですが、Milkcocoa と接続できないようです。以下はシリアルモニタの表示です。

Connecting to *******
FW Version:AT version:0.40.0.0(Aug 8 2015 14:45:58)
SDK version:1.3.0
compile time:Aug 11 2015 17:02:18
to station ok
Join AP success
IP: +CIFSR:STAIP,""
+CIFSR:STAMAC,"
"
single ok
milkcocoa on sucesss
Connecting to MQTT... Milkcocoa SDK demo

これを繰り返します。

###該当のソースコード
試したのは、ArduinoIDEのメニューからファイル>スケッチの例>MilkcocoaArduino SDK > milkcocoa_esp8266 のスケッチで、MEGAに合わせて、wifi.begin()を、Serial5からSerial1に変更しました(https://github.com/exshonda/ESP8266_Arduino_AT を参考にしました)。

#include "ESP8266.h" #include "Milkcocoa.h" #include "Client_ESP8266.h" /************************* WiFi Access Point *********************************/ #define WLAN_SSID "*******" #define WLAN_PASS "*******" /************************* Your Milkcocoa Setup *********************************/ #define MILKCOCOA_APP_ID "*******" #define MILKCOCOA_DATASTORE "*******" /************* Milkcocoa Setup (you don't need to change this!) ******************/ #define MILKCOCOA_SERVERPORT 1883 /************ Global State (you don't need to change this!) ******************/ // Create an ESP8266Client class to connect to the MQTT server. ESP8266Client wifi; const char MQTT_SERVER[] PROGMEM = MILKCOCOA_APP_ID ".mlkcca.com"; const char MQTT_CLIENTID[] PROGMEM = __TIME__ MILKCOCOA_APP_ID; Milkcocoa milkcocoa = Milkcocoa(&wifi, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID); int cnt; void setup() { Serial.begin(115200); delay(10); Serial.println(F("Milkcocoa SDK demo")); // Connect to WiFi access point. Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(WLAN_SSID); wifi.begin(Serial1, 115200); // MEGA対応に変更した部分はここのみSerial5→Serial1 Serial.print("FW Version:"); Serial.println(wifi.getVersion().c_str()); if (wifi.setOprToStation()) { Serial.print("to station ok\r\n"); } else { Serial.print("to station err\r\n"); } if (wifi.joinAP(WLAN_SSID, WLAN_PASS)) { Serial.print("Join AP success\r\n"); Serial.print("IP: "); Serial.println(wifi.getLocalIP().c_str()); } else { Serial.print("Join AP failure\r\n"); } if (wifi.disableMUX()) { Serial.print("single ok\r\n"); } else { Serial.print("single err\r\n"); } if(milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush)){ Serial.println("milkcocoa on sucesss"); } else { Serial.println("milkcocoa on failure"); } cnt = 0; }; void loop() { milkcocoa.loop(); DataElement elem = DataElement(); elem.setValue("v", cnt++); milkcocoa.push(MILKCOCOA_DATASTORE, &elem); delay(7000); }; void onpush(DataElement *pelem) { Serial.println("onpush"); Serial.println(pelem->getInt("v")); };

###試したこと
Arduino IDE を変えて行いましたが、結果は変わりませんでした。
試したのは1.6.12と1.7.9と1.7.11です。

###補足情報(言語/FW/ツール等のバージョンなど)
MEGA2560の接続は、https://github.com/exshonda/ESP8266_Arduino_AT を参考にしました。
Milkcocoa のドキュメントに従って、ライブラリーは競合を避けるため、Milkcocoa ESP8266 SDKは入れずにMilkcocoa_Arduino_SDKを入れています。他に、ESP8266.hを使うために必要だと思いますが、ESP8266_Arduino_ATがインストールされています。

以上です。
ご回答お願いいたします。

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

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

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

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

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

MasahikoHirata

2016/11/19 10:16

ソースの入力の際に、先頭と最後に’```’をつけると見えやすいのですが。
MasahikoHirata

2016/11/19 12:51

先頭以外の’include'と'define'には'#'が付いてないのでしょうか?
moa

2016/11/19 13:11

なぜでしょう? #が消えて表示されます。’include'と'define'には'#'がついております。
moa

2016/11/19 13:17

すみません。ようやく、きれいに表示できました。読みにくくて失礼しました。
guest

回答1

0

まず、’ESP8266’はスイッチサイエンスのシールドでしょうか?
もしそれならばシリアルはハード?ソフトのどちらになってますか?
それとインクルードから’ATコマンド’を使う形になっているように見えるのですが。

投稿2016/11/19 10:03

MasahikoHirata

総合スコア3747

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

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

moa

2016/11/19 12:52

MasahikoHirata様 こんばんは ’ESP8266’は、AE_ESP-WROOM-02という型式で秋月電子で購入しました。 http://akizukidenshi.com/catalog/g/gK-09758/ シリアルがハードかソフトかESP8266の型によって決まっているということでしょうか? スケッチは、SoftwareSerialを使っていないと思うのですが? Milkcocoa のドキュメントを読むと、Milkcocoa Arduino SDKは、インクルードから’ATコマンド’を使う形になっていると書かれているので、そうなのだと思います。 ESP8266をArduinoの代わりとして使う場合と違い、Arduino MEGAに接続しているので、’ATコマンド’で大丈夫なのだと思います。 今は供給電力が不足している可能性もあると考え、Arduino MEGA 2560から電気を取るのをやめて、ACアダプターから三端子レギュレーターで3.3Vを取り、ロジックレベル変換でESP8266と接続するのを、これかやってみます。
MasahikoHirata

2016/11/19 12:55

’供給電力が不足している可能性’、秋月のモジュールもスイッチサイエンスも元モジュールは同じなので消費電力から考えると可能性は低いかと。ソースの引用が後に’```’ではフォーマットなどが崩れて読みにくいです。ちょっとソースも眺めて確認したいので。
MasahikoHirata

2016/11/19 13:22

今、githubを見ているのですが、貴殿がincludeしている、’Client_ESP8266.h’はどこにあるのでしょう。それと恐らく参照先のモジュールはarduino unoをターゲットにしている?のでしょうが、'TX1 18,RX1 19'はたしかにハードシリアルですがMEGAとDue特有でSerial1、UNOだとSerialでRX 0,TX 1なので。この辺りを見てみたいので。
MasahikoHirata

2016/11/19 13:38

README.mdの中ですね。探した。。Hardware Connection WeeESP8266 library only needs an uart for hardware connection. All communications are done via uart. In each example, you must specify the uart used by mainboard to communicate with ESP8266 flashed AT firmware. MEGA and WBoard Pro For MEGA and WBoard Pro, Serial1 will be used if you create an object (named wifi) of class ESP8266 in your code like this: #include "ESP8266.h" ESP8266 wifi(Serial1); The connection should be like these: ESP8266_TX->RX1(D19) ESP8266_RX->TX1(D18) ESP8266_CH_PD->3.3V ESP8266_VCC->3.3V ESP8266_GND->GND の所と理解。
moa

2016/11/19 13:54

MasahikoHirata様 誠にもうしわけありません。 README.mdの中と、お伝えしなければならなかったですね。 こちらで、今、ACアダプターから別電源で供給し3.3Vに下げてESP8266に供給し、ロジックレベルを変換して、Arduino MEGA に接続するパターンを実施しましたが、先のご指摘のように解決することはなく、同じ症状がでました。 自分的には、もう打つ手が思いつきません。
MasahikoHirata

2016/11/19 14:01

こういう時は一つづつ潰していかないと。シリアルからのメッセージから想像するとESP8266とMEGAは通信できていると考えて、次の段階へ。
moa

2016/11/19 14:21

Milkcocoaとの接続につまづいているのだと、初心者ながら思っています。 ArduinoとESP8266を接続して使う人が少なそうなので'Milkcocoa_Arduino_SDK'と、多くの人が使用して安定感のありそうな'Milkcocoa ESP8266 SDK'のファイルを見比べてみようと思います。 問題のありそうな部分のライブラリーのファイルに'Serial.println'を入れて挙動を一つ一つ追ってみます。
MasahikoHirata

2016/11/19 14:21

まずは確認。 #define MILKCOCOA_APP_ID "*******" #define MILKCOCOA_DATASTORE "*******" は当然伏字ですよね。(実際には”...YOUR_MILKCOCOA_APP_ID...”や”esp8266”みたいに。
moa

2016/11/19 15:01

私もこれやりました。’http://blog.mlkcca.com/iot/milkcocoa-arduino/’ おかげさまで、うまくできました。 たぶん、最近の情報を見るとほとんどの人が、ESP8266単体にArduinoのスケッチを書き込んで使っているのではないでしょうか。 センサーとか、リレーとかをたくさんつけてIOTの制御をしたかったので、Arduino MEGA との接続でESP8266を使うことにしました。 もっと、いろいろな人がArduinoとの接続も試して、お互いにうまくいく情報を共有できるといいのですが・・・
MasahikoHirata

2016/11/19 15:04

これからもがんばってください。
moa

2016/11/19 17:57

あっ!すみません。 >おかげさまで、うまくできました。 は、以前esp8266 単体での作動を’http://blog.mlkcca.com/iot/milkcocoa-arduino/’のとおりにやってできた という意味です。 まだ、本題のArduino MEGA 2560 + esp8266 + Milkcocoa接続は クリアしていません。 きっと、誤解されましたね。 ごめんなさい。 その後、ライブラリーの中にもSerial.println()を挿入して問題を探ったところ milkcocoa.loop()内で、Milkcocoa.cppファイルのMilkcocoa::connect(uint16_t timeout)を呼び出し、その中のwhile文のなかで挙動がおかしくなっているみたいです。途中で処理が止まり、再起動するような形で、Arduinoのスケッチ.inoのsetup()に戻って新たな処理が始まるような感じです。 Milkcocoa::connect(uint16_t timeout)で、Adafruit_MQTT.cppのint8_t Adafruit_MQTT::connect()を呼び出し、その中で処理が止まっているようですが、間にSerial.println()を挟みながらif文を整えたところ、なぜか安定してエラーが上がるようになりました。 結果としては、Adafruit_MQTT.cpp内のconst __FlashStringHelper* Adafruit_MQTT::connectErrorString(int8_t code) によってエラーの内容が特定され Server unavail という内容に行きつきました。 Milkcocoa のサーバーでこの接続が使用不可の状況にある?ということでしょうか? 認証の問題なのかもしれませんが、最終的によくわかりません。 Milkcocoaさんに聞くしかないのかもしれませんが、わかる方がいたら教えてください。
MasahikoHirata

2016/11/20 02:37

”途中で処理が止まり、再起動するような形で、Arduinoのスケッチ.inoのsetup()に戻って新たな処理が始まる”。メモリーリークかスタックオーバーフローのような気が。
moa

2016/11/20 06:06

なるほど、この状態がメモリーリークあるいはスタックオーバーフローなのですね。 初めて遭遇しました。 メモリーリークについては、 https://github.com/exshonda/ESP8266_Arduino_AT のREADME.mdの最後の方に、IDE 1.7.7ではおきるといことと、 秀和システムの'センサーでなんでもできる おもしろまじめ電子工作'という書籍でもIDE 1.7.9の場合での対処法が載っていました。 因みにライブラリーをいじってテストしたのIDE 1.6.12です。 その後、何度かテストしましたが、Adafruit_MQTT.cppのint8_t Adafruit_MQTT::connect()のなかで処理が止まって再度Arduinoのスケッチ.inoのsetup()に戻ることを繰り返す現象はなくなりました。 Milkcocoa::connect(uint16_t timeout)を呼び出し、その中のwhile文のなかで Retrying MQTT connection in 5 seconds... と、5秒おきにMOTTの再接続を繰り返しています。 その後のエラーも Server unavail を表示します。 次の一手として、HardwareSerial.hで定義されているハードウェアのシリアルバッファのサイズが小さすぎると問題が発生するという指摘もあるようなので、確認してサイズを変更してやってみます。 いろいろヒントをいただきありがとうございました。
moa

2016/11/20 06:53

IDE 1.6.12のHardwareSerial.h(hardware/arduino/avr/cores/arduino/HardwareSerial.h)のハードウェアのシリアルバッファのサイズの記述と思われるヶ所です。 #if !defined(SERIAL_TX_BUFFER_SIZE) #if ((RAMEND - RAMSTART) < 1023) //#define SERIAL_TX_BUFFER_SIZE 16 #define SERIAL_TX_BUFFER_SIZE 256 #else //#define SERIAL_TX_BUFFER_SIZE 64 #define SERIAL_TX_BUFFER_SIZE 256 #endif #endif #if !defined(SERIAL_RX_BUFFER_SIZE) #if ((RAMEND - RAMSTART) < 1023) //#define SERIAL_RX_BUFFER_SIZE 16 #define SERIAL_RX_BUFFER_SIZE 256 #else //#define SERIAL_RX_BUFFER_SIZE 64 #define SERIAL_RX_BUFFER_SIZE 256 #endif #endif #if (SERIAL_TX_BUFFER_SIZE>256) typedef uint16_t tx_buffer_index_t; #else typedef uint8_t tx_buffer_index_t; #endif #if (SERIAL_RX_BUFFER_SIZE>256) typedef uint16_t rx_buffer_index_t; #else typedef uint8_t rx_buffer_index_t; #endif スケッチの内容に応じて、必要なバッファサイズをコンパイル時に割り当てる?仕様なのでしょうか? C言語に詳しくないので、よくわかりませんが、元の部分をコメントアウトし、256に変更してみましたが、結果は同じでした。
MasahikoHirata

2016/11/20 07:33

’因みにライブラリーをいじってテストしたのIDE 1.6.12です。’ IDEのバージョンを上げるのは? 特に今までのスケッチが無駄になる事は無いと思うので。
moa

2016/11/20 09:16

IDE1.7.9 or 1.7.11でもやってみますね。 「おもしろまじめ電子工作」ではArduino MO ProとESP8266でMilkcocoa に接続する方法が載っていたので、そちらを参考にMEGAでも動くやり方を模索してみます。
MasahikoHirata

2016/11/20 09:21

期待しています。あなたのような前向きな方であればできると確信していますから。
moa

2016/11/23 11:05

いろいろやりましたが、Arduino MEGA2560とESP8266によるMilkcocoaの接続は出来ませんでした。 'センサーでなんでもできる おもしろまじめ電子工作'を参考にしてArduino Mo Pro で試したところ、こちらはできました。ただし、ESP8266周りの接続を書籍の内容と変えてRSTを開放し、IO2を10kの抵抗でプルアップしてやりました。 MEGAとESP8266のWiFi接続は、https://ics.media/entry/10457/3 を参考にしてうまくできました。 ライブラリーは、参考のHPのとおり、ESP8266_Arduino_ATではなく、ITEADLIB_Arduino_WeeESP8266を使用しました。 IDEは、1.6.12、1.7.9、1.7.11で試し、いずれも成功しました。 スケッチはMEGA2560に合わせて、ESP8266 wifi(Serial1);に変更し、 TX1 18にESP8266のRXD RX1 19にESP8266のTXD を接続しました。 ESP8266 2製品で試しましたが、「ATコマンドで通信速度を設定」で、簡単に設定できるものとなかなかうまくいかずにATコマンドを色々試したり、RSTをGNDに落としてリセットしたり、最後には作動中にTXDやRXDを接続し直したりと、設定できるようになるまで苦労するものもあり個体差?のようなものを感じました。 MilKcocoaに接続するために、Milkcocoa_Arduino_SDKの"Client_ESP8266.h"をスケッチにinclude しているので、たぶんArduinoとWiFiシールドなどESP8266以外のWiFi接続には対応できないSDKなのだと思います。 Arduino Mo Pro 以外でも使えるライブラリーを出していただけるとありがたいというのが個人的な感想です。 以上、期待外れな結末ですが、書籍や上記ホームページでも解説していただいた 蔵下 まさゆき様、ありがとうございました。 また、初心者の私にヒントをくださったMasahikoHirata様、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問