Raspberry Pi Pico(ラズパイPico、RP2040)をArduinoの開発環境からプログラムしてます。
デジタルI/Oのピン操作は、ArduinoのdigitalRead/Writeよりも、C/C++記述のほうがやれることが多く便利で処理も早いです。よく使いそうなGPIO操作、主に入出力ピン操作のC/C++記述をいくつかまとめておきます。今回の内容はArduinoIDEでもそのまま記述可能です。
▼ラズパイPicoをArduinoIDEで動かす方法はこちら▼
GPIOピンの設定
ArduinoでいうpinMode()
にあたる関数です。I/Oピンの入出力設定、また内蔵プルアップダウンの設定です。C/C++では一度に複数ピンの設定が可能な関数があるため少し便利です。
void gpio_set_function(uint8_t gpio, enum gpio_function fn)
//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
▲指定したピンの機能を定義します。入出力ピンに設定するにはSIO(5n)にします。
static void gpio_set_dir(uint8_t gpio, bool out) //指定ピンの入出力設定、out(true) => 出力、in(false) => 入力 static void gpio_set_dir_out_masked(uint32_t mask) //複数ピンを出力に設定、GP0-GP29 => 32bitで指定 static void gpio_set_dir_in_masked(uint32_t mask) //複数ピンを入力に設定、GP0-GP29 => 32bitで指定 static void gpio_set_dir_all_bits(uint32_t values) //すべてのピン方向を設定 1 => 出力、0 => 入力 static void gpio_set_dir_masked(uint32_t mask, uint32_t value) //複数ピンを指定し入出力を設定 // └ ex. gpio_set_dir_masked(0x07,0x05) // └ 0x07:b00000111 GP0~GP2ピンを指定 // └ 0x05:b00000101 GP0出力,GP1入力,GP2出力
▲ピンの入出力(In/Out)の方向を設定します。
static void gpio_pull_up(uint8_t gpio) static void gpio_pull_down(uint8_t gpio)
▲指定したピンの内蔵プルアップ/ダウンをONします。ともに中身はgpio_set_pulls()
関数を呼び出してます。また他にもピンの状態(プルアップ/ダウン)を確認したり、解除したりする関数もありますがあまり使わなそうので割愛。
void gpio_init(uint8_t gpio) //指定したピンを初期化 void gpio_init_mask(uint32_t gpio_mask) //複数ピンを同時に初期化
▲指定したピンを初期化します。SIOピンに割り当て、入力設定にし、出力値をクリアします。
ピン入出力設定関係でよく使いそうな関数はこんなところです。一度に複数の設定はできないけど、設定だけなら、個人的にはArduinoのpinMode()関数使ったほうが簡素で簡単。
▼入出力ピンの設定例▼
//GP2ピンを入力に設定 gpio_init(GP2); gpio_set_dir(GP2, 0); gpio_pull_up(GP2); //GP3ピンを出力に設定 gpio_init(GP3); gpio_set_dir(GP3, 1);
▲簡単ですが記述例です。
次に入出力ピンの操作です。
GPIOピンの操作
ArduinoでいうdigitalRead/Write()
にあたる関数です。こちらはC/C++で記述したほうが複数ピンを同時に操作できたり、処理速度が速かったりとメリットがそこそこあります。
static void gpio_put(uint8_t gpio, bool value) //指定ピンをHIGH/LOWで駆動 static void gpio_put_masked(uint32_t mask, uint32_t value) //指定した複数ピンをHIGH/LOWでビット駆動 // └ ex. gpio_put_masked(0x0f,0x05); // 0x0f:B00001111 GP0~GP3ピンの // 0x05:B00000101 GP0,2をHIGH GP1,3をLOW static void gpio_set_mask(uint32_t mask) //複数ピンを同時にHIGH static void gpio_clr_mask(uint32_t mask) //複数ピンを同時にLOW static void gpio_xor_mask(uint32_t mask) //複数ピンを同時に反転
▲digitalWrite()
にあたる関数。複数ピンをビット操作で同時に駆動できるのはArduino関数には無いため便利です。
static bool gpio_get(uint gpio) //指定したピン状態を確認 static uint32_t gpio_get_all() //すべてのピン状態を確認
▲digitalRead()
にあたる関数
入出力関係のC/C++でのGPIO関数はこんなところです。他、割り込み関係の設定やペリフェラル(UART、SPI、I2Cなど)のピン割り当てなどがありますが、またそれぞれの機能を使うときに詳しく見ていきたいと思います。
コメント