Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

GPIO ピン

最初の LED を点灯させるには、最初の列を LOW に設定し、その後で最初の行を HIGH に設定する必要がありました。これで回路が閉じ、LED が点灯します。

BSP クレートを使っていたときは、とてもわかりやすいものでした。BSP は row1、row2、あるいは col1、col2 のような名前を提供してくれるので、それらをコード内で簡単に使えました。また、LED マトリクス全体を表現するために 2 次元配列を使うこともできました。

しかし HAL を使う場合は、GPIO ピンを直接扱います。row1 や col1 の代わりに、p0_28、p0_21 などのピン名を使います。これらはマイクロコントローラ上の実際のピンであり、入力または出力として設定します。

GPIO とは何か?

GPIO は General Purpose Input Output の略です。これは、コードから制御できるマイクロコントローラ上のピンです。

各 GPIO ピンは次のいずれかになります。

  • 出力 : HIGH(電源のようなもの)または LOW(GND のようなもの)に設定できます
  • 入力 : センサーやボタンから HIGH か LOW かを読み取れます

GPIO ピンは、コードから制御するスイッチのようなものだと考えてください。ピンを HIGH に設定すると、電源のように振る舞います。LOW に設定すると、GND への経路のように振る舞います。

いくつかのピンを HIGH に、ほかのピンを LOW に設定することで、LED、ボタン、センサーなどを制御できます。

どの GPIO を使うべきかを知るには?

どの GPIO ピンを使うべきかを調べるには、通常、使用しているマイクロコントローラやボードのデータシートまたは技術リファレンスマニュアルを確認します。micro:bit のドキュメントにあるピンマップも参照できます。

わかりやすくするために、LED マトリクス内の各行と各列が nRF52833 マイクロコントローラ上の実際の GPIO ピンにどのように接続されているかを示す表を以下に示します。

マトリクス上の役割電気的役割ポートピン
ROW1ソースp021
ROW2ソースp022
ROW3ソースp015
ROW4ソースp024
ROW5ソースp019
COL1シンクp028
COL2シンクp011
COL3シンクp031
COL4シンクp105
COL5シンクp030

Pin 列は GPIO ピン番号を示しています。Port はまだ紹介していない用語です。これは単に、マイクロコントローラによってまとめて管理される GPIO ピンのグループです。マイクロコントローラでは、GPIO ピンは Port 0(p0)や Port 1(p1)のようなポートに整理されていることがよくあります。各ポートは複数のピンを制御できます。

私たちの目標は、1 行目 1 列目にある最初の LED を点灯させることです。最初の行の GPIO ピンは p0_21 です。最初の列の GPIO ピンは p0_28 です。

コードを変更する

では、src/main.rs ファイルを変更して、GPIO ポートと必要な特定のピンを初期化しましょう。

まず、必要なインポートを追加します。

#![allow(unused)]
fn main() {
use nrf52833_hal::gpio::Level; 
use nrf52833_hal as hal;
}

ここで、Level はピンの論理レベルを表す列挙型です。Level::High(論理的な高電圧)または Level::Low(論理的な低電圧)のいずれかになります。

また、nrf52833_hal クレートを hal というエイリアスでインポートしています。これにより、コード全体でモジュールや型を参照するときに、クレートの完全な名前を毎回書かずに済みます。

main 関数の中に、次のコードを追加します。

#![allow(unused)]
fn main() {
let port0 = hal::gpio::p0::Parts::new(peripherals.P0);
let _col1 = port0.p0_28.into_push_pull_output(Level::Low);
let mut row1 = port0.p0_21.into_push_pull_output(Level::High);
}

このコードが行うことは次のとおりです。

  • port0 により、Port 0 内の個々のピンにアクセスできます。
  • _col1プッシュプル出力 として設定され、LOW に駆動されます。これは、そのピンが GND に接続されることを意味します。これにより、その列へ電流が流れ込めるようになり、列が「有効化」されます。
  • row1プッシュプル出力 として設定されますが、こちらは HIGH に駆動されます。これは、そのピンが電源(3.3V など)に接続されることを意味します。これにより、電流の供給元を与えることで、その行が「選択」されます。

プッシュプル出力とは?

プッシュプル出力は、マイクロコントローラの GPIO ピンでよく使われる電気的な構成です。このモードでは、ピンは出力を HIGH と LOW の両方に能動的に駆動できます。

  • HIGH に設定されると、ピンは電源電圧(通常は 3.3V または 5V)に接続され、接続された部品へ電流を供給できます。
  • LOW に設定されると、ピンは GND に接続され、電流を吸い込むことができます。

これは、ピンが浮いた状態のままになることがなく、常に明確な電圧レベルを持つことを意味します。LED やリレーのようなデジタル出力を駆動したり、論理信号を制御したりするのに適しています。

ラインを LOW に引き下げることしかできず、HIGH にするには外部プルアップ抵抗が必要な オープンドレインオープンコレクタ 出力とは異なり、プッシュプル はその両方を行えるため、汎用出力にとってシンプルで信頼性の高い方式です。