ArduinoでIoTにチャレンジ<その11>Arduino IDE 2.0で追加されたデバッグ機能を試す

 Arduino IDE 2.0では、次に示すSAMベース(Atmel(Microchip)が作っているarmのCortex-Mシリーズ)のArduinoで、J-Linkのプローブを使用するとオンラインのデバッグが行えます。

デバッグに必要なもの

① 下記のArduinoのボード
② Arduino IDE 2.0(ダウンロードして入手)
③ Atmel ICE オンチップ・デバッガ
④ 接続ケーブル、ボードとAtmel ICEを接続するためのケーブル

Arduino MKR zero (プローブは不要)
Arduino MKR WiFi 1010
Arduino MKR FOX 1200
Arduino MKR WAN 1300
Arduino MKR WAN 1310
Arduino MKR GSM 1400
Arduino MKR NB 1500
Arduino MKR VIDOR 4000
デバッガに対応しているArduino MKRのボード

 Arduino MKRの裏面には、1010の表示の下の6個パッドがあり、次の信号の配置になっています。()の中の数字はAtmel-iceのSAM側のヘッダのピン番号です。

 6個パッドは、3×2で構成されており、図に示すようにデバッグするために必要なSWDインターフェース用の信号が用意されています。

 このパッドは回路図ではJ2と記述され、J2の2番にSWDIO、4番にSWDCLKが接続されています。1番はボードの電源の3.3Vに、2番はRESET、GNDは3番、6番、9番の3本のリード線が割り当てられていますが、1本の接続でも動作します。Arduinoのチュートリアルでは9番の接続だけになっています。線が細いので3本まとめてはんだ付けしました。

 - GND(3,6,9)
SWDCLK(4) RESET(10)
SWDIO(2) 3.3V(1)

Atmel ICE Base キット

 入手したAtmel ICE Base キットは、次に示すように、本体とUSBケーブル、ISP端子用のケーブルがセットです。

SAM、AVRボード用のコネクタ

  Atmel-iceのLEDの表示の下にSAMとAVRの表示があります。表示の下には、次に示す5ピン2段のハーフピッチのヘッダがあります。今回使用するのはSAMの表示のある、向かって左側のソケットを利用します。

 左端の下段が1番ピン、その上段が2番ピンの順に、右端の下段が9番ピンでその上段が10番ピンとなります。
 多くのヘッダは切り欠きのあるほうに1番ピンがありますが、Atmel-iceは反対になっています。そのため、標準のコネクタ付きケーブルを接続すると、1番ピンと10番ピンが反対になります。この点を留意して接続します。

 リード線をArduino MKRのボードのJ2のパッドにはんだ付けするとき、このピン・ナンバを確認します。ケーブルのソケットにピンヘッダを差し込み、リード線と該当する番号との導通をテスタで確認しながら、リード線の接続を行いました。

接続ケーブル

 接続には、ハーフ・ピッチの10芯の15cmのフラット・ケーブル(秋月電機通商で購入)を利用しました。必要なソケットは一つだけので、ケーブルを中ごろで切断しリード線をばらしました。

 該当する番号のリード線を、次のようにそれぞれのパッドにはんだ付けして接続しました。

ケーブル接続時の1番ピン

 通常は赤のリード線が1番ピンに接続されていますが、ヘッダの誤挿入防止の切り欠きがAtmel-ICEのヘッダは一般のヘッダと反対になっていますので、一般用のソケット付きのケーブルのソケットをヘッダに差し込んだ時は赤いリード線が10番ピンのリード線となります。よく確認してください。

 Atmel-ICE Basic Kitに付属している10ピン・ソケットと6ピンヘッダは、ArduinoのISPピンヘッダの接続に利用するものです。今回の目的には、10番ピンのresetが接続されていないので利用できません。

テスト・プログラムの用意

 テスト・プログラムは、1秒(1000ms)ごとに内蔵のLEDを点滅する単純なものです。併せて、デバッグで変数の内容を確認するために、LEDの点滅ごとに変数xをカウントアップ、変数yをカウントダウンします。このスケッチは、Arduino IDE 2.0チュートリアルの中にある、デバッグに関する次の記事のサンプルのコード部分です。

    Debugging SAM-Based Arduino? Boards with Atmel-ICE

    https://docs.arduino.cc/tutorials/mkr-wifi-1010/atmel-ice

int x = 0; // カウントアップする変数
int y = 0; // カウントダウンする変数
void setup() {
    pinMode(LED_BUILTIN, OUTPUT); //内蔵LEDに接続されているポートを出力に設定
}
void loop() {
    digitalWrite(LED_BUILTIN, HIGH);  // 内蔵LEDを点灯する
    x++;                               // x をカウントアップする
    y--;                                 // y をカウントダウンする
    delay(1000);                                 // 1000ms 待つ
    digitalWrite(LED_BUILTIN, LOW);   // 内蔵するLEDを消灯する 
    delay(1000);                                // 1000ms 待つ
}

デバッグに最適化してアップロード

 メニューバーのスケッチを選択し、「デバッグに最適化」をチェックしてからコンパイルし、ボードにアップロードしてデバッグを開始します。このチェックで、デバッグに対応できる状態になります。


デバッグを開始するために

 デバッグを開始するためには、ツールバーの左から3番目の「デバッグの開始」アイコンをクリックします。次の図は、「デバッグの開始」のアイコンにマウス・ポインタを載せた状態でクリックしています。


デバッグの開始

 デバッグの開始方法には、二つ目の方法があります。左端にあるサイドメニューのデバッグのアイコンをクリックすると、スケッチの左側にデバッグ・ツール・エリアが表示されます。しかし、まだデバッグが開始されていないので、最上段の行しかアクティブになっていません。

 この行のアイコンなどの左端の右向きの三角マークがデバッグの開始のアイコンとなり、このアイコンをクリックしてデバッグを開始できます。

 デバッグ・ツールが開いていない場合はこのアイコンが利用できません。その場合はツールバーの左から三番目のアイコンが「デバッグの開始」の機能を担っています。デバッグ・ツールが開いていない場合は、このアイコンをクリックしてデバッグを開始できます。

デバッグを開始すると

 デバッグを開始すると、サイドメニューの横のデバッグ・ツール・メニューとデバッグ・コンソールが表示されます。
 デバッグ・ツールの2行目の六つ並んだアイコンがデバッガ・ボタンで、左から次のような機能を持っています。

 継続       :次のブレーク・ポイントまでスケッチを実行する
           ブレーク・ポイントが設定されていない場合は、停止/再開となる
 ステップオーバー :選択された命令だけ実行しプログラムを停止する
 ステップイン   :命令が関数を呼び出している場合、その細部の命令をワンステップごとに順番に実行する
 ステップアウト  :呼び出し元の命令まで実行する
 初期化      :初期化してスケッチの最初から実行できるようにする
 停止       :デバッグを停止する

 

ブレーク・ポイントの設定

 行番号の左側をマウスでクリックすると赤い丸が表示され、選択された行がブレーク・ポイントとして設定されます。ブレーク・ポイントとして設定すると、デバッグ中はスケッチを連続して実行するモードであってもブレーク・ポイントを実行する直前でプログラムは停止します。


確認する変数の設定

 スケッチ実行中、変数の変化の様子を確認できます。デバッグ・ツールのウォッチ式(WATCH;下のように画面が英語表示の時)の文字の上にマウスを持っていくと、「+」のアイコンが表示され、このアイコンをクリックすると、次に示す式を追加するダイアログが表示されます。

 変数x、変数yをここで設定します。具体的な式の例としてx+yを設定してあります。内蔵したLEDをドライブしたポート番号を確認するために、LED_BUILTINも設定してあります。

デバッガによる動作確認

 デバッグが開始されブレーク・ポイントの設定、ウォッチする変数や式の設定を行います。
 変数の値は、デバッグの開始までに進行していた状況を反映しています。デバッグ開始時にはリセット処理を開始するルーチンで停止しています。


スケッチの動作を開始する

 続行ボタンをクリックしてスケッチの動作を開始すると、次に示すように変数の初期化が行われ、最初のブレーク・ポイントでプログラムが停止します。

 初期化されたためx、yの変数は0となっています。デバッガ・ボタンの続行ボタンを繰り返すたびにLEDの点滅が繰り返され変数の値も変化します。


ステップオーバー・ボタンを確認する

 デバッガ・ボタンのステップオーバー・ボタンはスケッチを1命令ごとに実行します。次に示す状態は、x++の変数xのカウント・アップは完了しているので、xは4になっています。変数yのカウント・ダウンはこれからなので変数yの値は-3となりx+y≒1となっています。
 スケッチの動作の確認が行えるので、デバッグには大いに役立ちます。

 ステップオーバーを続けることでyのカウント・ダウンも完了しx+y=0となり、LEDの消灯を終えloop()関数を終了し、次のloop()関数に続く処理に入ります。ここでLED_BUILTINの値が6であることが確認できました。

 loop関数は、次に示すようなコードで繰り返されます。繰り返す前に毎回シリアル入力があるかチェックしています。今回はスケッチの中ではシリアル入出力を利用していないので影響はありませんが、シリアル入力をチェックしていることは心にとめておきます。

 以上で、Arduino IDE 2.0で利用できるようになったデバッガの確認ができました。引き続きいろいろな場面で利用し理解を深めていきます。


(2022/10/02)

<神崎 康宏>

前へ

Smart gadget SHT4x を使って電子百葉箱を作る ⑦ 電波の強さRSSI

次へ

グラフィック三昧 ① ST7735とMKR WiFi 1010