Pico Project Geneerator

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

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