プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

Raspberry Pi Picoで内部プルアップが使えるピンは?さらにPicoのプロジェクトの初期設定をする

TL;DR

・GP0 - GP28 まですべてのピンが内部プルアップを使える
・CmakeListsの書き方を改めて整理した

ラズパイピコを使ったプロジェクトを計画中なのですが、内部プルアップを使えるピンの情報が見つからない(一度どこかで見た)のでテストコードを書いて確認してみました。
以前、ラズパイピコに関してCmakeListsの書き方を書いたようなつもりでいましたが、記事を書いていなかったようなので改めて整理しました。

新プロジェクトの作成

ラズパイピコのサンプルコードはビルドできたけど、自分のプロジェクトをイチからつくるのはどうやるの?というとこををまとめました。
すでにpico-examplesがbuildできている前提です。

pico-examplesや pico-sdkがあるフォルダで作成すると手順通りにできます。これ以外の場所で行うときはこれらのパスを適切に設定する必要があります。

// projectのフォルダを以下の場所に作る

pico
├── pico-examples
├── pico-sdk
├── <project>

この場所にC言語ソースやCMakeListsを作成し、sdkのパスを設定します。

$ mkdir <フォルダ名>
$ cd <フォルダ名>
$ touch main.c
// main.cの作成
// CMakeLists.txtの作成

// pico-examplesや pico-sdkがあるフォルダ以外の場合は相対パスを正しく設定する必要がある
$ cp ../pico-sdk/external/pico_sdk_import.cmake .

この時点で以下のようになているはずです。

ubuntu@ubuntu-XXXX:~/code/te$ ls -la
合計 20
drwxrwxr-x  2 ubuntu ubuntu 4096  2月 10 18:23 .
drwxrwxr-x 12 ubuntu ubuntu 4096  2月 10 18:18 ..
-rw-rw-r--  1 ubuntu ubuntu  329  2月 10 18:23 CMakeLists.txt
-rw-rw-r--  1 ubuntu ubuntu  795  2月 10 18:13 main.c
-rw-rw-r--  1 ubuntu ubuntu 3165  2月 10 18:21 pico_sdk_import.cmake

buildフォルダに移動してbuildします。

$ mkdir build
$ cd build

// pico-examplesや pico-sdkがあるフォルダ以外の場合は相対パスを正しく設定する必要がある
$ export PICO_SDK_PATH=../../pico-sdk
$ cmake ..
$ make

これでbuildフォルダにbin.uf2が作成されます。
ラズパイpicoのbootスイッチを押しながらUSBを接続し、USBストレージとして認識されたらラズパイpicoにドラッグドロップでコピーします。
USBを再接続すると書き込んだプログラムで起動します。
またソースコードを変更したとき再度コンパイルするにはmakeだけでOKです。

ソースコード

//main.c

#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"

int main() {
    stdio_init_all();
    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    sleep_ms(1000);
    gpio_put(LED_PIN, 1);
    sleep_ms(1000);
    gpio_put(LED_PIN, 0);
    
    for(int i=0;i<30;i++)
    {
        if(i==25)continue; // BUILTIN_LEDを除外
        gpio_init(i);
        gpio_set_dir(i, 0);
        gpio_pull_up(i);
    }
    
    while (true) 
    {
            for(int i=0;i<30;i++)
	    {
	  	if(i==25)continue; // BUILTIN_LEDを除外
		if(gpio_get(i))
		{
			gpio_put(LED_PIN, 0);			  
		}
		else
		{
			gpio_put(LED_PIN, 1);
			 sleep_ms(1000);
		}
		printf("debug\n");
	    }
    }
}
// CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
project(test_project C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(bin #バイナリのファイル名
main.c #ソースコード
)
pico_enable_stdio_usb(bin 1) #対象のバイナリ, usb sirial (1:有効、0:無効)
pico_add_extra_outputs(bin) #対象のバイナリ
target_link_libraries(bin pico_stdlib) #対象のバイナリ,リンクするlibrary