ふたたび)SG90のサーボー信号を計算してみる(角度からPWM長を直接求める)




注意、いろいろ
----

- 過去ログを見よ!!!
- なんどか「シリアルモニター」を開き直す(windows系)
- なぜか連続でシリアル出力するとかけるで、ウエート
- 3.1.2
- あまり正確では、ない
- 10ビット(1024)の固定小数点の処理をしている
- おどしでも、冗談でもなく、サーボ系は、一発で終わるので、ちょとめんどい。(悪い意味)


目的
----

無線でラジコンサーボ SG90を制御する(予定)

結果
----


```

ESP-ROM:esp32c6-20220919

.........
1秒は、1000000nS(ナノ秒)
50Hzは、20mS(マイクロ秒)
20mSは、20000nS(ナノ秒)
20000nSを4096カウントで割ると4.88nS
0.5mSは、500nSで、500nSを4.88で割ると102カウント
2.4mSは、2400nSで、2400nSを4.88で割ると492カウント
492カウント引く102カウントは、390カウント
390カウントを180で割る2.17カウント
角度に2.17カウント掛けて、102カウント足す

[0]<102>
[1]<104>
[2]<106>
[3]<108>
[4]<110>
[5]<112>
[6]<114>
[7]<117>
[8]<119>
[9]<121>
[10]<123>
[11]<125>
[12]<127>
[13]<130>
[14]<132>
[15]<134>
[16]<136>
[17]<138>
[18]<140>
[19]<143>
[20]<145>
[21]<147>
[22]<149>
[23]<151>
[24]<153>
[25]<156>
[26]<158>
[27]<160>
[28]<162>
[29]<164>
[30]<166>
[31]<168>
[32]<171>
[33]<173>
[34]<175>
[35]<177>
[36]<179>
[37]<181>
[38]<184>
[39]<186>
[40]<188>
[41]<190>
[42]<192>
[43]<194>
[44]<197>
[45]<199>
[46]<201>
[47]<203>
[48]<205>
[49]<207>
[50]<210>
[51]<212>
[52]<214>
[53]<216>
[54]<218>
[55]<220>
[56]<222>
[57]<225>
[58]<227>
[59]<229>
[60]<231>
[61]<233>
[62]<235>
[63]<238>
[64]<240>
[65]<242>
[66]<244>
[67]<246>
[68]<248>
[69]<251>
[70]<253>
[71]<255>
[72]<257>
[73]<259>
[74]<261>
[75]<264>
[76]<266>
[77]<268>
[78]<270>
[79]<272>
[80]<274>
[81]<276>
[82]<279>
[83]<281>
[84]<283>
[85]<285>
[86]<287>
[87]<289>
[88]<292>
[89]<294>
[90]<296>
[91]<298>
[92]<300>
[93]<302>
[94]<305>
[95]<307>
[96]<309>
[97]<311>
[98]<313>
[99]<315>
[100]<318>
[101]<320>
[102]<322>
[103]<324>
[104]<326>
[105]<328>
[106]<330>
[107]<333>
[108]<335>
[109]<337>
[110]<339>
[111]<341>
[112]<343>
[113]<346>
[114]<348>
[115]<350>
[116]<352>
[117]<354>
[118]<356>
[119]<359>
[120]<361>
[121]<363>
[122]<365>
[123]<367>
[124]<369>
[125]<372>
[126]<374>
[127]<376>
[128]<378>
[129]<380>
[130]<382>
[131]<384>
[132]<387>
[133]<389>
[134]<391>
[135]<393>
[136]<395>
[137]<397>
[138]<400>
[139]<402>
[140]<404>
[141]<406>
[142]<408>
[143]<410>
[144]<413>
[145]<415>
[146]<417>
[147]<419>
[148]<421>
[149]<423>
[150]<426>
[151]<428>
[152]<430>
[153]<432>
[154]<434>
[155]<436>
[156]<438>
[157]<441>
[158]<443>
[159]<445>
[160]<447>
[161]<449>
[162]<451>
[163]<454>
[164]<456>
[165]<458>
[166]<460>
[167]<462>
[168]<464>
[169]<467>
[170]<469>
[171]<471>
[172]<473>
[173]<475>
[174]<477>
[175]<480>
[176]<482>
[177]<484>
[178]<486>
[179]<488>
[180]<490>

```


プログラム
----


```c++


//servo_sg90_test1_M5NanoC6_1


//インクルド
#include <Arduino.h>


//定義
//使い方　SOのマクロに0から180を設定すると
//PWMの間隔の値が返る
//        a = SO(i);
//        //a = SO(180-i);
//V_0が0度の時の初期値で単位は、nS(ナノ秒)
//V_180が180度の時の初期値で単位は、nS(ナノ秒)
#define V_0    500
#define V_180 2400
//#define Width_0_180   (V_180-V_0)
#define Wavelength_1count (((1000000/50)*1024)/4096)
#define T_MIN ((V_0*1024)/Wavelength_1count)
#define T_MAX ((V_180*1024)/Wavelength_1count)
#define HH  ((T_MAX-T_MIN)*1024)/180
#define SO(AA) (T_MIN+(((AA)*(HH))>>10))
//#define M_SO(AA) (SO(180-(AA)))


void setup() {
  // put your setup code here, to run once:

  //シリアルの初期化 //debug(1)
  Serial.begin(9600);
  Serial.println();
  //シリアルの待ちが0.5*9
  for (int i = 0; i < 9; i++) {
    Serial.print('.'); delay(500); //接続待ち
  } //for
  Serial.println();
  delay(500);

  Serial.println("1秒は、1000000nS(ナノ秒)");delay(1);
  Serial.println("50Hzは、20mS(マイクロ秒)");delay(1);
  Serial.println("20mSは、20000nS(ナノ秒)");delay(1);
  Serial.println("20000nSを4096カウントで割ると4.88nS");delay(1);
  Serial.println("0.5mSは、500nSで、500nSを4.88で割ると102カウント");delay(1);
  Serial.println("2.4mSは、2400nSで、2400nSを4.88で割ると492カウント");delay(1);
  Serial.println("492カウント引く102カウントは、390カウント");delay(1);
  Serial.println("390カウントを180で割る2.17カウント");delay(1);
  Serial.println("角度に2.17カウント掛けて、102カウント足す");delay(1);
  Serial.println();delay(1);

  int a;
  for (int i = 0; i < (180 + 1); i++) {
    a = SO(i); //正転
    //a = M_SO(i); //逆転
    //a = SO(180-i);
    printf("[%d]<%d>\n", i, a);delay(1);
  }//for

}//setup


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

  delay(300);  //0.3秒待つ

}//loop

```