前回一応動いたので今回はカメラをつけたサーボモータを車両につけた。

 

 

よくわからないが、プログラムにサーボモータのライブラリー<ESP32Servo.h>を使ってもうまく行かなかった。

そこで、モーターと同じようにledwriteを使うことにした。

ただ、パルス幅と周波数をサーボモータの仕様に合わせる必要があった。

 

duty=PH/((1/F*1000)/2^BIT)

PH ・・パルス幅(0.5~2.5msec)

BIT・・制御bit

F    ・・周波数(Hz)

 

周波数はサーボモータできまるらしいが、ほぼ50Hz。

パルス幅もこれくらいの範囲90度は1.5msec

制御bit dutyの数字が使いやすい数字にする。8でやったらdutyの数字が小さく使いにくかったので12bitにした。

 

サーボモーターは左の1ボタンで左回転、右の1ボタンで右回転、離すとそこで止まる。

中立は、左の1ボタンを押すと中立に戻る。

 

 

 

 
 

 

 

プログラム

 

//*****************************************************

#include <Ps3Controller.h>

 

int RY,LY,BR1,BL1,BBL1;

int MIN=10;

int MAX=128;

int MAX1=200;//400

int C_MAX=410;  //=1/((1/50*1000)/2^12)

int C_NE=307;   //=1.5/((1/50*1000)/2^12)

int C_MIN=200;   //=2/((1/50*1000)/2^12)

 

uint8_t RY1=14;

uint8_t RY2=27;

uint8_t LY1=26;

uint8_t LY2=25;

int C_PIN=12;//*************************

long R_SPEED,L_SPEED;

int CAMERA,CAMERA1;

uint32_t freq=12800;

uint8_t res=8;

 

void  setup()

{

    pinMode(LY1,OUTPUT);

    pinMode(LY2,OUTPUT);

    pinMode(RY1,OUTPUT);

    pinMode(RY2,OUTPUT);

    pinMode(C_PIN,OUTPUT);

    //myservo1.attach(C_PIN);//++++++++++++++++++++++

    Serial.begin(115200);

    Ps3.begin("7C:9E:BD:E9:A2:72"); //1.でメモしたmac adresに修正

    Serial.println("Ready");

 

    ledcAttach(LY1, freq, res);//pwm信号 ledcSetup(ピン番号, 周波数, 分解能)

    ledcAttach(LY2, freq, res);//pwm信号

    ledcAttach(RY1, freq, res);//pwm信号

    ledcAttach(RY2, freq, res);//pwm信号

    ledcAttach(C_PIN, 50, 12);//pwm信号  =1/((1/50*1000)/2^12)

    ledcWrite(LY2,0);

    ledcWrite(LY1,0);

    ledcWrite(RY1,0);    

    ledcWrite(RY2,0);

    ledcWrite(C_PIN,C_NE);  

}  

void  loop(){

  if  (Ps3.isConnected()){

    if (Ps3.data.button.ps){

    Serial.println("ps ボタン圧下");

    }

    LY= Ps3.data.analog.stick.ly;

    RY= Ps3.data.analog.stick.ry;

    L_SPEED=map(LY,-MAX,MAX,-MAX1,MAX1);

    R_SPEED=map(RY,-MAX,MAX,-MAX1,MAX1);

   

    BL1=Ps3.data.button.l1;

    BR1=Ps3.data.button.r1;

    BBL1=Ps3.data.button.l2;

    CAMERA=-BL1+BR1+CAMERA;

    if (BBL1==1) {CAMERA=0;}

 

    Serial.print(LY);

    Serial.print(" ");

    Serial.print(RY);

    Serial.print(" ");   

    Serial.print(" L_SPEED ");

    Serial.print(L_SPEED);

    Serial.print(" R_SPEED ");

    Serial.print(R_SPEED);  

 

    Serial.print(" BL1,BR1 ");  

    Serial.print(BL1);

    Serial.print(BR1);

    Serial.print(BBL1);  

 

//left speed

    if (abs(L_SPEED)<=MIN){//50以下なら 速度は0

      ledcWrite(LY2,0);

      ledcWrite(LY1,0);          

    }

    else if (L_SPEED>MIN){

      ledcWrite(LY2,0);  

      ledcWrite(LY1,abs(L_SPEED));        

    }

    else {

      ledcWrite(LY1,0);  

      ledcWrite(LY2,abs(L_SPEED));

    }

   

//right speed    

    if (abs(R_SPEED)<=MIN){

      ledcWrite(RY1,0);    

      ledcWrite(RY2,0);

    }

    else if (R_SPEED>MIN){

      ledcWrite(RY2,0);    

      ledcWrite(RY1,abs(R_SPEED));

    }

    else {

      ledcWrite(RY1,0);

      ledcWrite(RY2,abs(R_SPEED));    

    }

 

//CAMERA

   CAMERA1=CAMERA/20+C_NE;

   if (CAMERA1<C_MIN){CAMERA1=C_MIN;}

   if (CAMERA1>C_MAX){CAMERA1=C_MAX;}

   ledcWrite(C_PIN,CAMERA1);

   Serial.print(" CAMERA ");

   Serial.println(CAMERA1);

  }  

}

 

 

モニターへの書き込み部分は本来いらないけれど確認するときに使った。

相変わらず配線が下手。