C言語によるRaspberry Pi Picoマルチコアマイコンボード入門

著者 Jacob Beningo

DigiKeyの北米担当編集者の提供

組込みシステムでは、強力で低価格なマイクロコントローラユニット(MCU)を搭載することが本質的に求められています。これらのデバイスは、製品だけでなく、テストやラピッドプロトタイピング、機械学習(ML)などの機能をサポートする上でも重要な役割を担っています。しかし、一般的にMCUを使い始めるには、MCUの技術や低レベルのプログラミング言語について深く理解する必要があります。その上、開発ボードは20ドルから1000ドルすることが多く、多くの開発者にとっては高すぎることもあります。また、開発ボードが用意されているとは限らず、用意されていても、設計者がボードの立ち上げに苦労することも少なくありません。

本記事では、開発者に幅広い機能を提供するRP2040 MCUの低価格開発ボードとして、Raspberry Pi Pico(SC0915)を紹介します。この記事では、Picoといくつかの拡張ボードについて説明し、Raspberry Pi Picoがサポートするさまざまなソフトウェア開発キットを検証し、C SDKを使用してLEDを点滅させるアプリケーションを作成する方法を詳しく実演します。

Raspberry Pi Picoの紹介

Raspberry Pi Picoは、RP2040マイクロコントローラの開発プラットフォームとして、2021年に登場しました。Picoは単体で開発ボードとして使用できるほか、キャリアボードにはんだ付けできるエッジ接続により、直接製品の設計に盛り込むことも可能です(図1)。Picoの5ドル以下のコストと多目的用途の間で、メーカーとプロの開発者の両方に人気のあるソリューションとなっています。

低価格な開発ボードのRaspberry Pi Picoの画像図1:Raspberry Pi Picoは、RP2040マイクロコントローラでアプリケーションを開発するために必要なものをすべて搭載した低価格な開発ボードです。(画像提供:Raspberry Pi)

RP2040は、133メガヘルツ(MHz)で動作するデュアルコアArm®Cortex®-M0+プロセッサを備え、最大264キロバイト(Kbyte)のSRAMを搭載しています。RP2040には、フラッシュメモリは搭載されていません。その代わりに、Raspberry Pi Picoは、2メガバイト(Mbyte)のフラッシュチップを外付けし、クワッドシリアルペリフェラルインターフェース(QSPI)を介してRP2040とインターフェースします。また、ユーザー用のLED、位相ロックループ(PLL)が安定した高速CPUクロックを生成するために使用する水晶発振器、プロセッサが通常起動するかブートローダーに入るかを設定するための押ボタンも搭載しています。

広範なエコシステム

Raspberry Pi Picoは、すでに広範なエコシステムを備えており、開発者はボード用のアプリケーションを書くためにMicroPythonまたはCソフトウェア開発キットのいずれかを選択することができます。Raspberry Pi Picoの面白いところは、利用できる開発ボードが1種類だけではないことです。標準的な構成のオリジナルSC0915、ヘッダーコネクタを含むSC0917、接続アプリケーション用の低価格なWi-Fiチップを含むSC0918の3種類があります(図2)。

3種類の構成が利用可能なRaspberry Pi Picoの画像図2:Raspberry Pi Picoは、3種類の構成が利用可能です。(画像提供:Beningo Embedded Group, LLC)

これらの各バージョンにおいて、ボードの一般的なフットプリントは変わりません。基板のエッジ接続は、周辺機器と図3に示す接続オプション用の40ピンエッジ接続で構成されています。電源、グランド、UART(Universal asynchronous receiver and transmitter)、GPIO(General purpose input and output )、PWM(Pulse width modulation)、ADC(Analog-to-digital converter)、SPI(Serial peripheral interconnect )、I2C(Inter-interintegrated circuit)インターフェース、デバッグなどが含まれます。

Raspberry Pi Picoのエッジコネクトピンアウトの画像(クリックして拡大)図3:Raspberry Pi Picoのエッジコネクトピンアウトは、様々な周辺機器へのアクセスを可能にします。(画像提供:Raspberry Pi)

ブレークアウトボードオプション

Raspberry Piをラピッドプロトタイピングに使用する場合、基板のエッジコネクタに簡単にアクセスできるようにする必要があります。アクセスするための1つの選択肢は、ヘッダーを装着して、ブレッドボードを使用することです。しかし、この解決策では、配線が乱雑になってしまい、エラーを引き起こすも少なくありません。その代わりに、エッジコネクタをより利用しやすいインターフェースに発展させるためのブレークアウトボードのオプションがいくつか用意されています。

例えば、BridgetekMM2040EVPicoモジュール基板では、エッジコネクタのほとんどをピンとソケット接続に分けています。さらに、各周辺インターフェースをコネクタとして提供するSeeed StudioのPico用シールド103100142があります。各コネクタは、慣性センサ、モータドライバ、レンジファインダなどの機能を追加するための拡張ボードとピン互換性があります。

C言語またはMicroPythonの選択

組み込みシステムは、低レベルの制御を高レベルのシステムアプリケーションのアプローチで釣り合わせているため、従来はC言語で書かれていました。現在のC言語の問題は、50年前の古いプログラミング言語であり、大学でもほとんど教えられていないことです。また、誤ってバグを注入し、損害を与えることがあまりにも容易です。このような潜在的な問題があるにもかかわらず、C言語は組込みシステム開発の大部分で選択されています。

Raspberry Pi Picoのエコシステムでは、C言語を使用する代わりに、MicroPythonが提供されています。MicroPythonは、MCUベースのシステムで動作するように設計されたCPythonの移植版です。C言語よりも処理系が重いのは間違いありませんが、多くの開発者が慣れ親しんでいる現代の言語です。MicroPythonは、MCUやハードウェアの低レベルの詳細を抽象化することができます。ハードウェアへのアクセスは、ハイレベルのAPI(Application Programming Interface)を通じて行うため、習得が容易です。このことは、プロジェクトの納期がタイトな場合にはとても重要な特長です。

C言語とMicroPythonのどちらのソフトウェア開発キット(SDK)を使用するかは、開発者のニーズに合わせて選択する必要があります。MicroPythonと比較して、C言語を使用することで、MCUのレジスタに低レベルでアクセスでき、メモリフットプリントが小さくなり、効率的です。

C SDKのセットアップ

C SDKを使用して点滅LEDアプリケーションを作成する場合、いくつかのオプションがあります。1つ目は、SDKのドキュメントを確認し、その指示に従うことです。2つ目は、あらかじめ用意されたDockerコンテナを使って、必要なツールを自動的にインストールすることです。3つ目のオプションは、ツールチェーンとRaspberry Pi Picoのサンプルコードを手動で以下のようにインストールすることです。

  • Git
  • Python 3
  • Cmake
  • gcc-arm-none-eabi \
  • libnewlib-arm-none-eabi

Raspberry Pi Picoのサンプルコードの入手は、以下のコマンドでRaspberry Piのgit repoをcloneすることで可能です。

git clone https://github.com/raspberrypi/pico-sdk /home/sdk/pico-sdk && \

cd /home/sdk/pico-sdk && \

git submodule update --init &&

これらのライブラリとソースコードがインストールされたら、次は点滅LEDアプリケーションの探索とコンパイルを行います。

最初の点滅アプリケーションの書き方

C SDKには、開発者が最初のアプリケーションを作成するために使用できる、点滅のサンプルが付属しています。以下のコードリストでは、PicoのオンボードLEDとPICO_DEFAULT_LED_PIN命令を使用してI/Oピンを設定し、250ミリ秒(ms)の遅延で点滅させています。

コピー
	/**
	 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
	 *
	 * SPDX-License-Identifier: BSD-3-Clause
	 */
	

	#include "pico/stdlib.h"
	

	int main() {
	#ifndef PICO_DEFAULT_LED_PIN
	#warning blink example requires a board with a regular LED
	#else
	    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
	    gpio_init(LED_PIN);
	    gpio_set_dir(LED_PIN, GPIO_OUT);
	    while (true) {
	        gpio_put(LED_PIN, 1);
	        sleep_ms(250);
	        gpio_put(LED_PIN, 0);
	        sleep_ms(250);
	    }
	#endif
	}

コードリスト:Raspberry Pi Picoでは、PICO_DEFAULT_LED_PIN命令を使用してI/Oピンを設定し、250msの遅延で点滅させます。(コード提供:Raspberry Pi )

リストでは、LED_PINにデフォルトのピンが割り当てられ、その後、Cのgpio APIが呼び出されています。gpio_initはピンの初期化に、gpio_set_dirはLED_PINを出力に設定するために使用されます。そして、250msごとにLEDの状態を切り替える無限ループが作成されます。

アプリケーションのコンパイルは比較的簡単です。まず、開発者はRaspberry Pi Picoのフォルダに以下のコマンドでビルドディレクトリを作成する必要があります:

mkdir build

cd build

次に、以下のコマンドを実行することで、cmakeがビルドの準備をします。

cmake

これで、開発者はblinkyディレクトリに移動してmakeを実行することができます。

cd blink

make

ビルドプロセスからの出力はblinky.uf2ファイルとなります。コンパイルしたプログラムは、BOOTSELピンを押しながら電源を入れることで、Raspberry Pi Picoにロードすることができます。すると、RP2がマスストレージデバイスとして表示されます。開発者はblinky.uf2ファイルをドライブにドラッグする必要があり、その時点でブートローダがアプリケーションをインストールすることになります。完了すると、LEDが点滅を始めます。

まとめ

Raspberry Pi Picoは、開発サイクルの柔軟性を求める組み込み開発者にとって魅力的なソリューションです。スタンドアローンのソリューションや、ワイヤレス接続が可能なボードなど、いくつかのオプションが用意されています。また、エコシステムはMicroPythonだけでなく、CおよびC++もサポートしています。開発者は、アプリケーションに最適な言語を選択し、対応するSDKを活用することで、ソフトウェア開発を加速させることができます。

DigiKey logo

免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。

著者について

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo氏は組み込みソフトウェアコンサルタントで、現在、製品の品質、コスト、市場投入までの時間を改善することで、ビジネスを劇的に変革するために数十か国以上のお客様と作業しています。同氏は、組み込みソフトウェア開発技術に関する200以上の記事を発表しており、引っ張りだこのスピーカーでありテクニカルトレーナです。ミシガン大学のエンジニアリングマスターを含む3つの学位を取得しています。気楽にjacob@beningo.comにメールするか、彼のウェブサイトwww.beningo.comから連絡してみてください。そして毎月のEmbedded Bytes Newsletterにサインアップしましょう。

出版者について

DigiKeyの北米担当編集者