Amigos, tenho um robô do tipo Tank, na qual quero mudar todo o seu controle para utilizar no Joystick do PS3!

Para isso comprei duas Pontes-H IBT2 43A

Cada ponte H dessa, possui 2 pinos PWM (1 para cada direção ) de direção e 2 PWM de ENABLE (1 para cada direção)

Gostaria de utilizar somente Joystick esquerdo para controlar o TANK, pois o Joystick direito irá controlar a câmera Pan/Tilt

Encontrei um código pronto no fórum do Arduino.cc e tentei adapta-lo a minha necessidade porém não obtive sucesso, pois não consigo o controle de velocidade por PWM no código.
Alguém poderia me ajudar na adaptação da função MAP ( acredito eu que seja essa ) para controle ?

[code]

#include <PS3USB.h>
#include <AFMotor.h>

USB Usb;
PS3USB PS3(&Usb);

AF_DCMotor g_motor1(1, MOTOR12_8KHZ);
AF_DCMotor g_motor2(2, MOTOR12_8KHZ);
AF_DCMotor g_motor3(3, MOTOR12_8KHZ);
AF_DCMotor g_motor4(4, MOTOR12_8KHZ);

//y = PS3.getAnalogHat(LeftHatY);
//x = PS3.getAnalogHat(LeftHatX);

void setup() {
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start"));
while(1); //halt
}
Serial.print(F("\r\nPS3 USB Library Started"));
}

void loop() {
Usb.Task();

if(PS3.PS3Connected || PS3.PS3NavigationConnected) {
//print X and Y values on serial monitor
Serial.print(F("\r\nLeftHatX: "));
Serial.print(PS3.getAnalogHat(LeftHatX));
Serial.print(F("\tLeftHatY: "));
Serial.print(PS3.getAnalogHat(LeftHatY));

//set motor directions as forward for all Y < 120
if(PS3.getAnalogHat(LeftHatY) < 120) {
g_motor1.run(FORWARD);
g_motor2.run(FORWARD);
g_motor3.run(FORWARD);
g_motor4.run(FORWARD);
}
//set motor directions as backward for all Y > 135
if(PS3.getAnalogHat(LeftHatY) > 135) {
g_motor1.run(BACKWARD);
g_motor2.run(BACKWARD);
g_motor3.run(BACKWARD);
g_motor4.run(BACKWARD);
}
//set speeds for when the joystick is pushed directly up
if(PS3.getAnalogHat(LeftHatY) < 120 && PS3.getAnalogHat(LeftHatX) > 120 && PS3.getAnalogHat(LeftHatX) < 135) {
g_motor1.setSpeed((PS3.getAnalogHat(LeftHatY)-120)*-2.125);
g_motor2.setSpeed((PS3.getAnalogHat(LeftHatY)-120)*-2.125);
g_motor3.setSpeed((PS3.getAnalogHat(LeftHatY)-120)*-2.125);
g_motor4.setSpeed((PS3.getAnalogHat(LeftHatY)-120)*-2.125);
}
//set speeds for when the joystick is pushed directly down
if(PS3.getAnalogHat(LeftHatY) > 135 && PS3.getAnalogHat(LeftHatX) > 120 && PS3.getAnalogHat(LeftHatX) < 135) {
g_motor1.setSpeed((PS3.getAnalogHat(LeftHatY)-135)*2.125);
g_motor2.setSpeed((PS3.getAnalogHat(LeftHatY)-135)*2.125);
g_motor3.setSpeed((PS3.getAnalogHat(LeftHatY)-135)*2.125);
g_motor4.setSpeed((PS3.getAnalogHat(LeftHatY)-135)*2.125);
}
//set speeds for when joystick is pushed directly left
if(PS3.getAnalogHat(LeftHatX) < 120 && PS3.getAnalogHat(LeftHatY) > 120 && PS3.getAnalogHat(LeftHatY) < 135) {
g_motor1.setSpeed(0);
g_motor2.setSpeed((PS3.getAnalogHat(LeftHatX)-120)*-2.125);
g_motor3.setSpeed((PS3.getAnalogHat(LeftHatX)-120)*-2.125);
g_motor4.setSpeed(0);
}
//set speeds for when joystick is pushed directly right
if(PS3.getAnalogHat(LeftHatX) > 135 && PS3.getAnalogHat(LeftHatY) > 120 && PS3.getAnalogHat(LeftHatY) < 135) {
g_motor1.setSpeed((PS3.getAnalogHat(LeftHatX)-135)*2.125);
g_motor2.setSpeed(0);
g_motor3.setSpeed(0);
g_motor4.setSpeed((PS3.getAnalogHat(LeftHatX)-135)*2.125);
}

//set speeds for when joystick is pushed up and right
if(PS3.getAnalogHat(LeftHatY) < 120 && PS3.getAnalogHat(LeftHatX) > 135) {
g_motor1.setSpeed((PS3.getAnalogHat(LeftHatY)-120)*-2.125);
g_motor2.setSpeed((PS3.getAnalogHat(LeftHatX)-255)*-2.125);
g_motor3.setSpeed((PS3.getAnalogHat(LeftHatX)-255)*-2.125);
g_motor4.setSpeed((PS3.getAnalogHat(LeftHatY)-120)*-2.125);
}
//set speeds for when joystick is pushed up and left
if(PS3.getAnalogHat(LeftHatY) < 120 && PS3.getAnalogHat(LeftHatX) < 120) {
g_motor1.setSpeed((PS3.getAnalogHat(LeftHatX))*2.125);
g_motor2.setSpeed((PS3.getAnalogHat(LeftHatY)-120)*-2.125);
g_motor3.setSpeed((PS3.getAnalogHat(LeftHatY)-120)*-2.125);
g_motor4.setSpeed((PS3.getAnalogHat(LeftHatX))*2.125);
}
//set speeds for when joystick is pushed down and left
if(PS3.getAnalogHat(LeftHatY) > 135 && PS3.getAnalogHat(LeftHatX) < 120) {
g_motor1.setSpeed((PS3.getAnalogHat(LeftHatX))*2.125);
g_motor2.setSpeed((PS3.getAnalogHat(LeftHatY)-135)*2.125);
g_motor3.setSpeed((PS3.getAnalogHat(LeftHatY)-135)*2.125);
g_motor4.setSpeed((PS3.getAnalogHat(LeftHatX))*2.125);
}
//set speeds for when joystick is pushed down and right
if(PS3.getAnalogHat(LeftHatY) > 135 && PS3.getAnalogHat(LeftHatX) > 135) {
g_motor1.setSpeed((PS3.getAnalogHat(LeftHatY)-135)*2.125);
g_motor2.setSpeed((PS3.getAnalogHat(LeftHatX)-255)*-2.125);
g_motor3.setSpeed((PS3.getAnalogHat(LeftHatX)-255)*-2.125);
g_motor4.setSpeed((PS3.getAnalogHat(LeftHatY)-135)*2.125);
}

//stopping
if(PS3.getAnalogHat(LeftHatY) > 120 && PS3.getAnalogHat(LeftHatY) < 135 && PS3.getAnalogHat(LeftHatX) > 120 && PS3.getAnalogHat(LeftHatX) < 135) {
g_motor1.setSpeed(0);
g_motor2.setSpeed(0);
g_motor3.setSpeed(0);
g_motor4.setSpeed(0);
}
}
}

[/code]


Obs.: Não é possível utilizar o mesmo pino de PWM para as duas direções pois o BTS7960 possui FET's de proteção para não acionar as duas direções ao mesmo tempo.

Nesse video ele executa exatamente o desejado, porém utilizando XBOX + Raspberry PI
https://youtu.be/z9gSZwVMybc?t=160


Qualquer ajuda é bem vinda.

Exibições: 157

Responder esta

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço