Сервоприводы и джойстик PS/2

Нет ответов
unlceRoma
Offline
Зарегистрирован: 25.08.2016

Добрый день всем !  Делаю танк Карл Герат из бумаги с упрвлением ардуино через джойстик PS/2. Нужна Ваша помощь в скетче - не могу прописать код , чтобы серва двигалась плавно от нажатия кнопок в разных направлениях, например , от нажатия L1-вниз и L2 -вверх.  От стикера(джойстика)  все получается, но надо от кнопок . 






// движение гусеницами через драйвер L298N(сделано).
// опускание и поднимание корпуса танка двумя сервоприводами
// опускание и поднимание пушки сервоприводом
// заталкивание снаряда в дуло  сервоприводом
// открывание затвора сервоприводом
// движение дула сервоприводом
// выстрел через реле


#define pin1 A0    //   из -за недостатка пинов
#define pin2 A1    //   назначаю
#define pin3 A2    //   эти выводы 
#define pin4 A3    //   для драйвера L298N

#include <Servo.h>
#include <PS2X_lib.h>  //for v1.6



 
PS2X ps2x;
int PS2 = 0;



Servo servo_1;       
Servo servo_2;


const int ena = 3;     // PWM pin to change speed         левая гусеница           Джойстик

const int enb = 5;     // PWM pin to change speed         правая гусеница          Джойстик




int fspeed;           // forward speed

int pos_1 = 90;
int pos_2 = 50;

void setup() {

  servo_1.attach(6);
  servo_2.attach(8);
 
  PS2 = ps2x.config_gamepad(13, 11, 10, 12, true, true); //Настройка выводов: (clock, command, attention, data, true, true)

  pinMode(ena, OUTPUT);      // connection to L298n       Джойстик
  pinMode(enb, OUTPUT);      // connection to L298n       Джойстик
  pinMode(pin1, OUTPUT);     //  вывод для L298N
  pinMode(pin2, OUTPUT);     //  вывод для L298N
  pinMode(pin3, OUTPUT);     //  вывод для L298N
  pinMode(pin4, OUTPUT);     //  вывод для L298N

}

void loop() {

  ps2x.read_gamepad();


  // Движение гусеницами

  if (ps2x.Analog(PSS_RY) == 128) analogWrite(ena, 0);
  if (ps2x.Analog(PSS_LY) == 128) analogWrite(enb, 0);


  if (ps2x.Analog(PSS_RY) > 128) {
    fspeed = map(ps2x.Analog(PSS_RY), 129, 255, 0, 255);
    digitalWrite(pin1, LOW);
    digitalWrite(pin2, HIGH);
    analogWrite(ena, fspeed);
  }

  if (ps2x.Analog(PSS_RY) < 128) {
    fspeed = map(ps2x.Analog(PSS_RY), 0, 127, 255, 0);
    digitalWrite(pin1, HIGH);
    digitalWrite(pin2, LOW);
    analogWrite(ena, fspeed);
  }

  if (ps2x.Analog(PSS_LY) > 128) {
    fspeed = map(ps2x.Analog(PSS_LY), 129, 255, 0, 255);
    digitalWrite(pin3, LOW);
    digitalWrite(pin4, HIGH);
    analogWrite(enb, fspeed);
  }

  if (ps2x.Analog(PSS_LY) < 128) {
    fspeed = map(ps2x.Analog(PSS_LY), 0, 127, 255, 0);
    digitalWrite(pin3, HIGH);
    digitalWrite(pin4, LOW);
    analogWrite(enb, fspeed);
  }


  // Принудительное опускание корпуса танка (два серво запарарелить)

       if(ps2x.ButtonPressed(PSB_R1))       
        {
         servo_1.attach (6);
         servo_1.write (30);
        }
 
      if(ps2x.ButtonPressed(PSB_R2))
        {
        servo_1.write (150);
        delay(200);
        servo_1.detach ();
        }

        
    // Опускание и подъем пушки

    if(ps2x.ButtonPressed(PSB_L1))     
        {
         servo_2.attach (8);
         servo_2.write (30);
        }
     if(ps2x.ButtonPressed(PSB_L2))
        {
        servo_2.write (150);
        delay(200);
        servo_2.detach ();
        }     
      delay(10);
 
}