Raspberry Pi PicoをC/C++で制御するのをWindows内で完結させる


情報があまりにも少ない

いや、情報はあるんだろうけど探しても出てきにくい。やはりMicro Pythonの利便性から、CやC++から利用しようという人たちは少ないのだろうか。
今回、この記事ではWindows上のみで完結する、Raspberry Pi Picoの制御方法について備忘録的に書き残しておく。
である口調・命令口調で書いたので少々口がきついように聞こえるかもしれないが、別に怒ってるわけでも、私が偉いわけでもないので、わからないことがあればなんでも気軽に聞いてくれ。

環境・用意するもの

私が用意した環境は以下の通りだ。

  • Raspberry Pi Pico
    • 今回の主役。こいつがなければ話にならない。
  • Windows 10 Pro Insider Preview
    • Insider Previewを常用しているのが筆者なので、頭のおかしいやつだと思って温かい目で見てやってほしい。おそらく普通のWin 10 ProやHomeでも問題なく動作するだろう。
  • gcc-arm-none-eabi
    • こいつが割と肝、Ras Pi PicoなどのARMプロセッサ向けのクロスツールチェーン。
    • ここからダウンロードする。
    • 記事執筆時点の最新版は10-2020-q4-major
    • 32bit版しかないが、別に問題はなさそうだった。
    • インストールするだけではパスが通らないので、binフォルダのパスを通しておく必要がある。これに関しては長くなるので割愛。パスの通し方ぐらいたくさんありそうだし...
  • cmake
    • 最新版入れておけば大体何とかなると思う(無責任)。
    • ダウンロードはここから
  • mingw-w64
    • これも必要。Visual StudioのTool Kitを使う方法もあるようだが、手元ではうまくいかなかった。仕方がないので、mingw-w64を用いる。別にCygwinなんかでもいいだろうが、私にはさっぱりわからんので保証はしない。
    • ここからダウンロードする。
    • バージョン指定できるが、多分適当に7.3.0あたり選んでおけば無難。手元では7.3.0がすでにインストール済みだったので、それを使用した。
    • やはりパスを通しておく必要がある。
  • Git for Windows
    • エンジニアなら大体入れてると思うから割愛...
    • Unixコマンドを利用可能な設定にしている。なので、WindowsなのにUnixコマンドが出てきているが、使えない人は適宜読み替えて別の手法を用いてくれ。

以上のものを用意すれば大体何とかなるはずだ。わからなければコメント欄で質問してくれ。あくまでも私の備忘録というスタンスだ。
なお、今回デバッガ(gdb)などは用意しないものとする。申し訳ないが他をあたってくれ...

作業

基本的にはコマンドライン上で作業する。フォルダ作成やテキスト編集などは適宜ご自由にエクスプローラやテキストエディタ、IDEを使ってくれ。

  1. まず適当なプロジェクトディレクトリを用意し、git initしておく。今回プロジェクト名はmy-pico-projectとした。

    mkdir my-pico-project
    cd my-pico-project
    git init
    
  2. プロジェクトにpico-sdkをサブモジュールとして登録する。
    これが一番手軽そうだったので採用。PICO_SDK_PATHなんかを使う方法もあり、私はそうしているのだが、説明がめんどくさいので、サブモジュール化する。ほかにも、ビルド時にGitHubから自動でクローンしてきてインポートするような方法もあるようだ。詳しく知りたい方はこちらから。

    git submodule add https://github.com/raspberrypi/pico-sdk pico-sdk
    
  3. cmake関連のファイルを作る。
    CMakeLists.txtをプロジェクト直下に作成する。

    CMakeLists.txt
    # cmake の最小要求バージョンの指定
    cmake_minimum_required(VERSION 3.13)
    
    # pico-sdkのサブモジュールから、cmakeファイルを読み込み
    include(pico-sdk/pico_sdk_init.cmake)
    
    # プロジェクト名の設定
    project(my_pico_project)
    
    # Raspberry Pi Pico SDKの初期化
    pico_sdk_init()
    
    # 実行可能バイナリの作成(要はコンパイルするように仕向ける)
    add_executable(blink_test_with_win
        blink.c
    )
    
    # pico-sdkのリンク
    target_link_libraries(blink_test_with_win pico_stdlib)
    
    # elfからのuf2バイナリ(pico上で実行可能な奴)の作成
    pico_add_extra_outputs(blink_test_with_win)
    
  4. メインのプログラムを書く。
    今回は適当に、動くことが目に見えてわかるLチカプログラムを用いる。こちらのコードをコピーするとよい(他人のコードを勝手に貼っていいのかというところがあるので、リンクにさせてもらった、GitHubのコードが貼れないのがQiitaの残念なところ)。3.のcmake関連のファイル作成で、プログラムのファイル名をblink.cとしたので、それだけは守らなければならない。当たり前だが、CMakeLists.txtを作った時と同じく、プロジェクト直下に作成する。

  5. 現状確認
    正しくできていれば、今フォルダ内の構成は以下のようになっているはずだ(ファイルは作成順で、順不同。隠しファイル/フォルダの表示設定がされていない人は、Git関連のファイル/フォルダが見えないかもしれないが、おそらく正常だろう)。

     - my-pico-project
       |- .git
       |- .gitmodules
       |- pico-sdk
       |- CMakeLists.txt
       |- blink.c
    
  6. ビルド
    さて、バイナリをビルドしていこう。cmakeのビルド方法には少し癖があるが、すぐになれるだろう。

    mkdir build
    cd build
    cmake .. -G "MinGW Makefiles"
    mingw32-make
    

    下から2番目のコマンドは、-G "MinGW Makefiles"の部分が重要だ。これがなければ多分Visual Studio Tool Kitを使おうとする(私の環境だけなのか?)
    うまくいけば、CMakeのきれいなmake画面を拝めるはずだ(私は普通にMakefileを作るときに見られる汚いログはあまり好きではないのである)。

    この中にある、pico_test_with_win.uf2をRasPi Picoに書き込んで、無事Lチカしていれば、環境の構築は成功していることになる。

おわりに

今回、あまりにWindowsでC/C++開発をする話が見つけられなかったので、手探りで方法を編み出した。Twitterなんかを見ると、WSL上で実行している人もいて、あぁなるほどなぁと思ったものだ。私もWSL信者ながら、WSLを使うという手段は普通に思いつかなかった。ただ、WSLだといろいろ制約があるのは事実で、Windows上で完結すると便利だろうなぁと思い、この記事を書いた。皆さんの参考になれば幸いだ。

追記

もっと詳しく、ちゃんと解説してる人がいた。デバッグ関連も詳しく記載されているのでこっち読むほうが幸せになれると思う。