Knurling Sessions 2020Q4 をやる (2) 〜基本編〜
はじめに
knurling-rs では Ferrous Systems が、スポンサー向けに組込み Rust の教材 knurling-session を提供しています。
knurling-session では、3ヶ月ごとに1つのテーマを取り上げています。 最新のもの以外は、公開されています。スポンサーになると最新のものも見れます。 また、スポンサーが増えると、knurling-rs に割く時間が増やせるため、ツールの改善や教材の整備が増えることが期待できます。 興味を持ったらスポンサーしましょう!
現在公開されている knurling-session の 2020 Q4 をやっていきます。 2020 Q4 は、nRF52840-DK と CO2 センサーを使ったプロジェクトです。
2020 Q4 のレンダリングされているドキュメントはこちら。
session20q4.ferrous-systems.com
前回、環境構築したので、LED やボタン使う基本からやっていきます。
tomo-wait-for-it-yuki.hatenablog.com
Hello World
nRF52840-DK ボード上の L チカからです。
コードは1_hello_extended.rs のような感じで、どこかで見たのと同じような感じだなぁ、となるかと思います。
External RGB LED
お次は、RGB LED を使って、様々な色で LED を点灯します。 3つ口のある LED というだけなので、それほど通常の L チカと違う感じではありません。
https://akizukidenshi.com/catalog/g/gI-02476/
が、サクッと家のどこかに埋まっている RGB LED を発掘できなかったので、nRF52840-DK の LED を3つ使って代替しました。
Internal Temperature Sensor
nRF52840 に搭載されている内蔵温度計の温度を defmt
を使って出力します。
別途 UART がいらないので、ここは非常に体験が良いです。
More about Methods
ここまでで作ったものをリファクタリングします。 この、どのピン選んでも動くようにジェネリックな型にするの良いですね。 (組込み Rust 本でもやりたかったのですが、お蔵入りになってます)
- struct LEDState { - r: P0_03<Output<PushPull>>, - b: P0_04<Output<PushPull>>, - g: P0_28<Output<PushPull>>, - } + struct LEDColor { + r: Pin<Output<PushPull>>, + b: Pin<Output<PushPull>>, + g: Pin<Output<PushPull>>, + }
初期化も次のよな感じで、GPIO ピンのモードをジェネリックパラメータにして、どんなモードのピンでも関数の引数に指定できるようになっています。
pub fn init<Mode>(led_red: Pin<Mode>, led_blue: Pin<Mode>, led_green: Pin<Mode>) -> LEDColor { LEDColor { r: led_red.into_push_pull_output(Level::High), b: led_blue.into_push_pull_output(Level::High), g: led_green.into_push_pull_output(Level::High), } }
Adding User - Input
ボタン入力を受け付けるやつです。 ボタンを押している間、LED が点灯するプログラムを作成します。 組込み Rust 本執筆中は読んでなかったのですが、やっぱ同じような過程を経るものですねぇ。
Adding User Input - Advanced
もう少し真面目にボタンが押された瞬間を受け付けます。 次のような型を定義して、立ち上がりエッジを検出します。
struct Button { pin: Pin<Input<PullUp>>, was_pressed: bool, }
ボタンが押されたら、温度を表示する単位を変換するコードを作成します。
Bringing it all Together
RGB LED と、温度とボタンを組み合わせたプログラムを作成します。 組み合わせだけなので、新しいことはないです。
次回とうとうお高い CO2 センサが登場します。