0
0

Arduinoと簡単な回路でFreeRTOSの動作を試す

Last updated at Posted at 2024-02-25

この記事は何?

以前から組込み向けのリアルタイム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

20240224回路図.jpg

※こちらの画像をお借りしました。

FreeRTOSのインストール

Arduino IDEのライブラリマネージャから、FreeRTOSを見つけてインストールします。

20240224_freertos.jpg

プログラム作成

以下に、RTOSなしのコードと、RTOSありのコードを示します。

  • RTOSなし
sketch_twinLED_noRTOS.ino
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あり
sketch_twinLED_RTOS.ino
#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);
  }
}

検証結果

実際に回路を接続し、スイッチを押してみて、予想通りの動作が確認できました。

20240224_写真.jpg

今後は自宅で利用できるIoTデバイスや、簡単なロボットの制作に活用してみたいと思います。以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0