Tengo un Gamepad gyro ch340 con un cjmcu beetle usb que reconoce Windows como Arduino micro, ambos llevan bluetooth hc05 y funcionaba bien hasta que hace poco volví a meterle el uso código pero cambiando un botón y ahora el mando se vuelve loco cuando lo conecto girando al azar y tocando botones al azar... Me da error compilando el receptor Arduino mega 2560, más abajo pone narrowing conversation of 167 int to char y así con varios números, quizá sea por eso? Todo parece compilar se bien... Gracias!!
Si pongo el código que me paso el creador del mando (mi amigo) empieza a presionar automáticamente los botones que utilizo en el Gamepad ejemplo fffffffffffffrrrrrrrrrrr. Sssaaaasddd y así infinitamente y tengo que desconectar el usb para que pare.. este es el código por si os dice algo
TRANSMISOR:
#include <I2Cdev.h>
#include <MPU6050.h>
#define Pul_bloquear_GYRO A7
#define JoystickMouse_x A2
#define JoystickMouse_y A3
#define Joystick_WS_x A10
#define Joystick_AD_y A11
#define Pul_F1 52
#define Pul_F2 50
#define Pul_F3 48
#define Pul_F4 46
#define Pul_1 30
#define Pul_2 34
#define Pul_3 32
#define Pul_4 36
#define Pul_R 3
#define Pul_E A4
#define Pul_F A12
#define Pul_SPACE 7
#define Pul_TAB 42
#define Pul_ESCAPE 44
#define Pul_MOUSE_LEFT 5
#define Pul_MOUSE_RIGHT 1
int pulArray[16] = {Pul_F1, Pul_F2, Pul_F3, Pul_F4, Pul_1, Pul_2, Pul_3, Pul_4, Pul_R, Pul_E, Pul_F, Pul_SPACE, Pul_TAB, Pul_ESCAPE, Pul_MOUSE_LEFT , Pul_MOUSE_RIGHT};
MPU6050 mpu;
int16_t ax, ay, az, gx, gy, gz;
int vx_gyro, vy_gyro;
unsigned long puldadores_DWORD;
void setup() {
Serial2.begin(38400);
//Serial.begin(9600);
pinMode(Pul_bloquear_GYRO, INPUT_PULLUP);
for (int i = 0; i < 16; i++)
{
pinMode(pulArray[i], INPUT_PULLUP);
}
Wire.begin();
mpu.initialize();
if (!mpu.testConnection()) {
while (1);
}
}
void loop() {
if (digitalRead(Pul_bloquear_GYRO) == 1)
{
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
vx_gyro = -(gz - 100) / 200;
vy_gyro = -(gy - 160) / 100;
}
else
{
int Ax = analogRead(JoystickMouse_x);
int Ay = analogRead(JoystickMouse_y);
vx_gyro = -(Ay - 526) / 40;
vy_gyro = (Ax - 515) / 40;
}
for (int i = 0; i < 16; i++)
{
puldadores_DWORD = (puldadores_DWORD << 1) | (1 - digitalRead(pulArray[i]));
}
int Aws = analogRead(Joystick_WS_x);
int Aad = analogRead(Joystick_AD_y);
puldadores_DWORD = (puldadores_DWORD << 1) | ((Aws > 900) ? 1 : 0);
puldadores_DWORD = (puldadores_DWORD << 1) | ((Aws < 300) ? 1 : 0);
puldadores_DWORD = (puldadores_DWORD << 1) | ((Aad < 300) ? 1 : 0);
puldadores_DWORD = (puldadores_DWORD << 1) | ((Aad > 900) ? 1 : 0);
Serial2.print("*");
Serial2.print(vx_gyro);
Serial2.print("#");
Serial2.print("%");
Serial2.print(vy_gyro);
Serial2.print("@");
Serial2.print("$");
Serial2.print(puldadores_DWORD);
Serial2.println("&");
}
RECEPTOR:
#include <SoftwareSerial.h>
#include <Mouse.h>
#include <Keyboard.h>
SoftwareSerial HC05_Serial(9, 10); // RX, TX
int vx, vy;
unsigned long puldadores_DWORD = 0;
unsigned long puldadores_DWORD_Last = 0;
char buttons[20] = {'D', 'A', 'S', 'W', MOUSE_RIGHT , MOUSE_LEFT, KEY_ESC, KEY_TAB, ' ', 'F', 'E', 'R', '4', '3', '2', '1', KEY_F4, KEY_F3, KEY_F2, KEY_F1};
void setup() {
HC05_Serial.begin(38400);
Serial.begin(38400);
Mouse.begin();
Keyboard.begin();
delay(1000);
Serial.println("Initialization Done!");
}
void loop() {
if (HC05_Serial.available() > 0)
{
String recTXT = HC05_Serial.readStringUntil('\n');
if (recTXT.indexOf("*") == 0)
{
vx = recTXT.substring(recTXT.indexOf("*") + 1, recTXT.indexOf("#") + 1).toInt();
vy = recTXT.substring(recTXT.indexOf("%") + 1, recTXT.indexOf("@") + 1).toInt();
puldadores_DWORD = recTXT.substring(recTXT.indexOf("$") + 1, recTXT.indexOf("&") + 1).toInt();
Mouse.move(vx, vy);
for (byte i = 0; i < 20; i++ )
{
if (i == 4 || i == 5)
{
if (bitRead(puldadores_DWORD, i) == 1 && bitRead(puldadores_DWORD_Last, i) == 0)
Mouse.press(buttons[i]);
else if (bitRead(puldadores_DWORD, i) == 0 && bitRead(puldadores_DWORD_Last, i) == 1)
Mouse.release(buttons[i]);
}
else
{
if (bitRead(puldadores_DWORD, i) == 1 && bitRead(puldadores_DWORD_Last, i) == 0)
Keyboard.press(buttons[i]);
else if (bitRead(puldadores_DWORD, i) == 0 && bitRead(puldadores_DWORD_Last, i) == 1)
Keyboard.release(buttons[i]);
}
}
Serial.print(vx);
Serial.print(" ");
Serial.print(vy);
Serial.print(" ");
Serial.println(puldadores_DWORD);
puldadores_DWORD_Last = puldadores_DWORD;
}
}
}
Gracias!!!
Última Actualización:
He comprobado que el problema es que el gyro presiona botones automáticamente en plan AASD WF EE y cosas así siguiendo un patrón según el movimiento, alguien sabe que falla en el código?
Por favor lee las Normas del foro y edita.