0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry PicoのPlatformIOでの開発環境構築

Last updated at Posted at 2025-11-16

やりたいこと

Raspberry Pi PicoのPlatformIOでの開発環境を作る。
pioasmも使えるようにする

PlatformIOのインストール

①VSCodeでExtentionを開く。

②検索バーに platformio を入力する。

③表示されたPlatformIO IDEを選択する。

Install を押す。

image.png

ラズベリーパイPicoへの接続

USBケーブルを接続する。

デバイスマネージャーに表示されていることを確認する。

(ポートは違うこともある)

「BOOTSEL」ボタンを押しながら接続してしまうと表示されないので注意する。

image 1.png

プロジェクトを作成する

①PlatformIOのアイコンをクリックする。

Create New Project を選択する。

image 2.png

New Project を選択する。

image 3.png

①プロジェクト名を入力する。(ここでは「RPi_Pico_blink」)

Board:pico を入力する。

③出てきた候補の中から Raspberry Pi Pico を選択する。

image 4.png

図のとおり設定ができたら Finish をクリックする。

image 5.png

設定が完了するまで数分待つ。

image 6.png

図の内容が表示される。

image 7.png

「このフォルダー内のファイルの作成者を信頼しますか?」が表示されたら「はい」を選択する。

ファイルは

C:\Users\ユーザー\Documents\PlatformIO\Projects 内に作成される

ボード設定の書き換え

「Platform.ini」ファイルの内容を使用するボードを書き換えて、開発版の環境にする。

image 8.png

開発版の方が元のPlatformIOよりも更新されているため。

変更前

[env:pico]
platform = raspberrypi
board = pico
framework = arduino

変更後

[env:pico]
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
board = pico
framework = arduino
board_build.core = earlephilhower

「platformio.ini」に書き込むとプロジェクトの更新が始まるので完了するまで待つ。
30分ほどかかる。
image 9.png

RPi_Pico_blink\src\main.cpp を開く

image 10.png

以下を書き込む

#include <Arduino.h>

void setup() {  // 初期設定(1回だけ実行)
  pinMode(LED_BUILTIN, OUTPUT);     // LED端子を出力に設定
}

void loop() {   // メイン処理
  digitalWrite(LED_BUILTIN, HIGH);  // LEDを点灯
  delay(500);                       // 0.5秒待つ
  digitalWrite(LED_BUILTIN, LOW);   // LEDを消灯
  delay(500);                       // 0.5秒待つ
}

画面左下の [→] を押すことで書き込みする。

image 11.png

以下の表示が出たら書き込み成功

image 12.png

書き込みに失敗したとき

image 13.png

まず「BOOTSEL」ボタンを「押さずに」USBケーブルを挿し直して書き込めるか確認する。
書き込めなければ、

C:\Users\ユーザー\Documents\PlatformIO\Projects\RPi_Pico_blink\.pio\build\pico

にある「firmware.uf2」を「BOOTSEL」ボタンを押しながら接続したときに表示される「RPI-RP2」フォルダの中にコピーする。

image 14.png

Pico C SDKを使う

pioasmを使うためにPico C SDKを使う。

PlartformIOのプロジェクト作成時、Frameworkを Picosdk にして作成する。

image 15.png

MSYS2をダウンロード

https://www.msys2.org/

image 16.png

msys2-x86_64-*.exe をダウンロード。

msys2をインストールする。
インストール先はデフォルトの C:\msys64 のまま。

VSCodeからMINGW64を開く

image 17.png

以下コマンドを入力。

pacman -Syu

ターミナルが落ちるので再度MINGW64で開く。

もう一度以下コマンドを入力。

pacman -Syu

ビルド環境をインストール。

pacman -S mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-zlib

正しく入ったか確認。

which gcc
which cmake
which mingw32-make
ls /mingw64/bin/zlib1.dll

それぞれ以下が表示されればOK。

/mingw64/bin/gcc
/mingw64/bin/cmake
/mingw64/bin/mingw32-make
/mingw64/bin/zlib1.dll

pioasmのビルド

MINGW64を開いて以下を入力し、pioasmをビルドする

cd $USERPROFILE/.platformio/packages/framework-arduinopico/pico-sdk/tools/pioasm
cmake -S . -B build -G "MinGW Makefiles" -DPIOASM_VERSION_STRING="1.0.0"
cd build
mingw32-make all

PlatformIOの設定

platformio.ini に以下を書き込む。

[env:pico]
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
board = pico
framework = picosdk

extra_scripts = pre:scripts/pioasm.py

プロジェクトフォルダの直下に scripts というフォルダを作り、以下のファイルを作成する。

pioasm.py

import glob
import os.path
import pathlib
import sys
import warnings

Import("env") # type: ignore

PIO_FILES = glob.glob(os.path.join(env["PROJECT_SRC_DIR"], "*.pio"), recursive=True) # type: ignore

if len(PIO_FILES) != 0:
    PIOASM_EXECUTABLE = (
        pathlib.Path(env.PioPlatform().get_package_dir("framework-arduinopico")) # type: ignore
        .joinpath("pico-sdk/tools/pioasm/build/")
        .joinpath(f"pioasm{'.exe' if sys.platform.startswith('win') else ''}")
        .resolve()
    )

    if PIOASM_EXECUTABLE.exists():
        for filename in PIO_FILES:
            env.Execute(f'"{PIOASM_EXECUTABLE}" -o c-sdk "{filename}" "{filename}.h"') # type: ignore
    else:
        warnings.warn(f'pioasm executable not found in "{PIOASM_EXECUTABLE}"', Warning)

128ns幅のパルスを出すコード

GP0ピンから128nsのパルス幅でクロックを出すコードを書く。

srcフォルダに以下のファイルを作成する。

toggle_128ns.pio

.program toggle_128ns
; GP0 を 128ns ごとに High/Low トグル(125MHz クロック前提)

.wrap_target
loop:
    set pins, 1 [15]   ; 1 + 15 = 16 サイクル ≒ 128ns High
    set pins, 0 [15]   ; 同じく 128ns Low
    jmp loop
.wrap

% c-sdk {
#include "hardware/pio.h"

static inline void toggle_128ns_program_init(PIO pio, uint sm, uint offset, uint pin) {
    pio_sm_config c = toggle_128ns_program_get_default_config(offset);

    // 出力に使うピンを設定
    sm_config_set_set_pins(&c, pin, 1);

    // GPIO 初期化&方向
    pio_gpio_init(pio, pin);
    pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);

    // シフト設定(今回は特に使わない)
    sm_config_set_out_shift(&c, false, false, 32);

    // ステートマシン初期化
    pio_sm_init(pio, sm, offset, &c);
}
%}

main.c

#include "pico/stdlib.h"
#include "hardware/clocks.h"
#include "hardware/pio.h"
#include "toggle_128ns.pio.h"

int main() {
    stdio_init_all();

    PIO pio = pio0;
    uint sm = 0;
    uint offset = pio_add_program(pio, &toggle_128ns_program);

    toggle_128ns_program_init(pio, sm, offset, 0);

    pio_sm_set_enabled(pio, sm, true);

    while (1) tight_loop_contents();
}

書き込むとパルスが出る。

200MHzにクロック上げる

125nsのパルス幅で出すためにクロックを上げて実行する。
src フォルダに以下にファイルを作成する。

toggle_125ns_200m.pio

.program toggle_125ns_200m

.wrap_target
loop:
    set pins, 1 [24]   ; 1 + 24 = 25 cycles = 125ns (200 MHz)
    set pins, 0 [24]
    jmp loop
.wrap

% c-sdk {
#include "hardware/pio.h"

static inline void toggle_125ns_200m_program_init(PIO pio, uint sm, uint offset, uint pin) {
    pio_sm_config c = toggle_125ns_200m_program_get_default_config(offset);

    // ピン設定
    sm_config_set_set_pins(&c, pin, 1);
    pio_gpio_init(pio, pin);
    pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);

    // init
    pio_sm_init(pio, sm, offset, &c);
}
%}

main.c

#include "pico/stdlib.h"
#include "hardware/clocks.h"
#include "hardware/pio.h"
#include "toggle_125ns_200m.pio.h"

int main() {
    stdio_init_all();

    // 200MHz
    set_sys_clock_khz(200000, true);

    PIO pio = pio0;
    uint sm = 0;
    uint offset = pio_add_program(pio, &toggle_125ns_200m_program);

    toggle_125ns_200m_program_init(pio, sm, offset, 0);

    pio_sm_set_enabled(pio, sm, true);

    while (1) tight_loop_contents();
}

書き込むとパルスが出る。

参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?