注目キーワード

【Arduino】Raspberry Pi Pico/W のPIOでUART送信するぞ!(PIO : UART送信)

すけろく
Raspberry Pi Pico/WのPIO機能については前回調べた。
今度は実際に使ってみたいの~
げんろく
そうだな。
実際にプログラムする際の注意事項などを見ていこう。
すけろく
Arduino IDEでも使用できるのか?
げんろく
ああ。
使えるぞ!
Arduino IDEで使う場合を例にやっていこう。

この記事では、「Raspberry Pi  Pico/W」に実装されている「PIO(Programmable I/O」を使って、実際に使ってみます。

まずは第一弾として、「UART送信」機能を「PIO(Programmable I/O」を使って実装します。

microPythonやC言語でのプログラム例はあるものの、Arduino IDEを使った例はあまりないので、ぜひチェックしてくださいね!

Raspberry Pi の中でも、省電力なCPUを搭載したマイコン開発ボードです。

他のRaspberry Pi 製品とは異なり、Linux OSを搭載していません。

しかし省スペース、省電力の専用CPU「RP2040」を搭載していて、Arduino IDEや、MicroPythonで開発可能です。

しかも、Wi-FiとBluetoothが使用できるモジュールも搭載されているので、スタンドアロンでの稼働のみならず、他のマイコンと無線通信することが可能です。

 

今回の目標
PIO(Programmable I/O」を使ってUART送信機能を「Raspberry Pi  Pico/W」のGPIOに対して実装します。
開発環境としては、Arduino IDEを使います。

Raspberry Pi  Pico/W」の特徴でもある「PIO(Programmable I/O」について身に着けるために、

UARTのような基本的な機能を実装することで理解を深めていくことが大切です。

ぜひ、皆さんも挑戦してみてくださいね!

この記事の前提となる「Raspberry Pi  Pico W」のはじめかたは、次の記事で紹介しています。

関連記事

すけろく ついに、国内でもRaspberry Pi Pico Wを手に入れたぞ! げんろく Wi-Fiモジュールがついているので、 国内の技適取得が必要だったからな。 すけろ[…]

あわせて読みたい!「Raspberry Pi  Pico W」関連の便利記事

関連記事

すけろく ん~。 このエラーの時の変数の値が知りたいな~ げんろく どうした? プログラムがうまく動かないのか? すけろく そうなのだ。 Raspberry Pi Pico[…]

今回の記事の対象となるマイコンはこちら!

Raspberry Pi Pico

created by Rinker
Raspberry Pi
¥1,350 (2024/07/18 04:58:46時点 Amazon調べ-詳細)

Raspberry Pi Pico W

ピンヘッダ実装済み

created by Rinker
ノーブランド品
¥2,290 (2024/07/18 10:07:00時点 Amazon調べ-詳細)

ピンヘッダを自分ではんだ付けするもの

created by Rinker
Raspberrypi
¥1,630 (2024/07/18 01:15:04時点 Amazon調べ-詳細)

 

PIO(Programmable I/O)とは?

PIOとは Prgrammable I / O (Input / Output)の略で、端子の部分とマイコン中核部の仲介役をプログラマブルに行うことができるものです。

詳しい説明については、次の記事で紹介していますので、あわせて確認してくださいね!

関連記事

すけろく Raspberry Pi Pico/Wには、PIOという機能があるらしいな。 げんろく そうだ。 UARTなどのインタフェース不足や、実装されていない機能を GPIOに対してプログラムでき[…]

 

PIOをArduino IDE で使う際の準備

PIOは、Raspberry Pi Pico SDKに含まれるpioasmを使ってC言語やPython用のプログラムをジェネレート(生成)します。

Arduino IDEも実際にはC言語での使い方に近い手順を取ります。

Raspberry Pi Pico SDKにあるpioasmは、ソースファイルのみ提供されています。

使うためにはコンパイルして実行形式ファイルに変換しなければなりません。

 

Arduino IDEで使う場合も同じように、コンパイルが必要かな~と思いながら調査。

次のボードマネージャをインストールすることで実行形式ファイルを含むpioasmを取得することができることが判明しました。

ボードマネージャのインストール

次のボードマネージャをArduino IDEへインストールしてください。

 

ボードマネージャ名(バージョン名) 参照URL
Raspberry Pi Pico /RP2040(3.7.2) https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

 

ボードマネージャのインストール手順はこちら!

関連記事

今回は、「Arduino IDE 2.0」の「ボードマネージャ」と書き込み先のボードの指定について記載します。 Arduino IDEは、Arduinoに対応した各種ボード(Arduino uno、M5Stack、M5Stic[…]

 

pioasmの保存先を確認する

前述のボードマネージャをインストールすると、次の場所にpioasmが保存されます。

(Windows11の場合)

保存先 説明
C:\Users\”ユーザ名”\AppData\Local\Arduino15\packages\rp2040\tools\pqt-pioasm\2.2.0-d04e724 ”ユーザ名”にはArduino IDEをインストールしたユーザを入れてください。

 

上記の保存先を見てみると、次のようなものが保存されています。

※赤線で囲ったpioasm.exeが実行形式ファイルになります。

実行形式ファイルが見つかれば、OKです。

 

 

pioasmの使用方法

pioasmの実行形式ファイルをコマンドプロンプトでPIOソースファイル「.pio」を指定して実行することでヘッダーファイルがジェネレートされます。

手順は次の通りです。


コマンドプロンプトを起動します。

コマンドプロンプト内で「cd」コマンドを使って
pioasmの保存先フォルダへ移動します。

先のコマンドを入力して実行します。
(入力例)
コマンド:pioasm
ソースファイル:pio_src.pio
ヘッダーファイル:pio_src.h

pioasmの保存先フォルダにヘッダーファイルが生成されます。

以上で、pioasmのヘッダーファイル生成する手順は完了です。

 

 

UARTとは?

UART(Universal Asynchronous Receiver/Transmitter:汎用非同期 受信/送信)は、Raspberry Pi Pico / W」とパソコン間など、異なるシステム間の通信で用いられます。

UARTは、「シリアル通信」で「非同期式」です。

 

リアル通信

複数ビットの情報を、時系列として1ビットずつ送信します。

パラレル通信の環境よりも伝送経路数が少ないという利点があります。

1ビットずつ送信する特性から、通信速度は遅いというデメリットもあります。

例えば、Arduino IDE(パソコン)とRaspberry Pi Pico / W」 をUSBで接続しシリアルモニタを使う場合にUARTが使用されます。

 

非同期式

データを同期する基準となる同期信号を必要としない方式です。

通信開始の合図となる「スタート・ビット」で同期を開始し、1ビットの情報を推定時間幅で出力し、規定のビット数を送信します。

通信の最後は「ストップ・ビット」を送信することで、通信を終了します。

同期式に比べ伝送経路数が少なくなりますが、送信側と受信側の時刻精度がずれている場合、ビットを認識するタイミングがずれてしまい通信エラーとなります。

 

UARTで使う伝送経路

UART通信は、送信と受信の1対1通信です。

UART通信で使用する伝送経路は次の通りです。

経路(端子)名 用途・説明
TX 送信に使用します。UARTの基本構成に含まれます。
RX 受信に使用します。UARTの基本構成に含まれます。
CTS オプション機能です。CTS(Clear to Send)は送信(TX)と一緒に使われます。
CTSが「High」状態であれば、送信側は送信を一時停止します。
RTS オプション機能です。RTS(Request to Send)は送信(RX)と一緒に使われます。
受信側は、データの受信処理を処理しきれない場合に、RTSを「High」状態にして送信の一時停止を要求します。

UARTの接続イメージ

先述した伝送経路の接続イメージは次のとおりです。

2つのマイコン上でデータを送受信する場合は、送信(TX)と受信(RX)をそれぞれのマイコンで準備し接続します。

フロー制御ありの場合、受信側のデータ処理状況に応じてRTSを「High」状態にします。

送信側はCTSの状態を見て送信を継続するかを確認します。

 

UARTのプロトコル

UART通信の信号波形イメージは次のとおりです。

 

UART信号は、デジタル信号で表現されます。

符号「0」は”Low”、符号「1」は”High”で表現されます。

1ビットを表現する送信の時間幅が決められていて、一定時間ごとに1ビットずつ送信されます。

複数ビットからなるデータは、LSB(最下位ビット)から送信され、MSB(最上位ビット)まで逆に送信されます。

無信号区間は、”High”状態で出力されます。

 

 

UART通信のパラメータ

UART通信のパラメータとしては、次のものがあります。

  • ボー・レート(Baud Rate)
  • データ・ビット長
  • パリティ
  • ストップ・ビット長
  • フロー制御フラグ

 

ボー・レート(Baud Rate)

1ビットを表現する時間幅の決定に使用するパラメータです。

単位は「bps」です。

ボー・レートを「115200bps」とすると、1ビット当たりの時間幅は、約8µs(マイクロ秒)です。

Arduino IDEでシリアルモニタを使う際も、このボー・レートを指定します。

そしてRaspberry Pi Pico / W」などのマイコンにも同じボー・レートでプログラムします。

このように、Arduino IDE(パソコン側)とRaspberry Pi Pico / W」(パソコン側)の双方が

同じボー・レートで合意することで通信が確立できます。

 

データ・ビット長

1回の通信で送られるデータのビット長です。

5~8ビットに対応していますが、通常は8ビットがビット長になります。

 

パリティ

データの誤り検出に付加される、1ビットの情報です。

パリティの種類には、次の5つがあります。

  • none(パリティなし)
    パリティ・ビットがない状態です。
  • odd(奇数パリティ)
    データ・ビットとパリティ・ビットの符号「1」の数が奇数になるように
    パリティ・ビットを「0」か「1」にします。
  • even(偶数パリティ)
    データ・ビットとパリティ・ビットの符号「1」の数が偶数になるように
    パリティ・ビットを「0」か「1」にします。
  • mark
    パリティ・ビットを「1」に固定します。
  • space
    パリティ・ビットを「0」に固定します。

 

ストップ・ビット長

データの送信完了を表すために使用するストップ・ビットの長さです。

通常は1ビットです。

 

フロー制御フラグ

先述したCTS、RTSの伝送経路を追加したフロー制御を行うか、どうかを指定します。

 

 

UARTでのビット通信順序

UARTでデータを送信する際には、次の順番に送られます。

  1. スタート・ビットを送信(”Low”状態)
  2. データ・ビットを送信
  3. パリティ・ビットを送信
  4. ストップ・ビットを送信(”High”状態)

 

スタート・ビットを送信

スタート・ビットは、デジタル信号の符号「0」(”Low”)で表します。

スタート・ビットの長さは1ビットです。

 

データ・ビットを送信

データ・ビットをLSBから順に1ビットずつ送信します。

 

パリティ・ビットを送信

パリティを使用する場合は、データ・ビットに続いてパリティ・ビットを送信します。

送信する信号は、使用するパリティの種類により異なります。

 

ストップ・ビットを送信

ストップ・ビット長で設定した間隔だけ「1」(”High”)状態にします。

 

 

UART送信プログラムの作成

今回は、UARTを使って送信するプログラムを作成します。

UART通信のパラメータは次のものを使います。

パラメータ名 設定値
ボー・レート 115200
データ・ビット長 8ビット
パリティ even(偶数パリティ)
ストップビット長 1ビット
フロー制御 なし

 

送信のみの実装を行います。

送信するGPIOは、本来Raspberry Pi Pico / W」ではUART機能が実装されていないGPIO2を使います。

送信するデータは、「pico」にします。

データはASCIIコードで処理します。

 

PIOファイルを作成する

ノートパッドなどのテキストエディタを開いて、次のプログラムをコピーし、貼り付けます。

ソース内部にコメントを入れていますので、参考にしてください。

 

ファイルの拡張子を「.pio」にして保存します。

アセンブリ部分の記述方法については、次の記事を参照してください。

関連記事

すけろく Raspberry Pi Pico/Wには、PIOという機能があるらしいな。 げんろく そうだ。 UARTなどのインタフェース不足や、実装されていない機能を GPIOに対してプログラムでき[…]

 

ヘッダーファイルの生成

pioasmの使用方法で記載した手順を使って、ヘッダーファイルを生成します。

pioasmが保存されているフォルダに先ほど作成したPIOソースファイル(.pio)をコピーして行ってください。

 

生成されたヘッダーファイルは次のようになります。

 

Arduino IDEへのヘッダーファイルの取り込み

生成されたヘッダーファイルをArduino IDEに取り込みます。

そのためにArduino IDE上で新規のスケッチを作成します。

スケッチに次のようにコードを記載し、保存します。

 Arduino IDE スケッチ例

 

生成したヘッダーファイルを次の手順で、作成したスケッチに取り込みます。

  1. Arduino IDEのメニューから[スケッチ]-[ファイルを追加]を選択します。
  2. スケッチが保存されたフォルダが開くので、生成したヘッダーファイルをコピーして選択します。
  3. 追加する旨の確認メッセージが表示された場合は承認してください。
  4. 最後にスケッチの3つ目の「#include “uart_tx_test.h”」の部分を保存したヘッダーファイル名に変更します。

 

以上で、ヘッダーファイルの取り込みは完了です。

Raspberry Pi Pico Wへの書き込み 

  1.  Raspberry Pi PicoをパソコンにUSB接続します。
  2.  Arduino IDEで前述のプログラムを記載して、 「ファイル」メニューから「名前を付けて保存」で任意の名前を付けて保存します。
  3. 「ツール」メニューから「ボード」情報を確認し、次のものを選択します。
    「Raspberry Pi Pico/RP2040」-「Raspberry Pi Pico W」
  4. 「シリアルポート」にマイコンを接続したCOMポートが指定されているかも確認します。
  5. 「ツール」メニューから「シリアルモニタ」を選択してシリアルモニタを起動します。(転送速度は「115200」です)
  6. 「スケッチ」メニューから「マイコンボードに書き込む」を選択します。

※Raspberry Pi Pico の場合は、③の手順から適宜変更してください。

プログラム実行結果

書き込みが完了した「Raspberry Pi Pico / W」は、UART機能を使い1秒おきに「pico」というデータを送信します。

内容を見るため、今回はロジックアナライザを使用しました。

送信機能を付けたGPIO2からの信号をロジックアナライザで解析します。

今回は、「ZeroPlus LAP-C 16128」というロジックアナライザで、プロトコルを「UART」に設定しました。

プロトコルの設定は次の通りです。

 

送信されている内容をキャプチャして解析した結果、次のように取得できました。

(水色:スタート・ビット、緑:データ・ビット、紫:パリティ・ビット、赤:ストップ・ビット)

送信データ「pico」をASCIIコードでバイナリ(2進数)化すると次のようになります。

[p] [i] [c] [o] = [0111 0000] [0110 1001] [0110 0011] [0110 1111]

ロジックアナライザの結果も同様になりました。

 

 

データ部分の表示をバイナリから、ASCIIコードに変更すると次のようになります。

分析したデータが「pico」を受信していることがわかります。

 

 

編集後記

いかがだったでしょうか。

Raspberry Pi Pico / W」の「PIO(Programmable I/O」を使って「UART送信」の機能を実装してみました。

プログラムした結果通りに信号が送信されているとうれしくなりますね。

これで、Arduino IDE を使った「PIO(Programmable I/O」のプログラミング方法が確立できました。

今後も作例を充実させていければと思います。

 

記事の内容は以上です。

最後までご覧くださり、ありがとうございました。

次回もご期待ください。

今回の記事の対象となるマイコンはこちら!

Raspberry Pi Pico

created by Rinker
Raspberry Pi
¥1,350 (2024/07/18 04:58:46時点 Amazon調べ-詳細)

Raspberry Pi Pico W

ピンヘッダ実装済み

created by Rinker
ノーブランド品
¥2,290 (2024/07/18 10:07:00時点 Amazon調べ-詳細)

ピンヘッダを自分ではんだ付けするもの

created by Rinker
Raspberrypi
¥1,630 (2024/07/18 01:15:04時点 Amazon調べ-詳細)

 

Raspberry Pi Pico Wの他の記事はこちらからどうぞ!

すけろく ウーム。 センサーなどの情報を記録したいな。 げんろく なに。Raspberry Pi Picoで記録媒体を 使いたいのか。 すけろく そうだ。 センサーやカメラのデータを保存したいのだ。 げんろく データの保管には、microSDカードが 使いやすいそ。使ってみるか! この記事では、「Raspberry Pi  Pico/W」に「microSDカードスロット」を接続して読み書きしてみま […]

すけろく うーむ。 げんろく どうした?浮かない顔をして。 すけろく LEDを火のように光らせる方法を知りたくてな。 げんろく それなら、1/fの揺らぎを使って 再現してみるか。 この記事では、「Raspberry Pi  Pico W」を使って、「LEDを揺らぎを加えて点灯させる」方法をご紹介します。 Raspberry Pi の中でも、省電力なCPUを搭載したマイコン開発ボードです。 他のRa […]

すけろく うーむ。 どうしたものか。 げんろく どうした。 暗い顔をして。 すけろく カーモデルのウィンカー点滅を再現したくてな。 明滅回路を作ろうか悩んでおる。 げんろく ん!? そんなときは、メインプロセッサと切り離して 動作するPIOの出番ではないのか! この記事では、「Raspberry Pi  Pico/W」に実装されている「PIO(Programmable I/O」を実際に使ってみます […]

すけろく Raspberry Pi Pico/WのPIO機能を使ってUARTの送信には成功した。 しかし、まだ受信側ができていないのぉ。 げんろく そうだな。 今度は受信側を試してみるか。 すけろく どうせなら、パソコンから送った文字を返すような やり取りができるといいな。 げんろく よし。 UART送受信を実装してみよう。 この記事では、「Raspberry Pi  Pico/W」に実装されてい […]

すけろく Raspberry Pi Pico/WのPIO機能については前回調べた。 今度は実際に使ってみたいの~ げんろく そうだな。 実際にプログラムする際の注意事項などを見ていこう。 すけろく Arduino IDEでも使用できるのか? げんろく ああ。 使えるぞ! Arduino IDEで使う場合を例にやっていこう。 この記事では、「Raspberry Pi  Pico/W」に実装されている […]

すけろく Raspberry Pi Pico/Wには、PIOという機能があるらしいな。 げんろく そうだ。 UARTなどのインタフェース不足や、実装されていない機能を GPIOに対してプログラムできる機能だ。 すけろく Raspberry Pi Pico/Wをもっと知るために PIOを調べてみたい。 げんろく よし! PIOについて少し調べてみるか! この記事では、「Raspberry Pi  P […]

すけろく うーむ。 げんろく どうした浮かない顔して。 すけろく これまで、Raspberry Pi Pico / Wをいろいろ確認してきたが 外付けのボタンの認識ってやったかぇ? げんろく たしかに!まだ取り上げていない基本的なものがあるな よし、今回はボタン押下時の状態を Raspberry Pi Pico / Wで認識してみよう。 この記事では、「Raspberry Pi  Pico W」を […]

すけろく 宅内で使っているリモコンは、どういった仕組みで テレビなどをつけているのかな~? げんろく 赤外線を使って信号を送っているのだ。 すけろく しかし、たくさんある機器のリモコンが混信しないのは どういった仕組みなのかぇ? げんろく よし、今回は赤外線リモコンの通信を 調査してみるか! この記事では、「Raspberry Pi  Pico W」を使って、「赤外線リモコンの通信内容を分析する」 […]

すけろく うーむ。 対応付けが難しいな。 げんろく どうした? Raspberry Pi Picoで悩んでいるようだな。 すけろく Raspberry Pi PicoやPico Wの GPIOピンの情報がボード上にプリント されていないから資料との対応付けがやりづらくてな。 げんろく そうか。そういう課題があるのだな。 よし、解決するグッツを作って提供してみよう! 皆さんは、「Raspberry […]

すけろく うーむ。 モーターを毎回同じくらい回転させることはできんのかな。 げんろく DCモーターや、サーボモーターだと、 回転量を正確に制御することは難しいぞ。 すけろく では、何か解決策はあるのかぇ? げんろく ステッピングモーターというものがある。 モーターの回転をステップとして制御できる。 今回はこのあたりを動かしてみるか。 この記事では、「Raspberry Pi  Pico W」を使っ […]