Raspberry Pi Pico 2 W で遊ぶ
昨年末に注文していた Raspberry Pi Pico 2 W が届いたので遊んでみることにしました。
(早くSwitch Scienceで取り扱ってくれないかな…)
内容はただのLチカです。VSCode + C/C++ の練習及び開発環境の動作確認のためにとやってみました。
Raspberry Pico W でも通る内容だと思います。
現段階での環境は以下の通り。
・Raspberry Pi Pico 2 W
・Raspberry Pi Pico (PicoProbe用)
・VSCode + 拡張機能「Raspberry Pi Pico」 ←①
・C/C++
酷く限定された環境でのお話になります。
言語はやりたいことに合わせて変える予定。
(MicroPythonとかも使います)
で。
Pico WのLチカ自体はある程度情報があったのだが全部MicroPythonでピュア C/C++ の情報が無かった(英語が読めないから)ので、誰かが困ったときのために書いておきます。
結論から先に言うと、①の拡張機能のサンプルコードにやり方書いてありました(だから情報なかったのか…)。
丸コピなんですが、こんな感じです。
**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pico/stdlib.h"
// Pico W devices use a GPIO on the WIFI chip for the LED,
// so when building for Pico W, CYW43_WL_GPIO_LED_PIN will be defined
// Pico W系 は WIFI ICにLEDが接続されていて、LチカにWiFi ICドライバが必要
// Pico W 向けプロジェクトを作成すると CYW43_WL_GPIO_LED_PIN が定義され
// pico/cyw43/arch.h をインクルードできる(無印プロジェクトにはこのヘッダは提供されない)
#ifdef CYW43_WL_GPIO_LED_PIN
#include "pico/cyw43_arch.h"
#endif
#ifndef LED_DELAY_MS
#define LED_DELAY_MS 250
#endif
// Perform initialisation
int pico_led_init(void) {
#if defined(PICO_DEFAULT_LED_PIN)
// A device like Pico that uses a GPIO for the LED will define PICO_DEFAULT_LED_PIN
// so we can use normal GPIO functionality to turn the led on and off
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
return PICO_OK;
#elif defined(CYW43_WL_GPIO_LED_PIN)
// For Pico W devices we need to initialise the driver etc
return cyw43_arch_init();
#endif
}
// Turn the led on or off
void pico_set_led(bool led_on) {
#if defined(PICO_DEFAULT_LED_PIN)
// Just set the GPIO on or off
gpio_put(PICO_DEFAULT_LED_PIN, led_on);
#elif defined(CYW43_WL_GPIO_LED_PIN)
// Ask the wifi "driver" to set the GPIO on or off
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, led_on);
#endif
}
int main() {
int rc = pico_led_init();
hard_assert(rc == PICO_OK);
while (true) {
pico_set_led(true);
sleep_ms(LED_DELAY_MS);
pico_set_led(false);
sleep_ms(LED_DELAY_MS);
}
}
65行目のcyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, led_on);
(led_onは呼び出し元で1/0にする)でLEDを点滅させています。裏でCYW43と通信してLEDの状態を変更させています。
無印では
gpio_put(PICO_DEFAULT_LED_PIN, led_on);
でまあまあおなじみ?のコード。MicroPythonの本体が色々隠蔽していたんですね。
36行目の
#include "pico/cyw43_arch.h"
がインクルードできるかが勝負どころ。そのためには35行目のCYW43_WL_GPIO_LED_PIN
が定義されるかがキモなわけですが、これは、サンプルプロジェクトの作成時のターゲットに"Pico W"、"Pico2 W"をしっかり選んでいるかが勝負になります。これを怠るとプロジェクトにW系のヘッダ等が組み込まれず、W系を使っていたとしても35行目の判定に失敗しヘッダファイルが読み込まれないことになります。筆者は失敗しました。無念。後からinclude文コピペしても無駄でしたのでファイル自体がコピーされてないのでしょう。
ターゲットを後から変える方法は現時点ではわかりません。要調査です。
……始めたばかりでもうしんどい……
全く関係ない話ですが、三点リーダが下につくのって日本語っぽくなくて好きじゃないです。
いじょ