picoのコンパイルは通常、cmake -> make を使います。cmake を行うにはCMakeLists.txt が必要です。しかしこのCMakeLists.txtを作成することはなかなか成功せず、こつが必要です。 Pico Project Generator は PicoのCMakeList.txtを含むプロジェクトのテンプレートを作成してくれます。
https://github.com/raspberrypi/pico-project-generator
GuthubからZipファイルをダウンロードします。
pico-project-generator-master.zipというファイルがダウンロードされます。 これを展開するとpico-project-generator-masterというフォルダができます。
私はMac OS14で作業しています。ターミナルアプリを開きpico-project-generator-masterへ移動します。 Pico Project Generatorは以下のPython3を使って以下のコマンドで動作します。
pico-project-generator-master > python3 pico_project.py --gui
しかし、Pico Project Generatorを動作させるには、Python3.12.xが必要です。 少なくともPython3.6.9ではGUIが真っ白になりました。
Pythonの最新版はこちらからダウンロードできます。
https://www.python.org/downloads/
ダウンロードしたpython-3.12.4-macos11.pkgをダブルクリックすることでインストールができます、
pythonのバージョンを確認します。インストールしたバージョンを同じであればOKです。
> python3 -V Python 3.12.4
もう一つ、Pico Project Generatorを動作されるには、tkinterというpythonのGUIを表示するモジュールが必要です。 Tkinter は通常は Python に含まれています。
> python3 -m tkinter
このコマンドで以下のようなウィンドウが開けばOKです。
もう一度pico-project-generatorを起動します。
pico-project-generator-master > python3 pico_project.py --gui
Project Nameに"pico_test"を入力し、Console Over USBにチェックを入れ、画面下の赤文字の”OK”を押します。 下図のようなcmakeのダイアログを表示されます。
cmakeダイアログの"OK"を押すとpico-project-generator-masterの下にpico_testフォルダができています。
pico-project-generator-master/pico_test > ls CMakeLists.txt pico_sdk_import.cmake build pico_test.c
次のコマンドでコンパイルできます。
pico-project-generator-master/pico_test > cd build pico-project-generator-master/pico_test/build > cmake .. pico-project-generator-master/pico_test/build > make
成功すればpico_test.uf2がbuikdの下にできています。
pico-project-generator-master/pico_test/build > ls CMakeCache.txt generated pico_test.elf.map CMakeFiles pico-sdk pico_test.hex Makefile pico_test.bin pico_test.uf2 cmake_install.cmake pico_test.dis pioasm elf2uf2 pico_test.elf
Raspberry Pi PicoのPWMの使い方を説明します。Picoは16bitのカウンターでPWM波形を生成します。 カウンターはPicoのクロック周期(8 nanosecond, nsecと記述します。)で1づつ増加します。 16bitなので、カウンターの値が65536に達するとゼロに戻ります。 このでできるノコギリ波の周期は8nsec x 65536 = 524,288 nsecとなり、周波数では約1,907Hzとなります。
PWM波形を作るには、この0から65535までの値を繰り返しているカウンターをあるレベルで切り取ります。 このレベルをchan_levelと書くことにします。 カウンターの値がchan_level以下では1を、カウンターの値がchan_levelを超えると0となるような出力を作ります。 この出力波形がPWM波形です。 PWM波形はいずれかのPWMがアサインされているピンの出力を観察することで、1の時3Vが、0の時0Vが出力されます。 下の図の場合は、Chan_levelが32768の場合です。この値はカウンターの値のちょうど真ん中ですので 得られるPWM波形は0vと3vが同じ長さの矩形波となります。
chan_levelが16384であれば、下図のように1になっている時間が、0となっている時間の1/3になります。
実際にこのような波形が出力されるかどうか、プログラムを作成します。 ここではGPIO0とGPIO1の2つのGPIOを主力として使っています。
#include "pico/stdlib.h" #include "hardware/pwm.h" int main() { gpio_set_function(0, GPIO_FUNC_PWM); gpio_set_function(1, GPIO_FUNC_PWM); uint slice_num = pwm_gpio_to_slice_num(0); pwm_set_wrap(slice_num, 65535); pwm_set_chan_level(slice_num, PWM_CHAN_A, 32768); pwm_set_chan_level(slice_num, PWM_CHAN_B, 16384); pwm_set_enabled(slice_num, true); while(1){} }
CMakeList.txtは以下のようになります。
# Generated Cmake Pico project file cmake_minimum_required(VERSION 3.13) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) # Initialise pico_sdk from installed location # (note this can come from environment, CMake cache etc) set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) set(PICO_BOARD pico CACHE STRING "Board type") # Pull in Raspberry Pi Pico SDK (must be before project) include(pico_sdk_import.cmake) if (PICO_SDK_VERSION_STRING VERSION_LESS "1.4.0") message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.4.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}") endif() set(Proj PWM_TEST) project(${Proj} C CXX ASM) # Initialise the Raspberry Pi Pico SDK pico_sdk_init() # Add executable. Default name is the project name, version 0.1 add_executable(${Proj} PWM_TEST.c) pico_set_program_name(${Proj} "PWM_TEST") pico_set_program_version(${Proj} "0.1") pico_enable_stdio_uart(${Proj} 0) pico_enable_stdio_usb(${Proj} 1) # Add the standard include files to the build target_include_directories(${Proj} PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/.. # for our common lwipopts or any other standard includes, if required ${PICO_SDK_PATH}/src/rp2_common/hardware_pwm/include ) # Add any user requested libraries target_link_libraries(${Proj} pico_stdlib hardware_pwm) pico_add_extra_outputs(${Proj})
GPIO0とGPIO1の波形を下に示します。
chan_level=32768 | chan_level=16384 |