子育てしながらエンジニアしたい

現在 3 歳女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

Wemos Lolin ESP32 OLED で、BME280 温湿度センサーを使う

前回の記事で、ESP32 OLED の画面に文字や図形を出力できるようになりました。

edosha.hatenablog.jp

しかし、これではまだ単体で動作しているだけです。
せっかくの組み込みデバイスなので、センサーをつなげてみたい...
ということで、わかりやすい (?) 温湿度センサーをつなげてみることにしました。

温湿度センサー BME280

BME280 は Bosch 社が出している温湿度センサーです。
温度、湿度、気圧を 1 つのセンサーで計測することができます。

www.bosch-sensortec.com

このセンサーを組み込みやすくするために、いろいろなところからモジュール化された製品が発売されています。
秋月電子スイッチサイエンスが有名どころだと思いますが、ちょっと高いのでケチって以下のものにしました。
Amazon なので他のものと合わせ買いして、送料もケチります。

接続

BME280 のピン配置については以下のサイトが詳しく記載してくれています。

ht-deko.com

また、ESP32 OLED の I2C ピンは前回の記事のように以下の配置になっています。

  • SCL: GPIO 4
  • SDA: GPIO 5

よって以下のようにつなぎます。

BME280 ESP32
VCC 3.3V
GND GND
SCL GPIO 4
SDA GPIO 5
CSB 未接続
SDO GND

ちょっと見にくいかもしれませんが、以下のような感じです。

f:id:edosha:20180112143806j:plain

MicroPython BME280 ドライバーの導入

ありがたいことに MicroPython 用の BME280 ドライバーを公開してくださっている方がいます。

github.com

bme280.py を、前回のように uPyCraft を使って ESP32 にダウンロードしましょう。

Python コード

あとは BME280 ドライバーの仕様にしたがって値を取得するだけです。
せっかくなので、取った値を OLED にも出力してみました。

import bme280
import ssd1306

i2c = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5))
bme = bme280.BME280(i2c=i2c)
oled = ssd1306.SSD1306_I2C(width=128, height=64, i2c=i2c)

def show():
    oled.fill(0)
    oled.text(bme.values[0], 0, 0)
    oled.text(bme.values[1], 0, 10)
    oled.text(bme.values[2], 0, 20)
    oled.show()

show()

f:id:edosha:20180112145343j:plain

取れた!!!!
一つ一つ、やってることは簡単なことなのですが、実際に取れると感動します。

なお画像には、関係ないボタンがうつってますが、これは次回以降使おうと思って設置したものです。
次は何をするか決めてませんが... 乞うご期待 (?)

Wemos Lolin ESP32 OLED で、MicroPython から OLED 出力をする

前回の記事で、ESP32 に MicroPython を導入することができました。

edosha.hatenablog.jp

これで ESP32 上で Python REPL を動かせるようになりました。
今回は、せっかくついている OLED に文字や図形を出力してみたいと思います。
それにあたって、便利のために MicroPython 用の IDE も導入することにしました。

uPyCraft (IDE) の導入

uPyCraft は DFRobot 社が無償で提供している、MicroPython 用の IDE です。

uPyCraft

IDE とはいっても、Python のコーディングには PyCharm を使っているので、uPyCraft はファイル転送用に使います。

uPyCraft のダウンロード

最新版は Github の以下のページからダウンロードするようです。

github.com

exe ファイルはインストーラではなく、IDE の実体です。
なのでインストール等の必要はなく、ただ exe を開けば良いようです。

uPyCraft にポートの設定をする

uPyCraft から ESP32 を見えるようにするため、ポートの設定をします。
これはとても簡単で、uPyCraft の Tools -> Serial から適切なポートを選ぶだけです。
ポートは前回の記事のようにデバイスマネージャーで確認できます。

f:id:edosha:20180111130201p:plain

OLED に出力する

Wemos Lolin ESP32 OLED にのっている OLED は、SSD1306 というモジュールのようです。
ありがたいことに MicroPython では、SSD1306 のドライバーがすでに用意されています。
このドライバーを導入すれば、非常に簡単に OLED 出力をすることができます。

ドライバーの導入

MicroPython の Github から、ssd1306.py をダウンロードします。

github.com

これを uPyCraft を使って、ESP32 にダウンロードすれば導入完了です。
ダウンロードしたいファイルを開いて、Tools -> Download すればダウンロードできます。
うまくいくと、左側の device ディレクトリにファイルが追加されます。

f:id:edosha:20180111130614p:plain

ドライバーを使って OLED に出力する

I2C か SPI を使って OLED に出力することができます。
ひとまず I2C を使ってみることにしました。
I2C を使う場合は、SCL と SDA を指定する必要があります。
Wemos Lolin ESP32 OLED では、それぞれ以下のように接続されています。

  • SCL: GPIO 4
  • SDA: GPIO 5

これを ssd1306 ドライバーに教えてあげましょう。

import ssd1306
import machine

i2c = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5))
oled = ssd1306.SSD1306_I2C(width=128, height=64, i2c=i2c)

上で作った oled インスタンスを介して、文字などを OLED 出力します。
ssd1306.py では、MicroPython の framebuf クラスを使って文字出力などを実現しています。
そのため framebuf のメソッドをそのまま使うことができます。

framebuf — Frame buffer manipulation — MicroPython 1.9.3 documentation

なお framebuf の引数で、色を指定する c がありますが、この OLED は 0 か 1 以上しか判定しないようです。
0 で消去、1 で描画というイメージです。

  • 文字出力
oled.text("Hello", 0, 0)
oled.show()

f:id:edosha:20180111133619j:plain

  • 直線をひく
oled.line(0, 0, 128, 64, 1)
oled.show()

f:id:edosha:20180111133857j:plain

  • 四角をかく
oled.rect(10, 10, 108, 44, 1)
oled.show()

f:id:edosha:20180111133923j:plain

  • 塗りつぶす
oled.fill(1)
oled.show()

f:id:edosha:20180111133834j:plain

まとめ

今回は OLED に文字出力ができるようになりました。
次回はより IoT っぽく (?)、BME280 温湿度センサーモジュールから値を取得して、OLED 出力してみたいと思います。

Wemos Lolin ESP32 OLED に初挑戦

最近、シンプルな UI をもったデジタルガジェットを作りたいなぁと思っていました。
考えていた条件はこんな感じ。

  • シンプルな UI
  • いわゆる IoT 的な考え方で、ネットワーク経由でデータは蓄積したい
  • 蓄積したデータはスマホ等で見られれば良い
  • でもちょっとした確認もガジェット上でできるとなお良い

当然 Raspberry pi は候補に入ってくるのですが、求めている機能からするとちょっと高級すぎかなと感じていました。
しかもお値段も高いです。
Raspberry Pi Zero W なら安いけど、ずっと在庫切れですし...

そんなときに Wemos Lolin ESP32 OLED モジュールというのを発見しました。

Wemos Lolin ESP32 OLED モジュールとは

こんな特徴を持っています。

そして価格が、なんと送料込みで \1,200 程度!!(2017/11/29 現在)

やりたいことが全部満たせて、このお値段なら買いでしょ!
ということで購入してみました。

以下の Banggood.com というところで初めての購入です。

www.banggood.com

ちなみに日本の Amazon でも売ってますが、結局は中国から送られてくるようなので、それなら上記で買ったほうが安い気がします。

開封の儀

注文してから、だいたい 10 日くらいで到着しました。

f:id:edosha:20170915230517j:plain:w400

分厚い緩衝材に包まれてきます。

f:id:edosha:20170915230523j:plain:w400

ピンヘッダは自分ではんだ付けする必要があります。

f:id:edosha:20170915230527j:plain:w400

何も考えずに USB をつなぐと、OLED にサンプルが表示されます。
これに MicroPython 環境をセットアップすることにしました。

MicroPython のセットアップ

MicroPython は、組み込みプラットフォーム上で Python を動かそうというプロジェクトです。
ESP32 向けのポーティングがあり、すぐに動かせそうなのでやってみました。

シリアルドライバーのインストール

ESP32 ボードを仮想 COM ポートとして見せるためのドライバーを下記からインストールします。

USB - UART ブリッジ VCP ドライバ|Silicon Labs

インストール後、ESP32 ボードと USB 接続します。
バイスマネージャーに以下のような表示が出れば OK です。

f:id:edosha:20171129142737p:plain

この場合は COM6 に認識されたことがわかります。

ESPtool のインストール

Python 環境がすでに PC 上にある前提です。
なければ Anaconda 等でインストールしてから以下に進んでください。

ESP32 のフラッシュ書き込み等を行う ESPtool を、pip でインストールします。

pip install esptool

ESP32 のファームウェアを入手する

ESP32 用の MicroPython ファームウェアは、bin ファイルとして提供されています。
以下より入手してください。

MicroPython - Python for microcontrollers

11/29 時点では esp32-20171129-v1.9.2-444-g292816a1.bin が最新でした。

ESP32 にファームウェアを焼き込む

いよいよターゲットボードにファームウェアを焼きましょう。
まずは接続確認をします。
ESP32 ボードと PC を USB 接続し、コマンドプロンプトで以下のようにコマンドを叩きます。
COM6 のところは、ご自身の環境に合わせて変更してください。

> esptool --port COM6 flash_id
esptool.py v2.2
Connecting........_____.
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting...

このように何らかの返事が返ってくれば OK です。
ちなみに自分のボードでは、Connecting... のところで Boot ボタンを押さないとダメでした。
押さなくても良い、という人もいるので、ボードによってばらつきがあるようです。

返事が返ってきていれば、まずはフラッシュメモリを消します。

esptool --port COM6 erase_flash

次に、先程ダウンロードしたファームウェアを焼きます。

esptool --chip esp32 --port COM6 write_flash -z 0x1000 C:\somewhere\esp32-20171129-v1.9.2-444-g292816a1.bin

焼いている間、Boot ボタンを押しっぱなしにする必要がある、こともありました。
そうでないこともあったので、よくわかりません。

テスト

ここまでくれば、シリアルでアクセスすることで Python ターミナルが見えるはずです。
Tera term などで COM6 を開いてみましょう。

MicroPython v1.9.2-444-g292816a1 on 2017-11-29; ESP32 module with ESP32
Type "help()" for more information.
>>>

ためしに print などを打ってみると

>>> print("hello")
hello

いいね!!

起動時のエラーを取る

ちなみに、シリアル接続直後には以下のようなエラーが出ることがあります。

OSError: [Errno 2] ENOENT
MicroPython v1.9.2-444-g292816a1 on 2017-11-29; ESP32 module with ESP32
Type "help()" for more information.

これはどうも、起動後に main.py というファイルを自動的に見に行く仕様になっているようで、
そのファイルがないと上記のエラーがでます。
このエラーを取るには、main.py を作ってあげれば良いということで、適当に作ってみましょう。

f = open("main.py", "w")
f.write("print(\"main.py: Hello\")\n")
f.close()

こうすると、起動後には

main.py: Hello
MicroPython v1.9.2-444-g292816a1 on 2017-11-29; ESP32 module with ESP32
Type "help()" for more information.

のようになり、エラーの部分が main.py: Hello になったことがわかります。

このあとは、MicroPython 経由で OLED に文字を書いたり、BME280 モジュールを使って温湿度を取ってみたいと思います!