ESP-WROOM-02

ESP-WROOM-02単体でWi-Fi通信とNeoPixel両方動かしたい(1)


ESP-WROOM-02を使ってWi-Fi通信をしたい。
しかも、通信して取得したデータによって、NeoPixelの光り方を変えたい。

先日の記事ではArduinoにFirmataのスケッチを書き込んでNode.js(Johnny-Five)で動かせるようにしましたが、

その場合Wi-Fiで通信するのは、どうしたらいいの?
ってことで挑戦中です。
挑戦中のメモ記事なので今すぐ真似したり何かを解決したいとかいう人向きではないのであしからず…

ESP-WROOM-02をWi-Fiにつないでみる

ぐぐればいくらでも記事が見つかりますので、まずはJavaScriptのことは忘れて自宅Wi-Fiルータにつなげてみました。

これを使ったらめちゃくちゃ簡単でした。
USBシリアル変換がついているのでただUSBを挿すだけ。
配線もなにもない。
右下のボタンを押しながら書き込みをする、と。
HelloServerのサンプルスケッチを書き込む、ただそれだけ。

で、NeoPixelを動かすのも、Adafruitのライブラリをインクルードしてサンプルスケッチ書き込むだけ。

こないだまでArduinoUnoでやってたことが、こんなに小さなボードでできてしまうんですね!

ちなみに、こんなライブラリを見つけました。

つまり、ESP8266を介して通信して、Johnny-Fiveを使える…
よさそうじゃないですか?

でも、NeoPixelRingは身に着けたい。

となると、ArduinoUnoをぶら下げるわけにもいかないので、やっぱりWROOM02単体で動かしたい!

無理にJSで動かすことにこだわらず、Arduinoプログラミングも覚えていけばいいじゃない。

この際Node.jsを使わずWi-FiとNeoPixelを共存させる

というわけで、ESP8266のサンプルスケッチと、NeoPixelのスケッチをがっちゃんこしようとしたら、まあもうぜんぜんうまくいきませんでした。
エラーが出て、それらしい箇所を消したりしてみてもダメ、そもそもこの言語を知らないから何がどうダメなのかわからない。
いろいろ検索しても日本語の情報が少ない。
たどり着いたのが

「ESP8266とNeoPixel一緒に使おうとするとうまくいかないんだよね~ってわけで調整してみたからね!」
「あなたの環境にあわせて修正して使ってね!」

っていう、ドンピシャな内容!
さっそくコピーさせてもらうと

コンパイル時にどうしてもエラーが出る。
しかも定義してないよとかいうけどちゃんとあるし。
重複して定義している箇所もないし。
何がなんだかわかんないよ!

あとからわかったんですが、setup()、loop()よりもあとに関数が書いてあるとだめっぽい。
ほかにもちょくちょく、どこそこのファイルがダメ~みたいなエラーが出るので、ESP8266のライブラリのファイルを削除して違うバージョンをインストールしたりとか更新したりとかいろいろやりました(ヽ´ω`)

そして、せっかく書いてくれた関数を片っ端から消し、エラーが出なくなるまで関係なさそうなところを削っていきました。
スッキリした状態からNeoPixelの単純な処理をちょろっと書いて、コンパイル。

連動はしていませんが、Wi-Fiにつなぐほうの処理とNeoPixelを光らせるほうの処理、まとめて書き込むことに成功。

MilkcocoaSDKも使ってみる

サーバ側の処理の書き方とかがぜんぜんわからないので、Wi-Fi通信で「受けたデータによって」NeoPixelの光り方を変える、ということをどうやったらいいんだろう、と悩む。
さらに、自分のアクションによってほかのユーザのリングも同じように光らせる、とかもしてみたい。
となるとセンサーなどの「値を送る」のもやらないといけない。

そこで、Arduino/ESP8266用のSDKも展開しているMilkcocoaの出番。

ライブラリを読み込んで、サンプルスケッチを書き込みます。
ここでまたコンパイルエラーが出たので、サンプルの下のほうにあるvoid onsend(DataElement elem)とかはsetup()の前に移動しました。
ここまでくるとだんだんエラーの出るポイントがわかってきますね。
サンプルのソース自体に問題があるというより、IDEやライブラリのバージョン違いによる、言語の構文チェックらへんの差異な気がします。

そこさえ気をつければこれこのとおり。

あっさり!(・∀・)

そしてここで気づくのです。

MilkcocoaのサンプルスケッチだけでWi-Fi通信もできてるんだから、サーバの処理なんて考えなくていいし、あとはただNeoPixel光らせるだけじゃね?

すごいよ、Milkcocoaすごいよ・・・

で、とりあえず照度センサーの値はMilkcocoaとやりとりできているので、onSendでとれた値によってif分岐。NeoPixel用のライブラリを読み込んで、分岐によってLEDの色の設定を変える、とここまでのスケッチを書き込み。

動きません。

照度センサーの値は定期的に送信されていくのですが、LEDが光らない。
ジャンパワイヤを触ったりすると、チカッ!となったりするので接触の問題かな~?とも思ったんですが、実際に書いたスケッチでは1個ずつ順番に点灯するので、そもそもそういう風に動いていない。
しかもときどき照度が著しく低くなったりする。
さらにWROOM02自体のLEDが消えたり、Wi-Fiが切れて再度接続したりする。

これはもう、電力不足なのでは!?

と気づきました。

おそらくNeoPixel側を動かすとき、またはWi-Fiで接続するとき、など急に消費電力が高くなったときに足りなくなって、照度が小さくなってしまうのではないでしょうか…

給電を解決する必要がありそう。

というところまで。

スポンサードリンク

菜摘

Web制作がメインですがときどきフライヤーデザインやCDラベルなどDTP系もやってます。 デザイナーだったはずがhtml/cssコーディングに目覚めた。 黒い画面は相変わらず怖い。 javascriptはこのごろちょっと頑張ってるよ。

コメント

  1. 電力不足もありえますが、NeoPixelは割り込みとの相性がわるいので、ESP-WROOM-02が無線通信する際に発生する割り込みでNeoPixelへのコマンドのタイミングが狂わされてる可能性も多いにあると思います(NeoPixelはマイコンとクロック信号のやり取りをしないので、マイコン側の割り込みでコマンドが崩れてしまう&無線通信はプログラム下層でたくさん割り込みを起こす)。

    もし、照度の送受信が頻繁なら、その頻度を減らしてみると状況がよくなるかもしれません。
    ただ、データ送受信以外にもハートビート的な送受信があったりするのでそれも影響します。

    もし、AdafruitのライブラリでNeoPixelへのコマンド送信時に割り込み禁止しているとそれもそれで、問題を起こします。Wi-Fiに必要な割り込みがブロックされることで通信がぶった切られてしまう可能性があるので。

    1. 割り込みですか!そういうのはまったく考えていませんでした。

      NeoPixelをつないだときは照度は10とか6とかの値しか取れなくなるので、そもそも送受信が起きてない(値が大きく変化したときしか送信しない)んですが、ただその間もWi-Fiは接続し続けているので、jojiさんのおっしゃるような「ハートビート的な送受信」の影響もあるのかもしれません。

      照度がちゃんと取れないのはまた別の問題もありそうですが・・・(そもそも私の配線が間違っているとか)。
      ライブラリの中身をきちんと見てみれば、わかるかもしれませんね。
      今の私では非常に難しいですが(;´Д`)

      ヒントありがとうございます!がんばります!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です