ESP8266と通信出来ない。

ESP8266のプログラム開発中にトラブルに遭遇。 それまで、普通に行えていたOTAでのプログラム書込ができなくなったのだ。pingにも反応しない。「宛先ホストに到達できません」と出る。arp -a の出力にターゲットのIPアドレスが無い。WireSharkで調べるとESP8266がarpに返事していない。

“esp8266 arp”でgoogle 検索。ESP8266には,ARP関連の問題があるらしい。 「しばらくするとARPに反応しなくなる」とか「複数のESP8266があるとWiFiルータのバグでARPに反応しなくなる」などという現象が報告されている。

私も複数のESP8266を同時に動作させている。WiFiルータがARPパケットを中継しなくなるのか? WiFi側の通信状況をモニタする方法がわからないので調べられない。ルータを再起動すると症状が消えたりする。

この問題を自力で解決するのは大変そうなので、対症療法に走る。手作業でARPテーブルにESP8266のMacアドレスを登録する。

ESP8266のMacアドレスがわからないと面倒なので、まず、シリアルポートとかに表示させる。IPアドレスは表示させているので、追加する感じ。プログラムとしては、次のようになる。

	uint8_t mac[6];
	WiFi.macAddress(mac);
	Serial.print("mac:");
	for(int i=0;i<6;i++)
		Serial.printf("%c%02x",i>0?'-':' ',mac[i]);
	Serial.println();

次にWindowsでARPテーブルに登録する。 arpコマンドがあるのだから、arp -s で設定できるはずだが、何故か出来ない。コマンド・プロンプトを管理者で起動してもダメ。

設定方法を検索して、「sakashita-net.jp: arp -sでARPエントリを追加しようとすると「ARP エントリを追加できませんでした: アクセスが拒否されました。」というエラーになる」というページを発見。バッチリ書いてある。

コマンド・プロンプトを管理者権限で起動し、次のコマンドでアドレスをARPテーブルに追加できる。

$ netsh interface ipv4 set neighbors "イーサネット" "192.168.0.110" "5c-cf-7f-89-88-d3"

“イーサネット”は、インターフェース名で,次のコマンドで表示できる。

$ netsh interface ipv4 show interface

とりあえず、これで開発を進められる。でも、この問題はちゃんと解決して欲しい。

ESP8266+OLEDでRSS表示

HSES-NODEのサンプルプログラムにRSS表示のプログラムを追加することは、前々から予定していた。RSS表示自体はHSES-LCD24で既にやっていて新味が無いので後回しになっていたのだが、やっと完成した。実際に動かして見ると案外面白い。OLEDなので、表示が鮮明。LCDより、はるかに見やすい。表示される文字数が少なく、スクロールされていくので、見続けないと内容がわからないため、つい見続けてしまう。あとサイズが小さいのも魅力的。

プログラムとしては、まずHumblesoft_SSD1306ライブラリに文字をスクロール表示する機能(ScrollTextクラス)を追加。HSES-LCD24用のRssDispのソースプログラムを持ってきて、ちょっと修正してやったら、すぐにRSSが表示された。 それに日付・時刻等を表示する機能を追加し、さらに画面のレイアウトを変更する機能もつけた。スイッチ(IO0)を押すとレイアウトが切り替わり、時刻が大きく表示されたり、RSSが大きく表示されたりする。

WeatherStationDemoをHSES-NODE-OLEDで動かした。

前回ESP8266 Weather Station ColorをHSES-LCD24で動かした際、ESP8266 Weather Stationライブラリをインストールしたのだが、そのexampleにOLED用のプログラムがあったのでHSES-NODE-OLEDで動かしてみた。インストール方法はこちら

表示される情報は前回のcolorとほぼ同じ、月齢が無いぐらい。画面が小さいので、何秒ごとかに切り替えながら表示される。動作の様子の動画を下に置く。

画面切り替えは、見栄えが良いので、デモ用としてはありがたい。でも実用上はどうなんだろう。欲しい情報が得られるまで何秒か待たなければいけないのは不満。

スケッチの例には WetherStationDemo|Extended|DSTと似たようなものが3本ある。中身を見ると動作はほぼおなじで、表示の仕方、画面の枚数などが違う程度。あとThingSpeakやセンサーをつかって、室温・湿度なども表示させているようだ。

ESP8266 Weather Station ColorをHSES-LCD24で動かした

ESP8266 Weather Station Colorは スイスの Daniel Eichhorn氏がblogで公開されているプログラム。wundergroundから気象情報を取得し、天気、気温、3日分の天気予報、月齢などを表示する。GitHubで公開されている。

カッコよさそうなプログラムなのでHSES-LCD24で動かそうと試してみたところ、あっさり動いた。WundergroundのAPI-keyの取得方法が若干わかりにくい程度。インストール方法はこちらにまとめておいた。

動かしてみると、やっぱりカッコいい。私の環境ではディスプレイに映り込むのが嫌で、部屋のカーテンを閉め切っているので天気がわかり難いのだが、これで天気がわかる。 外気温は室温よりも変化が大きくて面白い。外気温をスマホの天気状況と見比べているが、大体合っているようだ。3日分の天気予報も、なんか天気をイメージできていい感じだ。

技術的には、Wunderground.comから取得できる気象情報が興味深い。ここから気温データを取ってきて、保存し、グラフ表示とかさせたい。ここではIcon setsも提供されている。このプログラムでもてっきり、それが表示されていると思っていたのだが、ソースを見たら作者のサイトからbmpファイルをダウンロードしているようだ。

HSES-NODE-OLED発売

昨日からHSES-NODE-OLEDスイッチサイエンスから購入可能になった。物はOMMF寸前に上がって来ていたのですが、年末年始のドタバタやHP等の準備で時間がかかってしまった。

HSES-NODE-OLEDのセールスポイントは2つある。1つはGrove Wrapperで固定できるESP8266モジュールであるということ。もう1つは0.96インチSPI接続128x64dot OLEDが付属すること。

Grove Wrapperがあれば、対応した形状の小型基板を、いろんな方法で固定することができる。レゴブロックと組み合わせたり、ネジ止めできたりできるのだが、特に便利だと思うのはGrove Wrapperに磁石をネジ止めしたもの。M3皿ネジ穴付きネオジム磁石を購入し、自分で組み立てた。これを使うと割と強力に固定できるし、簡単に取り外しもできる。身の周りのいろんなところに簡単に設置できる。現在国内でGrove Wrapperを販売しているところは無く、直接SeeedStudioから買うしか入手方法がないようなので、HSES-NODE-OLEDには1個付属させている。ご活用頂きたい。

OLEDは、2.4インチのカラーLCDと比べるとモノクロだし画素数も少ないが、表示の明瞭度、視野角の広さが魅力的だ。それに小さいというところも良い。この手のOLEDにはI2C接続のものとSPI接続のものがあるが、更新速度にこだわりSPI接続のものを使用した。

基板上のピンソケットにはESP-WROOM-02の全I/Oが接続されている。100milピッチに乗っているので市販のユニバーサル基板が使用可能。個人的には、これで色んなハードウェアの実験に使っていきたい。

OLED向けに日本語表示に対応させたライブラリHumblesoft_SSD1306を公開している。また、サンプルプログラム集HSES_NODE_OLED_Sample_programsも、まだプログラムは2つだけだが公開している。

今後、ライブラリの機能拡張、サンプルプログラムの追加を行っていく予定なので、是非一度 HSES-NODE-OLEDを試していただきたい。

ESP8266 PlaneSpotterColorを動かした

ESP8266 PlaneSpotterColorはESP8266で旅客機の位置情報を取得し、小型カラー液晶に表示するプログラム。なんかHSES-LCD24で簡単に動きそうなので試してみた。

続きを読む… »

秋月電子のJpegカメラをESP8266に接続

シリアルJPEGカメラをesp8266につないでみようとaliExpressを物色していた私にとって、秋月の新製品TTLシリアルJPEGカメラは驚きの安さ、1,980円(税込)だ。同等品は国内だと3~4千円するし、AliExpressでも$16ぐらいする。驚きというのは言い過ぎかもしれないが半額に近い。ということで、さっそく注文。届いたいのでHSES-LCD24に繋いでみる。

続きを読む… »

OMMF2016参加報告

12月3日(土),4日(日)岐阜県大垣市ソフトピアジャパンセンターで開催されたOogaki Mini Maker Faire 2016に参加、出展した。

前日の2日午後8時20分発の高速バスで熊本を出発、3日午前7時半ごろ名古屋名鉄バスセンターに到着。JRで大垣へ移動、駅前のロッテリアで朝食を食べ、バスの時間が合わなかったので徒歩で会場に向かい、9時過ぎに到着。展示物を整え、石川さん骸骨くんと話などをしつつ12:00の開会を待つ。

続きを読む… »

温度計プログラム完成

HSES-LCD24のサンプルプログラムとして温度計が完成、githubに公開した。まずは、画面を見て貰おう。

161124a1i
画面には、日付、時刻、温度センサーから取得した4つの温度と、その平均値、温度変化のグラフが表示されている。グラフには当日のデータに加えて、前日のデータもグレイで表示されている。
続きを読む… »

arduino用にsscanf関数のサブセットを作成

d161118a1C/C++のプログラムで簡単な文字列解釈が必要になった時、sscanf()で処理しているのだが、esp8266 arduino環境だと使えない。コンパイルは通るがリンク時にエラーとなる。仕方がないので strtol()関数などで凌いでいたのだが、浮動小数点の解釈をする必要があり、StringのtoFloatの説明を見ているうち、段々腹が立ってきて、sscanf()のサブセットを作ることを思いついた。

toFloat()で許せないのは、数字として解釈できなかった場合0を返すだけで、元の文字列を見ないと数字だったのかどうかわからないこと。解釈できたかどうかをbool値で返し、値は引数に変数のポインタを渡して返すべきだと思う。
続きを読む… »

SPI3台使いは、ちょっと大変

d161117a2HSES-LCD24ではESP8266(ESP-WROOM-02)のSPIに3つのデバイスが接続されている。TFT LCDとTouchscreenとSDカードスロットの3つだ。1つづつの動作確認は済んでいるのだが、今回初めて3つのデバイスを同時に動作させるプログラムを作ろうとしてトラブった。

各デバイスのライブラリーは、いろいろ提供されている。、SPI接続のライブラリーは基本的にSPIに複数のデバイスが接続されていることをあまり考慮していないので、使用の際には注意が必要だ。

まず、SPIデバイスのCS信号に接続されている端子は、初期化時にHighを出力されるようにされるが、そのまま初期化処理を続行されてしまうので、デバイスの初期化処理(biginメソッド?)を順次呼び出すと、他のデバイスのCS信号が未初期化、INPUTモードでハイインピーダンス状態でSCLK/MOSI/MISOに信号が出てくることになりMISO信号の衝突がありえる。よって、全部のCS信号を自分でHigh出力状態にしてやる必要がある。

続きを読む… »

cygwin上でArduinoOTA動作

161114a1ArduinoOTAというのは、OTA(Over The Air)無線経由でArduinoでコンパイルしたプログラムをターゲットに書き込む機能らしい。存在は、前から知っていたが、ROM容量を倍使うとか読んだことがあって、そうなると日本語フォントを使用するプログラムでは容量的に非常に苦しい。ということで、手を出さなかったのだが、今、作業しているプログラムは日本語無しでも行けそうなので、組み込んでみることにした。

続きを読む… »

esp8266/ArduinoのRTC

f161108a1ESP-WROOM-02等で使用するesp8266/Arduinoでは、サンプロプログラムにNTPClienttが含まれていることもあり、現在の時刻を取得するRTC(Real Time Clock)は自分で作成するものだと思い込んでいた。

時刻を取得するたびにntpパケットを飛ばすのもどうかと思うので、ntpパケットは適当な間隔で飛ばして、millis()関数とのオフセットでも管理することになるのかな。ntpサーバ1つだけだと嫌だな、とか色々考えているうち、偶然 esp8266/Arduinoの中にtime.cというファイルを発見。configTime()関数で、サーバーやタイムゾーン等を設定してやれば、time()関数でUNIX時間を取得できそう。
続きを読む… »

RSS表示プログラム

161107a2HSES-LCD24用にRSS表示プログラムを作成し、GitHubで公開した。

RSS表示プログラムは、ニュース/Webサイト、Blog等の更新情報であるRSSを表示させるプログラムで、ニュース等のタイトルだけ、表示させ続ける電光掲示板でみかけるやつである。PCでは普通の機能だが、ネットワーク接続された表示装置にとっては、その機能をうまくアピールできる有難いプログラムである。

HSES-LCD24用にRSS表示プログラムを作るにあたって、日本語表示機能やスクロール表示機能は作成済みなので、残る必要な機能はRSSのパーザぐらいである。これも昔C言語作成したSAXっぽいプログラムがあったので、C++に書き直し、PC上でデバッグ&テストを済ませたのち、ESP8266/Arduinoに組み込んだ。なおRSSはサイト毎に読み込み、20Kbyte程度のバッファに蓄えたのち、1記事あたり5秒づつ表示させている。

最後に、時刻の表示機能も欲しくなり、自作する必要があるのかと調べたら、簡単に使えるntp同期の時計がESP8266-Arduinoに組み込まれていることがわかり、使用した。これについては、また、別記事で紹介したい。

161107a6m

RSSも表示できるHSES-LCD24はスイッチサイエンスにて絶賛発売中です。

ILI9341のスクロール機能

fig161103a2ILI9341には,画面をスクロールさせる機能がある。VerticalScrollDifinition(33h)コマンドで、上下の非スクロールエリアの幅を設定(リセット時は0)。VerticalScrollStartAddress(37h)コマンドでスタート位置を設定すれば、Vertical Scroll Areaの表示を自由にスクロール(回転?)表示できる。

続きを読む… »