久しぶりにサーボを動かそうとしてて、M5StickCでプログラムを組んでたら
This pin can not be a servo: 36 Servo available on: 2,4,5,12-19,21-23,25-27,32-33
という表示が出て動かなかった。
Servo available onで表示されているピンが対象ということらしい。
という訳でM5StickCからM5Atomにへ変更。
M5AtomならG22,G19,G23,G33と左側(裏面)端子全部が対象になっている。
#include <Arduino.h> #include <M5Unified.h> #include <ESP32Servo.h> typedef enum { ServoStateInit, ServoStateOffA, ServoStateA, ServoStateOffB, ServoStateB, } ServoState; class Pusher { private: Servo _servo; int _pin_no; ServoState _state; ServoState _ex_state; int _adjust_angle; int angle() { switch(_state) { case ServoStateA: return 90 - 10 + _adjust_angle; case ServoStateB: return 90 + 10 + _adjust_angle; default: return 90 + _adjust_angle; } } public: Pusher(int pin_no, int adjust_angle = 0) { _pin_no = pin_no; _state = _ex_state = ServoStateInit; _adjust_angle = adjust_angle; } void begin() { _servo.setPeriodHertz(50); _servo.attach(_pin_no, 500, 2400); setState(ServoStateOffA); } void setState(ServoState state) { _state = state; if (_ex_state != _state) { _servo.write(angle()); _ex_state = _state; } } void move_next() { _state = ServoState((int)_state + 1); switch(_state) { case ServoStateInit: case ServoStateOffA: case ServoStateOffB: case ServoStateA: case ServoStateB: break; default: _state = ServoStateOffA; } setState(_state); } }; static Pusher pushers[] = { Pusher(22, 3), Pusher(19, 8), Pusher(23, 10), }; void move_servos() { for (int i = 0; i < 3; i++) { pushers[i].move_next(); } } void setup() { auto cfg = M5.config(); M5.begin(cfg); M5.Display.setTextSize(3); M5.Display.setRotation(1); M5.Display.print("Hello World!!"); Serial.println("Hello World!!"); ESP32PWM::allocateTimer(0); ESP32PWM::allocateTimer(1); ESP32PWM::allocateTimer(2); ESP32PWM::allocateTimer(3); for (int i = 0; i < 3; i++) { pushers[i].begin(); } } void loop() { M5.update(); if (M5.BtnA.wasPressed()) { move_servos(); } delay(10); }