{ "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" }, "orig_nbformat": 2, "kernelspec": { "name": "python388jvsc74a57bd076f9b3eb98fee63ee766a339af29bcb269f70e31ae50c94992d90bfff92a1151", "display_name": "Python 3.8.8 64-bit ('toragi_env': conda)" }, "metadata": { "interpreter": { "hash": "76f9b3eb98fee63ee766a339af29bcb269f70e31ae50c94992d90bfff92a1151" } } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "source": [ "# Arduino UNOのスケッチのソース・デバッグ\n", "Arduino UNOを使い始めて10年あまりが立ちますが、ずっと不思議に思ってことにArduinoのスケッチをソースレベルでデバッグする方法を紹介した記事がないことです。\n", "\n", "Arduinoに使われているATmega328P単体ならATMEL Studio(現 Microchip Studio)を使ってC言語のソースデバッグの記事は見かけられますが、\n", "Arduinoとなるとほとんどヒットしません。\n", "また、AVR Studioでソースレベルのデバッグをするには、AVR Dragon(7,350円)やAtmel-ICE(11,000円)と高価なツールが必要でした。\n", "\n", "\n", "\n", "## 安価なデバッグツールMPLAB Snapの登場\n", "トランジスタ技術2021年4月号では、基板レベルではありますが安価なMPLAB Snap(2,850円)を使ったデバッグ方法が紹介されました。\n", "\n", "\n", "\n", "### MPLAB Snapの改造\n", "Microchip StudioでMPLAB Snapを使用するには、少しの準備(改造)が必要です。\n", "- プルダウン抵抗R48の取り外し\n", "- Firmwareの更新\n", "\n", "技術2021年4月号の写真2(43p)は、少し古いモデルみたいで、私が秋月から購入したものはR48の位置が少し異なっていました。\n", "隙間が狭くピンセットが入らなかったので、チップ抵抗にコテを当てた後ドライバーでずらして、取り外しました。\n", "\n", "\n", "\n", "MPLAB SnapのFirmwareの更新には、Windows版のMPLABX IDEが必要です(Mac版では更新できませんでした)。\n", "\n", "MPLABX IDEは以下のサイトからMPLABX-v5.45-windows-installer.exeをダウンロードしました。\n", "- https://www.microchip.com/en-us/development-tools-tools-and-software/mplab-x-ide\n", "\n", "MPBLAX IDEでATmega328Pのプロジェクトを作成し、MPLAB Snapを接続すると更新できました(すみません画像を取りそこねました)。\n", "\n", "更新前のバージョンは\n", "```\n", "Connecting to MPLAB Snap...\n", "\n", "Currently loaded versions:\n", "Application version............00.00.17\n", "Boot version...................01.00.00\n", "Script version.................00.04.07\n", "Script build number............59586f4647\n", "Tool pack version .............1.3.305\n", "```\n", "\n", "アップグレード後のバージョンは以下のように出力されました。\n", "```\n", "Connecting to MPLAB Snap...\n", "\n", "Currently loaded versions:\n", "Application version............00.04.18\n", "Boot version...................01.00.00\n", "Script version.................00.04.07\n", "Script build number............59586f4647\n", "Tool pack version .............1.3.305\n", "```\n" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "## Arduino UNOでデバッグツールが動かない理由\n", "Arduino UNOでデバッグツールが動かない理由が以下のサイトに説明されています。\n", "- http://www.solutions-cubed.com/electronic-design-blog/debugging-arduino-sketches-with-atmel-studio-7/\n", "\n", "Arduino UNOの公式サイトから回路図の一部を引用します。\n", "- https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf\n", "\n", "\n", "\n", "Arduino IDEでスケッチをArduinoにアップロードした後に、Arduinoをリセットする必要があります。\n", "このリセット信号は瞬間的にLOWになるパルスが必要ですが、シリアルの通信でそのような制御はできません。\n", "そこで、CTSをLOWにしたあとC4とRN10のCR回路でリセット信号を作っています。\n", "\n", "\n", "\n", "Arduino IDEにとっては便利なCR回路ですが、これがデバッグツールの制御に悪影響を与え、デバッグできなかったのです。\n", "\n", "### シリアルのリセット信号のカット\n", "Arduino UNOの互換器では、CR回路がボードに直付けになっており、切り離すことができません。\n", "\n", "しかし、秋月電子から発売されている\n", "ATMEGA168/328用マイコンボード(I/Oボード)通販コード:P-04399\n", "を使うとシリアルとの接続(TX, RX, RST)をジャンパーで選択することができます。\n", "\n", "\n", "\n", "\n" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "## ArduinoスケッチをMicrochip Studioでデバッグ\n", "残念ながら、Microchip Studioは、Windows版のみが提供されており、MacのVirtualBoxでは動作しませんでした(Paralles, VMwareでは動作が確認されているみたいです)。\n", "\n", "\n", "### Microchip Studioのインストール\n", "Microchip Studio for AVR and SAM Devices 7.0.2542のオフラインインストーラを以下のURLからダウンロードします。\n", "- https://www.microchip.com/content/dam/mchp/documents/parked-documents/as-installer-7.0.2542-full.exe\n", "\n", "\n", "### Arduino UNOとMBLAB Snapとの接続\n", "Arduino UNOとMBLAB Snapとの結線は、トランジスタ技術2021年4月号の図8から引用します。\n", "\n", "\n", "\n", "結線を整理すると以下のようになります。\n", "\n", "| MPLAB Snap | Arduiono ISPピン |\n", "| :-: | :-- |\n", "| 2: VDD | 2: VCC |\n", "| 3: GND | 6: GND |\n", "| 4: DAT | 1: MISO |\n", "| 5: CLK | 3: SCK |\n", "| 6: AUX | 5: /RESET |\n", "| 7: TDI | 4: MOSI |\n", "\n", "自由に切り離せるメス・押すのピンケーブルを使って以下のようにテープでまとめました。\n", "\n", "\n" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "### Arduinoスケッチのインポート\n", "Microchip StudioにArduinoスケッチをインポートする手順は、以下の動画に紹介されています。\n", "- https://onlinedocs.microchip.com/pr/GUID-54E8AE06-C4C4-430C-B316-1C19714D122B-en-US-2/index.html?GUID-438A4502-6265-4930-9D7A-230E3D7BB909\n", "\n", "手順としては、以下の通りです。\n", "- File > New > Project...を選択\n", "- プロジェクトの作成ディレクトリを指定\n", "- インポートするスケッチとボード、デバイスを選択\n", "\n", "Arduinoプロジェクトの作成画面では、「Create project from Arduino sketch」を選択し、プロジェクト名称、作成ディレクトリを入力して、OKボタンを押下します。\n", "\n", "\n", "\n", "\n", "インポートするArduinoのスケッチを指定し、ボードのタイプ、CPUデバイスをセットしてOKボタンを押下します。\n", "必要なライブラリも合わせてインポートされ、Microchip Stduioのプロジェクト画面が表示されます。\n", "\n", "\n" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "### Arduinoスケッチのデバッグ\n", "Arduinoスケッチをデバッグするときに注意が必要なことにヒューズ・ビットの切り替えです。\n", "ATmega328Pのデバッグには、ISPインタフェースからdebugWIREインタフェースに切り替えるために、\n", "ヒューズ・ビットを書き換える必要があります。\n", "\n", "Arduino(ATMEGA168/328用ボード)のジャンパを外して電源をオンにし、MPLAB Snapを接続してください。\n", "\n", "\n", "\n", "以下の手順でデバッグを開始します。\n", "- Debug > 「プロジェクト名」 Properties...を選択し、debugger/programmerでMPLAB Snapを選択、InterfaceでdebugWIREを選択\n", "\n", "\n", "\n", "\n", "- Debug > Start Debugging and Break(Alt+F5)を選択\n", "- ボードでの最初のデバッグの場合、\"Failed to launch debug session with debugWIRE\"の警告メッセージがでますので、YESボタンを押下\n", "\n", "\n", "\n", "\n", "-「debugWIRE is enabled」情報メッセージができますので、Arduinoの電源を入れ直し後、OKボタンを押下してください。\n", "\n", "\n", "\n", "- main関数で停止\n", "Start Debugging and Break(Alt+F5)でデバッグを開始するとmain関数の先頭で停止します。\n", "\n", "この後は、Step Over(ステップ実行)、Step Into(関数内に入る)、Step Out (関数を抜ける)、Continue(続ける)等の\n", "デバッグコマンドが使用でき、Autos画面では変数の値が確認できます。\n", "\n", "\n", "\n", "\n", "ブレークポイントをセットしておけば、Continueボタンを押下した時にブレークポイントで停止します。\n", "\n", "\n", "\n", "\n", "### Launch Failedが出たとき\n", "Launch Failedが出たときには、ターゲットボードの電源またはケーブルの配線をチェックしてください。\n", "\n", "\n", "\n", "\n", "### デバッグ完了時\n", "デバッグを完了したら、必ずISPモードに戻してください。\n", "debugWIREモードからISPモードに戻すには、デバッグの最後に\n", "- Debug > Disable debugWIRE and Closeを選択してください。\n" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ] }