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 |
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); |
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); if (!gpio_get(BUTTON_GPIO)) { } |
●出力LEDの手順
#include "hardware/gpio.h"
#define FIRST_GPIO 2 gpio_init(gpio); |
これらを参考に、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を取り上げる予定です。