[17] PWMでサーボモータ制御

[15] Arduino-IDEで動かしてみる(PWMドライバサンプル)」で、PWM制御を行いました。

PWMはITUをPWMモードにすることによって実現しています。
[15]ではITU1を使用してPA4に対しduty cycle を設定し、波形を採取しました。

今回は、サーボモータを接続し制御してみました。

1. ハードウェア構成

PA4端子と、GND,Vccをそれぞれサーボモータに接続します。

今回使用したサーボモータは「SG92R」です。

SG92Rの黒線:GND
SG92Rの赤線:Vcc(5v)
SG92Rの黄線:PA4

以下拡大版です。

補足:
上記では、サーボモータに対する電源をボードから3.3Vで取得しています。(サーボモータ側は5Vの仕様ですが、3.3Vでも動作はするため)
ですので、動作時に十分な電流を供給するためには、ボードではなく別途電源を用意した方が良いです。
本記事では、PWM動作を見ることが主旨であり、モータを完全に動作させることはあまり意図してはいないため、簡易的にボードから電源供給しています。

1. プログラムの準備

まず、「[15] Arduino-IDEで動かしてみる(PWMドライバサンプル)」を一度動作させてみることをお勧めします。
Arduinoのバージョン2を使用する場合は、「[16] Arduino-IDE 2.0.4を使用する」に、セットアップ方法を記載しています。

その上で、Arduino-IDEの新しいスケッチを起動し、以下のプログラムをコピー&ペーストしてください。

#include <Arduino.h>
#include <FreeRTOS.h>
#include <task.h>

void vPwm(void *pvParameters);

// put your setup code here, to run once:
void setup() {
    xTaskCreate(vPwm, (signed portCHAR *)"PWM", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

    vTaskStartScheduler();
}

void loop() {
    // put your main code here, to run repeatedly:
}

void vPwm(void *pvParameters) {
    timer_error_code_t ret;
    ret = PWM_Open(1);
    if (ret == TIMER_SUCCESS) {
        PWM_SetPeriodAndDuty(1, 1000, 10000);
        PWM_Start(1);

        vTaskDelay(2000/portTICK_RATE_MS); // delay 2s

        PWM_SetPeriodAndDuty(1, 1500, 10000);
        PWM_Start(1);

        vTaskDelay(2000/portTICK_RATE_MS); // delay 2s

        PWM_SetPeriodAndDuty(1, 2000, 10000);
        PWM_Start(1);

        vTaskDelay(2000/portTICK_RATE_MS); // delay 2s
        PWM_Stop(1);
    }

    while (1) {
        vTaskDelay(1);
    }
}

ビルドします。
(IDEを2.1.0にした際に和文化しておらず、図が英文となっています)

2. 実行

他のサンプル同様、あらかじめE10A-USB経由でBootloader部をダウンロードし、リセット後実行をしておきます。

サンプルをダウンロード&実行してみます。

「マイコンボードに書き込む」を選択すると、ビルドが行われ、書き込みを開始しようとします。(図は英文なので「Upload」となっています)

実行すると、以下のように動作します。

①サーボが0度の位置に動作します。

②2秒待ちます。

③サーボが45度の位置に動作します。

④2秒待ちます。

⑤サーボが90度の位置に動作します。