ステッピングモーターを動かす

ステッピングモーターを動かす

ステッピングモーターを動かす

バイポーラ型のステッピングモーターを動作させてみました。
ESP32に以下を繋げてます。

秋月電商さんの42SHD4404-24 バイポーラ型ステッピングモーター。

DRV8835モータードライバ。
取り合えず動けばいいやと、ブレッドボードに適当に配線して動かしました。

回路図

こんなんなります。配線するだけでOK。


ステッピングモーターについて

以下の順番に出力を切り替えていけば回ってくれます。
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本)

コメント

このブログの人気の投稿

(真)ESP32の開発環境をVSCodeで作る

ESP32にmicroSD接続

ESP32でデバッグ