Сервоприводы и джойстик PS/2
- Войдите на сайт для отправки комментариев
Пнд, 12/09/2016 - 10:22
Добрый день всем ! Делаю танк Карл Герат из бумаги с упрвлением ардуино через джойстик 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);
}