ラベル Wifi の投稿を表示しています。 すべての投稿を表示
ラベル Wifi の投稿を表示しています。 すべての投稿を表示

2015年12月29日火曜日

ESPにつないだRGB LEDをブラウザから制御する


■WiFi制御Lチカ■

ESPからサーバへデータを送信するのは何度かやったのですが、そういえばブラウザなどからESPを制御する、というのはやっていなかったので試してみました。

上の動画では、

  1. http://server/?w=4
  2. http://server/?r=1023&g=1023&b=1023
  3. http://server/?r=1023&g=0&b=0
  4. http://server/?r=0&g=1023
  5. http://server/?w
  6. http://server/?r=0&g=0&b=1023

の順番で操作しています。1.明滅指定、2.全色全点灯、3.青のみ明滅、4.緑のみ明滅、5. 明滅をストップ、6.青のみ点灯、という制御です。

こういうのをゼロから作るのはシンドいので、まず土台になりそうなプログラムをESP8266サンプルの中から探すと「HelloServer」というのが見つかりました。

これは、ブラウザから「/」または「/inline」でアクセスするとそれぞれ異なるメッセージが返ってきて、それ以外だとnot foundとともにargが表示される、というものです。必要なのはパスとargなので、これを使います。

■仕様と解説■

単にLEDを点滅させるだけじゃつまらないので、

  • RGB LEDを接続する
  • 各色ごとに明るさを変える r=100&g=200&b=300 って感じで
  • w=<n>と指定するとn mSec×256周期で滑らかに明滅する。ただしその時に設定されている各色の値がピークの明るさになる。

って仕様にしてみました。明るさを調節するにはanalogWriteでPWMを使い、それを滑らかに変化させるためにTickerを使います。

analogWriteは指定したGPIOに対して約500hzのPWM出力をします。値として0-1023を指定することができますが、値/1023の比率でonになっている時間が長くなります。0を指定すればずっとoff、512なら約50%、1023ならonのまま、ってことです。

Tickerは指定した秒数ごとに指定した関数を呼び出してくれます。attachで有効になり、detachで無効になります。今回のプログラムではsetupであらかじめサインカーブを描くテーブルisinを作っておき、設定したミリ秒数毎にテーブルの値を出力することで滑らかに明るさを変化しています。実際にその処理をおこなっているのはwaveHandlerです。waveHandlerではwaveCountで示されるisinの値を各色ごとの直近の明るさ比率(gRGB)に補正して、RGBごとに位相を120度ずつずらして(i*MaxSinTable/3)出力しています。一個出力したらwaveCountに1を足して次の値を準備します。

ブラウザからのコマンドを受け付けるのはhandleRootです。最初の例で示したように引数は同時に複数指定することができます。何個引数があるかはserver.args()で知ることができるので、これでforループを回します。そして、「引数名=値」の形式の引数名に相当するargName(i)の最初の1文字だけを取り出し、値をarg(i)から取り出します。そして引数名として指定されたのがr, g, bならばそれぞれの明るさをセットし、wならば値をミリ秒単位の割り込み周期としてattachかdetachを実行します。wはトグル動作つまり呼ばれるごとにon/offを切り替えるので、tickerAttachedというフラグを用意して切り替えます。

サーバのルートが呼ばれたらhandleRootを呼び出すということは、setup()の中で
server.on("/", handleRoot);
と指定しています。

…楽だわー。Play! Framework並にラクだわー(すいません、仕事でstruts2などという化石の干物を腐らせたようなライブラリを相手にしているので、つい愚痴が)

なお、handleNotFoundはサンプルのままです。ブラウザから例えば
http:<server>/foo?tare=panda
と呼び出すと、画面上には
File Not Found

URI: /foo
Method: GET
Arguments: 1
 tare: panda

という表示が返ってきてソースと見比べながら引数などをどういう具合いに扱われるかがよくわかります。

また、setup()では
  server.on("/inline", [](){
    server.send(200, "text/plain", "this works as well");
  });
という記述もあります。この [ ]( ) { } は無名の関数で、別のところにhandler関数を書くかわりにここで簡単な処理をチャッチャと記述してしまうことができます。サンプルのように単純なテキストメッセージを返すならこれで十分ですね。

■ハードウェア■

素のESP-WROOM-02は配線が面倒くさいので、今回は自家製のESP基板を使いました。FTDIとRGB LEDを接続するだけなので素晴らしく簡単です。電源にも良い部品を使っているので動作も安定しています(だれも褒めてくれないので自分だけは自分に優しくしよう)。



ESPでのお約束なプルダウン / プルアップ抵抗などの他には、RGB LEDを接続するだけです。

RGB LEDは秋月の「RGBフルカラーLED 5mm4本足 OSTA5131」です。BlueとGreenのLEDは3.6v以上の電圧かけないと光らないのが建前なんですが、実際には3.3vでも結構明るく点灯しちゃうんですよね。なお、GPIOと直結するのはまずいので、220オームの抵抗を直列に入れてます。また、このRGB LEDはカソードコモンといってマイナスにつなぐ側が共通になっています。GNDと接続してください。その辺、ブレッドボードでつくると妙にでかくなってしまうので、aitendoのユニバーサル基板で作りました。
ああハンダ付けは楽しいw


■はまりどころ■

今回はなかった、と言いたかったんですが、実は解決できていない問題が1つ。このプログラムを起動して r=200&g=200&b=200&w=8 と暗め and ゆっくり目で動かしていると時々「パッ」と明るくなります。WiFiに関する機能を取り除いても起こりますが、明滅させないでいると起こりません。

明滅時にはanalogWrite命令で頻繁にPWMの出力幅を変えているのですが、実行のタイミングが悪いとHIGHがしばらく続いてしまうのではないかと思います。同じような現象はmbed / LPC1114FN28でも経験していて、この時はPWMの周波数を高くすることで回避できたのですが、Arduino IDE環境ではPWMの周波数を簡単には変更できないのでさてどーしたもんかしら。

■ソース■

というわけで、ソースです。

2015年9月16日水曜日

ESP-WROOM-02の電源はかなりシビア?

林さんの髪型を彷彿とさせる配線状況

前回の記事(やっとESP8266(WROOM-02)入手)で、ファームウェアを書き換えるための文字列のスペースが詰まっていたり全角が挟まっていてご迷惑をおかけしました。申し訳ありません。なぜかこのブログを書いているBloggerでは、数日後テキストのスタイルが突然崩れるという珍現象が時々発生します。発表直後には必ず確認しているのですが、後日見ると崩れていて…私も自分でコピペして初めて壊れていることに気づいた次第です。大変申し訳ありませんでした。

さて、某林さんのところでも珍現象が起きていて、どうもESP-WROOM-02のWebサーバが安定しないご様子。数分でフリーズしたり、たまに数時間動いたりする。私のところで正常に動いていたWROOMを送って試したもらったのですが、このときSSIDを林さんちに合わせていなかったので、予備のWiFiを用意してもらいました。するとなんと数時間無事に動作した!…のですが、やっぱり落ちる。林さんの作ったWROOMでも予備WiFiだと比較的安定するものの、やっぱり落ちることは落ちる。

それでここしばらく、林さん、○野さん(伏せ字になってないな)と3人で脳ミソを寄せ集めていたのですが、どうにもならず。

で、ゆうべ、ちょっと確認したいことができたので、私のうちにもう一枚余ってたESP-WROOM-02を組み立てて実験していたのですが…これがまともに動いてくれません。林さんと同様どころか林さんより悪くてsetup()の起動メッセージすらでない。

電源はUSBシリアルの5v出力からDC/DCを使って3.3vに落としているので容量的な問題はないはず。

これも一晩、各種バージョンのファームウェアをアドレス変えながらいろんなパターンで流し込んだりしたのに、状況は変わらず。

…というか変わらなすぎる。ファームが原因なら、もっと毎回違うメッセージが出てくるはず。

というわけで念のため電源電圧を測ってみたら、3.1vしか出ていない? USBシリアルの供給能力が足りないっぽいので、USBシリアルのVcc端子をやめてACアダプタに交換してみました。

すると何事もなかったかのように、Web画面表示が…。

また無駄な苦労をしてしまいました…。

追記:使っている三端子DC/DCについて書きました(リンク)。

今日会社で眠いだろうなぁ…。

寝てないわー3時間寝てないわー(ミサワ
以前Beaglebone blackで作った睡眠・活動計(Play!アプリとBoneScriptの通信 - 1.構成)は今もちゃんと動作していますが、こういう時は便利なのか不便なのか…。寝不足だから眠いのではなく、寝不足だと思うから眠いのだ、と言ったのはどこの漫画家だったか、それとも照井俊光氏の弟子トミ子氏だったか…。

2015年8月24日月曜日

やっとESP8266(WROOM-02)入手


■追記9/16■

ファームウェアのダウンロード先が違っていました。またコマンドラインなどの表示が崩れていました。ご迷惑をおかけして申し訳ありませんでした。

なお、後日、もう一枚のESP-WROOM-02を組み立てたら、コマンドやArduino IDEファームウェアの書き込みはできるものの、起動してすぐにexceptionやコアダンプの山が出てくる状態になりました。

原因は電源でした(ESP-WROOM-02の電源はかなりシビア?)。某林さんを初め、この現象で悩んでいる方は少なくないようですので、ご参考になれば幸いです。

■お礼■

facebookで某林伸夫さんから教えてもらって、仕事帰りにaitendoに駆け込み入手しました。2個入りとボード2枚で1320円。情報ありがとうございました。

■準備■

さっそくハンダ付け。何も考えずにピンヘッダ付けちゃいましたけど、幅が広いのでブレッドボードで使うのが難しいです。横方向にジャンパ伸ばせばいいんだけど、壮大に間違える自信があるw なので、写真にあるように100円で買ってきたミニブレッドボードを2枚橋渡しして使っていますが(aitendoで1枚100円大安売りしてました。買っといてよかったw…と思ったけど、安いのには理由がある。クソ堅くてピン刺さらないいいいいいw)、ピンソケットを付けた方が試作には便利かも。あ、サンハヤトの新しいブレッドボードなら届きますね。


■さて■

何はともあれ環境整備、最近失敗が多いので、人様の成功例を真似しました。今回はこの記事(ESP-WROOM-02 の Arduino 環境で I2C 制御)を参考にさせていただきました。ありがとうございます。I2C用のプルアップ2本だけだと思っていたのですが、10kΩは5本必要。ずいぶん抵抗使うなぁと思ったんですが、おかげさまで一発で成功しました。

なおリセット/ISPについてはいつもの抵抗入りジャンパ線でGNDに落とすだけ、プルアップはしていません。

電源は最初余裕を見て秋月の超高効率三端子レギュレータを使いましたが、そのあと3.3v100mAの安い三端子レギュレータ(HT7533…秋月では販売終了)に交換しても問題なく動作しました。ESP-WROOM-02の平均消費電流は80mAとのことなので、ちょっとギリギリですが。

Arduino IDEは1.6.5を使います。まずArduino IDEを起動しPreference / 環境設定画面のAdditional Boards Manager URL'sに「http://arduino.esp8266.com/stable/package_esp8266com_index.json」をコピペしてOKをクリック、Toolsメニュー>Board>Board Manager>esp8266 platformを選ぶとインストールされます。

この後、ボードの種類を選びますが、aitendoなど素のespの場合にはGeneric ESP8266 Moduleです。

■ファームウェアアップデート■

この後、WiFiのサンプルを試したのですが、うまく動きませんでした。ので、ファームウェアをアップデートします。バージョンを確かめようとシリアルモニタからATコマンドを叩いてみたのですが、返ってきません。どうやら一度Arduinoとして動作させるとATコマンドインタフェースが消えてしまう模様。そのためだけにツールをアップロードするのも面倒なので、もうサクッとアップデートしてしまいます。Windowsはそのためのツールがあるようなので、そっちをどうぞ。Mac / Linuxではコマンドラインから操作します。

まずesptool.pyライブラリ(分かりにくいけどATTACHMENTSのところ)をダウンロードします。それぞれのzipを解凍したら、esptoolをインストールします。

$ cd <ダウンロードディレクトリ>
$ cd esptoos-master
$ sudo python setup.py install

次にライブラリをインストールしますが、そのためにはUSBで接続したデバイス名が必要です。Arduino IDEのツールメニュー>ポートを見れば /dev/tty.usbなんたら という名前が表示されているはずですので、それを控えておきます。私のところは /dev/tty.usbserial-AH016T8K です。

$ cd <ダウンロードディレクトリ>
$ cd esp_iot_sdk_v1.3.0_15_08_08 ←ダウンロードしたバージョン次第
$ cd esp_iot_sdk_v1.3.0/bin ←これも


以下は実際には1行です。また、上が1.3なのに下が1.2ですが…これは何故か1.3の中に入っているものが1.4と1.2で、1.4はβ版(b1)なのでこうなりました。ダウンロードしたものの中身に合わせてください(以下のコマンド、実際には1行です)。

$ esptool.py -p /dev/tty.usbserial-AH016T8K write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.1024.new.2.bin 0xfc000 esp_init_data_default.bin 0xfe000 blank.bin

すると以下の表示が出てきます。エラーなしにLeavingが出てくれればOKです(というかエラーになったことがないので不明…エラーとしてあり得るのは、usbシリアルの名前が違う、ファイル名が違う、ディレクトリが違う…などでしょうか)。

Connecting...
Erasing flash...
Writing at 0x00000400... (100 %)
Erasing flash...
Writing at 0x00041000... (100 %)
Erasing flash...
Writing at 0x000fc000... (100 %)
Erasing flash...
Writing at 0x000fec00... (100 %)
Leaving...$

これで書き込み終わりました。念のため、さっき動いたスケッチをもう一度書き込んでみて、同じように動作するか確認しておきましょう。

■さて。WiFi■

これもサンプルを試しました(ええそうよ失敗したくないのよ私は)。Arduino ideで ファイルメニュー>スケッチの例>ESP8266WebServer>AdvancedWebServer を開き、WifiルータにあわせてSSIDとパスワードを設定します。シリアルモニタを開くとIPアドレスなどの情報が表示されますので、そのURLをブラウザで叩くと表示されました。このグラフは単に乱数で生成されたものですが、SVGで非常に簡単にグラフができていますので、サーバ側単体でデータ表示する場合の参考になると思います。


…と書くと一発で動いたみたいですが、実際には上記ファームウェアアップデートの前に試してみたら、動きませんでした。v1.2のファームウェアを入れたところ、一発で起動してそのまま8時間安定して動きました。

でそのファームウェアやバージョンの差異ごとにパラメータが違ったりで、インストール後にまったく反応しなくなることもあり、結局最終的に上記パラメータにたどり着くまで2時間ほどかかりました。

■お約束のハマりどころ■

Arduinoとの互換性は高いのですが、微妙な違いもあります。私がハマったのは、もはや私の宿敵ともよぶべきI2C。最初に試した、超小型液晶AQM0802はそのままスケッチをコピペして動いたのですが、その後、手持ちのLCDライブラリやHDC1000用ライブラリは動いたり動かなかったり。

どうもI2CでendTransmissionした後、標準のArduinoでは送信を終了してから戻り、ESPでは終了を待たないで戻ってしまうのが原因ではないかと思い、調査中です。