YouTube動画
動画内容の注意点
動画では説明を簡単にするために、FreeRTOSスケッチを極力シンプルにしました。ただ、シンプルにしすぎた結果、Arduno Uno R4ではビルドエラーになってしまいます。
動画内では、FreeRTOSの基本形として、通常のスケッチをFreeRTOSスケッチに書き直すとき、次のようなフォーマットにする、と説明しています。
// ヘッダー部分
// #defineなど
void LedControl() {
// --- setup関数の内容 ---
// pinMode設定など
for (;;) {
// --- loop関数の内容 ---
}
}このコードをArduino Uno R4でビルドするとエラーになってしまいます。
多くのArduinoボードで動作させるには、上のコードの4行目を次のように書き換える必要があります。
// ヘッダー部分
// #defineなど
void LedControl(void *pvParameters) {
// --- setup関数の内容 ---
// pinMode設定など
for (;;) {
// --- loop関数の内容 ---
}
}ポイントは、引数のところにvoid *pvParametersと書く点です。
以下の内容はこの点を反映しています。
Arduino IDEのライブラリマネージャーでインストールしたFreeRTOSライブラリは、ちょっと雑な書き方をしても動作するようになっています。
一方、Arduino Uno R4などの最近のArduinoボードでは、デフォルトでFreeRTOSライブラリが利用できるようになっています(Arduino Uno R4では、ライブラリマネージャーでインストールしたFreeRTOSではなく、デフォルトで利用できるライブラリを使用しています)
Arduino Uno R4のデフォルトで利用できるFreeRTOSライブラリは、文法が厳密にチェックされるようになっています。
このような違いから、雑に書いたスケッチではエラーになってしまいます。
なお、厳密に書けばどちらのライブララリでもビルドできますので、このページに掲載したスケッチは厳密な書き方に修正しています。
動画内で作成したスケッチ
動画内の「スケッチの基本形」で作成したスケッチです。それぞれの制御ブロックがわかりやすいようにコメントを追加しています。
#include <Arduino_FreeRTOS.h> // FreeRTOSライブラリ
// ------- LEDの制御スケッチ -------
#define RED_LED_PIN 12
void LedControl(void *pvParameters) {
// --- 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(void *pvParameters) {
// --- 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」「task2」task3」としています。
#include <Arduino_FreeRTOS.h> // FreeRTOSライブラリ
// ------- 1個目の電子部品制御スケッチ(タスク1) -------
// --- この部分に定数定義など必要内容を書く
void task1(void *pvParameters) {
// --- ここからfor(;;)の前までの範囲に、通常スケッチのsetup関数の内容を書く ---
for (;;) {
// --- この部分に、通常スケッチのloop関数の内容を書く ---
}
}
// ------- 2個目の電子部品制御スケッチ(タスク2) -------
// --- この部分に定数定義など必要内容を書く
void task2(void *pvParameters) {
// --- ここからfor(;;)の前までの範囲に、通常スケッチのsetup関数の内容を書く ---
for (;;) {
// --- この部分に、通常スケッチのloop関数の内容を書く ---
}
}
// ------- 3個目の電子部品制御スケッチ(タスク3) -------
// --- この部分に定数定義など必要内容を書く
void task3(void *pvParameters) {
// --- ここから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(待ち時間))関数を使用します
