Code(以降、VSCと称す)でデバッグしたいなー」って思うのは筆者だけでは無いと思います。これまでのプログラムのデバッグでは、プログラム中にprint文を書いて、確認したい内容をCOMポートに出力したり、OLEDなどの外部表示器に出力してデバッグしていました。内部変数などの細かい部分の確認をするときに毎回内部変数を出力するprint文を追加するのは手間がかかり、なにより面倒な作業でした。今回は、そんな面倒事を一気に解消するESP専用JTAGデバッガ「ESP-PROG(Espressif社純正JTAGボード)」を紹介したいと思います。ESP-PROGとは#ESP-PROG外観Amazonやスイッチサイエンスから購入できます。(筆者はもっと安いところから購入しましたけど)中身は「FT2232HL(デュアルタイプのUSBシリアル)」が載ったボードみたいです。この機器はUSBシリアルが2ポート使えますが、今回はデバッグ用の1ポートだけを使用し、プログラムの書き込みにはESP32本体が持つUSBポートを使用します。ESP-PROGの残りのUSBシリアルポートを使ったプログラムの書き込みは、また別の機会に紹介したいと思います。Module)を使用します。(開発対象の選定理由は、ジャンパーピンを引き出す電源ボードが30ピンのものしか持ち合わせがなかったためです。ブレッドボードの使用も考えましたが、ブレッドボードの使い勝手については、別の記事を参照ください)ESP32と電源ボードドッキングしてセットアップします。n」と書かれたコネクタ部分のピンを使用します。(ESP-PROGの電源電圧を3.3Vと5Vを切り替えるジャンパーピンは”5V”側に設定します)ESP32とESP-PROGの結線は以下の図のようにします。GNDESP32とESP-PROGを接続した状態(ESP-PROGのJTAGコネクタにちょうど合うケーブルが見つからず・・・。USBコネクタを持った物もあるようですが、まだ一般的にはmicroUSBのタイプのものが流通しているようです)デバイスマネージャでCOMポートを確認します。今回接続したESP32とESP-PROGのものです。COMポートの接続先は次のようになっていました。USB(COM12)から給電+プログラム書き込みを実施しますので、COM14(ESP-PROGのUARTポート)は使用しません。実はESP-PROGのCOMポートが上記のように認識されているだけではデバッグができません。このままESP-PROGを使用しても「デバッガが見つかりません」と言われてエラーになってしまいます。(ネット上の記事では接続後すぐに使用できたという記事も見かけますが)ESP-PROGのデバッグポートを「デバッガ」として認識させるためにはひと手間必要です。ここで「Zadig」というツールを使います。ダウンロードした「Zadig-2.8.exe」(2024-01-02現在の最新)を実行します。Devices」を選択します。リストの中に以下の2つのインターフェースがあると思います。Driver」ボタンを押します。DEBUG用です)インストールが始まります。デバイス」を確認します。RS2332-HS」が登録されていればOKです。デバイス側に登録が移動しています。COMポート側に残っている状態になっています。IO(以降、PIOと称す)」を使っていきます。ESP32用のプロジェクトを作成します。作成したプロジェクトは以下です。今回、プロジェクトのロケーションをc:/opt/ESP32_ESP-PROG/に変更しました。実は最初、プロジェクトのロケーションをC:/Users/<username>/OneDrive/ドキュメント/PlatformIO/Projectsに置いところ、デバッガが「ドキュメント」フォルダを含むパス名を正常に認識しなかったので、仕方なく別の場所に移動しました。プロジェクト外観は以下のようになりました。扱うものをコードサンプルから取得しました。device_name;」の部分だけ、任意の文字列に書き換えています。いくつかオプションを追加していきます。ファイルの内容を以下のようにしました。詳細を説明していきます。以下の3つの設定は基本なので今回特に変更はありません。Module」を選択すると「espressif32」が設定されます。上記と同様の操作で「esp32dev」が設定されます。開発フレームワークに「Arduino」を選択したので「arduino」が設定されます。Bluetoothを使うのに必要なライブラリを追加しています。今回はBluetoothを使用するので「BluetoothSerial」ライブラリをインストールしています。参照ください)ESP-PROGでデバッグするために追加したオプションは以下です。ビルド時に設定するオプションです。今回利用したESP32はボード上に制御できるLEDを持っていないのでピン設定を変更しています。シリアル通信のボーレートを指定します。PIOはプログラムをアップロードするCOMポートを自動検出しますが、ESP-PROGのUARTとESP32側の2つのCOMポートが存在するので、今回はESP32側のCOMポートを明示的に指定しています。アップロードのスピードを指定します。今回の記事の肝と言ってもいい部分です。「esp-prog」を指定します。デバッグ実行時に最初に停止(ブレーク)させたい関数を指定します。今回は「setup」関数で止まるように指定しました。ビルドオプションに「debug」を指定します。release、testの指定ができるようです。デバッグ設定(VSC)#VSCのデバッグ設定「launch.json」はPIOが出力した初期値のままを使用します。]}ビルド、アップロード、そしてデバッグ#PIOでプログラムをビルドし、ESP32にアップロードします。ESP32は時々プログラム書き込みに失敗することもありますが、ESP32をリセットするなどすると書き込めるようになります。ESP32にプログラムが書き込めない問題については、いろいろな方が対策に取り組んでいるようです。Debug」を実行します。デバッガーが起動され「Setup関数」で停止します。setup()」で停止していることが見て取れます。そのまま実行させると、設定したブレークポイントで停止します。「これぞデバッグ!」って感じですね。print文でちまちまデバッグするよりも効率が良いと思います。ステップ実行も可能です。Bluetoothで接続し、どんな動作をするかなど細かい部分の確認ができるようになりました。した「謎」#プログラムを少し書き換えてみましょう。プログラムにグローバル変数「counter」とローカル変数「_counter」を設け、loop関数の中でインクリメントするだけの単純な変更です。インクリメント部分にブレークポイントを設定してみました。グローバル変数に設定したブレークポイントは機能しました。IF文まで飛ばされてしまいました。ステップ実行でステップごとに進めようとしても、どうしてもローカル変数部分(宣言部分も演算部分も)に止まってくれません。変数が最適化されてアドレスが振られていないのかと想像します(この程度のプログラムならレジスタ上の処理で済んでしまうのでしょう)。最適化オプションの関係だと思ったので、デバッグビルドのオプションを調べました。PIOのINIファイルでは、デフォルトで以下の指定がされているようです。Bluetoothライブラリのリンクでエラーになるなどしてしてビルドが成功しませんでした。このあたりについてはもう少し調査が必要のようです。詳細が分かったら、また別の記事で紹介したいと思います。デバッグすることが出来ました。print文を使ってデバッグするよりも格段に効率がよいと思います。筆者の場合は「デバッガーを使わないとデバッグ出来ないほど難しいプログラムを書いているか?」という別の問題がありますが。ススメ(2023-03-22)豆蔵では共に高め合う仲間を募集しています!具体的な採用情報はこちらからご覧いただけます。