SPI入力LEDを堪能 (C/C++) ーRaspberry Pi Picoへの道5ー
前回はフォトリフレクタによる割り込み動作を確認しました。
ここではSPI入力のテープLEDの点灯を試してみました。
目次
サンプルコード動作確認
以下のSPI入力LED APA102のサンプルコードを試してみます。
https://github.com/raspberrypi/pico-examples/tree/master/pio/apa102
構成
Raspberry Pi Pico のハードウェアSPI(SPI0)でLEDを制御します。
動作
サンプルコードをビルドしてuf2ファイルをRaspberry Pi Pico にドラッグ&ドロップします。
Raspberry Pi Pico
SPI入力LED点灯サンプルコードを実行PIOなるモノを使用しているようだけど、よく理解できない。
早く体に浸透させ好きな色で点灯させたい。#RaspberryPiPico #PiPico #ラズパイhttps://t.co/Nq3xmX2HRR pic.twitter.com/pV2V03XbDb— HomeMadeGarbage (@H0meMadeGarbage) February 11, 2021
LEDの制御シーケンスは.pioファイルに記述されていました。
独自プロジェクト作成
サンプルコードを参考に自分のワークスペースにフォルダを作成して所望の色でを光らせてみます。
フォルダ (SpiLedTest) には以下を用意します。
- Pico SDKを参照するための設定を記述した pico_sdk_import.cmakeをコピー
- LEDの制御シーケンスを記述した apa102.pio をコピー
- プログラム .cファイル (SpiLedTest.c) 作成。詳細は後述
- プログラムとビルドの設定を記述する CMakeLists.txt 作成。詳細は後述
Visual Studio Codeでフォルダを開いてビルドします。
.cファイル
4色で交互に点灯するコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#include "pico/stdlib.h" #include "hardware/pio.h" #include "apa102.pio.h" #define PIN_CLK 2 #define PIN_DIN 3 #define N_LEDS 11 #define SERIAL_FREQ (5 * 1000 * 1000) // Global brightness value 0->31 #define BRIGHTNESS 8 uint32_t color[] ={ 0xFF0000, 0x00FF00, 0x0000FF, 0x00FFFF }; void put_start_frame(PIO pio, uint sm) { pio_sm_put_blocking(pio, sm, 0u); } void put_end_frame(PIO pio, uint sm) { pio_sm_put_blocking(pio, sm, ~0u); } void put_bgr888(PIO pio, uint sm, uint32_t c) { pio_sm_put_blocking(pio, sm, 0x7 << 29 | // magic (BRIGHTNESS & 0x1f) << 24 | // global brightness parameter c ); } int main() { stdio_init_all(); PIO pio = pio0; uint sm = 0; uint offset = pio_add_program(pio, &apa102_mini_program); apa102_mini_program_init(pio, sm, offset, SERIAL_FREQ, PIN_CLK, PIN_DIN); while (true) { for (int j = 0; j < 4; ++j) { put_start_frame(pio, sm); for (int i = 0; i < N_LEDS; ++i) { put_bgr888(pio, sm, color[j]); } put_end_frame(pio, sm); sleep_ms(500); } } } |
CMakeLists.txt
コピーした.pioファイルを pico_generate_pio_header で宣言しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
cmake_minimum_required(VERSION 3.13) include(pico_sdk_import.cmake) project(SpiLedTest_project) pico_sdk_init() add_executable(SpiLedTest SpiLedTest.c) pico_generate_pio_header(SpiLedTest ${CMAKE_CURRENT_LIST_DIR}/apa102.pio) pico_enable_stdio_usb(SpiLedTest 1) pico_enable_stdio_uart(SpiLedTest 1) target_link_libraries(SpiLedTest pico_stdlib hardware_pio ) pico_add_extra_outputs(SpiLedTest) |
動作
これで自由にLEDを制御できるようになりました!
所望の色を出せるようになりました#RaspberryPiPico #PiPico #ラズパイ pic.twitter.com/bh7O02EAIf
— HomeMadeGarbage (@H0meMadeGarbage) February 11, 2021
割り込みと組み合わせ
前回確認したフォトリフレクタによる割り込み動作と組み合わせてみました。
ここではフォトリフレクタで光が遮られると割り込みでLEDの点灯カラーを変えています。
おわりに
ついにRaspberry Pi PicoでSPI入力のLEDを自由に制御できるようになりました!
次回はいよいよバーサライタを組み立てていこうと考えております。
Raspberry Pi Picoの性能が浮き彫りになるのではないかと非常に楽しみです♪
それでは次の道でお会いしましょう!
SPI制御のLEDテープを探していてこちらにたどり着きました。LEDは今日注文し、実験は後日になりますが、プログラムも参考にさせていただきたく、よろしくお願いします。