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 | ソース | p0 | 21 |
| ROW2 | ソース | p0 | 22 |
| ROW3 | ソース | p0 | 15 |
| ROW4 | ソース | p0 | 24 |
| ROW5 | ソース | p0 | 19 |
| COL1 | シンク | p0 | 28 |
| COL2 | シンク | p0 | 11 |
| COL3 | シンク | p0 | 31 |
| COL4 | シンク | p1 | 05 |
| COL5 | シンク | p0 | 30 |
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 にするには外部プルアップ抵抗が必要な オープンドレイン や オープンコレクタ 出力とは異なり、プッシュプル はその両方を行えるため、汎用出力にとってシンプルで信頼性の高い方式です。