2021/4/29
earlephilhower版専用になるがMulticoreのスケッチを追加した。
2021/4/23
もう一つの実装であるarduino純正ボード・ライブラリでの使用方法を追加した。
また、書き込みでエラーになるので、その解決方法についても記述した。
2021/4/5+
Arduno-IDEのwindows版でPicoの書き込みで
エラーになる場合の対応方法を追加した。
2021/4/4
LittleFSを使用したスケッチを追加した。
2021/4/3+
動作確認したスケッチを追加した。
2021/4/1+
初版
Pico Arduino Install
Pico Arduino Install
概要
Arduino-IDEでPicoを動かす。
ホスト環境は、ubuntu20.04とする。
なお、Arduino-IDEの最新版がインストール済みのものとする。
linuxのArduino-IDEのインストールについては以下を参照のこと。
・Install the Arduino Software (IDE) on Linux
本記事は、linux版Arduino-IDEについて記述したものであるが、
ほとんど、そのままwindows版でも適応可能である。
ボード情報(*.json)のインストール
Arduino-IDEを起動して以下を実行する:
1.[ファイル]/[環境設定]を選択する
2.画面の「追加のボードマネージャーのURL」に以下を入力(追加)する
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
# 今後、このjsonを利用したものをearlephilhower版と呼ぶことにする。
3.入力後、[OK]をクリックする
4.[ツール]/[ボード]/[ボードマネージャー]を選択する
5.検索欄に「pico」と入力する
6.検索結果から「Raspberry Pi Pico/RP2040」を選び、[インストール]をクリックする
7.インストール後、[閉じる]をクリックする
8.[ツール]/[ボード]/[Raspberry RP2040 boards]/[Raspberry Pi Pico]を選択する
以上で、ボードとして[Raspberry PiPico]が選択されたことになる。
なお、これ以外に以下のボードが選択できる:
Raspberry Pi Pico
Raspberry Pi Pico (Picoprobe)
Adafruit Feather RP2040
Adafruit Feather RP2040 (Picoprobe)
Generic PR2040
Generic PR2040 (Picoprobe)
「(Picoprobe)」付きは、書き込みにopenocd(picoprobe)を使用するものになる。
Picoprobeを使った書き込み
Picoprobeを接続した場合、Arduino-IDEでボードを「Raspberry Pi Pico (Picoprobe)」を切り替える。その後は従来どおりの操作で書き込みができる。
以下、書き込み時の出力例:
<省略>
Open On-Chip Debugger 0.10.0+dev-gd58c2ef5e-dirty (2021-03-28-18:41)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'swd'
Warn : Transport "swd" was already selected
adapter speed: 5000 kHz
Info : Hardware thread awareness created
Info : Hardware thread awareness created
Info : RP2040 Flash Bank Command
Info : clock speed 5000 kHz
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x00000001
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x10000001
Info : rp2040.core0: hardware has 4 breakpoints, 2 watchpoints
Info : rp2040.core1: hardware has 4 breakpoints, 2 watchpoints
Info : starting gdb server for rp2040.core0 on 3333
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00
** Programming Started **
Info : RP2040 B0 Flash Probe: 2097152 bytes @10000000, in 512 sectors
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00
...
<省略>
...
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00
** Programming Finished **
** Verify Started **
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00
** Verified OK **
** Resetting Target **
shutdown command invoked
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x00000001
留意点:
・シリアルを使っているスケッチは、USBシリアルを前提にしているので、そのままでは動かない。
・picoprobe接続時でもシリアルが利用可能だが、USBシリアルではなく、普通のシリアルにpicobrobe経由で接続している。(したがって、picoprobe経由でシリアルを使用する場合、スケッチの「Serial」を「Serial1」に置き換えると使用できる)
サンプルスケッチ
ボード設定が完了した後は、通常のArduinoボードとして使用できる。
リセットボタンがないので、リセットボタンを押されることを前提にしているスケッチは、無限ループにするなどの工夫が必要となる。
なお、(Picoprobeを使用していない場合は)書き込み前に書き込み用ストレージ(RPI-RP2)が見える状態にする必要がある。
# ただし、ボードのUSBシリアルが有効になっている場合、
# 自動的にリセットするのでbootselボタンを押してのUSBの抜き差しは
# 不要となる
以下、実際に動かしたスケッチを挙げる:
ASCIITablePico.ino
void setup() {
Serial.begin(115200);
while (!Serial) {
;
}
Serial.println("ASCII Table ~ Character Map");
}
int thisByte = 33;
void loop() {
Serial.write(thisByte);
Serial.print(", dec: ");
Serial.print(thisByte);
Serial.print(", hex: ");
Serial.print(thisByte, HEX);
Serial.print(", oct: ");
Serial.print(thisByte, OCT);
Serial.print(", bin: ");
Serial.println(thisByte, BIN);
if (thisByte == 126) {
thisByte = 33-1;
Serial.println("----------------------------------------------");
Serial.println("");
delay(500);
}
thisByte++;
}
・標準に提供されているスケッチを無限ループにしたもの。
・シリアルはUSBシリアルを使用する。
Blink.ino
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
・標準に提供されているスケッチが無修正で動作する。
bootselBlink.ino
bootselボタンをLED点滅のボタンに使用したスケッチ(トグル動作)
int toggle = false;
void setup() {
Serial.begin(115200);
delay(5000);
pinMode(LED_BUILTIN, OUTPUT);
}
int c = 0;
void loop() {
if (toggle) digitalWrite(LED_BUILTIN, HIGH); else digitalWrite(LED_BUILTIN, LOW);
if (BOOTSEL) {
Serial.printf("You pressed BOOTSEL %d times!\n", ++c);
toggle = !toggle;
while (BOOTSEL) { delay(1); }
}
}
temperature.ino
CPUのコア温度を測ってシリアルに出力するスケッチ
void setup() {
Serial.begin(115200);
delay(5000);
}
void loop() {
Serial.printf("Core temperature: %2.1fC\n", analogReadTemp());
delay(1000);
}
・このスケッチはearlephilhower版専用となる。
fade.ino
int led = LED_BUILTIN;
int brightness = 0;
int fadeAmount = 5;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
analogWrite(led, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
delay(15);
}
morse_blinky.ino
シリアルから入力した文字列をLED点滅のモールス信号で出力するスケッチ
(pico-sdkのサンプルのaruduino移植版)
char str[100];
const uint LED_PIN = 25;
const uint DOT_PERIOD_MS = 100;
const char *morse_letters[] = {
".-",
"-...",
"-.-.",
"-..",
".",
"..-.",
"--.",
"....",
"..",
".---",
"-.-",
".-..",
"--",
"-.",
"---",
".--.",
"--.-",
".-.",
"...",
"-",
"..-",
"...-",
".--",
"-..-",
"-.--",
"--.."
};
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
while (!Serial) {
;
}
}
void put_morse_letter(const char *pattern) {
for (; *pattern; ++pattern) {
digitalWrite(LED_BUILTIN, HIGH);
if (*pattern == '.')
delay(DOT_PERIOD_MS);
else
delay(DOT_PERIOD_MS * 3);
digitalWrite(LED_BUILTIN, LOW);
delay(DOT_PERIOD_MS * 1);
}
delay(DOT_PERIOD_MS * 2);
}
void put_morse_str(const char *str) {
for (; *str; ++str) {
if (*str >= 'A' && *str <= 'Z') {
put_morse_letter(morse_letters[*str - 'A']);
} else if (*str >= 'a' && *str <= 'z') {
put_morse_letter(morse_letters[*str - 'a']);
} else if (*str == ' ') {
delay(DOT_PERIOD_MS * 4);
}
}
}
void loop() {
Serial.printf("Enter String for Morse\n");
delay(1000);
if (Serial.available()){
String sline = Serial.readStringUntil('\n');
sline.toCharArray(str, 100);
Serial.printf("morse: %s\n", str);
put_morse_str(str);
}
}
内蔵ファイルシステム(FLASH)を使用したスケッチ
Pico用のLittleFSの書き込みツールを以下の手順でインストールする:
cd ~Downloads
wget https://github.com/earlephilhower/arduino-pico-littlefs-plugin/releases/download/0.2.0/PicoLittleFS-0.2.0.zip
mkdir -p ~/Arduino/tools/PicoLittleFS/tool
cd ~/Arduino/tools/PicoLittleFS/tool
ls
picolittlefs.jar
スケッチのディレクトリ「FSUploadPico」にファイルシステムのデータ用の
ディクトリ「data」を作り、保存したいファイルを置く。
cd FSUploadPico
mkdir data
cd data
gedit file1.txt
FSUploadPico.ino
#include <LittleFS.h>
void setup() {
Serial.begin(115200);
delay(5000);
LittleFS.begin();
char buff[32];
int cnt = 1;
File f = LittleFS.open("counts.txt", "r");
if (f) {
bzero(buff, 32);
if (f.read((uint8_t *)buff, 31)) {
sscanf(buff, "%d", &cnt);
Serial.printf("I have been run %d times\n", cnt);
}
f.close();
}
cnt++;
sprintf(buff, "%d\n", cnt);
f = LittleFS.open("counts.txt", "w");
if (f) {
f.write(buff, strlen(buff));
f.close();
}
Serial.println("---------------");
while(true) {
File i = LittleFS.open("file1.txt", "r");
if (i) {
while (i.available()) {
Serial.write(i.read());
}
Serial.println("---------------");
i.close();
}
}
}
void loop() {
}
・リセットボタンがないのでシリアル出力部分を無限ループに変更した。
・ボードのライブラリが最新版である必要がある。(ボードマネージャーで更新する)
書き込みと実行:
以下の手順でdata書き込みとスケッチの書き込みを行なう:
(1)Arduino-IDEで[ツール(tools)]/[Flash Size]で任意(ゼロ以外)を設定する
(2)Arduino-IDEで[ツール(tools)]/[PicoLittleFS Data Upload]を選択して
dataディレクトリの内容をPicoのflashに書き込む
(3)書き込み(Upload)アイコンを押してスケッチのコンパイルと書き込みを実行する
出力例(USBシリアル):
# 以下のfile1.txtの内容を繰り返し出力する
Hello!
Welcome to the Raspberry Pi Pico using arduino-pico!
this is LittleFS test#1.
this is LittleFS test#2.
this is LittleFS test#3.
this is LittleFS test#4.
this is LittleFS test#5.
this is LittleFS test#6.
windows版Arduino-IDEでの書き込みエラーの対応方法
windows版Arduino-IDEでは、動作環境によっては、Pico書き込み時にエラーになり書き込めないことがある。
これは、windowsのドライブのボリューム名として、半角カタカナが使われている場合、
書き込みツールとして使用しているuf2conv.pyでutf8文字列変換がエラーになっていることが原因である。
この対応として、日本語のボリューム名を英語などに変更することで、エラーを回避でき、書き込みが正常に動作するようになる。
または、ボリューム名を(手動で)変更せずにwindowsのシステム言語を英語に変更することでボリューム名も英語に変更することで書き込みが可能になる。
ここでは、システム言語を変更する方法でエラーを回避する。
システム言語を英語にする方法については以下などを参照のこと:
・Windows 10 表示言語を英語版にする
重要な注意:
[Windows display], [Apps & websites]のみを英語に変更すること。
他も英語にすると日本語キーボードなどが使用できなくなるなどの不都合が生じる。
参考:
日本語から英語にシステム言語を変更すると、uf2conv.pyの変数r(bytearray)の内容が以下のように変化する:(環境依存あり)
日本語の場合:
b'DeviceID DriveType FileSystem VolumeName
\r\r\nC: 3 NTFS Windows
\r\r\nD: 3 NTFS \x83{\x83\x8a\x83\x85\x81[\x83\x80
\r\r\nE: 2 FAT RPI-RP2 \r\r\n\r\r\n'
英語の場合:
b'DeviceID DriveType FileSystem VolumeName
\r\r\nC: 3 NTFS Windows
\r\r\nD: 3 NTFS Volume
\r\r\nE: 2 FAT RPI-RP2 \r\r\n\r\r\n'
・この例ではドライブDのボリューム名が変化していることが分かる。
・「\x83{\x83\x8a\x83\x85\x81[\x83\x80」(83 7B 83 8A 83 85 81 5B 83 80)は半角カナの部分になる。
他の対応方法としては、uf2conv.pyの変数rの中の半角カナ部分をutf8変換可能な文字に置き換えるパッチが考えられる。
それには以下のように修正する:
uf2conv.py
def to_str(b):
return b.decode("utf-8")
↓
def to_str(b):
return b.decode("utf-8",errors="replace")
Multicore用スケッチ (2021/4/29)
PicoはDualCoreのCPUなので、2つのCPUをスケッチで動作させることができる。
以下のexamplesにあったものを掲載する。
・examples(earlephilhower)
残念ながら自分の環境では1コア(core0)としてしか動作しなかった。
(今後のupdateでfixするものと思われる)
Multicore.ino
// Demonstrates a simple use of the setup1()/loop1() functions
// for a multiprocessor run.
// Will output something like, where C0 is running on core 0 and
// C1 is on core 1, in parallel.
// 11:23:07.507 -> C0: Blue leader standing by...
// 11:23:07.507 -> C1: Red leader standing by...
// 11:23:07.507 -> C1: Stay on target...
// 11:23:08.008 -> C1: Stay on target...
// 11:23:08.505 -> C0: Blue leader standing by...
// 11:23:08.505 -> C1: Stay on target...
// 11:23:09.007 -> C1: Stay on target...
// 11:23:09.511 -> C0: Blue leader standing by...
// 11:23:09.511 -> C1: Stay on target...
// 11:23:10.015 -> C1: Stay on target...
// Released to the public domain
// The normal, core0 setup
void setup() {
Serial.begin();
delay(5000);
}
void loop() {
Serial.printf("C0: Blue leader standing by...\n");
delay(1000);
}
// Running on core1
void setup1() {
delay(5000);
Serial.printf("C1: Red leader standing by...\n");
}
void loop1() {
Serial.printf("C1: Stay on target...\n");
delay(500);
}
・このスケッチはearlephilhower版専用となる。
Arduino純正のボード・ライブラリを使用する(2021/4/23)
最近、Arduino純正のボード・ライブラリもサポートされたので、その使い方について述べる。
純正ライブラリなので.jsonの設定などは不要で、ボード・ライブラリのアップデートをするだけで良い。
(この版をearlephilhower版と区別するために純正版と呼ぶ)
ボード・ライブラリ設定は以下の手順で行なう:
(1)[ツール(tools)]/[ボードマネージャ]を選択する。
(2)「pico」で検索する。
(3)検索された候補のなかで[Arduino Mbed OS RP2040 Boards]を選択する。
(4)[インストール]をクリックする。
(5)[閉じる]をクリックする。
ボードを選択するためには以下の手順で行なう:
(1)[ツール(tools)]/[Arduino Mbed OS RP2040 Boards]/[Raspberry Pi Pico]を選択する。
(2)[ツール(tools)]/[シリアルポート]を選択する。
あとは、通常の方法でビルドと書き込みができる。
重要:
書き込み時にエラーになった場合、udev-ruleが登録されていない可能性があるので、
その場合、以下を実行してudev-ruleを登録する:
sudo ~/.arduino15/packages/arduino/hardware/mbed_rp2040/2.0.0/post_install.sh
書き込みが正常に動作すると以下のようなメッセージが出る:
(設定で「より詳細な情報を表示する:」で[書き込み]にチェックしている場合)
/home/xxxx/.arduino15/packages/arduino/tools/rp2040tools/1.0.2/rp2040load -v -D /tmp/arduino_build_yyyyy/zzzzz.ino.elf
rp2040load 1.0.1 - compiled with go1.15.8
Loading into Flash: [==============================] 100%%
参考情報
earlephilhower版関連:
Arduino-Pico(Detailed Documentation)
examples(earlephilhower)
Pico-Arduino関連:
Arduino IDE support for RP2040 and Pico arrives
Display_Packをpico_arduinoで動かす
Arduino関連:
Arduino-Pico
Install the Arduino Software (IDE) on Linux
How to Program Raspberry Pi Pico With the Arduino IDE
pico-setup-windows installer
Arduino IDEライブラリのインストールとディレクトリ(フォルダ)構成 (Windows, Mac, Linux対応)
FS関連:
Arduino Pico LittleFS Filesystem Uploader
Filesystem
LittleFS
Arduino ESP8266 LittleFS Filesystem Uploader
OpenOCD関連:
PicoボードにPico_SDKでC言語をビルドする(Picoprobeの説明あり)
Debugging the Raspberry Pi Pico on Windows 10
Pico関連:
Raspberry Pi Pico – How to Interface (almost) Everything!
WSL2関連:
WSL2でRDPサーバーを動かす
WSL2でSSHサーバーを動かす
WSL2でのplatformioやPico-SDKの利用方法
python3関連:
How to permissively decode a UTF-8 bytearray?
bytes, bytearray/日本語エンコード名
その他:
文字コードの16進ダンプ
以上