トップ画像
RP2040開発ボードでRaspberry Pi Pico C/C++ SDKを使う

執筆者: 瀕死

最終更新: 2024/07/03

はじめに

瀕死(ひんし)と申します。しばらくはマイコン関連の記事を投稿する予定です。

より良い記事を目指す一環として、表現や文体等を見直しました。

本稿でもよろしくお願いいたします。

目的

本稿ではRP2040開発ボード、つまりRaspberry Pi Picoの互換ボードでRaspberry Pi Pico C/C++ SDK(以下SDK)をWindows11において用いる方法について解説する。

互換ボード専用の手順は存在しないため、 Raspberry Pi PicoをSDKで開発するのにも適用可能である。

目次

  • RP2040開発ボードでRaspberry Pi Pico C/C++ SDKを使う
    • はじめに
    • 目的
    • 目次
    • 環境構築
    • CMakeによるビルド
    • Lチカを試す
    • USB経由のシリアル(UART)通信
    • おわりに
    • 参考文献

環境構築

Windows11においておそらく最も簡単にSDKを用いた開発環境を構築する方法は、pico-setup-windowsのインストーラーを実行することである。

GitHubページ右側のReleasesの下のvX.Y.Z(X, Y, Zは数字)をクリックし、拡張子が.exeのファイルをダウンロードして実行する。

そうすると、デスクトップに以下のようなアイコンが作成されるのでクリックして実行する。

もしショートカットがデスクトップになければ、 インストールした場所(標準は"C:\Program Files\Raspberry Pi\Pico SDK vX.Y.Z\")の pico-code.ps1をPowerShellで実行する。

このSDKで開発する場合は上記のショートカットorPowerShellスクリプトからVSCodeを起動する必要がある。 その他の方法でVSCodeを起動すると、CMake 実行可能ファイルが正しくありませんなどのエラーが出るので、必ずデスクトップのアイコンから起動する。

CMakeによるビルド

起動すると、以下のような画面が表示されるのでPico ARM GCCを選択する。

消してしまった場合は、VSCodeのコマンドパレットからCMake: Configureを選択すると同じ画面になる。

他には、CMake拡張機能が無効であるなどの原因が考えられる。

次に、CmakeタブのBlink(実行可能ファイル)の右のツールチップがビルドのアイコンをクリックすると、Blinkプロジェクトをビルドできる。

VSCodeの出力のとおり、./buildフォルダに実行可能ファイルが生成される。 今回はさらにその下の./blink/blink.uf2が開発ボードで実行できるファイルである。

開発ボードのBOOTSELボタンを押しながらUSBでPCに接続すると、ドライブとして認識するので、ここにblink.uf2をコピーする。

新しいプログラムを開発ボードに書き込む場合は、BOOTSELボタンを押しながらUSBで接続する必要がある。 押していなかった場合は、給電のみ行われる。

コピーすると自動でマウントが解除され、LEDが点滅する。

Lチカを試す

開発ボードを用いた電子工作におけるHello, World.はLEDを点滅させるLチカである。

1つ前の章でもLチカを実行したが、この章では新しいプロジェクトとしてLチカプロジェクトを作成す。

適当なフォルダをC:\Users\${あなたのユーザー名}\Documents\Pico-X.Y.Zの下に作成し、 以下の3ファイルを配置する。

  • ..\pico-examples\pico_sdk_import.cmakeをコピーして配置する。
  • CMakeLists.txtを作成し、下記をコピーして貼り付けておく。
  • main.cppを作成し、下記をコピーして貼り付けておく。
cmake_minimum_required(VERSION 3.13)

# PICO_SDK_PATHを基にSDKを初期化する
# project()より先に呼ばれる必要がある
include(pico_sdk_import.cmake)

# プロジェクトを宣言
project(my_project)

# Raspberry Pi Pico SDKを初期化
pico_sdk_init()

# 実行可能ファイルを作成する
# (生成するファイル名, ソースファイル1, ...)
add_executable(a
    main.cpp
)

# pico_stdlibを追加する
target_link_libraries(a pico_stdlib)

# Raspberry Pi Picoで実行可能なファイルを作成する
pico_add_extra_outputs(a)
#include "pico/stdlib.h"
#include "hardware/gpio.h"

#define LED_BUILTIN 25      // LEDがつながっているピンを定数マクロとして定義

int main() {
    gpio_init(LED_BUILTIN);                 // gpioを初期化
    gpio_set_dir(LED_BUILTIN, GPIO_OUT);    // gpioの役割を出力に設定    

    while(true) {
      gpio_put(LED_BUILTIN, 1);       // LEDをONに
      sleep_ms(1000);                 // 1秒待機
      gpio_put(LED_BUILTIN, 0);       // LEDをOFFに
      sleep_ms(1000);                 // 1秒待機
    }
}

上記のとおりにビルドし開発ボードに書き込むと、 先ほどより点滅の間隔の広いLチカが実行される。

USB経由のシリアル(UART)通信

CMakeLists.txtpico_add_extra_outputs(a)の直前に以下を追記する。

# 標準出力をUARTピンからUSBに変更
pico_enable_stdio_usb(a 1)
pico_enable_stdio_uart(a 0)

main.cppを以下のとおり書き換える。

#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include <iostream>

#define LED_BUILTIN 25
const char LED_ON_CMD = 'Y';

using namespace std;

int main() {
    // stdio初期化 ないとシリアルポートが見つからないので注意
    stdio_init_all();

    gpio_init(LED_BUILTIN);
    gpio_set_dir(LED_BUILTIN, GPIO_OUT);
    gpio_put(LED_BUILTIN, 1);
    
    while(true) {
        char c;
        cin.get(c);
        if(c == LED_ON_CMD) gpio_put(LED_BUILTIN, 1);
        else gpio_put(LED_BUILTIN, 0);
        cout << "read success" << endl;
    }
}

この開発ボードでは標準入出力をUSBに流すようにするだけで、 cinprintf等を簡単に用いることができる。

VSCodeのシリアルモニターで'Y'を送信するとLEDが点灯し、 それ以外を送信するとLEDが消灯する。

おわりに

読んでいただきありがとうございました。 次回は、RP2040開発ボードで複数のコアを利用する方法について解説する予定です。

参考文献

取得に失敗しました

2024年度 入部