1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-02-24

注意、いろいろ

  • 過去ログを見よ!!!
  • なんどか「シリアルモニター」を開き直す(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>

プログラム



//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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?