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

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

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" を選択して完了!

Raspberry pi で SSH ログアウト後もプロセスを残したい

作業の途中で SSH ログアウトしたい...

前回の記事で、Raspberry piRadius サーバーとして活用する方法をご紹介しました。

edosha.hatenablog.jp

こんなふうに大量の作業をするときは、一時中断するために SSH からログアウトすることもあります。
コンフィグファイルなど、ファイルに書き込むような作業はログアウトしても問題ありませんが、たとえば Python スクリプトを走らせっぱなしにしてログアウトすると、Python プロセスが終了してしまいます。

それを避けるために 2 つの方法を試しました。

SSH ログアウト後もプロセスを残す方法

1. screen コマンドを使う

Linux では仮想端末を作成する screen というコマンドがあります。
SSH をログアウトしても仮想端末を残す」ことで、仮想端末上にプロセスを残すことができます。

askubuntu によれば、tmux というコマンドのほうが良いぜ!ということらしいのですが、Raspberry pi 上に入れるのに一苦労しそうだったので、まぁ良いかということで screen にしました。

askubuntu.com

インストール

apt-get でインストールするだけです。

$ sudo apt-get install screen
プロセスの残し方

基本的には以下の流れがすべてです。

1. screen を起動する

$ screen

2. 所望のプロセスを起動する
3. Ctrl + A、Ctrl + D をタイプする

これで、所望のプロセスが起動したまま、仮想端末から抜ける (デタッチ) ことができます。
抜けた後で SSH ログアウトしても、仮想端末が残っているのでプロセスも残る、というわけです。

ちなみに、またこの仮想端末に入るときは

$ screen -r

とすれば OK です。

その他の screen コマンド

いくつか便利なコマンドを紹介します。

  • screen を起動するときに出るメッセージを消す
    • screen -q
  • 仮想端末のリストを出す
    • screen -list
  • 該当する仮想端末にアタッチする
    • screen -r [プロセス番号]
  • 該当する仮想端末を削除する
    • screen -X -S [プロセス番号] quit
  • コマンドのヘルプを見る
    • screen -h

その他、以下のサイトに詳しく紹介してくれています。

qiita.com


2. シリアルを使う

Raspberry pi はシリアル接続でコマンドを投げることもできます。
SSH ログアウト後」という趣旨とはちょっと違いますが、そもそも SSH/ネットワークを使わなければプロセスはそのまま残る、ということで、この方法も紹介しておきます。

なお PC とシリアル接続をするには、USB シリアル変換とジャンパーケーブルが必要です。
自分は以下の製品を使っています。

ジャンパワイヤ(オス?メス) 10本セット

ジャンパワイヤ(オス?メス) 10本セット

Raspberry pi のシリアルを有効にする

まず最初に、Raspberry pi のシリアルを使えるようにしてあげる必要があります。
なお Raspberry pi のモデルや OS バージョンによって、微妙にやり方が異なるようです。
自分が使っているのは Raspberry pi 3 model B で、OS は Raspbian Jessie 8.0 (2017/07/05) です。

ここは SSH にログインしてやりましょう。

$ sudo raspi-config

5. Interfacing Options を選択します。
P6 Serial を選択し、Yes にします。
そのあとリブートすれば、シリアルが有効になります。

Raspberry pi との接続

以下のように Raspberry pi と USB シリアル変換を接続します。
Raspberry pi 3 model B でやっていますが、他のモデルだと配置が違うと思うのでご注意ください。

f:id:edosha:20171110141446j:plain:w400

Raspberry pi --- USB Serial
6 (GND)       -  GND
8 (UART TX)   -  RX
10 (UART RX)  -  TX

TX と RX を接続することに注意が必要です。
TX 同士、RX 同士をつないでも送受信できません。
また、スイッチサイエンスの USB シリアル変換モジュールは 5V/3.3V の両対応になっており、ジャンパで切り替えられます。
Raspberry pi は 3.3V なので、あらかじめ 3.3V 側にジャンパしておきましょう。

最後に PC と USB シリアル変換モジュールを USB でつなげば完了です。
ドライバは勝手にインストールされる、と思います。

シリアル接続の良いところは、余計なコマンドを叩かなくても良いことですね。
忘れっぽい自分に合ってます。
デメリットはもちろん外部モジュールが必要なことですが...