理系的な戯れ

理工学系とくにロボットやドローンに関する計算・プログラミング等の話題を扱って、そのようなことに興味がある人たちのお役に立てればと思っております。

Raspberry Pi Picoのcmakeを用いたオリジナルプロジェクト

Raspberry Pi Picoのcmakeを用いたオリジナルプロジェクト

はじめに

Raspberry Pi Picoのプログラム制作において pico-sdkを使用して開発したいと思います。

その場合に、独自のプロジェクトを一から作る基本的な手順についてまとめておきます。

この記事は「Getting Started with Raspberry Pi Pico」(以下参考資料)の8章をほぼそのまま実行した記録です。

pico-sdkとpico-examplesの準備

pico-sdkが必要になるので、gitから任意のディレクトリにcloneしておきます。 これらはどちらも同じディレクトリにしてください。 (gitがインストールされていることが前提になります。) サンプルプログラムがたくさん入っているpico-examplesも大変参考になるはずなので、合わせてcloneします。

この記事ではpicoという名前のディレクトリを作り、その下にcloneしました。

mkdir pico
cd pico
git clone https://github.com/raspberrypi/pico-sdk.git
git clone https://github.com/raspberrypi/pico-examples.git

サンプルソースファイルの準備

プロジェクト用のディレクトリの作成

独自のプロジェクトを構築していくためのディレクトリ(フォルダ)を作成します。

mkdir test_prj

ディレクトリ名は任意ですがここではtest_prjにしました。(参考資料と変えています。)

以下、test_prjをプロジェクトのルートディレクトリ、あるいは単にルートと呼びます。

テスト用のソースコードの準備

以下のソースファイルを用意します。ソースファイルのファイル名は参考資料と変えて、test_prj.cとしました。

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

const uint LED_PIN = 25;

int main() {

  bi_decl(bi_program_description("This is a test binary."));
  bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED"));

  stdio_init_all();

  gpio_init(LED_PIN);
  gpio_set_dir(LED_PIN, GPIO_OUT);
  while(1) {
    gpio_put(LED_PIN, 0);
    sleep_ms(250);
    gpio_put(LED_PIN, 1);
    puts("Hello World\n");
    sleep_ms(1000);
  }
}

bi_declの行はpicotoolと言う、コンパイル後のバイナリから情報を得るツールで生かされる行で、 プログラムの動作の本質とは関係ない様です。

CMakeLists.txtの準備

開発環境としてcmakeを用いますので、cmakeの動作指示書とでもいえるCMakeLists.txtを準備します。

CMakeLists.txtはプロジェクトのルートであるtest_prjディレクトリ内に作ります。 ソースコードと同じ場所に置くと言うことです。

以下のテキストをCMakeLists.txtとしルートに保存してください。

cmake_minimum_required(VERSION 3.13)

include(pico_sdk_import.cmake)

project(test_prj C CXX ASM)
set(CMAKE_C_STNDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()

add_executable(test_prj
  test_prj.c
)

pico_enable_stdio_usb(test_prj 1)
pico_enable_stdio_uart(test_prj 1)

pico_add_extra_outputs(test_prj)

target_link_libraries(test_prj pico_stdlib)

プロジェクトの名前とCのソースファイルの名前が一致しているので、自分でプロジェクトを作る際は CMakeLists.txtの該当箇所を注意して変更してください。

pico_sdk_import.cmakeのコピー

ビルドを正常に行うためにルートにpico-sdkからpico_sdk_import.cmakeと言うファイルをコピーしてきます。

cp ../pico-sdk/external/pico_sdk_import.cmake .

pico-sdkのパスの設定

ビルドする前に、pico-sdkのパス(場所)を環境変数に設定します。

export PICO_SDK_PATH=../../pico-sdk

上記はpico-sdkの場所を後述するbuildディレクトリからの相対パスで指定しています。 そのため、この記述ででうまくいくのはプロジェクトのルートディレクトリが本記事どうりに、 pico-sdkディレクトリと同じディレクトリ内に存在している必要があります。

ビルド

cmakeを用いたビルドは

  1. ルートにbuildディレクトリを作成
  2. buildディレクトリに移動
  3. cmakeを実行して、makefile作成
  4. makeを実行してコンパイル&リンク、書き込み用ファイル作成

と言う様な流れで行います。実際は以下の様にコマンドを実行していきます。

mkdir build
cd build
cmake ..
make

マルチコアのCPUを搭載しているマシンではmakeで以下の様にコンパイルに使用するコア数を指定すると コンパイルが高速になるかもしれません。(以下の例はコア数を4に指定)

make -j4

うまくビルドが終わるとuf2ファイルが出来上がるのでPicoをUSB接続するとUSBドライブとして見えるので、 そこにドラッグアンドドロップすると、書き込み完了となります。

おわりに

今回は基本的なRaspberry Pi Picoの独自プロジェクトを構築する方法の基礎のきそを解説しました。 複雑なプロジェクトになるとCMakeLists.txtの記述内容を理解しなければなりませんが、そこはまた後日余裕があればとしたいと思います。

お急ぎの方は、以下の記事が大変参考になるかと思います。(執筆者に感謝です。)

qiita.com

qiita.com