Raspberry Pi Picoでタイマーを使ったLED点滅
まえがき
Raspberry Pi Picoとmicro-ROSとRaspberry Pi 4Bを使ってロボットを作っていますが、Picoの理解が浅いと感じています。そこでもっとPicoを使いこなしたいので再勉強して行きたいと思います。
とはいうものの、何も題材がないとやる気にもならないし、そもそもマイコン(組み込みソフト全般)がわかってないので、そのへんも一緒にわかるようになりたいと思います。
ということで、題材はMONOistの連載記事「マイクロマウスで始める組み込み開発入門」。この記事で使っているのはRX631というルネサス製のマイコン。使ったことありませんが、この記事を読みながらRaspberry Pi Picoに焼き直してみたらどうなるの?という感じでやっていきたいです。
RX631って数千円とかするんですね。Pico安いわー。
開発環境
最初の方は導入と開発環境の話のようです。
同じことをPicoに焼き直して考えます。開発環境は以下3つがよく使われるようです。
- C/C++ SDK
- MicroPython
- Arduino IDE
私はC/C++ SDKを使います。micro-ROSでPicoがサポートされた直後はC/C++ SDKしかなかったからです。
PCはThinkpad X260にUbuntu 22.04LTS、Picoは普通のRaspberry Pi Picoを使ってます。
インストールの仕方などは他の文献にあたってください。
Lチカ
普通ならただLEDを光らせるだけのプログラムから始めるのが定番なのですが面白くないので、そこはすっ飛ばして500[ms]ごとにLEDを点滅させることにしました。最初から記事に沿ってません。が、似たようなLチカなので気にしない。
ソースコード
500[ms]ごとにLEDを点灯と消灯を繰り返すコード(blink_timer.c)。LEDはGPIO25につながってるオンボードのもの。
#include <stdio.h>
#include <math.h>
#include "pico/stdlib.h"
#include "hardware/timer.h"
#define LED_PIN 25
volatile bool led_on;
static void repeating_timer_callback(void) {
led_on = !led_on;
gpio_put(LED_PIN, led_on);
}
int main() {
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
led_on = false;
struct repeating_timer timer;
add_repeating_timer_ms(-500, repeating_timer_callback, NULL, &timer);
while (true) {
}
}
add_repeating_timer_ms()
の第一引数がタイマーの間隔。符号がマイナスなのはタイマーが呼ばれてから次のタイマーが呼ばれるまでが500[ms]ということ。符号をプラスにした場合はタイマー関数が終わってから500[ms]後に次のタイマーが呼ばれるみたい。
CMakeList.txt
cmake_minimum_required(VERSION 3.12)
# Pull in SDK (must be before project)
include(../pico_sdk_import.cmake)
project(hunter_pico_examples C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(blink_timer)
target_sources(blink_timer PRIVATE blink_timer.c)
# Pull in our pico_stdlib which pulls in commonly used features
target_link_libraries(blink_timer pico_stdlib hardware_timer)
# create map/bin/hex file etc.
pico_add_extra_outputs(blink_timer)
ビルド
- 当該ディレクトリにblink_timer.cとCMakeLists.txt、ひとつ上のディレクトリにpico_sdk_import.cmakeを置く
- mkdir build
- cd build
- cmake ..
- 出来上がったblink_timer.uf2をPicoに書く
書いてあげると勝手にリセットがかかって勝手にLEDが点滅し始めます。うまく行かなかったらソースコードを見直します。
最後に
かなり雑なスタートですが、最後にはマイクロマウスに出られる機体が作れるかもしれません。
Discussion