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

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

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 モジュールを使って温湿度を取ってみたいと思います!

Nexus 5x が再起動し続ける自体に陥った。どうにかして直した。

Nexus 5x が起動しない...

1 年半くらい前から使っている Nexus 5x。
最近なんか調子が悪いなぁとは思っていました。

今日も、電話をかけようとしたらフリーズ。
「あぁ、またか」
と思い、電源ボタンを長押し。

リブート。

Google のロゴが出ます。

さ~て次は Google ロゴが踊って、解除パターンの入力だ。
と思っていたら画面が消えました。

ん?



もう一度、Google のロゴが出ます。
あぁ、見間違いだったか。
次こそ。。。

画面が消えました。

ん?



もう一度 (以下省略



というわけで、Google のロゴが出ては消えるという無限ループに陥ってしまいました。

復帰方法を探す

困ったときは結局 Google 先生ということで、Google 先生に聞いてみました。
"Nexus 5x" "再起動し続ける" とか、日本語キーワードで検索してしまうと、
「電池パックを外して付け直す」
という非常に胡散臭い復帰方法ばかりが出てきます。

いやいや、そうじゃないでしょう...

改めて "Nexus 5x" "boot" などで検索してみたら
"Android boot loop"
なる単語が出てきました。まじか。

いろいろ調べてみると、とにかくリカバリーモードに入るのが良さそう。
リカバリーモードに入るには、ボリューム下ボタンを押しながら電源を入れます。
こうすると Fast boot なる画面が出てきます。

f:id:edosha:20171127142947p:plain

この状態でボリューム下ボタンを 2 回押すと、"Recovery mode" と表示されます。
ここで電源ボタンを押すとリカバリーモードに入れる。

はずなんです。

しかし、ここでもまた問題が。
リカバリーモードに入るはずが、また Boot loop に戻ってしまいました。
これでは手のうちようがありません。

諦めきれずに、しばらく放置・充電して何度もトライしたら、ついに入れました。

以下のような表示とともに。

f:id:edosha:20171127143328j:plain

うんともすんとも言いません。
これは打つ手なしか...



しかし諦めきれずに調べ続けたら、ついに復帰方法にたどり着きました。

復帰方法

基本的にはここに書かれているとおりです。

Applying a Rescue OTA to a Nexus 5X.pdf - Google ドライブ

内容は同じことを書くのですが、リンク先は英語なので、日本語訳だけでも価値があるかもしれません。
ということでただの翻訳 + かなり省略しますが、手順を書き残しておきたいと思います。

なおこの手順には PC が必要になります。
私の環境は Windows 10 です。
もし違う OS の場合は、また別の手順が必要かもしれません。

PC に ADB と Fastboot のダウンロード

まず最初に ADB と Fastboot というツールを以下のリンクから落とします。

https://dl.google.com/android/repository/platform-tools-latest-windows.zip

これを適当なディレクトリで展開します。
そこまでできたら、システムの環境変数 PATH に、上記ディレクトリを追加します。

環境変数の追加手順は以下のサイトなどを見ればよいかと
www.wannko.net

正しくできているかどうか確認するには、コマンドプロンプトで以下のコマンドを叩いてみましょう。

>adb version
Android Debug Bridge version 1.0.39
Revision 3db08f2c6889-android
Installed as C:\tool\adb\adb.exe

このように何らかの返事が返ってくれば OK です。

Nexus 5x をリカバリーモードにする

上記の通り、まずはボリューム下ボタンと電源ボタンを長押しします。
Fastboot が起動したら、ボリューム下ボタンを2回押して、Recovery mode のところで電源を押します。
No command 画面が出たら、以下のようにボタンを押します。

1. 電源ボタンを押した状態で保持する
2. ボリューム上ボタンを押して、離す
3. 電源ボタンを離す

こうすると No command 画面を離れて、リカバリーモードに入れます!

ここで 3 行目に以下のような表示があると思います。

7.1.2/N2G47Z/4045513

この "N2G47Z" の文字を覚えておきましょう。
次の手順で必要になります。

PC に OTA イメージをダウンロードする

以下のリンクから、OTA イメージというものをダウンロードします。

Full OTA Images for Nexus and Pixel Devices  |  Google APIs for Android  |  Google Developers

Nexus 5x の項目から、上記の手順で得た "N2G47Z" に対応するリンクをクリックします。
そうすると 1.2 GB くらいのファイルが落ちてくるので、適当なところに置きます。

ADB update の実行

ここまできたら、Nexus 5x と PC を USB で接続します。
次に Nexus で "Apply update from ADB" を選択します。
この時点で PC から Nexus が見えているかどうかは、以下のコマンドで確認できます。

>adb devices
List of devices attached
0082*** sideload

sideload の左側には、Nexus 5x のシリアル番号が表示されます。
なので人によって違うはずです。

見えていれば、次のステップに進みましょう。
PC で、先程ダウンロードした OTA イメージがあるディレクトリで、以下のコマンドを叩きます。

>adb sideload bullhead-ota-n2g47z-07a2c0b4.zip

bullhead-*** は、ダウンロードしたファイル名です。
このコマンドが通れば、進捗状況が表示されるはずです。

100% までいったら、Nexus で "Reboot System now" を選択して完了!