Last Update 2023/04/04

開発環境/PIO/USB/OS/人工知能/Wi-Fi/オーディオ/MicroPython/C/C++
ラズベリー・パイPico/Pico W攻略本

Interface編集部 編
B5判 320ページ
定価3,080円(税込)
JAN9784789844772
2023年4月1日発行
好評発売中!
ラズベリー・パイPico/Pico W攻略本
Interface2021年8月号「ラズパイのマイコンPico攻略本」を中心に関連記事を集め,加筆修正したものです.
 ラズベリー・パイPicoは,ネット通販や秋葉原で気軽に買ってきて,PCがあれば気軽に始められるマイコンです.これでも32ビット・マイコンで動作速度は100MHz超,20年前なら高級マイコンです.さらに単に動作速度が速いだけではなく,正確なタイミングで信号制御ができるI/Oコントローラやリアルタイムでの信号補間処理に特化したハードウェアも内蔵し,現代の最新マイコンに比べても一歩進んだ応用が可能なポテンシャルを持っています.
 せっかくすごい道具が手に入ったのですから,使わない手はありません.まずはPCにつないで動かしてみましょう.高価な専用の機材は必要ありません.最初は定番のLチカから始めても良いですし,本書を見て興味が湧いた本気の製作例を真似てみるところから始めることも,マイコン学習の早道です.
 最新の話題として外せないのが,PicoにWi-Fi機能を追加したラズベリー・パイPico Wがリリースされたことです.Pico Wがインターネットに繋がれば,便利なクラウド・サービスと連動した大規模なシステムへの応用も可能となります.本書では国内販売を先取りして,Pico Wの詳細な仕様から実際の製作例までを幅広く紹介しています.

本書は月刊『Interface』2021年8月号に掲載した記事を中心に加筆・再編集したものです.

目次

はじめに

51×21mmの小さなボディにデュアル・コアCPUと高機能I/Oコントローラを凝縮
第1章 これがラズベリー・パイPicoだ

カメラやLCDを搭載するAI向け高機能タイプも
第2章 RP2040搭載ボード&Pico用拡張ボード図鑑
RP2040搭載マイコン・ボード
ラズベリー・パイPico対応拡張ボード

1200円で買える無線マイコン・ボード!CとMicroPythonでLチカ&HTTPクライアントを試す
第3章 PicoのWi-Fi版「Pico W」
ボード構成
ハードウェア仕様
C/C++SDK
MicroPython

搭載マイコン・チップRP2040は単体でも販売されるから製品開発にも使える
Appendix1 今マイコンを始めるならコレ!Picoがお勧めな理由

ラズベリー・パイやPCのI/Oボードとして活躍しそう!そうなれば強力なIoT端末が作れそう
Appendix2 Picoマイコンの立ち位置

教育/試作/業務まで幅広く使える
Appendix3 公式の開発言語はC/C++とマイコン用Python
標準的な開発環境が公式から提供されている
MicroPython実行環境としてのラズベリー・パイPicoの特徴
初心者はCircuitPythonという選択肢もある

第1部 開発のための基礎知識

開発環境の構築方法からPico C/C++SDK付属サンプル・プログラムの試し方まで
第1章 開発環境1…ラズベリー・パイ4を使った公式推薦のプログラミング
公式ウェブ・サイトから情報入手
開発環境の構築
任意…PCからラズベリー・パイ4Bの遠隔利用
サンプル・プログラム1…定番「Lチカ」
サンプル・プログラム2…UART通信
サンプル・プログラム3…A-D変換
サンプル・プログラム4…温度/湿度/気圧センサ
サンプル・プログラム5…時計機能RTC
サンプル・プログラム6…小型液晶ディスプレイ

ラズパイ4向けの公式C/C++ SDKをWindowsやLinuxで使う
第2章 開発環境2…PCだけでPicoをプログラミング
PCだけでPicoの開発ができる
環境構築
サンプルを動かしてみる
新規プロジェクトの作成
PC同様にデバッガも使える
デバッグ環境の構築
Picoprobeでデバッグしてみる
統合開発環境を使ってGUIでデバッグ操作する

VS Codeからリモート接続!メインPC環境に手を入れずに公式SDKが使える
第3章 開発環境3…PCからラズパイ経由でPicoをプログラミング
きっかけ…ラズパイ上の公式SDKをPCから快適に操作したい
セットアップの手順

Arduino IDEで開発したスケッチをステップ実行!ブレーク・ポイント設定や変数などの情報を見える化
第4章 汎用デバッガ×VS Codeで構築するデバッグ環境
ステップ1:Arduino IDEにPicoの開発環境を追加する
ステップ2:汎用デバッガJ-LinkとPicoの通信を試す
ステップ3:J-Link×VS Codeでスケッチをデバッグする

新たな後継マイコンが登場してもアプリ側で対応しやすい
第5章 公式C/C++ SDKの構造とRP2040ハード機能の使い方
SDKの階層構造
ボードの定義
RP2040のハードウェア機能を使うには

流入/流出電流値や内部プルアップ/プルダウン抵抗値など
第6章 実験でチェック! I/O端子の実力
GPIOを動かす前に知っておきたい基礎知識
実験(1) GPIO端子はどれくらいの電流を流せるのか
実験(2) GPIO端子はどれくらいの電圧を出せるのか
実験(3) GPIO端子にはどれくらいの電圧を加えられるか
実験(4) プルアップ/プルダウン抵抗の効果

多数ある拡張ボードを利用してサクッと試作
第7章 Arduino互換ボード利用のススメ
Arduino Uno系の基板のピン配置
Arduinoシールドのピン配置
Picoの互換基板のデザイン
Arduino IDEによる動作確認

新定番になりうるのか?スペックの違いから特徴が生きる用途を考える
Appendix1 700円マイコンESP32とPicoを比べてみた
Picoの特徴
こんな用途に

第2部 変幻自在プログラマブルI/O

ハードウェア詳細とC/C++ SDKによる開発
第1章 使い方完全マニュアル
PIOのハードウェア
プログラムには専用のアセンブリ言語を使う
PIOアセンブリ命令
実装例1:UARTを実装してみる
実装例2:PIO版ウォッチドッグ・タイマを実装してみる

正確なタイミングの高速I/Oを作れる
第2章 プログラマブルI/Oの機能と簡易ライブラリ
プログラマブルI/O機能のメリット
C言語による開発環境の構築
まずはLチカで動作確認
I/Oピンを経由した信号出力
Armプロセッサとの接続や信号入力
異なるプログラムの並列実行

GPIOにはできない速度!リアルタイムがうれしい
第3章 簡易ライブラリで複数のRCサーボや測距センサを動かす
作例1:SPI入出力の処理
作例2:PCからのRCサーボモータ制御
作例3:PCへの距離センサ測定値伝送
作例4:PCのパラレルI/Oポート

PIOアセンブリ・コードが手軽に作れる
第4章 実機がなくてもデバッグできる簡易PIOエミュレータ
開発のきっかけ
エミュレーションの行い方
PIOアセンブリ・コードの書き方
実機での動かし方
複数のステート・マシンを使うアプリの作成方法

第3部 ホストにもデバイスにもなれるUSB機能

USBホスト&デバイスのサンプル・プログラムを動かす
第1章 USB周りのハードウェア概要とライブラリTinyUSBの使い方
各機能ブロックの役割
PicoはオープンソースのUSBライブラリを使う
ホスト側サンプル・プログラムを動かす
デバイス側サンプル・プログラムを動かす

PCからはHIDデバイス&マス・ストレージとして見える
第2章 USBキーボードをCircuitPythonでサッと作る
USBキーボードの構成
PicoでCircuitPythonを使う手順
押されたキーを判別する仕組み

第4部 リアルタイムOSを載せる

アマゾンのバックアップで機能が充実!複数の処理もマルチタスクでシンプルに書ける
第1章 FreeRTOSを載せる方法
開発環境
製作…電光掲示板を例にマルチタスク・プログラミング

安定性や対応マイコンの多さなどから試作に使いやすい
第2章 ITRON仕様OS TOPPERS/ASPの載せ方
TOPPERS/ASPのPico対応
ビルドの前に
TOPPERS/ASPのビルド
動作実験

第5部 人工知能を載せる

開発環境のセットアップからマイコン向けサンプルの試し方まで
第1章 フレームワークTensorFlowの準備
Pico用のTensorFlowリポジトリがある
ビルド環境として利用するラズパイ4のセットアップ
hello_worldで動作確認
hello_world以外のサンプルを試す際にはセンサの実装が必要

加速度センサの値からスクワットやダンベル動作を推論する
第2章 オリジナルの学習済みモデルを動かす
ハードウェア
マイコン向けのAIサンプル・アプリケーションを入手する
データ収集のための変更点
データ収集
学習済みモデルを作る
推論環境を作る
推論を実行する

第6部 限界突破!開発事例

ちょっとしたデバイスをサッと動かすのにPicoは便利
第1章 受信モジュールを利用したFMラジオの製作
ハードウェア
ソフトウェア
Picoラジオを組み立てる
コラム Picoとラジオ・モジュール間の消費電流を下げるヒント

固定小数点演算/フィルタ/オシレータの工夫で
第2章 リアルタイム処理のために軽量化!シンセサイザの製作
ハードウェアの構成
開発環境
シンセサイザ3つの主要部品
プログラム(1) 浮動小数点演算で信号処理
プログラム(2) 固定小数点演算で信号処理
プログラム(3) 軽量化のための工夫(1) オシレータを軽量化1
プログラム(4) 軽量化のための工夫(2) オシレータを軽量化2
プログラム(6) 軽量化のための工夫(4) フィルタを軽量化2
プログラム(7) さらなる軽量化のための工夫(5) フィルタを軽量化3
プログラム(8) 軽量化のための工夫(6) フィルタを軽量化4
プログラム(9) 軽量化のための工夫(7) アンプを軽量化
軽量化のまとめ
プログラム(10) USB通信に対応
コラム シンセサイザの制御

前章に改良を加える
第3章 音の時間変化に対応したシンセサイザ作り
開発環境
プログラム1:オシレータ/フィルタ/アンプをモジュレーションに対応させる
プログラム2:LFOの実装
プログラム3:EGの実装
プログラム4:制御処理を軽量化1
プログラム5:制御処理を軽量化2
プログラム6:USB通信に対応させる

リアルタイムOS TOPPERS/ASPを利用する
第4章 128×128ドット・マトリクスLEDによる掲示板
PIOを使ってマトリクスLEDに出力するサンプルhub75
製作する電光掲示板
ハードウェア
ソフトウェア
ビルド環境の構築

第7部 Windowsでマイコン直たたき!RP2040の本質に迫る

C/C++でHello world!&Lチカ
第1章 自前のプログラムをビルドする
サンプル・プログラムをビルドする
自前のプログラムをビルドする

WindowsのPowerShell内でmake一発でプログラムをビルドしたい
第2章 公式SDKを使わずにLチカとUART通信
公式SDKを使いたくない
ブート・シーケンスのおさらい
スタートアップ・ファイルを作る
メイン・プログラムを作る
実行形式のバイナリ・ファイルを生成
UARTを使う
コラム SIO以外のレジスタもビット単位に書き込めないのか?

マルチコア・プログラムを公式SDKを使わずにアセンブラから書き下ろす
第3章 LチカとHello World!を2コアで並列動作させてみた
公式SDKを利用しないプログラム作り
2つのコアを動かす
コラム 盲腸のようなコードは何のため?

PIO専用アセンブラを使ってPWMパルス生成とUART通信
第4章 噂のプログラマブルI/Oはこう使う
ステート・マシンの命令
2つのステート・マシンを同時に動作させる
PCとUART通信する
サイドセットを使ってみる

第8部 Picoのプロトタイプに! MicroPython

MicroPythonと相性抜群のThonnyで始める
第1章 開発環境を構築する
実行環境をPicoに書き込む
開発環境Thonnyを導入する
Thonnyが便利なポイント
サッと動かす…Importして数行書くだけ

シリアル通信/PWM/ウォッチドッグ・タイマなど
第2章 GPIO活用リファレンス
Picoのペリフェラルの使い方
Pin:GPIOにアクセスする
ADC:アナログ値を読み取る
UART:シリアル通信その1
I2C:シリアル通信その2
SPI:シリアル通信その3
PWM:パルス幅変調信号を出力
WDT:ハングアップを監視
Timer:タイマを利用
Signal:正論理/負論理を意識したI/O制御

浮動小数点演算とマルチスレッドの実行時間を他のマイコン・ボードと比較
第3章 MicroPython×Picoの実力検証
PicoのMicroPythonの実力を検証
コラム 小さい数値の内部表現

ライブラリ一覧とプログラム開発のポイント
第4章 PIOプログラミング[導入編]
MicroPythonにはPIO用のライブラリも用意されている
命令を効率よく実行する仕組み
移植性を高めるためにGPIOの割り当てを抽象化
MicroPythonからPIOでLチカしてみる
コード・サイズを削減する工夫
コラム1 正確なディレイ・サイクルの作り方
コラム2 PIO向け関数のコンパイル処理

定番Lチカからスイッチ入力,ロータリ・エンコーダ用ドライバまで
第5章 PIOプログラミング[事例集]
プログラム(1) NOP命令だけを実行する
プログラム(2) LED点滅
プログラム(3) MicroPythonからLED点灯を制御
プログラム(4) スイッチON/OFF状態をPIOから取得する
プログラム(5) IRQを利用しステート・マシン間で処理を同期化する
プログラム(6) ロータリー・エンコーダ用ドライバの作成

ESP32向けに書いたMicroPythonプログラムをPico向けにCircuitPythonで書いてみた
第6章 CircuitPythonの特徴と互換性
2つの言語の使いやすさ
入手可能なバージョン
プログラミングの観点で2つの言語の相違点,ソースコードの相互利用について
ESP32版MicroPythonで作成したサンプルからの移植

第9部 C++を利用してPico用のMyicroPython拡張モジュールを作る

STM32向けを流用して,ラズベリー・パイPicoとRZマイコンで試す
第1章 開発の準備…環境構築とビルド&拡張の手順
MicroPythonの内部アーキテクチャ
MicroPythonの開発ツール
GitHubリポジトリのフォルダ構成
ソースコードのビルド
拡張モジュールを作るには
OpenOCDによるデバッグ

Arduino用C++ライブラリを改造してPico用MicroPythonの拡張モジュールに作り替える
第2章 拡張事例1…8×8マトリクスRGB LED
拡張機能の実装
実際に表示させる

(1)フォント描画,(2)SPI通信,(3)ファイル・システム
第3章 拡張事例2…SPI接続のLCD
拡張機能の実装
LCDへの画像ファイルの転送

ESP8266を利用しクラウドAWSにMQTTでトピックをパブリッシュするまで
第4章 Wi-Fiネットワークの追加
MicroPythonのネットワーク・アーキテクチャ
Wi-Fiネットワーク・ドライバの実装
クラウドへのアクセス

LCDやカメラの拡張モジュールを作る
第5章 おまけ…ルネサス・マイコンでの事例
GR-MANGOボードの仕様
GR-MANGO向けのMicroPythonを作るには
マイコン・レジスタにアクセスするモジュールを作る
MicroPythonでRZマイコンの汎用入出力ポートを操作する
LCDおよびカメラ関連の周辺機能を用意する
Pico向けに作ったLCD拡張クラスとDISPLAY拡張クラスの実装
CAMERA拡張クラスの実装
コラム MicroPythonのプログラムの学び方

第10部 Pico W活用事例

せっかくだからPico Wを簡単なウェブ・サーバにしてみた
第1章 公式サンプルの活用法
Picoからのハードウェアの変更点
Picoからのソフトウェアの変更点
サンプル・プログラムのコンパイル
サンプル・プログラムを動かす
main.pyの自動起動方法

Pico Wファームウェア書き込み/Wi-Fiルータ接続プログラムの入手/HTTP通信
第2章 Wi-Fiのアクセス・ポイントに接続して通信する

Eclipse Mosquitto/MQTT Explorer/Grafanaの導入
第3章 Pico Wで得たセンサ・データをWi-Fi経由で取得する
ブローカ/クライアント・ツールのインストール
設定後にできるようになること
データの可視化には「Grafana」を使う

デバイス証明書/キーファイル/署名ファイルを整える
第4章 AWS IoTへ接続しMQTTメッセージを送信する

プログラムをネットワーク経由で編集/実行できる
第5章 MicroPythonのWebrepl機能を使うための設定と実行方法

pico sdk関連のライブラリやpico_wフォルダ中にあるサンプルの紹介
第6章 Pico W用のサンプル・プログラムをビルドする

Pico Wを使う際には技適特例申請が必要です(2023年1月時点)