21.ESP8266ボード や Arduinoボードで、配列やポインタを使用すると、シリアルモニター表示が変だ
Arduino IDE でArduino UNOボードを使って、配列の初期化や、ポインタを使用していて、それをシリアルモニターに表示させると、意味不明な文字や、期待通りの結果にならない時があります。
また、同様に、ESP8266ボード上では、Arduinoボードと異なる表示結果になったりします。
ESP8266ボードではエラーになったのに、Arduino UNOボードでは正常にコンパイルできることがあります。
【原因】
配列やポインタの使い方を誤っている場合が考えられます。
Arduino IDE は全てのC言語仕様をサポートしていて、一部のC++言語をサポートしているそうです。
Arduino言語はビギナーにとって、とても使いやすくできていますが、複雑難解な本来のC言語の文法が隠れてしまって、なかなかアマチュアでは分からないことがあります。
【対策】
ポインタや配列の初期化については、以下の記事を参照してみてください。
そして、最後の方のコメント欄も参照してみてください。
その道の熟練者からアドバイスを頂きました。
意外な事実があったりします。
改めて、ポインタ・配列・初期化などを再考
22.グローバル変数とローカル変数のメモリに余裕があるのに正常に動作しない
Arduino IDE の警告やエラーメッセージが無く、グローバル変数とローカル変数のバイト数に余裕があって、プログラムも誤っていないのに、正しく動作しないことがあります。
【原因】
ローカル関数内の配列の領域確保が大きすぎたり、String 変数に文字列を多量に代入していたりすることが原因の場合があります。
【対策】
ローカル関数内の配列の領域を少なくしたり、String文字列の文字数を少なくしてください。
ESPr Developer ( ESP-WROOM-02, ESP8266 ) の場合、ローカル関数内で確保できる配列のバイト数限界は、25KB 程度と思ってください。
要するに、25000文字程度です。
ESP8266 のデータシートによると、RAM のユーザー使用領域は約50KB とありますが、ローカル関数内ではその半分程度しか確保できません。
Arduino UNO は1600文字程度です。
もちろん、これはプログラムによって変動します。
詳細は以下の記事を参照してください。
Arduino / ESP8266 の使用できるRAM 領域を再考
23.Arduino IDE のシリアルモニター出力で、日本語漢字が文字化けする
Arduino IDE で、Serial.print や Serial.write 関数などを使って、シリアルモニターに日本語漢字を出力する場合と、文字化けしている場合があります。
【原因】
日本語 Windows 10 の場合で説明します。
Arduino IDE 1.8.2 から、UTF-8 コード文字列をそのまま出力しても、シリアルモニターに日本語漢字が表示できるようになりました。
例えば、
Serial.println(“日本語漢字です”);
とすると、そのままシリアルモニターに日本語文字が出力できるようになりました。
そのため、今まで、私の自作の UTF8toSjis ライブラリを使って、Shift_JISコードで出力すると文字化けしてしまいます。
また、旧バージョンの Arduino IDE 1.8.1 以下では、Shift_JIS コードで出力しないと、シリアルモニターには正しく日本語表示されません。
【対策】
Serial.print関数で日本語をそのまま出力したい場合は、Arduino IDE 1.8.2 以降を使って下さい。
私の自作 Utf8toSjis ライブラリを使って、Shift_JIS コードで日本語を出力したい場合は、Arduino IDE 1.8.1 以下を使用して下さい。
24.ブラウザからスケッチ(ソースコード)をコピーして、Arduino IDE スケッチ画面に貼り付け、そのままコンパイル書き込みしたら、うまく動作しない
Webページにあるソースコードを、ブラウザ ( Google Chrome 等 )画面上でクリップボードにコピーし、そのまま Arduino IDE に貼り付けて、すぐコンパイルおよび書き込み、実行すると、うまく動作しないことがあります。
【原因】
以下の環境でそういう現象が起きました。
OS: Windows10
ブラウザ: Google Chrome
日本語漢字変換: Microsoft IME
Arduino IDE: ver 1.8.2 , 1.8.3
恐らく、Arduino IDE 1.8.2 から、UTF-8文字コード変換方法が変わったことによるものと考えられます。
Arduino IDE 1.8.2 からスケッチにUTF-8コードの日本語漢字を入力すれば、シリアルモニターにもUTF-8文字コードのまま日本語漢字が表示されるようになりました。
そこで、ブラウザ上のソースコードに日本語漢字のあるものだと、そのままクリップボードにコピーして Arduino IDE に貼り付けただけでは、他の文字コードのままの場合があり、そのままコンパイル書き込みしても、正しく動作しない場合があります。
これは、日本語文字列に限って起こる現象と思われます。
特に、Web から GET した文字列を抽出する場合に全角文字をつかって検索したりする場合はうまく動作しません。
【対策】
Arduino IDE のスケッチを一旦、名前を付けて保存してください。
その後、コンパイル書き込みすれば、UTF-8文字列は正しく表示されると思います。
Arduino IDE スケッチ上の日本語漢字または全角文字が画面に正しく表示されていれば、保存さえすれば正しい文字コードに変換されます。
25.突然 Wi-Fi ルーター(アクセスポイント)につながらなくなった
IoT 機器などの Wi-Fi デバイスをどんどん買い足していって数が増えると、過去に使ったデバイスの Wi-Fi 接続がいきなりできなくなることがあります。
【原因】
Wi-Fi ルーターの、DHCP ユーザー最大数をいつの間にか超えてしまっている可能性があります。
少なくとも、私の場合はつい最近、そういう現象に悩まされました。
【対策】
ご自分の Wi-Fi ルーターの管理者設定画面で、DHCP ユーザー最大数を増やすか、接続されている不要な Wi-Fi機器の電源をOFFにしてください。
そして、Wi-Fiルーターの電源を消して再起動してみてください。
26.SPIFFSフラッシュへアップロードする時、Bad Answer:Invalid bootstrapping state, reset ESP8266 before updating と表示されて、アップロードできない
Arduino IDE のプラグイン、SPIFFSファイルアップローダーを使って、ESP-WROOM-02 ( ESP8266 ) のフラッシュにファイルをアップロードする時、Arduinoのコンパイラのメッセージで、以下のように表示される場合があります。
特に、Arduino core for the ESP8266 ver 2.4.0-rc1 で、Wi-Fi OTA でアップロードする時に表示されます。
[ERROR]: Bad Answer: ERR: ERROR[11]: Invalid bootstrapping state, reset ESP8266 before updating
【原因】
OTA アップロードする時、ESP8266 がリセットされていないことが原因
【対策】
ESP-WROOM-02 ( ESP8266 ) のリセットボタンを押して、リセットした後、SPIFFSプラグインでOTAアップロードすればOKです。
27.Arduino – ESP8266 ver 2.4.0 がうまく動作しない
2018/01/30時点で、Arduino core for the ESP32 の公式バージョンが 2.4.0 になっています。
これをインストールすると、シリアルモニターを 115200bps で起動すると文字化けしたり、Wi-Fi がアクセスポイントに繋がらなかったりと、動作不良が多いです。
【原因】
私自身、プレリリース時点の、ver 2.4.0-rc2 をインストールして使って見ましたが、同じ症状でした。
2.4.0 は 2.4.0-rc2 を基に作成されているようなので、それをインストールしてしまったことが原因と思われます。
【対策】
Arduino IDE のボードマネージャーで、2.4.0 を一旦削除して、2.4.1 を再インストールしてください。
ただし、Crystal Frequency 設定を 26 MHz にする必要があります。
以下の記事を参照してください。
Arduino – ESP8266 最新版アップデート方法
28.Arduino – ESP8266 ver 2.4.1 で Wi-Fi が接続できない。シリアルモニターが文字化けする
2018/4/11時点の最新版 Arduino core for the ESP8266 は 2.4.1 ですが、以前の設定のまま使用すると、Wi-Fiアクセスポイントに接続できなかったり、シリアルモニターが文字化けして、74880bpsでしか表示できないなどの不具合が出ます。
【対策】
Arduino IDE のツールメニューで、Crystal Frequency を 26 MHz にしてください。
こうすると、処理速度も若干速くなりますし、Wi-Fiアクセスポイントにも問題無く接続され、さらにシリアルモニターも 115200bps で正常表示されるようになります。
以下の記事を参照してください。
Arduino – ESP8266 最新版アップデート方法
29.ESP-WROOM-02でATコマンドを使っていた時にはWiFiルータに接続できたが、Arduino IDEでコンパイル書き込みすると、WiFiルータに接続できなくなった
【原因】
こちらの記事のコメント投稿で、itaさんから情報を頂きました。
ATコマンド方式のWiFi接続暗号化方式は(WEP)らしく、ArduinoIDE方式のWiFi接続暗号化方式は(WPA2/WPA)だそうです。
itaさん、情報ありがとうございました。
m(_ _)m
(2021/09/14)
【対策】
私個人的にはATコマンドを使う利点は無いと思いますので、Arduino IDEでコンパイル書き込みにして、外部ルータとWPAで接続した方がセキュリティも高くなるし、断然シンプルになると思います。
30.ESP-WROOM-02(ESP8266)でATコマンドおよびArduinoプログラミングでWiFiのSSIDとパスワードを設定したのに、なぜかパスワードが設定されない(2022/06/04追加)
ESP-WROOM-02(ESP8266)でATコマンドのCWSAPコマンドや、Arduino IDEでSSIDやパスワードを指定してプログラミングしたのに、パスワードが有効になっていない場合があったようです。
【原因と対策】
この原因はSSIDやパスワードは半角英数字8文字以上だそうです。
多めの文字数にすれば良いと思います。
また、29番の項目で述べましたが、ATコマンドのWiFiはWEP、ArduinoプログラミングはWPA2らしいので、StationモードでWiFi接続する場合はルーターの設定も注意する必要があります。
まとめ
現段階で思いついたトラブルシューティングは以上です。
もし、誤りや、その他のトラブル対処方法等がありましたら、コメント等でご連絡いただけると幸いです。
新たに見つかったものは、随時、この記事に足していこうと思っておりますので、よろしくお願いいたします。
コメント
非常に参考にさせていただいております。
以下のエラーで色々やっているのですが、うまくコンパイルしたのが転送できておりません。
アドバイスいただけると嬉しいです。
Arduino:1.8.1 (Mac OS X), ボード:”Generic ESP8266 Module, 160 MHz, 80MHz, QIO, 921600, 4M (3M SPIFFS), nodemcu, Disabled, None”
ビルドオプションが変更されました。全体をリビルドしています。
最大1044464バイトのフラッシュメモリのうち、スケッチが230557バイト(22%)を使っています。
最大81920バイトのRAMのうち、グローバル変数が32108バイト(39%)を使っていて、ローカル変数で49812バイト使うことができます。
warning: serialport_set_baudrate: baud rate 921600 may not work
Uploading 234704 bytes from /var/folders/z0/ggnt7s1d3cx7v_ynhpp295jr0000gn/T/arduino_build_551472/sketch_feb19a.ino.bin to flash at 0x00000000
…………………………………………………………………….. [ 34% ]
…………………………………………………………………….. [ 69% ]
….スケッチの書き込み中にエラーが発生しました
.warning: espcomm_send_command: didn’t receive command response
warning: espcomm_send_command(FLASH_DOWNLOAD_DATA) failed
warning: espcomm_send_command: didn’t receive command response
error: espcomm_upload_mem failed
「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する:コンパイル」を有効にすると
より詳しい情報が表示されます。
藤田さん
当ブログをご覧いただき、ありがとうございます。
さて、私はMac を持っておりませんので、どうしてそういうエラーになるのか、正直分かりません。
と出ているので、おそらくシリアルポートの速度が速すぎるのかもしれません。
試しに、115200 bps でアップロードしてみるとかですかね。
ご回答いただいていたのにもかかわらず、お返事が遅くなり申し訳ございません。一度試してみます。よろしくお願いします。
いえいえ。
全然遅れても大丈夫ですよ~。
esp8266でespNow通信を試そうとしています。
esp8266のボードやその他のライブラリーはインストールが成功し正常に動作しています。
しかしながらesp_now.hがインストールできません。
何か方法が有るのでしょうか?
よろしくお願いします。
匿名さん
記事をご覧いただき、ありがとうございます。
コメント投稿が連続で2つ投稿されていたので、最初の方のコメントを採用させていただきました。
私は現在ESP8266を全く使用しておらず、当時とは環境が大幅に変化しており、しかもESP-NOWは全く使ったことがありませんので、あまりまともにお答えできないかも知れません。
ESP-NOWについてザッとネットで調べてみたところ、Arduinoスケッチ上で、
#include <esp_now.h>
と入力するのは、ESP32の場合っぽいです。
ESP8266 の場合は、
#include <espnow.h>
で良いのではないかなと思いました。
一応、現在の私の環境
Arduino IDE 1.8.19
Arduino core for the ESP8266 ver 3.0.2
でコンパイルしてみたところ、エラーせずに通ったので、ライブラリマネージャでESP-NOWをインストールする必要も無いように思います。
違っていたらゴメンナサイ。