HaLake Magazine

コワーキングスペースHaLakeの技術情報発信サイト!IoT,AR,VRなど最新技術情報をお届け!

【入門】ESP32 × MicroPython ファームウェア書き込み ~ Pmod KYPD (キーパッド)を使ってみる

今回は何度か扱ってきたESP32にファームウェアを書き込んでMicroPythonを使ってPmodKYPD(キーバッド)を使っていきたいと思います。
MicroPythonの書き込みなどは思ったよりも簡単でしたが所々躓いた事なども説明していきたいと思います。

目次

  1. 動作環境
  2. 使ったもの
  3. MicroPythonの書き込み
  4. プログラムの書き込み
  5. キーパッドを触る
  6. まとめ

1. 動作環境

2. 使ったもの

3. MicroPythonの書き込み

書き込みはとても簡単で特に気を使う場面はありませんでした。 と言うのも、公式が日本語の書き込み手順を出してくれているからです。公式のリファレンスに則って進めれば問題ありませんので下にそのリンクを貼っておきます。

  • 注意:MicroPythonのファームウェアを書き込む際に、使用しているPCにPythonがインストールされている必要があります。本記事ではPythonのインストールに関しての詳しい記述は省いて説明します。

ファームウェアの書き込みまでの説明は、公式リファレンス通りに進めた場合の補足になりますのでリファレンスと併せて作業してください。

micropython-docs-ja.readthedocs.io

ファームウェアのダウンロードの補足

強いて気を付けるべき場所はファームウェアのダウンロードです。ファームウェア入手 の項に記載があるようにMicroPythonのファームウェアに毎日ビルド版、安定ビルド版、SPRAMサポート付きビルド版の3つの種類があると記載がありますが、執筆現在(2021.03.17)だとバージョン3系では更新が止まっていて毎日ビルド版がないようです。

f:id:mischief_cat:20210317101530p:plain

それに加え執筆現在(2021/3/17)では、バージョンも3.Xと4.X代の2種類が存在し、3.Xと4.X代の違いはダウンロードサイトに記載があります。表にまとめたようにLAN(Wi-Fi)の対応の有無になっています。どちらもBLE(Bluetooth Low Energy)とPPP(Point-to-Point Protocol)は使えるようで、3.X代が3つすべてに対応しているようです。

f:id:mischief_cat:20210317101757p:plain

本記事では初心者でも安心して3つの機能を使えるようにするためにバージョンは3.X代の安定ビルド版をお勧めします。 ダウンロードは以下のリンクからできます。

micropython.org

以下の画像にあるように私はesp32-idf3-20210202-v1.13.binをダウンロードしました。

f:id:mischief_cat:20210317101939p:plain

この時ダウンロードしたファイルはこの後使うのでデスクトップなどに移動しておきましょう。

  • 注意:執筆現在(2021/3/17)より時間がたってしまうと、日々更新されるものなので変わることがあります。またバージョン3系ではないと思いますが、BLEやWi-Fiなどの機能も、更新によって状況が変化することがあるので注意してください。ダウンロードするときに十分確かめてください。安定版にはファイル名にunstableが入っていないこととシンプルな名前を選ぶのがコツかもしれません。(これも時期によって変わる場合があります)

ファームウェアの配備の補足

次に公式リファレンスのファームウェアの配備の項に書かれている書き込みに必要なesptool.pyの入手の補足になります。
リファレンスにはGit Hubからクローンする方法とpipでインストールする方法が記載されていますがリファレンス通りpipで入れていきます。

pip install esptool

バイスのポートを調べる

リファレンスに載っているコマンドにはデバイスのポートを指定しなければならないものがあるので調べ方を説明します。

バイスマネージャーから確認

手順:

タスクバーの検索ボックスにデバイスマネージャーと入力⇒アイコンクリック⇒ポート(COMとLTP)の項目をクリックで表示される

f:id:mischief_cat:20210317103703p:plain

ESP内の掃除とファームウェアの書き込み

まずはESPの中身のデータをきれいにしてからファームウェアを書き込むことが推奨されているのでそのコマンドを実行します。

まずはコマンドプロンプトを開き、次のコマンドを実行します。

私の場合は前の項で調べたデバイス名の最後に(COM3)と出ているので、公式リファレンスのコマンドを書き換えた例はこちらになります。

esptool.py --port COM3 erase_flash

次はファームウェアを書き込むので先ほどダウンロードしたファームウェアがデスクトップにあるものとして説明を進めます。

コマンドプロンプトでデスクトップに移動して、ファームウェアの書き込みをします。

二つ目のコマンドでは先ほどのポートの書き換えと、最後のesp32-idf3-20210202-v1.13.binの部分をダウンロードしたファームウェアの名前に合わせる必要があります。

説明したのと同じものをダウンロードしている場合は最後の書き換えは必要ありません。

cd Desktop
esptool.py --chip esp32 --port COM3 write_flash -z 0x1000 esp32-idf3-20210202-v1.13.bin

4. プログラムの書き込み

ファームウェアの書き込みが終わったら次に自分が作ったプログラムを書き込みみについて説明していきます。
これにも私が知る限りでWindowsの場合は4つは方法が存在まします。
全て説明すると長くなっていしまうので最も簡単なものを紹介して、他は先人たちの知恵がありますのでそちらの参考リンクを貼っておきます。

方法1:REPLのみ

WIndowsの場合、Mac OSLinuxでは使えるscreenコマンドは使えないので別のプログラムなどをインストールしなければREPLプロンプトは使用できないようです。
なので公式にもあるように無料のPuTTYを使う方法の説明です。
REPLプロンプトの表示についての公式リファレンスはこちらです。↓ micropython-docs-ja.readthedocs.io

まずは下のリンクにアクセスし、画像の赤枠をのようになっているので、お使いのPCのbit数に対応したものを選んでダウンロードしてください。

www.chiark.greenend.org.uk

f:id:mischief_cat:20210218174201p:plain

ダウンロードしたものをインストールしたら開いて

f:id:mischief_cat:20210218174705p:plain

画像のように入力し、ESP32のリセットボタンを押すと

f:id:mischief_cat:20210218175148p:plain

このようなREPLプロンプトが開かれます。
これでMicroPythonを対話的に実行できます。
しかし、これだとコードの量が大量になった場合、手でいちいち打ったり、Ctr + Eで貼り付けモードにもできますが別の方法で書き込むことが出来るので方法2で説明します。

方法2:REPL + ampy

大量のプログラムの時はファイルごと書き込んでしまうのが一番だと思います。その方法を説明していきます。
使っているPCのコマンドプロンプトを開き

pip install adafruit-ampy

と打ち込みampy(Adafruit MicroPython Tool)をインストールしていきます。ampyは簡単に説明するとAdafruit社が出しているシリアル通信でファイル転送を行ってくれるツールのことです。
これでプログラムファイルの転送が出来るようになります。

それぞれのコマンドを説明していきます。

ファイルの転送

ampy -p /COM3 put ファイル名

転送済みファイルの確認(boot.pyはもとから転送されています)

ampy -p /COM3 ls

転送済みのファイルの中身を見る

ampy -p /COM3 get /ファイル名
  • 注意:/COM3の部分は各PCで割り当てられるデバイスのポート名に変更してください。デバイスのポートを調べるの項で調べたものにあたります。私の場合はCOM3だったので例のようになっています。以下のCOM3の部分は各PCで割り当てられるデバイスのポート名に変更してください。

これで転送した後に方法1で説明したREPLで

import ファイル名

でプログラムをインポートして実行することが出来ます。
キーパッドを使う際には公式の使い方に最も近く、かつある程度簡単な方法なのでこちらの方法を使って説明していきます。

方法3:VSCode

こちらの方法では使い勝が良い反面、初心者には難しく、最初からだと工程が多くなってしまうのでVSCodeを普段使っている方にお勧めです。
説明すると長くなってしまうので参考にさせて頂いた先人のリンクを貼っておきます。

qiita.com

方法4:uPyCraft

こちらの方法はVSCodeよりかは使い勝手がよくはありません(人による)がArduinoIDEのような感覚で使えます。方法2よりこちらの方が一つにまとまっていて良いのですが、なるべく公式のリファレンスに沿って説明したかったので紹介程度にしておきます。 こちらも参考にさせて頂いた先人のリンクを貼っておきます。

blog.boochow.com

以上がプログラムを書き込む4つの方法です。
複数回書き込んだり、使い込んだりするときは自分に合った方法を選ぶのがよさそうです。

5. キーパッドを触る

まずは動かしてみましょう。

配線

キーパッドの回路図は下のリンクにあります。

https://akizukidenshi.com/download/ds/digilent/pmodkypd_sch.pdf

f:id:mischief_cat:20210218154959p:plain

画像のように配線してください。表も用意しておきました。

f:id:mischief_cat:20210218154510p:plain

  • 注意:ESP32ボードの種類によってピン配列が微妙に違うものがあるので表を参考に対応するピン同士で接続するようにしてください。

プログラム

from machine import Pin

COL_PIN_NUM = [12,14,27,26]#COL:[1,2,3,4]PIN
ROW_PIN_NUM = [34,35,32,33]#ROW:[1,2,3,4]PIN
COL_NUMS = len(COL_PIN_NUM)
ROW_NUMS = len(ROW_PIN_NUM)
KEY_MAP = [
    [1,  2,   3,  'A'],
    [4,  5,   6,  'B'],
    [7,  8,   9,  'C'],
    [0, 'F', 'E', 'D'],

COL_PINS = []
ROW_PINS = []
COL_PINS = [Pin(i, Pin.OUT, value=1) for i in COL_PIN_NUM]
ROW_PINS = [Pin(i, Pin.IN) for i in ROW_PIN_NUM]

def get_code():
    re_key = 'none'
    for i in range(COL_NUMS):
        COL_PINS[i].off(
        for j in range(ROW_NUMS):
            if ROW_PINS[j].value() == 0:
                re_key = KEY_MAP[j][i]
        COL_PINS[i].on()
    return re_key

def run():
    while True:
        print(get_code())

実行方法1

プログラムの書き込み方法1の操作をしたうえで、プログラムをコピペしてREPLプロンプトにCtr + Eをすることで貼り付けモードにします。右クリックするとペーストされ、その後はCtr + Dで入力が完了します。先のプログラムを実行するには入力完了後に以下を入力することで実行できます。

キーパッドの押されているキーを一度だけ返す(入力なしはnone)

get_code()

キーパッドの押されているキーを連続で無限回返す(get_code()の連続)Ctr + Cで終了

run()

しかしこの方法だとESP32をリセットしたりすると内容が初期化されてしまうので何度も同じペーストをしないといけません。すぐに実行は出来ますがいちいち手間がかかってしまいます。それを改善するのが実行方法2です。

実行方法2

プログラムの書き込み方法2の操作をしたうえで、既に開かれているREPLプロンプトがあれば一度ウィンドウを閉じておいてください。
その後、デスクトップにファイルを作成しkp.py(kp=key padの略)と名前を付けてプログラムをコピペした場合は

cd Desktop
ampy -p /COM3 put kp.py

と、二つのコマンドをPCのコマンドプロンプトに入力・実行することでファイルの転送が完了します。
転送し終えたらREPLプロンプトを起動しなおしてそこに

kp.pyのインポート

import kp

キーパッドの押されているキーを一度だけ返す(入力なしはnone)

kp.get_code()

キーパッドの押されているキーを連続で無限回返す(get_code()の連続)Ctr + Cで終了

kp.run()

その他の実行方法

プログラムの書き込み方法3プログラムの書き込み方法4での実行方法はそれぞれ参考リンクに記述があるのでそちらを参考にしてください。

まとめ

プログラム書き込み方法1と2でPuTTYを紹介したのですが、よく考えたらターミナルエミュレータを使えば何でもよかったのでRaspberry PiでおなじみのTera Termを使えばよかったと後悔しています。