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

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

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

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

Q&A

解決済

2回答

3593閲覧

Milkcocoa・ESP-WROOM-02・Arduino M0の組み合わせでArduino側でon()した時の処理が不安定なので安定させたい

umi_kappa

総合スコア12

Arduino

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

4グッド

0クリップ

投稿2016/02/18 10:36

編集2016/02/19 11:28

###前提・実現したいこと
以前の質問「 ESP-WROOM-02をWi-FiモジュールとしてArduinoに接続(SoftwareSerial)してMilkcocoa Arduino SDKを使用する方法について」でArduino M0からMilkcocoaへ値をpushすることはできるようになりました。
次のステップとして、スマートフォンのWebブラウザからJavaScriptで数値をMilkcocoaへpushし、Arduino M0のmilkcocoa.on()でスマートフォンからpushされた値を取得したいのですが、Arduino M0が値を取得中にスマートフォンから連続でpushしたりすると、Arduino M0の処理が止まったり、取得した値が古いものが返ってきたりしました。
安定して動作させるためのアドバイスをいただけますと幸いです。
milkcocoa.loop()を実行したタイミングでスマートフォンからpushすると正しい値が取得できます。

###ソースコード

#include "ESP8266.h" #include "Milkcocoa.h" #include "Client_ESP8266.h" /************************* WiFi Access Point *********************************/ // Wi-Fi SSID #define WLAN_SSID "SSID" // Wi-Fi PASSWORD #define WLAN_PASS "PASSWORD" /************************* Your Milkcocoa Setup *********************************/ // MilkcocoaのアプリID #define MILKCOCOA_APP_ID "APP_ID" #define MILKCOCOA_DATASTORE "led" /************* 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 value; // LEDを接続するピン const int ledPin = 13; /** * 初期設定 */ void setup() { // デジタル13番ピンを出力として設定 pinMode(ledPin, OUTPUT); SerialUSB.begin(115200); Serial5.begin(115200); SerialUSB.println("Milkcocoa SDK demo"); // Connect to WiFi access point. SerialUSB.println(); SerialUSB.println(); SerialUSB.print("Connecting to "); SerialUSB.println(WLAN_SSID); wifi.begin(Serial5, 115200); SerialUSB.print("FW Version:"); SerialUSB.println(wifi.getVersion().c_str()); if (wifi.setOprToStation()) { SerialUSB.print("to station ok\r\n"); } else { SerialUSB.print("to station err\r\n"); } if (wifi.joinAP(WLAN_SSID, WLAN_PASS)) { SerialUSB.print("Join AP success\r\n"); SerialUSB.print("IP: "); SerialUSB.println(wifi.getLocalIP().c_str()); } else { SerialUSB.print("Join AP failure\r\n"); } if (wifi.disableMUX()) { SerialUSB.print("single ok\r\n"); } else { SerialUSB.print("single err\r\n"); } if (milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush)) { SerialUSB.println("milkcocoa on sucesss"); } else { SerialUSB.println("milkcocoa on failure"); } value = 10; }; /** * ループ処理 */ void loop() { SerialUSB.println("Loop ..."); // Milkcocoaのループ処理を実行します milkcocoa.loop(); // 1秒処理を止める delay(1000); }; void onpush(DataElement *pelem) { SerialUSB.println("onpush"); //SerialUSB.println(pelem->getInt("state")); // 取得した値が1ならば if (pelem->getInt("state")) { SerialUSB.println("LED ON"); // LEDを接続しているピンをHIGH状態に変更(点灯) digitalWrite(ledPin, HIGH); } // 取得した値が1以外ならば else { SerialUSB.println("LED OFF"); // LEDを接続しているピンをLOW状態に変更(消灯) digitalWrite(ledPin, LOW); } };
naoyan, kiyopikko, afroscript, ikuwow👍を押しています

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

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

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

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

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

guest

回答2

0

いつもありがとうございます!
Milkcocoa開発チームのkiyopikkoです。

問題を明確にするために以下についてお答え頂けますか...?

  • 「Arduino M0の処理が止まる」というのは止まってしまってそこから何も処理をしなくなってしまうということでしょうか?また、そのときのシリアル出力を貼って頂けますでしょうか?
  • スマートフォンから連続でpushとは具体的な数値としてはどれくらいの間隔でしょうか?

「取得した値が古いものが返ってきたり」については、現在のSDKの仕様で1000msの間に同時に来たデータは同じタイミングで処理されるようになっています。
これは、用途によってはかなり邪魔な(笑)仕様かと思うので、ユーザー側で指定するように検討中です。

ちなみに、以下も確認頂けると幸いです。

  • Arduino SDKは最新版を使っているか
  • Arduinoのlibraries(home/Documents/Arduino/libraries)にESP8266 SDKとArduino SDKが混在してしまっていないか

投稿2016/02/19 14:16

kiyopikko

総合スコア105

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

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

umi_kappa

2016/02/21 07:19 編集

kiyopikkoさん いつもお世話になっております! ・「Arduino M0の処理が止まる」というのは止まってしまってそこから何も処理をしなくなってしまうということでしょうか?また、そのときのシリアル出力を貼って頂けますでしょうか? こちら再現しようとしたのですが、処理が止まることはありませんでした。私の勘違いだったかもしれません、、失礼しました。 ・スマートフォンから連続でpushとは具体的な数値としてはどれくらいの間隔でしょうか? HTML上のボタンをタップしたタイミングでpushしているので少々具体的な数値ではないのですが「タン・タン・タン」と500msほどでしょうか。Arduino側でMilkcocoaから受信している最中にスマートフォン側からpushすると止まってしまう印象です。 >「取得した値が古いものが返ってきたり」については、現在のSDKの仕様で1000msの間に同時に来たデータは同じタイミングで処理されるようになっています。 こちらですが1000ms以上の間隔を開けても同じでした。`Loop ...`という表示が出た瞬間にスマートフォンからpushした時のみうまくいきます。 ``` Join AP success IP: +CIFSR:STAIP,"☆☆☆☆" +CIFSR:STAMAC,"☆☆☆☆☆☆" single ok milkcocoa on sucesss Loop ... Connecting to MQTT... MQTT Connected! Loop ... Loop ... onpush LED ON Loop ... Loop ... onpush LED ON Loop ... Loop ... onpush LED ON Loop ... onpush LED OFF Loop ... onpush LED ON Loop ... ``` ・ Arduino SDKは最新版を使っているか はい、最新版をインストールしています。 ・Arduinoのlibraries(home/Documents/Arduino/libraries)にESP8266 SDKとArduino SDKが混在してしまっていないか こちらも大丈夫かと思います。`ESP8266_Arduino_AT`と`Milkcocoa_Arduino_SDK`の2つのみがインストールされている状況です。 すみません。あと1点気になっている挙動があります(こちらは別質問として立てたほうがよかったかもしれません。。)。 本質問のスケッチでvalueという変数を指定して`setup()`関数内で数値を代入しています。実は不要な変数なのですが、何故かこの代入する一文がないとMilkcocoaとの接続に失敗してしまいます。こちらもアドバイスいただけますと幸いです。。 以下、シリアル出力です。 ``` Join AP success IP: +CIFSR:STAIP,"☆☆☆☆" +CIFSR:STAMAC,"☆☆☆☆☆☆" single ok milkcocoa on sucesss Loop ... Connecting to MQTT... Server unavail 3 Retrying MQTT connection in 5 seconds... Server unavail 3 Retrying MQTT connection in 5 seconds... ``` 毎度細々とすみません。 よろしくお願いします!
kiyopikko

2016/02/21 09:49

詳細にありがとうございます! 状況がはっきりしたので、valueという変数の件も含めて、こちらで再現しようかと思います(M0 Proになりますが) すぐには返信できないかと思いますので、しばしお待ち頂けると幸いですm(_ _)m
umi_kappa

2016/02/22 01:12

お手数をおかけします! こちらでもArduino M0 Proを購入して試してみます。 進展がありましたらご報告しますね。
umi_kappa

2016/02/22 09:45

kiyopikkoさん あれからArduino M0 Proで本質問のスケッチを試してみましたが、Arduino M0と同じ現象(Value変数の件も含めて)が発生しました。 お手すきの時でかまいませんので、ご確認いただけますと幸いです。
kiyopikko

2016/02/23 13:11

こちら、M0 Proで同じ現象起こりました。 ESP8266 SDKではこの問題は起こらなかったので、 Arduino SDK特有の問題なので、Arduino SDKのIssueにあげますね。
umi_kappa

2016/02/24 00:49

kiyopikkoさん ご確認ありがとうございます! この部分がクリアになれば1つネタが完成するので楽しみにお待ちします。
guest

0

ベストアンサー

IDE 1.7.8 のM0のライブラリにはバグがあります.以下の変更を適用して試してもらえますででしょうか.

./hardware/arduino/samd/cores/arduino/USB/samd21_device.c : 152行目 メモリリーク修正.

for (i = 0; i < sizeof(usb_endpoint_table)/4; i++) {
(*(uint32_t *)((uint32_t *)(&usb_endpoint_table[0])+i)) = 0;
}

投稿2016/03/02 15:20

編集2016/03/02 15:22
ShinyaHonda

総合スコア15

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

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

umi_kappa

2016/03/07 07:42

ShinyaHondaさん 返答が遅くなってしまい申し訳ございません。 samd21_device.cファイルを修正することで「setup内でダミー変数へ代入しないと、MQTTの接続に失敗する」件は解消されました。ありがとうございます。 on()で取得した値が古い件は解消されませんでした。
umi_kappa

2016/03/07 08:25

「on()で取得した値が古い」件ですが、 ./hardware/arduino/samd/cores/arduino/RingBuffer.hのSERIAL_BUFFER_SIZEを256に変更することで解決できました。 ですが、別の問題が発生しました。 on()起動から初めてデータを取得したおよそ1分後に、再び同一IDのデータが取得され、その後on()でデータの取得ができなくなりました。
umi_kappa

2016/03/07 12:57

「on()起動から初めてデータを取得したおよそ1分後に、再び同一IDのデータが取得され、その後on()でデータの取得ができなくなりました。」 こちらを私の方で調べてみました。 on()の実行にかかわらず、スケッチを起動後一定時間が経過すると、ESP8266.cppのdataAvailable()の返り値が1となり現象が発生しているようです。
umi_kappa

2016/03/08 13:07 編集

「on()起動から初めてデータを取得したおよそ1分後に、再び同一IDのデータが取得され、その後on()でデータの取得ができなくなりました。」 こちらのその後です。 結論から申し上げると、Arduino M0 Proから一定時間アクセスがないとMilkcocoaが接続をCLOSEDにする仕様になっていそうです(実際に"CLOSED"という文字列を受け取った後にアクセスができなくなりました)。 接続が切れる前に定期的にダミーデータをsend()すると解決されました。こちらの認識で正しいでしょうか? Milkcocoa ESP8266 SDKの方では、Milkcocoa.cpp内のloop()関数のconnect()部分が下記のようになっており、接続が切れると再接続するようです。 if(!connect(timeout)){ return false; } GitHub https://github.com/milk-cocoa/Milkcocoa_ESP8266_SDK/commit/52ac4f33b5667588035d036785272586b3ca33cc
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問