[[Arduino勉強会]]

#contents

2021/05/23からのアクセス回数 &counter;

** RaspberryPi Picoをはじめよう [#k78b3147]
Raspberry財団から販売されたRaspberry Pi Pico(以下Picoと省略)が正式にArduino IDEをサポートしました。
それと同時にPlatformIOもPicoをサポートしました。

ここでは、VScodeにPicoの開発環境を構築し、Arduinoフレームワークを使ったアプリの作成とJTAG書き込みツール(jlink-OB)を使ったデバック方法を紹介します。

&ref(Pico-bbrd.png,,70%);


** PlatformIOのインストール [#fff12e2c]
VScodeをまだ使用していない場合は、以下のサイトからダウンロードしてください。
- https://code.visualstudio.com/download


VScodeを起動すると、画面の左側にさまざまなアイコンが並んでいます。PlatformIOは、VScodeのプラグインとして提供されています。プラグインをインストールするには、Extentionsボタンをクリックしてください。

&ref(VScode-init.png,,70%);


Extenstionの画面では、検索フィールドが表示されるので、「platformio」と入力してください。リストから「PlatformIO IDE」を選択すると、PlatformIO IDEの説明画面が表示されるので、「Install」ボタンをクリックするとインストールが実行されます。

&ref(VScode-platformio.png,,70%);


** 新規プロジェクトの作成 [#g9eb988c]
PlatformIOがインストールされると左のアイコンリストにアリさん?のようなPlatformIOアイコンが追加されます。

新規のプロジェクトを作成するには、このアイコンをクリックし、「PIO HOME」リストから「Open」を選択すると、以下の画面が表示されます。ここで、「New Project」ボタンをクリックしてください。

&ref(Platformio-new.png,,70%);


Project Wizard画面に切り替わりますので、プロジェクトの名前をName:フィールドに「L-Chika」と入力し、Boardフィールドには「pico」と入力すると候補が表示されますので「Rasperry Pi Pico」を選択します。Frameworkフィールドには「Arduino」が表示されます。入力が完了したら「Finish」ボタンをクリックしてください。プロジェクトの作成には時間がかかりますので、お茶でも飲みながら待ってください。

&ref(Project-Wizard.png,,70%);


*** 設定の変更 [#ya92138a]
プロジェクトが作られると以下のようなplatformio.iniファイルが表示されるます。
このファイルでプロジェクトの設定を行います。

今回は以下の行を追加してください。

#pre{{
upload_port = /Volumes/RPI-RP2/

monitor_speed = 115200
build_flags = -g
}}

各設定の意味は以下の通りです。
- upload_port: スケッチをアップロードする場所を指定します。MacOSの場合は「/Volumes/RPI-RP2/」とし、Windowsの場合には「COMn」とシリアルポート番号を指定します。
- monitor_speed: Picoとシリアルモニターで通信するときの通信速度を指定します。
- build_flags: C++のビルドコマンドへのオプションを指定します。後でOpenOCDを使ったデバッグを使用するので、「-g」を指定します。

&ref(platformio.ini-setting.png,,70%);


*** Lチカスケッチの作成 [#g74cdefe]
続いてLチカのスケッチを描きましょう。EXPLORERリストの「src」の中の「main.cpp」をクリックするとArduinoのデフォルトスケッチが表示されますので、以下のLチカスケッチをコピー&ペーストしてください。

#pre{{
#include <Arduino.h>

// 起動時に最初に1回だけ実行される関数です
void setup() {
  // ArduinoのデフォルトのLEDピンをデジタル出力に設定します
  pinMode(LED_BUILTIN, OUTPUT);
}

// setup後繰り返し実行されます
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // LEDをオン(HIGHは、電圧レベルを指定)
  delay(1000);                      // 1秒待ちます
  digitalWrite(LED_BUILTIN, LOW);   // LEDをオフ
  delay(1000);                      // 1秒待ちます
}
}}

&ref(L-Chika-sketch.png,,70%);


*** スケッチのPicoへのアップロード [#s3e19698]
MacOSの場合、スケッチをアップロードするにはPicoのBOOTSELボタンを押しながらUSBのケーブルを挿入します。USBメモリを差した時と同様にPicoのドライブが現れます。

&ref(BootSel.png,,100%);


PlatformIOでスケッチをアップロードするには、PlatformIOアイコンをクリックし、QUICK ACCESS>PIO HOMEの中のOpenを選択し、PROJECT TASK>pico>Generalの中のUploadを選択してください。
(以前はすぐにUploadの選択だけでよかったのですが、現在のバージョンではPIO Homeがアクティブの状態でないとUploadが実行されません)

スケッチをコンパイルした後、自動的にアップロードを実行します。

&ref(Upload-sketch.png,,70%);


スケッチのアップロードが完了するとPicoのドライブがアンマウントされるので、「ディスクの不正な取り出し」ワーニングがでますが問題ありません。

&ref(Disk-warning.png,,100%);


これでPicoへのLチカスケッチがアップロードが完了し、LEDが1秒間隔で点滅します。

** JTAG書き込みツールを使ったスケッチのデバッグ [#hf8d0996]
Picoにスケッチを書き込むには、JTAG-SWDに対応したJTAG書き込みツールが必要です。

私は自称デバッガーマニア(トランジスタ技術 2012/02 Mac/Linuxでも使える! 簡易デバッガの製作)なので、自作したものを含めいろんなJJTAG書き込みツールを使ってきました。

ここでは、安価なJLink-OBを使います。
aliexpressでは
[[1000円以下>https://ja.aliexpress.com/item/32827782488.html]]
Amazonでも、
[[1990円>https://www.amazon.co.jp/dp/B07F3CV2K2]]
で入手できます。

&ref(JTAGs.png,,70%);


RaspberryPI Pico用のopenocdは以下のJTAG書き込みツールに対応していますが、実際に動作が報告されているものを使うのがよいでしょう。ST-Link V2では、Picoのrp2040.cfgのjwj_newdapでエラーになりました。

#pre{{
The following debug adapters are available:
1: ftdi
2: usb_blaster
3: jtag_vpi
4: ft232r
5: presto
6: usbprog
7: openjtag
8: jlink
9: vsllink
10: rlink
11: ulink
12: arm-jtag-ew
13: remote_bitbang
14: hla
15: osbdm
16: opendous
17: aice
18: cmsis-dap
19: kitprog
20: xds110
21: st-link
}}

*** J-Link OBとの結線 [#vc4aff9d]
PicoとJ-Link OBとの以下のように接続します。

| pico | J-Link OB |h
| 1 ▼ |  SWCLK |
| 2 | GND |
| 3 | SWDIO |

*** OpenOCDコンフィグファイル [#f27b7a9a]
Pico用のOpenOCDコンフィグファイル(openocd.cfg)をplatformio.iniと同じディレクトリに作成します。

RP2040の設定については、OpneOCDの大御所
[[ねむいさんの記事>http://nemuisan.blog.bai.ne.jp/?eid=232122]]
を参考にさせていただきました。

openocd.cfgの内容
#pre{{
# インタフェース設定
source [find interface/jlink.cfg]
adapter driver jlink
transport select swd

# RP2040 CPU設定
source [find target/rp2040.cfg]
$_TARGETNAME_0 configure -work-area-phys $_WORKBASE -work-area-size $_WORKSIZE -rtos auto

# デバッガの初期化
adapter speed 1000
gdb_target_description enable
init
reset init
}}

*** launch設定の変更 [#o13c15fb]
PlatformIOのデフォルトデバッガーはPIO debugとなっており、.vscodde配下のlaunch.jsonをOpneOCD用に変更してもVScodeを起動し直すと元に戻ってしまいます。

そこで、左下のギアのアイコン(Manage)>Settingsを選択し、「Search settings」フィールドに「launch」と入力するとUserタブにLaunchが表示されるので、「Edit in setting.json」をクリックしてください。

「configurations」の[]の中をコピー&ペーストしてください。以下の設定は、Windows10とMacOSXで動作を確認しています。

#pre{{
{
    "git.ignoreMissingGitWarning": true,
    "launch": {
    
        "configurations": [
            {
                "name": "Pico debug",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceRoot}/.pio/build/pico/firmware.elf",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${workspaceRoot}",
                "environment": [],
                "externalConsole": false,  
                "debugServerArgs": "-f ${workspaceRoot}/openocd.cfg",
                "serverLaunchTimeout": 20000,
                "filterStderr": true,
                "filterStdout": true,
                // "serverStarted"には、ターゲットの起動が完了した時の出力キーワードを指定する
                "serverStarted": "target halted due to debug-request, current mode: Thread",
                "MIMode": "gdb", 
                "setupCommands": [
                    { "text": "-target-select remote localhost:3333", "description": "connect to target", "ignoreFailures": true },
                    { "text": "-target-download ${workspaceRoot}/.pio/build/pico/firmware.elf", "description": "load image", "ignoreFailures": true },
                ],
                "logging": {
                    "moduleLoad": true,
                    "trace": true,
                    "engineLogging": true,
                    "programOutput": true,
                    "exceptions": true
                },
                "osx": {
                    "MIMode": "gdb",
                    "MIDebuggerPath": "${env:HOME}/.platformio/packages/toolchain-gccarmnoneeabi/bin/arm-none-eabi-gdb",
                    "debugServerPath": "${env:HOME}/.platformio/packages/tool-openocd-raspberrypi/bin/openocd",
                },
                "windows": {
                    "MIMode": "gdb",
                    "miDebuggerPath": "\\Users\\${env:USERNAME}\\.platformio\\packages\\toolchain-gccarmnoneeabi\\bin\\arm-none-eabi-gdb.exe",
                    "debugServerPath": "\\Users\\${env:USERNAME}\\.platformio\\packages\\tool-openocd-raspberrypi\\bin\\openocd.exe",
                }

            }
        ],
        "compounds": []
    }
}
}}

*** デバッグの開始 [#t113638e]
準備が整ったで、Lチカ・スケッチをデバッガーで動かしてみましょう。
(MacOSXの人は、これで毎回BOOTSELボタンを押してスケッチを書き込むなくてもよくなります。)

最初にSetup関数の行番号の左をクリックすると赤丸が付きます。これでsetup関数にブレークポイントがセットされます。

左のアイコンリストから「虫と▷」のアイコンを選択し、デバッグプルダウンから「Pico debug」を選択し、「▷」をクリックします。デバッガーが裏でしばらく動いてsetup関数の最初のステップで停止します。

&ref(VScode-debug.png,,70%);


ここで、デバッガーのコマンドパネルで「Continue」や「Step Over」を実行すると、「Exception has occurred」のエラーがでることがあります。

&ref(debug-exception.png,,70%);


この例外は、ブレークポイントでPicoの2つのCPUのスレッドが両方停止状態になっていないために、発生しているものと思われます。これからの脱出方法として、「Terminal」メニューで「New Terminal」を選択し、ターミナルウィンドウを開き、telnetコマンドを起動し、OpenOCDに接続します。

最初のOpenOCDコマンドhaltは、現在動作しているターゲット(Pico)を停止し、次の「resume」で制御をデバッガに戻しています。

#pre{{
$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> halt
> resume
>
}}

画面上は何も変わりませんが、これで「Continue」や「Step Over」正常に使えるようになります。

** Windows10固有の設定 [#xa3c1d62]

*** libusbのドライバーの設定 [#x3579ef3]
OpenOCDとuploadに使われているコマンドは、libusbのライブラリを使用することを前提に作られているので、Windows10で使用するにはドライバーをセットする必要があります。

通常は、ドライバーのインストーラーが用意されていますが、libusbの場合にはZadigというツールを使用します。

Zadig 2.5は、以下のサイトからダウンロードします。
- https://zadig.akeo.ie/

BOOTSELボタンを押したままPicoにUSBコネクターを差します。
Zadigを起動し、「Options」メニューから「List All Devices」を選択します。

&ref(Zadig-options.png,,100%);


デバイスプルダウンから「RP2 Boot(Interface 1)」を選択し、「libusb-win32(v1.2.6.0)」を選択し、「Install Driver」をクリックします。
インストールはしばらく時間がかかります。

この設定をしておけば、platform.iniでupload_portの指定は不要になります。
;でコメントアウトしてください。

platform.ini
#pre{{
; upload_port = COM7
}}


同様にJ-LinkをUSBに差してドライバーを「libusb-win32(v1.2.6.0)」に入れ替えます。

*** telnetの有効化 [#f531750d]
Windows10は、そのままではtelnetコマンドが使えません。Windowsの機能画面を開き、「Windowsの機能の有効化または無効化」を選択し、「Telnetクライアント」にチェックを付け、「OK」ボタンをクリックしてください。

&ref(Activate-Telnet.png,,80%);


** コメント [#ff93bd6f]
#vote(おもしろかった[6],そうでもない[0],わかりずらい[0])
#vote(おもしろかった[7],そうでもない[0],わかりずらい[0])

皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc