TOPに戻る

Raspberry Pi Picoでプログラミング ⑮ gpioファンクション

 Lチカでgpioの出力を扱いました。ソース・プログラムです。

/**
 * 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
}

 コメント類を削除して、すっきりさせます。

 LED_PINをGP25に割り当てる。
 gpio_init(LED_PIN); でgpio番号を初期化する。
 gpio_set_dir(LED_PIN, GPIO_OUT); 出力に設定する。
 gpio_put(LED_PIN, 1); LED_PINをHighにする。


#include "pico/stdlib.h"

int main() {
    const uint LED_PIN = 25;
    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);
    }
}

 #include "hardware/gpio.h" はなくてもgpioのAPIは使えていますね。検索すると、「 Just like pico/stdlib.h is an umbrella header that includes things like pico/time.h and hardware/gpio.h」と書かれています。pico/stdlib.hに入っているから、特別に記述しなくてもよいということですね。

gpioファンクション

ファンクション 要約
void gpio_set_function (uint gpio, enum gpio_function fn)

GPIO機能を選択する。

例;GP2ピンをPWM
gpio_set_function(2, GPIO_FUNC_PWM);
例;PIN_MISOピンをSPI
gpio_set_function(PIN_MISO, GPIO_FUNC_SPI)
例;GP20ピンをI2C
gpio_set_function(20, GPIO_FUNC_I2C);

void gpio_set_pulls (uint gpio, bool up, bool down) 特定のGPIOで上下のプルを選択する
static void gpio_pull_up (uint gpio) 指定したGPIOをプルアップする
static bool gpio_is_pulled_up (uint gpio) 指定されたGPIOがプルアップされているかどうかを確認する
static void gpio_pull_down (uint gpio) 指定したGPIOをプルダウンする
static bool gpio_is_pulled_down (uint gpio) 指定されたGPIOがプルダウンされているかどうかを確認する
static void gpio_disable_pulls (uint gpio) 指定されたGPIOのプルを無効にする
void gpio_set_outover (uint gpio, uint value)

GPIO出力イネーブル・オーバライドを選択。

gpio_overrideの情報の記載はない

void gpio_set_inover (uint gpio, uint value)

GPIO入力オーバライドを選択。

gpio_overrideの情報の記載はない

void gpio_set_oeover (uint gpio, uint value)

GPIO出力イネーブル・オーバライドを選択。

gpio_overrideの情報の記載はない

void gpio_set_input_enabled (uint gpio, bool enabled) GPIO入力を有効(=true)にする
void gpio_set_irq_enabled (uint gpio, uint32_t events, bool enabled)

指定されたGPIOの割り込みを有効または無効にする。

イベント(0;Low level、1;High level、2;Edge low、3;Edge high)

void gpio_set_irq_enabled_with_callback (uint gpio, uint32_t events, bool enabled, gpio_irq_callback_t callback)

指定されたGPIOの割り込みを有効にする。

callback;GPIOirqを呼び出すためのコールバック・ユーザ関数

void gpio_set_dormant_irq_enabled (uint gpio, uint32_t events, bool enabled) 指定されたGPIOの休止状態のウェイクアップ割り込みを有効にする
void gpio_acknowledge_irq (uint gpio, uint32_t events) GPIO割り込みを確認。gpio番号、イベント(0;Low level、1;High level、2;Edge low、3;Edge high)をクリア
void gpio_init (uint gpio) 指定したgpio番号を初期化(I/Oを有効にし、funcをGPIO_FUNC_SIOに設定)。出力イネーブルをクリア(入力に設定)、すべての出力値をクリア
void gpio_init_mask (uint gpio_mask) 指定した複数のgpio番号を初期化(I/Oを有効にし、funcをGPIO_FUNC_SIOに設定)。出力イネーブルをクリア(入力に設定)、すべての出力値をクリア
static bool gpio_get (uint gpio) 指定された単一のGPIOの状態を取得する
static uint32_t gpio_get_all (void) すべてのGPIOの生の値を取得する
static void gpio_set_mask (uint32_t mask) マスク(0~29)に現れるすべてのGPIOをHighにドライブ
static void gpio_clr_mask (uint32_t mask) マスク(0~29)をクリア(Low)する
static void gpio_xor_mask (uint32_t mask) マスクに表示されるすべてのGPIOを切り替え。ビットマスクをマスクする
static void gpio_put_masked (uint32_t mask, uint32_t value) マスクされたビットをHigh/Lowで駆動する
static void gpio_put_all (uint32_t value) すべてのピンを同時に駆動する
static void gpio_put (uint gpio, bool value) 単一のGPIOをHigh/Lowで駆動する
static void gpio_set_dir_out_masked (uint32_t mask) 「マスク」内のすべてのGPIOを出力に切り替える。ビット0〜29として、出力に設定するGPIOのビットをマスクする
static void gpio_set_dir_in_masked (uint32_t mask) ビット0〜29として、入力に設定するGPIOのビットをマスクする
static void gpio_set_dir_masked (uint32_t mask, uint32_t value)

複数のGPIO方向を設定する。マスクされた以外のビットは不変。

例;gpio_set_dir_masked(0x3, 0x2);
0b00000011<-ピンの0と1を0b00000010<-ピン0は入力、ピン1は出力に設定

static void gpio_set_dir_all_bits (uint32_t values) すべてのピンの方向を同時に設定する(出力の場合は1、入力の場合は0)
static void gpio_set_dir (uint gpio, bool out) 単一のGPIOの方向を設定(outの場合はtrue、inの場合はfalse
static bool gpio_is_dir_out (uint gpio) 特定のGPIO方向がOUTであるかどうかを確認する
static uint gpio_get_dir (uint gpio) 特定のGPIO方向を取得する

enum gpio_function { GPIO_FUNC_XIP = 0, GPIO_FUNC_SPI = 1, GPIO_FUNC_UART = 2, GPIO_FUNC_I2C = 3, GPIO_FUNC_PWM = 4, GPIO_FUNC_SIO = 5, GPIO_FUNC_PIO0 = 6, GPIO_FUNC_PIO1 = 7, GPIO_FUNC_GPCK = 8, GPIO_FUNC_USB = 9, GPIO_FUNC_NULL = 0xf }

 Raspberry Pi Pico C/C++ SDKにあるサンプルのhello_7segment.cの中から、gpioの入力と出力の部分をピックアップしました。

スイッチの入力の手順

#include "hardware/gpio.h"

#define BUTTON_GPIO 9

gpio_init(BUTTON_GPIO);
gpio_set_dir(BUTTON_GPIO, GPIO_IN);
gpio_pull_up(BUTTON_GPIO);

if (!gpio_get(BUTTON_GPIO)) {

}

出力LEDの手順

#include "hardware/gpio.h"

#define FIRST_GPIO 2

gpio_init(gpio);
gpio_set_dir(gpio, GPIO_OUT);

 これらを参考に、LEDを点灯するプログラムを作ります。

スイッチを押すとLEDが点灯する STEP1

 LEDはUSBコネクタの横にある緑色のLEDです。GP25につながっています。
 タクト・スイッチを1.8kΩを直列にしてGP9とGND間につなぎました。抵抗はなくても、入力に設定してプルアップを有効にするので、動作上問題はありません。
 しかし、実験をしているうちに出力に設定して'1'を出すと、スイッチを押したときにGNDと直結され、大きな電流が流れるかもしれません。そのようなことはないとは言い切れないので、抵抗を入れました。

 while文がメイン・プログラムです。ひたすらスイッチが押されるのを待っているだけです。

 スイッチを押すと、ledflash() 関数が呼ばれ、LEDが瞬間点灯します。プログラムをこれだけの動作をしていますから、ほかの仕事をするには、while文の途中にその何かしたい処理を記述します。そのなにかしたい処理に時間がかかると、スイッチの見に行くタイミングが遅くなるという欠点があります。


#include "pico/stdlib.h"
// #include "hardware/gpio.h"

#define LED_PIN  25
#define SW_PIN   9

void ledflash() {
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    gpio_put(LED_PIN, 0);
    sleep_ms(10);
    gpio_put(LED_PIN, 1);
    sleep_ms(250);
    gpio_put(LED_PIN, 0);
}

int main() {
    gpio_init(SW_PIN);
    gpio_set_dir(SW_PIN, GPIO_IN);
    gpio_pull_up(SW_PIN);

    while(1){
         if (!gpio_get(SW_PIN)) {
            ledflash();
            sleep_ms(20);
        }
// 何か別の処理 } return 0; }

 次回は割り込み、その次はMASKを取り上げる予定です。

連載 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ファンクション