リモコン移動作業ロボット:ソースコード:ServoSupport.h

#pragma once
//ServoSupport.h
//copyright 2022 https://robot-creation-diary.com/
//20230320角度周りの整数値を100倍にした
#include <Wire.h> 
#include "SerialSupport.h"
#include "WheelSupport.h"
#include <Adafruit_PWMServoDriver.h>
#define SERBO_NUMBER (18)//サーボの数
#define DATA_NUMBER (20)//車輪も含めた数
#define WEAKNESS_ANGLE (100000)
#define ANGLE_MAX (22000)
#define PWM_FREQ (50)
#define PULSE_LENGTH ((long)1000000/PWM_FREQ)
#define MG996R_SERVOMIN  ((long)400  * (long)4096 / PULSE_LENGTH)    // 最小パルス幅(μs)
#define MG996R_SERVOMAX  ((long)2600 * (long)4096 / PULSE_LENGTH)   // 最大パルス幅(μs)
#define UNWKNOW_SERVOMIN ((long)500  * (long)4096 / PULSE_LENGTH)    // 最小パルス幅(μs)
#define UNWKNOW_SERVOMAX ((long)2500 * (long)4096 / PULSE_LENGTH)    // 最大パルス幅(μs)
#define MS18_SERVOMIN    ((long)550  * (long)4096 / PULSE_LENGTH)    // 最小パルス幅(μs)
#define MS18_SERVOMAX    ((long)2400 * (long)4096 / PULSE_LENGTH)    // 最大パルス幅(μs)

class CServoSupport{
public:
  CServoSupport();
  ~CServoSupport();
  void Continue();
  int GetRecievedDataSize(); //受信したデータの大きさを得る
  void SetSerialDataSize( int dsize); //シリアル通信で使うデータの大きさを設定
  unsigned char GetIndexRecievedData(int i ); //シリアル通信で得た指定位置のデータを得る
  
  int SetRecievedData(unsigned char rdata); //シリアル通信で得たデータをサーボの角度データとして保存

  int GetIndexServoAngle(unsigned int i); //指定番号のサーボデータを設定

  void SetSerovoData(); //保存されたサーボデータを実際にサーボモータに設定する
  void SetAllWeakness(); //すべてのサーボを脱力する。
  void _SetWeakness(int i, Adafruit_PWMServoDriver &pwm1, Adafruit_PWMServoDriver &pwm2); //すべてのサーボを脱力する。
private:
  CSerialSupport mRecievedData; //シリアル通信からデータの受け取り
  int mServoAngles[DATA_NUMBER]; //各サーボの角度
  int mPreServoAngles[DATA_NUMBER];// サーボの角度設定を何度も呼ばないようにするために

  Adafruit_PWMServoDriver mpwm1;
  Adafruit_PWMServoDriver mpwm2;
  int mError;
  
};