[M5Stack Core2 for AWS] Arduinoでサーボモータを操作してみました

2021.07.25

1 はじめに

IoT事業部の平内(SIN)です。

今回は、Arduinoを使用してM5Stack Core2 for AWSでサーボモーターを操作してみました。

最初に、動作確認している様子です。0度から180度の間で45度づつ回転させています。

2 SG90 9 g Micro Servo

使用したサーボモーター は、SG90 9g Micro Servoです。

こちらは、50HzのPWMで、Duty Cycleを0.5〜2.4msに設定することで、-90度から+90度までの180度の範囲に回転させることができます。


https://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf

3 ledcモジュール

ledcモジュールを使用するとPWM出力を簡単に行うことができます。

下記で、周波数50Hz、解像度16ビットで初期化し、GPIO 32にアタッチしています。

#define SERVO_PIN 32
#define SERVO_CH  0
#define PWM_HZ 50
#define PWM_RESOLUTION 16

ledcSetup(SERVO_CH, PWM_HZ, PWM_BIT);
ledcAttachPin(SERVO_PIN, SERVO_CH);

初期化後は、HIGHにする期間を指定します。

ledcWrite(SERVO_CH, duty_cycle);

なお、duty_cycleは、0.5/20msから2.4/20msで指定しています。

#define MAX 7800 // 65535 / 20 * 2.4 ≒ 7864 
#define MIN 1700 // 65535 / 20 * 0.5 ≒ 1638

int duty_cycle  = map(angle, 0, 180, MIN, MAX);

duty_cycleを変えている様子をオシロで確認しています。

3 コード

コードは、以下の通りです。

#include <M5Core2.h>
#include <stdio.h>

#define SERVO_PIN  32
#define SERVO_CH   0
#define PWM_HZ 50
#define PWM_BIT 16 // 16bit(0~65535)

#define MAX 7800 // 65535 / 20 * 2.4 ≒ 7864 
#define MIN 1700 // 65535 / 20 * 0.5 ≒ 1638

void setup() {

    M5.begin(true, true, true, false); // I2C無効(PORTA をGPIOで使用するため)

    ledcSetup(SERVO_CH, PWM_HZ, PWM_BIT);
    ledcAttachPin(SERVO_PIN, SERVO_CH);

    M5.Lcd.setBrightness(200);
    M5.Lcd.setTextSize(2);
    M5.Lcd.setTextFont(7);

    M5.Lcd.setTextColor(GREEN);
}
void loop() {
    char str[128];
    for (int angle = 0; angle <= 180; angle += 45) {
        int duty_cycle  = map(angle, 0, 180, MIN, MAX); 
        ledcWrite(SERVO_CH, duty_cycle);

        M5.Lcd.fillScreen(BLACK);
        M5.Lcd.setCursor(80, 80);
        sprintf(str,"%3d", angle);
        M5.Lcd.drawCentreString(str, 150, 70, 7);
        delay(1000);
    }
}

4 最後に

今回は、M5Stack Core2 for AWSで、サーボモーターを操作してみました。 なお、サーボモータへの給電は、M5Stackから吸い出すことはできません。Groveの5Vを接続すると、すぐに再起動がかかってしまて安定動作できないので、注意が必要です。

GPIOでM5Stack外部のデバイスを制御しだすと、少し、応用が広がってくるようで楽しめます。

5 参考リンク


Visual Studio Code + PlatformIO 環境で M5Stack Core2 for AWS でHello Worldしてみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してLEDを光らせてみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してディスプレイに表示してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して仮想ボタンの動作を確認してみました
[M5Stack Core2 for AWS] LVCLを使用してディスプレイ上のボタンの動作を確認してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して電源を操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してスピーカーを操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して静電容量式タッチパネルを操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してジャイロセンサーを操作してみました
[M5Stack Core2 for AWS] PlatformIO を使用して、ArduinoでHello Worldしてみました
[M5Stack Core2 for AWS] ArduinoでLED (Adafruit NeoPixel フルカラーLED) を点灯してみました
[M5Stack Core2 for AWS] Arduinoで仮想ボタンを作成してみました
[M5Stack Core2 for AWS] ArduinoでMQTT接続してみました
[M5Stack Core2 for AWS] Arduinoでオーディオファイルを再生してみました
[M5Stack Core2 for AWS] Arduinoでマイクの利用方法を確認してみました
[M5Stack Core2 for AWS] ArduinoでGroveポートのGPIOを使用しててみました