TOPに戻る

Raspberry Pi Picoでプログラミング ⑤ プログラミングの環境整備とLチカ

 Lチカから始めます。すでにソースはpico/pico-examples/blinkにあります。入っているのは、

  • blink.c
  • CMakeLists.txt

の二つです。blink.cは普通のLEDを点滅させるソース・プログラムです。最初に、CMakeLists.txtの中身を見ます。cmakeは、いろいろな環境でビルドをするためのツール名です。複数の設定ファイルが求められますが、このCMakeLists.txtは、実行ファイルを作るために必要な記述が入っています。


add_executable(blink blink.c ) # Pull in our pico_stdlib which pulls in commonly used features target_link_libraries(blink pico_stdlib) # create map/bin/hex file etc. pico_add_extra_outputs(blink) # add url via pico_set_program_url example_auto_set_url(blink)

 最初のブロック①は、コンパイルしてできあがる実行プログラムの名称と、そのソースです。ソースはここでは一つですが、ヘッダ・ファイルや、分割した場合別のソースを列挙します。

 次のブロック②は、リンクするライブラリ類を記述します。blinkは本体、pico_stdlibは標準ライブラリです。I2Cなどを使うときは、そのライブラリ名を列挙します。

 三つめ③は、コンパイルしたときにいろいろな実行ファイルやmapの出力ができるが、そのファイル名をblink.xxxにするようにという指示と思われます。しかし、解説が見つかりません。

 四つめ④は、想像ですがGitHubなどに公開するときの記述らしいので、当初、不要だと思います。削除します。

pico/worksで作業をする

 /picoフォルダの中に、何もない作業用のフォルダworksを作ります。

 /home/pi/pico/pico-examplesから、

  • pico_sdk_import.cmake
  • cmakeフォルダ
  • blinkフォルダ
  • CMakeLists.txt

らを、/home/pi/pico/worksにコピーします。

 buildフォルダを作ります。ソース・プログラムのディレクトリに実行ファイルを作るのではなく、buildフォルダ内に、オブジェクトや実行ファイルを保存するフォルダが作られます。
 画面の左側がworksフォルダです。

 pico_sdk_import.cmakeは、ライブラリ類が入ったsdkへのpathが書かれています。

CMakeLists.txtの修正

 worksフォルダにあるCMakeLists.txt(二つ目になる)をテキスト・エディタで開き、次のように必要なフォルダの記述だけにします。

  • cmakeのバージョン
  • sdkのpath
  • プロジェクト名、使用するC/C++のバージョン
  • プロジェクトのpath
  • sdkの初期化
  • # Add blink example以降に、makeを作るフォルダ名を列挙

 ここまでは、元のpico-examplesにあった内容と同じです。

 最後の行が、今回作成するLチカのフォルダの指定です。


cmake_minimum_required(VERSION 3.12)

# Pull in SDK (must be before project)
include(pico_sdk_import.cmake)

project(pico_examples C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})

# Initialize the SDK
pico_sdk_init()

# Add blink example
add_subdirectory(cmake)
add_subdirectory(blink)

 ターミナルで、buildフォルダにおります(/home/pi/pico/works/build/)。もちろん空っぽです。このディレクトリで、

cmake ..

 たくさんのファイルができます。

 新しくできたblinkにおります。makeを実行するのに必要なMakefileができています。

ビルド

 makeします。


pi@rasi01:~/pico/works/build/blink $ make -j4
Scanning dependencies of target ELF2UF2Build
Scanning dependencies of target bs2_default
[  0%] Creating directories for 'ELF2UF2Build'
[  0%] Building ASM object pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/compile_time_choice.S.obj
[  2%] Linking ASM executable bs2_default.elf
[  2%] Built target bs2_default
Scanning dependencies of target bs2_default_padded_checksummed_asm
[  5%] Generating bs2_default.bin
[  5%] Generating bs2_default_padded_checksummed.S
[  8%] No download step for 'ELF2UF2Build'
[  8%] Built target bs2_default_padded_checksummed_asm
[  8%] No patch step for 'ELF2UF2Build'
[ 10%] No update step for 'ELF2UF2Build'
[ 13%] Performing configure step for 'ELF2UF2Build'
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/pico/works/build/elf2uf2
[ 16%] Performing build step for 'ELF2UF2Build'
Scanning dependencies of target elf2uf2
[ 50%] Building CXX object CMakeFiles/elf2uf2.dir/main.cpp.o
[100%] Linking CXX executable elf2uf2
[100%] Built target elf2uf2
[ 18%] No install step for 'ELF2UF2Build'
[ 18%] Completed 'ELF2UF2Build'
[ 18%] Built target ELF2UF2Build
Scanning dependencies of target blink
[ 18%] Building C object blink/CMakeFiles/blink.dir/blink.c.obj
[ 24%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj
[ 24%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj
...
...
[ 89%] Building ASM object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj
[ 91%] Building ASM object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj
[ 91%] Building CXX object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj
[ 94%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj
[ 97%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj
[ 97%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj
[100%] Linking CXX executable blink.elf
[100%] Built target blink

 正常に終了したようです。

書き込み

 Resetボタンを押したまま、BOOTSELボタンを押し、Resetボタンを離してから、BOOTSELボタンを離します。これでマウントができます。RPI-RP2というドライブ名です。

 RPI-RP2ドライブへ、blink.uf2をドラッグします。

ソースの修正

 blink.cをテキスト・エディタで開き、修正します。

 

/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "pico/stdlib.h"

int main() {
#ifndef PICO_DEFAULT_LED_PIN
#warning blink example requires a board with a regular LED
#else
    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    while (true) {
        gpio_put(LED_PIN, 1);
        sleep_ms(2500);
        gpio_put(LED_PIN, 0);
        sleep_ms(2500);
    }
#endif
}

 250msを2500msに変更して保存します。makeします。修正のあったものだけがコンパイルされ、実行に必要なライブラリとリンクされます。


pi@rasi01:~/pico/works/build/blink $ make -j4
[  5%] Built target bs2_default
[  5%] Performing build step for 'ELF2UF2Build'
[  8%] Built target bs2_default_padded_checksummed_asm
[100%] Built target elf2uf2
[ 10%] No install step for 'ELF2UF2Build'
[ 10%] Completed 'ELF2UF2Build'
[ 18%] Built target ELF2UF2Build
Scanning dependencies of target blink
[ 18%] Building C object blink/CMakeFiles/blink.dir/blink.c.obj
[ 21%] Linking CXX executable blink.elf
[100%] Built target blink

 Resetボタンを押したまま、BOOTSELボタンを押し、Resetボタンを離してから、BOOTSELボタンを離します。RPI-RP2ドライブがマウントされました。

 RPI-RP2ドライブへ、blink.uf2をドラッグします。

 ゆっくりの点滅になりました。

連載 Raspberry Pi Picoでプログラミング

(1) ラズパイ4の準備(1) USBブートの設定

(2) ラズパイ4の準備(2) 標準入出力の用意

(3) ラズパイ4の準備(3) LチカとHello, world!の実行

(4) ラズパイ4の準備(4) リモート環境の設定

(5) プログラミングの環境整備とLチカ

(6) Hello, World!

(7) 使用するピンと機能

(8) クロックの値の表示

(9) i2cscanner

(10) i2c APIと気圧センサLPS25

(11) i2c 温度センサTMP117

(12) i2c 湿度センサAHT20

(13) spi APIとA-DコンバータMCP3008

(14) spi A-DコンバータMCP3208

(15) gpioファンクション