{
"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": []
}
]
}