【Arduino&FreeRTOS】リアルタイムOS基礎の基礎

目次

YouTube動画

動画内で作成したスケッチ

動画内の「スケッチの基本形」で作成したスケッチです。それぞれの制御ブロックがわかりやすいようにコメントを追加しています。

#include <Arduino_FreeRTOS.h>  // FreeRTOSライブラリ

// ------- LEDの制御スケッチ -------
#define RED_LED_PIN 12

void LedControl() {
  // --- setup関数の内容 ---
  pinMode(RED_LED_PIN, OUTPUT);

  for (;;) {
    // --- loop関数の内容 ---
    digitalWrite(RED_LED_PIN, HIGH);
    vTaskDelay(pdMS_TO_TICKS(500));
    digitalWrite(RED_LED_PIN, LOW);
    vTaskDelay(pdMS_TO_TICKS(500));
  }
}


// ------- サーボモーターの制御スケッチ -------
#include <Servo.h>  // ライブラリインクルード
#define SERVO_PIN 6  // 制御線の接続ピン
Servo servo;  // オブジェクト生成

void ServoControl() {
  // --- setup関数の内容 ---
  servo.attach(SERVO_PIN);
  servo.write(0);

  for (;;) {
    // --- loop関数の内容 ---
    for (int angle = 0; angle <= 90; angle++) {
      servo.write(angle);
      vTaskDelay(pdMS_TO_TICKS(30));
    }
    for (int angle = 90; angle >= 0; angle--) {
      servo.write(angle);
      vTaskDelay(pdMS_TO_TICKS(30));
    }
  }
}


void setup() {
  // --- LED制御スケッチの設定 ---
  xTaskCreate(
    LedControl,
    "LED Control",
    128,
    NULL,
    2,
    NULL);

  // --- サーボモーター制御スケッチの設定 ---
  xTaskCreate(
    ServoControl,
    "Servo Motor Control",
    128,
    NULL,
    2,
    NULL);
}

void loop() {
  // FreeRTOSスケッチではloop関数は何も書かない
}

FreeRTOSスケッチの基本形

複数の電子部品を制御するFreeRTOSスケッチの基本形をまとめます。

次の制御は3個の電子部品を独立して同時制御する内容です。

電子部品を制御するそれぞれのタスクは「task1」「task2task3」としています。

#include <Arduino_FreeRTOS.h>  // FreeRTOSライブラリ

// ------- 1個目の電子部品制御スケッチ(タスク1) -------
// --- この部分に定数定義など必要内容を書く

void task1() {
  // --- ここからfor(;;)の前までの範囲に、通常スケッチのsetup関数の内容を書く ---

  for (;;) {
    // --- この部分に、通常スケッチのloop関数の内容を書く ---

  }
}

// ------- 2個目の電子部品制御スケッチ(タスク2) -------
// --- この部分に定数定義など必要内容を書く

void task2() {
  // --- ここからfor(;;)の前までの範囲に、通常スケッチのsetup関数の内容を書く ---

  for (;;) {
    // --- この部分に、通常スケッチのloop関数の内容を書く ---

  }
}

// ------- 3個目の電子部品制御スケッチ(タスク3) -------
// --- この部分に定数定義など必要内容を書く

void task3() {
  // --- ここからfor(;;)の前までの範囲に、通常スケッチのsetup関数の内容を書く ---

  for (;;) {
    // --- この部分に、通常スケッチのloop関数の内容を書く ---

  }
}

void setup() {
  // --- タスク1のスケッチの設定 ---
  xTaskCreate(
    task1,
    "Task 1",
    128,
    NULL,
    2,
    NULL);

  // --- タスク1のスケッチの設定 ---
  xTaskCreate(
    task2,
    "Task 2",
    128,
    NULL,
    2,
    NULL);

  // --- タスク1のスケッチの設定 ---
  xTaskCreate(
    task3,
    "Task 3",
    128,
    NULL,
    2,
    NULL);
}

void loop() {
  // FreeRTOSスケッチではloop関数は何も書かない
}

上のスケッチを利用する際に次の注意点があります。

  • task1」などのタスク名を「LedControl」などの名前に変更する場合、制御部分のvoid task1() {の「task1」と、setup関数内のxTaskCreateの最初の引数「task1」を同時に変更する必要があります
  • それぞれのタスク制御内で時間待ちをする場合、delay関数ではなくvTaskDelay(pdMS_TO_TICKS(待ち時間))関数を使用します
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次