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

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

favicon.icoを作ってくれる favico

岡山大学の乃村研究室が公開しているツール集 (GitHub – nomlab/tools: Useful home-brewed small tools) の中にある favico というプログラムが便利。これは favicon.icoをコマンド1発で作ってくれるツール。 Webサーバのログを見て favicon.icoがありません、というエラーに遭遇しても、このコマンドがあれば一発で作れる。 文字だけに限定されるデザインだが、自分で作るfaviconも、いつも、そんな感じなので、十分だ。もっと凝りたければ、普通のツールで作れば良いのだ。

例えば、

$ favico -c white -b green -f Takaoゴシック -o favicon.ico  '電'

とコマンドを入力すると、というような画像ファイルを作ってくれる。

使い方は、引数無しで起動すると表示される。サイズ、色、フォントなどが指定できる。

$ favico
Usage: favico [-s size] [-c color] [-b bgcolor] [-f font] -o FILENAME STRING
Example: favico -s 64 -c white -b blue -o N.png 'N'
         favico -s 64 -f '/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc' -o nom.png '乃'

使えるフォント名が謎だったが、 favicoは Imagemagickのconvertコマンドを起動するshellスクリプトなので、以下のコマンドで自分の環境で使えるフォントの一覧を表示できる。

$ convert -list font | grep Font:

こんな便利なツールを公開して頂いてありがとうございます。>乃村さん

esp8266-arduinoでSD::remove()が固まる件

fsHandlerを作成している際、表記の問題に遭遇した。
原因は、SD.hの108-109行

  // Delete the file.
  boolean remove(char *filepath);
  boolean remove(const String &filepath) { 
    return remove(filepath.c_str()); }

remove(filepath.c_str())でremov(char *filepath)が呼び出されそうだが、
filepath.c_str()の型は (const char *)つまり書換不可文字列。これを (char *)書換可文字列として関数に渡すわけにはいかない。

不幸なことに String型にはconst char *型引数1つだけのコンストラクタがある。このコンストラクタにより、const char *型の文字列はString型に変換され、remove(const String &filepath)、つまり自分自身を呼び出し続けることになるのであった。

SD::exists,mkdir,rmdirも全く同じなので、固まるはず。

ちなみに、version 2.4.0-rc1では修正されている。

  boolean remove(const char *filepath);
  boolean remove(const String &filepath) { 
    return remove(filepath.c_str()); }

回避策は簡単、(char *)にキャストすれば良い。

  SD.remove((char *)path.c_str());  

気持ち悪いのは我慢.

AutoHotKeyでIME制御

Windowsを使っていて不満なのは、かな漢字変換のOn/Off切り替え。「半角/全角」キーを押せば良いのだが、このキーがブラインドタッチ(タッチ・タイピング?)しずらい。

以前は、日本語化EmacsでIME制御も出来ていたのでCtrl-Oに割り当てて満足していた。ところがIME制御ができるEmacsが手に入らなくなった。この場合Ctrl-OにはEmacs独自の入力メソッドの切り替え機能になり、WindowsのIMEとは別のものなので、とてもややこしいことになっていた。とても使いにくい。

昔は、Unix/Linu上のemacsでwnnやら使って、幸せにかな漢字変換できていたのに、何なのだろうと思う。

というわけで、このことは、かなり長い間、悩みのタネだったのだが、今回 思い切って AutoHotKeyでIMEのOn/Offを切り替え、この機能をCtrl-Oに割り当てることで、emacsだけでなく、Atomやブラウザでも日本語入力が楽になり幸せになった。Windows10ではIMEがどの状態に切り替えられたのかわかりやすくなったのも嬉しい。

参考にした記事は、今日もどっこい生きている: IMEのOn-OffをAutoHotkeyで行うで、2009年、8年も前の記事。

AutoHotKeyは、長いこと使っているが、何が出来て何ができないのか、まださっぱりわからない。

ESP8266用ILI9341ライブラリの高速化

HSES-LCD24用のILI9341ライブラリとして、Humblesoft_ILI9341を使用している。これは、Adafruit_ILI9341を拡張したもので、Fontxを使った漢字描画機能、scroll機能などが追加されている。 実行速度面では、まったく改善されていない。HSES-LCD24用のデモプログラムを新たに作ろうと思うのだが、描画速度が遅いので、先に高速化を行うことにした。

Adafruit_ILI9341のexamplesにgraphicstestという各種描画機能の実行時間をマイクロ秒単位で表示してくれる。これを使い、実行時間を計測しながら高速化を行った。

最終的な結果の表を以下に示す。塗りつぶし系の描画では7倍前後、あまり高速化できなかったLines等でも1.5倍程度の高速化ができた。 文字の描画も4.68倍高速化されているが、これは若干説明を要する。

今回使用した高速化の手段を以下に示す。

  • CS,D/C信号操作の高速化
  • SPI大量データ転送の高速化
  • クロックの高速化
  • 文字描画の高速化

続きを読む… »

Windows上のエディタ

Windows上でも、ずっとemacsを使ってきたが、ちょっと辛くなってきた。IME制御機能付きのWindows用emacsが手に入らなくなってきたからだ。

IME制御機能付きであれば、emacsのキー(デフォルトでCtrl-\, 私はカスタマイずしてCtrl-O)でIMEのOn/Offを切り替えることができるのだが、機能が無いとemacsのキーでは、emacs自身のかな漢字変換機能のOn/Offが行われ、IMEのOn/Offは「半角/全角」キーで行うことになる。日本語を入力しているとモードが混乱して極めて効率が悪い。
続きを読む… »

F-PLUG 再び

2年前に F-PLUGというBluetooth接続の電力計を導入し、部屋のエアコンの電力、周辺温度、湿度等を1分ごとに記録し、Linuxサーバに保存していた。Bluetooth接続をLinuxのrfcommコマンドでttyデバイスに変換し、sunagaeさんのpythonのプログラムでデータを取得している。 

ところが、rfcommのプロセスがよく止まる。 そのたびにrfcommを再起動(再実行?)させていたのだが、エアコンの電力消費状況も把握できたので、興味も薄れ、ほっぽらかしにしていた。

だんだん暖かくなり、今年はエアコンも新設したこともあり、興味が復活、ふたたび使いたくなってきた。しかし、rfcommを使うのは止めたい。 pythonを使えば、直接 Bluetooth機器とお話しできるっぽい、

まずは、pyBluezで、bluetoothデバイスのスキャン

import bluetooth

nearby_devices = bluetooth.discover_devices(lookup_names=True)
print("found %d devces" % len(nearby_devices))

for addr, name in nearby_devices:
    print(" %s - %s" % (addr, name))

デバイスのアドレス (‘B0:99:DE:AD:BE:EF” みたいなやつ)がわかれば、socketで接続できるらしい。

import socket

addr = "B0:99:DE:AD:BE:EF"
port = 1

sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM,
                     socket.BTPROTO_RFCOMM)
sock.connect((addr, port))

これを使ってpyFplugを改造し、直接データを取得できるようになった。 F-PLUGは 新しい方のエアコンに付け替えた。

可能ならF-PLUGを買い足そうと思ったんだが、調べると販売中止になっている。売れなかったということか。同じbluetooth接続の電力計 ラトックのREX-BTWATTCH1の方は、まだ買えそうだが、通信プロトコルの情報がみつからない。なんとかなるのであれば、他のエアコンや冷蔵庫のデータも取ってみたいところだが、残念だ。

音楽の再生には何bit必要?

ESP32のDACに音を出力する場合、8bitというのはどんなもんなんだろう。 bit数が足りないために音声が、まともに聞こえないというのでは困るなぁと思い、実験してみた。

pythonのwavライブラリを使うとwavファイルの操作ができる。これを使って、wavファイルのデータを指定したbit数まで落とすプログラムを作成した。処理に結構時間が、かかるので10秒だけ出力する。

結果、私のPCの再生環境では8bitと12bitの聞き分けができないことが判明。8bitからbit数を落として行ってもホワイトノイズが増えていくだけで、あまり問題無く聞ける。1bitだとノイズがかなり大きいが、それでも曲は判別可能。予想外の結果だった。

変換した結果を以下に示す。元の曲は魔王魂さんのフリー歌もの素材「桜日和」

1bitの音源:(音量注意)

続きを読む… »

ESP32_MP3_Decorderを動かしてみた。

ESP32のI2Sで音声出力の実験をしているが、なかなかうまくいかない。サンプルプログラムを元にプログラミング・ガイドを見ながらDACに音声を出力させようとしているのだが、うまくいかない。部分的にちゃんと波形は出力されているのだが、うまくつながらない。周期も変。

資料も少ないし、動いたという例も無いと思っていたところESP32_MP3_Decoderの存在を知る。試してみると、いろいろ問題は、ありながら、断続的に音が出た。MP3のデコードも自前でやっているらしい。


続きを読む… »

intel hexファイルのマージ

PIC32MXのプログラムを開発中、2つのintel hexファイル(bootloaderとfirmware本体)を1度に書き込みたいと思ったのだが、pic32progではできない。objcopyあたりでmergeできるか調べるが,無理そう。hexファイルのmergeならpythonで自分で書いても簡単そうなので書き始めるが、念のため python + intel hexで検索したら、ライブラリ、その名もintelhexがあった。ドキュメントによるとmerge機能まである。サンプルを見ながらプログラムを書き、あっさり動作。凄いね。世の中は。

import sys
from intelhex import IntelHex

usage = "%s hex_infile1 hex_infile2 hex_outfile" % sys.argv[0]
if len(sys.argv) != 4:
    print(usage)
    sys.exit(1)

infile1, infile2,outfile  = sys.argv[1:]

ih1 = IntelHex(infile1)
ih2 = IntelHex(infile2)
ih1.merge(ih2, overlap='ignore')
ih1.write_hex_file(outfile)

ドキュメントによると、ライブラリにhexmerge.pyというユーティリティが付属し、ライブラリと一緒にインストールされるとあったが、わたしの環境では見付らない。これが使えれば、プログラムを書く必要すら無い。

ESP8266+OLEDでRSS表示

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

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

ESP32で動画表示

ESP32に接続した320×240のTFT LCDにネットワーク経由でデータを転送し動画を表示することができた。表示速度は、240×160だと10fps, 240×135で15fps, 120×90なら30fps以上が可能。あと2倍ぐらい高速化の余地はありそう。

ESP32側のプログラムはArduino環境で開発。udpパケットを受信し、データをそのままLCDに書き込む。簡単なフロー制御も実装している。tcpではなく、udpを使用したのは、フロー制御を自前でやりたかったから。通信エラーでパケット欠落が起きても再送などして欲しくなかったから。あとudpだと自然にパケット単位で処理することになり、プログラムがわかりやすい。tcpのストリームにパケットの切り出し処理が面倒。やってみた結果,フロー制御でいろいろ実験できて面白かった半面、いろんな通信環境にちゃんと対応できているかどうか不安。そのうちtcpでも試してみたい。

動画データは、既存の動画ファイルをffmpegで専用フォーマットに変換したものを使用。ファイルの中には RGB各5,6,5bitづつの16bit/pixelのTFT LCDのフォーマットで画像データが収められている。これをpythonのプログラムでudpパケットで送信している。


続きを読む… »

ESP32のGPIOのバグ

ESP32でパラレル接続のTFT LCDに表示を行おうと、既存のライブラリを参考にプログラムを書き、大体動くようになったのだが、なんか変。変な点が描画される。(右上の写真参照)

怪しいところはたくさんある。自分のコードも怪しいし、LCDは使用実績はあるものの、結構古いものなので怪しいし、esp32-arduinoもesp-idfも日々更新されていて怪しい。電源ラインも怪しい。オシロスコープを駆使し、しつこく調べると WRパルスが出ているタイミングでCSがHighになっている状況を発見。WR信号もCS信号もGPIOで操作している。これは、プログラムのミスではありえない。
続きを読む… »

Bad Apple on ESP8266 + OLED

HSES-NODE-OLEDでBad Apple(影絵)を再生できた… って、結構前に出来ていたのだけれど、Blogに記事を書くのが遅くなってしまった。画像データは ffmpegで1フレームづつBMPファイルに変換し、PCからpythonのプログラムでudpパケットにして送信している。詳しい話はQiitaに書いた。ソースコードはGitHubで公開している。
続きを読む… »

温度計プログラム完成

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

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