ESP32のマルチスレッドで複数のサーボモータを同時に動かす方法

ゴール
ESP32で複数のサーボモーターを同時に動かす方法をご紹介します。
RTOSのタスクを使って、動画のように2つのサーボーモータを独立して動かします。
なんの工夫もなしに delay
関数を使ってサーボモータを動かそうとすると、ひとつのサーボモータの処理が終わるまで待たなければならず、同時に動かすことが難しいです。非ブロッキングなポーリング処理(コルーチン)で動かすやり方も考えられますが、コーディングが複雑になり管理が難しいです。ESP32ならばFree
RTOSのタスク機能(マルチスレッド)が使えますので、簡単に複数のサーボモータを動かすことが可能です。
ESP32のマルチスレッドで複数サーボを同時に動かす
ソースコード
次のコードは、FreeRTOSのタスク利用してマルチスレッドで複数サーボモータを制御する例です:
#include <Arduino.h>
#include <ESP32Servo.h>
#define SERVO_A_PIN 32
#define SERVO_B_PIN 33
, servoB;
Servo servoA
const int pulse_min = 544; // default 544us
const int pulse_max = 2400; // default 2400us
// プロトタイプ宣言
void taskServoA(void * parameter);
void taskServoB(void * parameter);
void setup() {
.begin(115200);
Serial.attach(SERVO_A_PIN, pulse_min, pulse_max);
servoA.attach(SERVO_B_PIN, pulse_min, pulse_max);
servoB.write(5); // リセット
servoA.write(5); // リセット
servoB(2000);
delay
// FreeRTOSを使用してタスクを作成
(taskServoA, "TaskServoA", 10000, NULL, 1, NULL);
xTaskCreate(taskServoB, "TaskServoB", 10000, NULL, 1, NULL);
xTaskCreate}
void loop() {
}
void taskServoA(void * parameter) {
for (;;) {
for (int pos = 5; pos <= 180; pos += 1) {
.write(pos);
servoA(2 / portTICK_PERIOD_MS);
vTaskDelay}
(700 / portTICK_PERIOD_MS);
vTaskDelay
for (int pos = 180; pos >= 5; pos -= 1) {
.write(pos);
servoA(2 / portTICK_PERIOD_MS);
vTaskDelay}
(700 / portTICK_PERIOD_MS);
vTaskDelay}
}
void taskServoB(void * parameter) {
for (;;) {
for (int pos = 5; pos <= 180; pos += 1) {
.write(pos);
servoB(6 / portTICK_PERIOD_MS);
vTaskDelay}
(300 / portTICK_PERIOD_MS);
vTaskDelay
for (int pos = 180; pos >= 5; pos -= 1) {
.write(pos);
servoB(6 / portTICK_PERIOD_MS);
vTaskDelay}
(300 / portTICK_PERIOD_MS);
vTaskDelay}
}
解説
サーボモータを、0度から180度へ行き来させるプログラミングです。サーボモータの制御は、ESP32Servo
ライブラリを使用しました。
本来は pos = 0
とすべきですが、サーボモータが震えてしまうため、5度までを下限として
pos = 5
のように宣言してます。
xTaskCreate
で、タスク(スレッド)を作成します。
一時停止を行いたい場合は delay
関数を使わずに、
vTaskDelay
で処理します。vTaskDelay
は、タスクを指定した時間だけブロック(一時停止)できます。
関連記事
- ArduinoでマイクロサーボモータSG90の使い方
- 【XYペンプロッター制作⑦】サーボモータでペンを上下させる(仮完成)
- 超音波センサHC-SR04の使い方|ArduinoとRaspberry Piで解説