# 第2章: ベアメタルからの出発 OS を使わずに(ベアメタルで)、`loop()` の中の自作の協調的スケジューラが、LED の点滅・ サーボ角度の計算(表示だけで、サーボは不要)・A0 の読み取りの 3 つのタスクを順番に 回すところから始めます。 ## サンプルコード - ディレクトリ: `docs/os-on-arduino/code/02_baremetal` - ビルドと書き込み: ```bash uv run pio run -d 02_baremetal -t upload uv run pio device monitor -b 115200 ``` コードを見る: [docs/os-on-arduino/code/02_baremetal](https://github.com/iory/learning-os-from-arduino/tree/main/docs/os-on-arduino/code/02_baremetal) ## ソースコード この章のスケッチです。ファイル名をクリックすると開きます。コードは原稿リポジトリから自動で同期されているので、ここに出ているものが常に最新です。 :::{dropdown} `src/main.cpp` — 119 行 :icon: code [GitHub で開く](https://github.com/iory/learning-os-from-arduino/blob/main/docs/os-on-arduino/code/02_baremetal/src/main.cpp) ```{literalinclude} ../../../../code/02_baremetal/src/main.cpp :language: cpp :linenos: ``` ::: ## 実機での出力 Arduino UNO R4 WiFi の実機で実際に取得した出力です(macOS / Windows の 両方で同じ結果を確認しています)。手元の出力と見比べてください。 協調的スケジューラが 3 つのタスクを順に回しています。`Sensor value` は可変抵抗をつないでいなければ端子が拾うノイズです。 Servo タスクは角度を計算して表示するだけで、サーボには信号を出しません。サーボをつなぐ必要はありません。 ```{figure} ../_static/ch02_tasks.gif :name: fig-ch02-tasks :width: 100% `Servo angle` が 10 度ずつ動き、その合間に `LED` と `Sensor` が 挟まるところ。3 つのタスクが順番に回っているのが見えます ``` ```text [2500ms] Running: LED LED toggled [2500ms] Running: Servo Servo angle: 70 [2600ms] Running: Servo Servo angle: 80 [2600ms] Running: Sensor Sensor value: 219 [2700ms] Running: Servo Servo angle: 90 [2800ms] Running: Servo Servo angle: 100 [2800ms] Running: Sensor Sensor value: 219 ... ``` ## つまずきやすいポイント (読者からの質問に応じて随時追記します。質問は [GitHub Issues](https://github.com/iory/build-your-own-arduino-rtos/issues) へどうぞ)