この記事は何?
以前から組込み向けのリアルタイムOSに興味がありました。
そして、Arduinoで比較的簡単にFreeRTOSを動作させている方がいたので、
私も試してみることにしました。
その際の検証手順と内容を備忘録として残しておきます。
参考にさせて頂いたURL
検証内容
マルチタスクが期待通りに動作しているかを、以下のシンプルな回路とプログラムで確認します。
最初に、Arduinoに2つのLEDと1つのスイッチを接続し、
1つのLEDを3秒ごとに点滅させ、もう1つのLEDはスイッチが押されている間だけ消灯するプログラムを作成します。
RTOSのないプログラムでは、3秒ごとの点滅をdelay関数で実現するため、待機中はスイッチの入力を受け付けません。
一方、RTOSを利用したプログラムでは、2つのLEDの制御を別々のタスクとして実行するため、待機中でもスイッチの入力を受け付けます。
これらのプログラムを実際に実行し、スイッチを押してみることで、
その違いを確かめることができます。
準備
回路設計
部品リストと配線図を以下に示します。
部品名 | 個数 |
---|---|
Arduino Uno R3 | 1 |
ブレッドボード | 1 |
LED(赤) | 1 |
LED(緑) | 1 |
カーボン抵抗(560Ω 1/6W) | 2 |
タクトスイッチ | 1 |
※こちらの画像をお借りしました。
FreeRTOSのインストール
Arduino IDEのライブラリマネージャから、FreeRTOSを見つけてインストールします。
プログラム作成
以下に、RTOSなしのコードと、RTOSありのコードを示します。
- RTOSなし
void setup() {
// put your setup code here, to run once:
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
int SW = digitalRead(8);
if(SW == HIGH){
digitalWrite(6, HIGH);
//digitalWrite(7, HIGH);
}
else{
digitalWrite(6, LOW);
//digitalWrite(7, LOW);
}
digitalWrite(7, HIGH);
delay(3000);
digitalWrite(7, LOW);
delay(3000);
}
- RTOSあり
#include <Arduino_FreeRTOS.h>
void TaskA( void *pvParameters );
void TaskB( void *pvParameters );
void setup() {
// put your setup code here, to run once:
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, INPUT_PULLUP);
xTaskCreate(
TaskA
, "TaskA"
, 128
, NULL
, 1
, NULL );
xTaskCreate(
TaskB
, "TaskB"
, 128
, NULL
, 2
, NULL );
}
void loop() {
}
void TaskA(void *pvParameters)
{
(void) pvParameters;
for (;;)
{
int SW = digitalRead(8);
if(SW == HIGH){
digitalWrite(6, HIGH);
}
else{
digitalWrite(6, LOW);
}
}
}
void TaskB(void *pvParameters)
{
(void) pvParameters;
for (;;)
{
digitalWrite(7, HIGH);
delay(3000);
digitalWrite(7, LOW);
delay(3000);
}
}
検証結果
実際に回路を接続し、スイッチを押してみて、予想通りの動作が確認できました。
今後は自宅で利用できるIoTデバイスや、簡単なロボットの制作に活用してみたいと思います。以上です。