スキップしてメイン コンテンツに移動

ESP8266でリモートLチカ

越谷レイクタウンにてコワーキングスペースHaLakeを運営して半年以上が経ちまして、月額会員の方に無償でプログラミングを教えるということをやっているのですが、そんな中、ESP8266という大変興味深いモジュールを知りました。
(電子工作は小学3年生に始めたのがきっかけで、近からず遠からずの距離で携わってきた経緯があり、時代はまさにIoTだろうということで、1000円を切るWifiモジュールというのは感慨深いものがあります。)

Macでの利用を対象としています。

大まかに以下の手順で進めます。
  1. ESP8266の配線
  2. ファームウェアの変更
  3. Luaスクリプトの転送
  4. リモートLチカ!

準備するもの

  • ESP8266(今回はスイッチサイエンスさんのESP-WROOM-02ピッチ変換済みモジュール<シンプル版>を使用しました)
  • ブレッドボード、ジャンパワイヤー、ピンヘッダ、半田、半田ごて、LED、数百Ωの抵抗
  • TTL-USB変換ケーブル(TTL-232R-3V3のこちらを使用しました)
  • Arduino(3.3Vの電源供給用です。電源供給できれば不要ですが、手元にある前提で簡単なのでこちらを使っています。)
  • Arduino IDE

ESP8266の配線

まずはESP8266をピンヘッダを半田づけします。(両端が長いピンヘッダしかなかったのですが、普通は片方が短いピンヘッダです。)


以下の配線でブレッドボードとESP8266を繋いでいきます。

  • GND: ArduinoのGND
  • IO0: Ardunoの3.3V
  • EN: 10kΩでプルアップ抵抗(抵抗を挟んでArduinoの3.3Vへ)
  • RST: 10kΩでプルアップ抵抗(抵抗を挟んでArduinoの3.3Vへ)
  • 3V3: Arduinoの3.3V



TTL-USB変換ケーブルとESP8266を、ケーブルに色を頼りに繋ぎます。

・変換ケーブル黒:GND <-> GND
・変換ケーブル橙:TxD <-> RxD
・変換ケーブル黄:RxD <-> TxD

Arduinoに電源を入れ、MacとTTL-USB変換ケーブルをUSBで繋ぎます。

Arduino IDEを立ち上げ、メニューの"ツール" > "ポート"の一覧から/dev/tty.usbserial-XXXXというようなTTL-USB変換ケーブルを選び、続けてメニューの"ツール" > "シリアルモニタ"を選びます。

速度に115200を選択して、ATと打てば"OK"が返ってくることを確認できればESP8266が動作していることが確認できます。

また、AT+GMRと打つとファームウェアのバージョンが分かります。
AT version:0.23.0.0(Apr 24 2015 21:11:01)
SDK version:1.0.1
compile time:May  5 2015 14:03:58

ファームウェアの変更

Luaというプログラミング言語がありますが、そのLuaを動かすことができるファームウェア、NodeMCUに変更します。
僕自身、LuaはESP8266を扱うにあたって最近始めた言語ですが、言語仕様が小さいながら割とパワフルな事ができる面白い言語です。

NodeMCU: https://github.com/nodemcu/nodemcu-firmware

変更の前に、ESP8266が今の時点では、IO0が、3.3Vのつながっていると思いますが、これをGNDに挿しなおしておいてください。

次にソフトウェアの方ですが、ファームウェアの更新あたって、Pythonと、PythonのライブラリであるpySerialを使用します。MacであればPythonは入っていますので、Pythonのパッケージ管理pipを使って、pySerialライブラリをインストールしましょう。
# sudo pip install pyserial
ファームウェアのbinファイルは、こちらからダウンロードできます。(2015/8/23時点では、nodemcu_float_0.9.6-dev_20150704.binが最新でした。)

ファームウェアを書き込むために、esptoolを使います。下記のGithubのサイトから"Download zip"を押して、esptoolのzipファイルを取得、解答して任意のディレクトリに置いて下さい。

https://github.com/themadinventor/esptool

ターミナルを立ち上げて、解答されたディレクトリ(esptool-master)に移動し、以下のようにesptool.pyコマンドを実行します。
この時、<ポート>を、Arduino IDEのメニュー"ツール" > "ポート"にあった、"/dev/tty.usbserial-XXXX"に置換え、<ファームウェアのパス>の部分に、上記のファームウェアのbinファイルのパスを指定します。
./esptool.py --port <ポート> write_flash 0x000000 <ファームウェアのパス>
例)
./esptool.py --port /dev/tty.usbserial-FTHK458I write_flash 0x000000 ../nodemcu_float_0.9.6-dev_20150704.bin

※このコマンドを実行した時、Resouce busyと出ることがありますが、Arduino IDEのシリアルモニタなどでポートを開いているのが原因ですので、シリアルモニタなどを閉じて再度実行して下さい。

しばらくすると書き込みの進捗が100%になって、以下のようにターミナルに出れば無事書き込みが成功しています。

Connecting...Erasing flash...Writing at 0x00070c00... (100 %)
Leaving...

書き込みが終わっていると、再度Arduino IDEのシリアルモニタで繋ぎ、速度を9600bpsにすると、LuaがREPLとして起動していますのので、いろんなコマンドを打って遊ぶことができます。

下記の例ではWifiに接続しています。wifi.sta.configの第1引数、第2引数にはWifiのSSIDとパスワードに置き換えてください。
> wifi.setmode(wifi.STATION)
> wifi.sta.config("halake", "pass")
> print(wifi.sta.getip())
192.168.11.85 255.255.255.0 192.168.11.1
※Wifiに接続できない場合は、以下のコードで、ESP8266から見えているアクセスポイントの一覧を表示して見ると、問題の解決に役立つかもしれません。
function listap(t) for k,v in pairs(t) do print(k) end end;  wifi.sta.getap(listap)

同じWifi内でpingを打つとちゃんと応答があります!
PING 192.168.11.85 (192.168.11.85): 56 data bytes64 bytes from 192.168.11.85: icmp_seq=0 ttl=255 time=111.699 ms64 bytes from 192.168.11.85: icmp_seq=1 ttl=255 time=24.666 ms--- 192.168.11.85 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet lossround-trip min/avg/max/stddev = 24.666/68.183/111.699/43.516 ms

Luaスクリプトの転送

最後のLチカの実現までもう一手間あります。シリアル通信でコードを実行することはできるようになりましたが、この方法だと電源をいれる度にプログラムを送る必要があります。
NodeMCUにはファイルシステムがあり、init.luaというファイルをアップロードすると起動するごとにそのファイルの内容を実行してくれます。
そのアップロード方法を確認しましょう。

まずは適当なinit.luaファイルを作るか、サンプルを持ってくる必要がありますが、NodeMCUのサイトにHTTPサーバの例もありますし、エンジニアであればAPIドキュメントをみてプログラムを組むこともできます。

そのためのツールとして、nodemcu-uploader.pyというそのものズバリなプログラムを使います。
例によって、"Download zip"のリンクをクリックしてzipファイルをダウンロード、解凍を行います。
解凍したディレクトリの中にある、nodemcu-uploder.pyファイルを使い、init.luaをアップロードします。
./nodemcu-uploader.py --port <ポート> upload init.lua
例)
./nodemcu-uploader.py --port /dev/tty.usbserial-FTHK458I upload init.lua

リモートLチカ!

いよいよ最後です!IO2を使って、LEDをリモートでオン、オフしてみましょう。
適当なLEDを使って、また数百Ωの抵抗をIO2に接続します。

こういった接続です。

ESP8266のIO2 <-> LED(カソード、足の長い方)
LED(アノード、足の短い方) <-> 抵抗 <-> GND

配線ができたら、次で終わりです。init.luaファイルを以下に置きました。ブラウザからアクセスするとLEDがアクセスするごとにオンになったり、オフになったりを繰り返します。



いやぁ、ESP8266って本当に面白いですね!ESP8266を使ったプログラミング教室をやってますので、越谷レイクタウンに近い方はぜひ遊びにいらして下さい!

コメント

このブログの人気の投稿

ESP8266で書き込めない時に対処したこと

ESP8266のチップで書き込めなかった問題が起こり、それについての対処を参考になる可方がいるかもということでブログにもメモとして残しておきます。 書き込みで失敗したケースとしては、 スイッチサイエンスさんのESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 へのシリアル通信での書き込みができなかった問題 Over The Air(OTA)の機能を使うコードを、同じくESP-WROOM-02に対して転送するも、更新の途中でクラッシュし、書き込みが失敗するという問題 の二つです。 OTAまで使って書き込もうとしている背景は、ニャンパスとして Robip というプログラミング学習環境を作っていて、そのツールの中でWi-Fi経由での書き込み機能を対応することでスマートフォン、タブレットなどでのビジュアルプログラミングしたものが、OTA経由で電子工作のプログラミングができるようという機能があり、いくつかのESP8266を積んだモジュールへのサポートを増やそうとしたところ(ようはRobipとしての対応デバイスを広げたかった)上記の書き込みできない問題にぶつかりました。 Facebookのこちらに書いたことの詳細版です。 ESP-WROOM-02への書き込み出来ない問題 もともと、HaLake KitというコワーキングスペースHaLakeオリジナル基板は、ESP8266を積んでいますので、この書き込みツールとしてClojureで書いた robip-tool というのを用意していました。 このツールであればHaLake Kitには書き込めていたのですが、ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》ですと最初の書き込みの段階で失敗することが分かりました。 そこで世界中で人気のESP8266ですので、色んなバージョンの書き込みツールがありまして、書き込みに成功するツールを探す旅が始まりました。 その際には、シンプル版だけでなく、HaLake Kit、ESPr Developer(ESP-WROOM-02開発ボード)、ESP-WROOM-02ピッチ変換済みモジュール《フル版》でも試して、全てで動くツールを検証しました。 途中、Go言語で書きなおしてみたりいろいろテストもしたのですが、結果的に全て

ClojureScriptとBLE

2017年Clojure Advent Calendar 15日目の記事として書きました。 今年、ニャンパスとして、またプライベートでいろいろとBLEを扱うコードをClojureScriptで書きましたので、まとめてみます。 使用したデバイスは、micro:bitです。秋葉原や通販等で手に入り、BLE、25個のLED、加速度センサーがついている学習用のボードです。ブラウザ上でビジュアルプログラミングでの開発ができたりと面白いので、年末年始に遊んでみてください。 ClojureScriptでの環境の作り方から始まって、micro:bitとPCとの接続、リモートでのLチカを試すというIoTなClojureScriptの内容となってます。 1. ClojureScriptで、BLEな環境を作る Node.js、npm、Leiningenを入れておいてください。プロジェクトを作ります。   $ lein new figwheel-node ble figwheel-nodeテンプレートを使い、できたファイルはこんな感じです。 ./project.clj ./README.md ./package.json ./.gitignore ./src ./src/ble ./src/ble/core.cljs ./dev ./dev/user.clj 今回、PC側をBLEのセントラルとして振る舞わせ、micro:bitをペリフェラルとして操作しますので、そのためセントラル側のプログラムとしてnobleというライブラリを使います。 OS毎に依存するものが違いますので、サイトで事前に確認しておいたほうが良いです。    https://github.com/sandeepmistry/noble ※nobleはMac、Linux、Windows、FreeBSDをサポートしており、 僕自身今年nobleを使ったコードをClojureScriptを使って、Windos、Mac、Linuxそれぞれで動かしていて動作は安定していました。 では、nobleを以下のコマンドを実行しておきます。   $ npm install noble ※普段はlein-npm等を使

HaLakeKit Lino開発しました!

少し前になりますが、 デブサミ2017 にて、IoTLTさんのブースで、HaLakeKit Linoを展示させていただきました。 HaLakeKit Lino デブサミでの展示 デブサミでの展示 HaLakeKit Linoは、BLEモジュールとして、昨年からニャンパスで作ってきていたもので、ボタン電池で駆動し、スマートフォン等から、BLEを手軽に操作してもらえるようなプログラムを書き込んであります。 ニャンパスの運営するコワーキングスペースHaLakeでもささやかにワークショップを行いました。 HaLake KitというESP8266を使ったデバイスをすでに開発して、プログラミング教室で利用していますが、HaLake Kitの場合は、IoTではありますが、Wifiモジュールですので、Wifiを前提としない、スマートフォンと直接接続が出来るBLE版が欲しかったというのが開発の動機です。 特徴としては、電圧が最大12Vで駆動し、実装されているMOSFETのお陰で、そのままの電圧をGPIOから出すことが出来ます。プログラムとして、4つのGPIOを制御できるようなBLEのプログラムが予め書き込まれているため、BLEデバイスのプロトタイプとして開発していくことが可能になっています。 また、オープンハードとして公開しており、KiCadで設計しています。BLEモジュールの開発PCBの参考にもぜひどうぞ。 https://github.com/nyampass/halakekit_lino Revisionが3となっていることからも分かる通り、3回目の設計であり、というのも当初想定したSoCが生産中止になったため、最終版で切り替えています。 サンプルとして動作するiOS、Androidアプリのソースコードも、Linoと連携するものをすでに要しており、今後Githubで時間のあるときに整理して公開予定です。 ニャンパス自体がソフトウェア開発がメインの会社ですので、できればライブラリ化して簡単にBLEモジュールを簡単に操作できるようにしたいと思っています。(Linoに限らずそういうことが出来れば理想。) ワークショップの情報は こちらのConnpass で行いますし、HaLakeで毎月開催のIoT勉強会でも触ってもらえるよう