ステッピングモーターを動かす
ステッピングモーターを動かす
バイポーラ型のステッピングモーターを動作させてみました。
ESP32に以下を繋げてます。
秋月電商さんの42SHD4404-24 バイポーラ型ステッピングモーター。
DRV8835モータードライバ。
取り合えず動けばいいやと、ブレッドボードに適当に配線して動かしました。
回路図
ステッピングモーターについて
以下の順番に出力を切り替えていけば回ってくれます。
step1~4を順番に切り替えてゆくと左回りに回転します。
右回りにしたい場合はstepを逆に切り替えればOKです。
step | AOUT1 | AOUT2 | BOUT1 | BOUT2 |
---|---|---|---|---|
1 | H | L | L | L |
2 | L | L | H | L |
3 | L | H | L | L |
4 | L | L | L | H |
1stepで1.8°、200stepで1回転します。
回転中は500mA~600mAくらい消費しますので駆動用の電源は別に用意します。データシートには定格3.4Vと書いてあったのですが3.0Vでも動作しました。
プログラム
main.cを以下のようにします。
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/timers.h"
#include "nvs_flash.h"
#include "driver/gpio.h"
#include "esp_log.h"
#define TAG "StepMotor"
int step_counter = 0;
TaskHandle_t xHandle = NULL;
enum StepDirection {
left, // 左回り
right // 右回り
};
void task(void* arg);
void init() {
ESP_LOGI(TAG, "init(S)");
// GPIO初期化
gpio_num_t gpios[] = {CONFIG_STEP_MOTOR_AOUT1_GPIO, CONFIG_STEP_MOTOR_AOUT2_GPIO, CONFIG_STEP_MOTOR_BOUT1_GPIO, CONFIG_STEP_MOTOR_BOUT2_GPIO};
for(int i=0; i<4; i++) {
gpio_reset_pin(gpios[i]);
gpio_set_direction(gpios[i], GPIO_MODE_OUTPUT);
}
xTaskCreate(task, TAG, configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, &xHandle);
ESP_LOGI(TAG, "init(E)");
}
void motor_step(enum StepDirection step_direction) {
step_counter += step_direction == left ? 1 : -1;
step_counter = step_counter < 0 ? 3 : step_counter > 3 ? 0 : step_counter;
switch(step_counter) {
case 0:
// A(OUT1=H, OUT2=L), B(OUT1=L, OUT2=L)
gpio_set_level(CONFIG_STEP_MOTOR_AOUT1_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_AOUT2_GPIO, 0);
gpio_set_level(CONFIG_STEP_MOTOR_BOUT1_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_BOUT2_GPIO, 1);
break;
case 1:
// A(OUT1=L, OUT2=L), B(OUT1=H, OUT2=L)
gpio_set_level(CONFIG_STEP_MOTOR_AOUT1_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_AOUT2_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_BOUT1_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_BOUT2_GPIO, 0);
break;
case 2:
// A(OUT1=L, OUT2=H), B(OUT1=L, OUT2=L)
gpio_set_level(CONFIG_STEP_MOTOR_AOUT1_GPIO, 0);
gpio_set_level(CONFIG_STEP_MOTOR_AOUT2_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_BOUT1_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_BOUT2_GPIO, 1);
break;
case 3:
// A(OUT1=L, OUT2=L), B(OUT1=L, OUT2=H)
gpio_set_level(CONFIG_STEP_MOTOR_AOUT1_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_AOUT2_GPIO, 1);
gpio_set_level(CONFIG_STEP_MOTOR_BOUT1_GPIO, 0);
gpio_set_level(CONFIG_STEP_MOTOR_BOUT2_GPIO, 1);
break;
}
}
void task(void* arg) {
// 360°(1step=1.8°なので200step)回転したら逆回転
int step = 0;
enum StepDirection step_direction = left;
while(1) {
motor_step(step_direction);
vTaskDelay(5 / portTICK_PERIOD_MS);
step++;
if (step >= 200) {
step = 0;
step_direction = step_direction == left ? right : left;
}
}
}
void app_main(void)
{
nvs_flash_init(); // Flash初期化 (お約束のようなもの)
init();
}
ユニポーラ型のステッピングモーターは正転逆転が不要なのでHブリッジがいりません。スイッチのみで簡単に動作させられます。
でもESP32などマイコンで動作させる場合はモータードライバ+バイポーラ型の方が楽だと思います。
線も4本しかないですしね。(ユニポーラは6本)
コメント
コメントを投稿