フォト
2021年8月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
無料ブログはココログ

« CMakeの調査 | トップページ | Raspberry Pi Picoのリセットボタンの実装 »

2021年3月11日 (木)

Raspberry Pi PicoでLチカ

Raspberry Pi PicoでのC/C++プロジェクト作成の練習として、8個の外部接続LEDを制御するプログラムを作ってみました。
その時のメモです。開発環境はWindows 10です。

ブレッドボード上での実装の様子
02_20210310191701

動いている様子


単純な点灯ですが、最初のプロジェクトの作成、最初のGIPOの制御ということで、色々と勉強になりました。

ハードウェア面について

まず回路的には、次のような感じでGP2GP9の8個のピンにLEDを接続しています。
01_20210310192101
LEDに流したい電流を4mAとして、順方向電圧VF2.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
ので出来るようです。

   04_20210311102201
とりあえず今回は設定変更はせず、デフォルト値の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」上で行います。
06_20210311113501

プロジェクトファイル(MAKEFILE)の作成
 mkdir build
 cd build
 cmake -G "NMake Makefiles" ..

これで、nmake用のmakeファイルが作成されます。
ファイル構成の変更がない限りは、1回だで実行です。

ビルド
  nmake led

プログラムファイルの更新の都度、nmakeコマンドでビルドします。
これで、build下に led.uf2が作成されます。
あとは、led.uf2Raspberry Pi Picoに書き込むだけです。


追記 2021/03/13

流せる電流の疑問の件、左端のLEDの抵抗を200Ω、150Ω、100Ωと換えていき、
流れる電流を増やす実験をしてみました。

100Ωを接続すると、LEDが点灯しなくなりました(下記の写真)。

07_20210313175101

100Ωの場合、流れる電流は13mAです。
まだ何とも言えませんが、電流制御の機能が働いていて、出力がストップされた感じです。

padの設定を12mAにしてこの挙動が変わるかと試してみました。
下記が検証用のプログラムです。

実行時の出力(設定されていることの確認)
20210315-093255

同じことをやってみましたが、挙動が一緒で100Ωの場合に、LEDが点灯しなくなりました。
もしかしたら、上記プログラムだと設定できていないのかもしれません。
いずれにしても、大きい電流出力防止的な機能があるようです。
もう少し、調べてみます。

2021/03/15 追記

データシートの「5.2.3.5. Interpreting GPIO output voltage specifications」
GIPOの出力特性に関する記載があり、何となく原因が分かりました。
次のグラフは、GPIOピンの出力電圧、流れる電流、padのdriveの設定の関係を示すものです。
(上がHigh、下はlow時)

20210315-120420

GPIOピンにHigh(LEDを点灯させる場合)を出力した場合、
実際の出力電圧は流れる電流が増えるほど下がるようです。またdiveの設定でその傾きは変更可能..
100Ωの抵抗を接続した場合にLEDが消えてしまったのは、順方向電圧低下が原因だと思われます。
あとで、再実験して電圧・電流を測定して検証してみます。

« CMakeの調査 | トップページ | Raspberry Pi Picoのリセットボタンの実装 »

Raspberry Pi」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« CMakeの調査 | トップページ | Raspberry Pi Picoのリセットボタンの実装 »