Raspberry Pi Pico でのC/C++プロジェクト作成の練習として、8個の外部接続LED を制御するプログラムを作ってみました。 その時のメモです。開発環境はWindows 10 です。 ブレッドボード上での実装の様子 動いている様子VIDEO 単純な点灯ですが、最初のプロジェクトの作成、最初のGIPOの制御ということで、色々と勉強になりました。
ハードウェア面について まず回路的には、次のような感じでGP2 ~GP9 の8個のピンにLED を接続しています。 LEDに流したい電流を4mA として、順方向電圧VF が2.0V 、ボードの駆動電圧を3.3V とすると 電流制御抵抗値R は R = (3.3 - 2.0) ÷ 0.004 = 325 (Ω) となります。近い抵抗として330Ω をチョイスしました。 このあたり(LEDのの電圧降下、電流制御用抵抗値の求め方など)は下記のサイトの解説が参考になると思います。 参考資料: ■ LED関連パーツ 専門店 マイクラフト - LED基本知識&自作工作のHowto集 - LEDの電圧降下とは? - LEDの順電流(IF)とは? こういった、まとめ・解説はありがたいですね。 さて、ここで1つ 疑問 が..「Raspberry Pi Picoは、1ポートあたりどれくらいの電流を流せるのか?」 です。 スペック紹介レベルの資料では、記載がありません。調べるのに意外と時間がかかりました。 なんか面白い(複雑な?)機能あり、簡単な記載ができなかたっぽい?です。 Raspberry Pi Pico のGPIO には"pad "という機能があって、その機能の1つに流せる電流強度の設定が出来るようです。 公開されている資料 RP2040 Datasheet の「2.19 GPIO」 の「2.19.4.Pads」 に次のような記載があります。
Pad electrical behaviour can be adjusted to meet the requirements of the externalcircuitry. The following adjustments are available: • Output drive strength can be set to 2mA, 4mA, 8mA or 12mA • Output slew rate can be set to slow or fast • Input hysteresis (schmitt trigger mode) can be enabled • A pull-up or pull-down can be enabled, to set the output signal level when the output driver is disabled • The input buffer can be disabled, to reduce current consumption when the pad is unused, unconnected or connected to an analogue signal.
2mA、4mA、8mA、12mA のいずれかの設定が可能で、デフォルト値は4mA のようです。 この設定はUser Bank Pad Control register の PADS_BANK0: GPIO0, GPIO1, …, GPIO28, GPIO29 Registers の DRIVE ので出来るようです。 とりあえず今回は設定変更はせず、デフォルト値の4mA を上限として利用することにします。 このあたりは後ほど調べていきます。超えて流した場合の挙動等、非常に興味深いです。 いずれにしても、12mA が上限ですかね~
ソフトウェア面について 最初のプロジェクト作成ということで、手順等を忘れないよう、自分的メモをのこします。 今回は新規にled というフォルダを作成して管理することにます。 プロジェクトは D:\Raspberry Pi Pico\projects\led に配置します。 また、Raspberry Pi Pico SDK は、D:\Raspberry Pi Pico\pico-sdk に配置し 環境変数PICO_SDK_PATH にこのパスを設定しておきます。 setx PICO_SDK_PATH "D:\Raspberry Pi Pico\pico-sdk" プロジェクト内の作成ファイル(led下のファイル) ① pico_sdk_import.cmake pico sdk利用のためのファイル ② CMakeLists.txt プロジェクトファイル ③ led.c プログラム本体 ①の pico_sdk_import.cmake は、pico-sdk\external\pico_sdk_import.cmake をコピーして配置します。 ②はドキュメントを参考にして新規作成です。内容は次の通りです。
今回はプログラムソースがled.c のみのためCMakeLists.txt の記述はらくちんです。 いずれ、自作ライブラリのビルド、自作ライブラリのリンク等の記述方法についても学んでいきたいと思います。 Lチカの本体のプログラムは次のような感じです。
始めてSDKのAPIをつかいましたが、他のarm用sdkと比較すると、やれクロック活性化だのと前準備が不要でお手軽です。Arduino のような感じで利用出来て、大変良いですね。 プログラム的には、LED_PIN配列で8個のIOポートのマッピング、update() 関数に引数に8ビット(8個のLEDの状態)を指定してLEDのオン・オフの設定を行っています。 今回は1つ1つのLEDの状態を設定していますが、8ビット同時出力が出来るか調べて、やってみたいと思います。 一方で直接レジスタ操作して、低レベルなことも出来るようです。 これについても、ちょっとやってみます。プログラムのビルド ビルド作業はコマンドプロンプト 「Developer Command Prompt for VS2019」上で行います。 プロジェクトファイル(MAKEFILE)の作成 mkdir build cd build cmake -G "NMake Makefiles" .. これで、nmake 用のmakeファイル が作成されます。 ファイル構成の変更がない限りは、1回だで実行です。 ビルド nmake led プログラムファイルの更新の都度、nmake コマンドでビルドします。 これで、build 下に led.uf2 が作成されます。 あとは、led.uf2 をRaspberry Pi Pico に書き込むだけです。追記 2021/03/13 流せる電流の疑問の件、左端のLEDの抵抗を200Ω、150Ω、100Ωと換えていき、 流れる電流を増やす実験をしてみました。100Ωを接続すると、LEDが点灯しなくなりました(下記の写真)。 100Ωの場合、流れる電流は13mAです。 まだ何とも言えませんが、電流制御の機能が働いていて、出力がストップされた感じです。 padの設定を12mAにしてこの挙動が変わるかと試してみました。 下記が検証用のプログラムです。
実行時の出力(設定されていることの確認) 同じことをやってみましたが、挙動が一緒で100Ωの場合に、LEDが点灯しなくなりました。 もしかしたら、上記プログラムだと設定できていないのかもしれません。いずれにしても、大きい電流出力防止的な機能があるようです。 もう少し、調べてみます。2021/03/15 追記 データシートの「5.2.3.5. Interpreting GPIO output voltage specifications」 にGIPO の出力特性に関する記載があり、何となく原因が分かりました。 次のグラフは、GPIO ピンの出力電圧、流れる電流、padのdrive の設定の関係を示すものです。 (上がHigh、下はlow時)GPIO ピンにHigh (LEDを点灯させる場合)を出力した場合、 実際の出力電圧は流れる電流が増えるほど下がるようです。またdive の設定でその傾きは変更可能..100Ω の抵抗を接続した場合にLED が消えてしまったのは、順方向電圧低下が原因だと思われます。 あとで、再実験して電圧・電流を測定して検証してみます。
最近のコメント