Bluetooth Soft Serial и контроллер PS2 на Arduino Леонардо

Я пытаюсь объединить два входных источника, которые распознаются как один геймпад / контроллер. Для этой цели я использую Arduino Leonardo, который можно легко преобразовать в устройство HID, используя Joystick.h библиотека. В качестве входных данных я использую (1) контроллер PS2 с библиотекой PS2x и (2) последовательные данные Bluetooth, поступающие с HC-05, работающего в режиме мастера.

Я создал отдельный эскиз для чтения и анализа данных Bluetooth и даже смог переслать его через Joystick.h библиотека для ПК.

В то же время, чтобы использовать контроллер PS2, я подключил PS2 к USB с помощью того же Arduino Leonardo. Однако, когда я попытался объединить эти два эскиза (объединить два входа от BT и PS2), что-то не получилось.

Я выяснил, что PS2_lib, используемый для чтения значений из контроллера PS2, не позволяет Arduino читать данные BTSerial или наоборот.

Вот эскиз, когда ReadOneByte() называется, ничего не работает.

byte ReadOneByte() {
  int ByteRead;
  while(!BTSerial.available());
  ByteRead = BTSerial.read();
  return ByteRead;
}

Если я закомментирую цикл while, PS2 и геймпад работают.

Полный эскиз:

#include <PS2X_lib.h>  //for v1.6
#include "Joystick.h"
#include<SoftwareSerial.h>


Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
    12, 2, // Button Count, Hat Switch Count
    true, true, true, // X and Y, but no Z Axis
    false, false, true, // No Rx, Ry, or Rz
    false, false, // No rudder or throttle
    false, false, false);  // No accelerator, brake, or steering

#define PS2_DAT        3  //14    
#define PS2_CMD        2  //15
#define PS2_SEL        12  //16
#define PS2_CLK        13  //17

//#define pressures true
#define pressures false
//#define rumble true
#define rumble false

const bool testAutoSendMode = false;
SoftwareSerial BTSerial(11, 10);
PS2X ps2x;

int error = 0;
byte type = 0;
byte vibrate = 0;

void setup() {
  SoftwareSerial BTSerial(11, 10);
  BTSerial.begin(57600);
  Serial.begin(57600);
  delay(300);
  Joystick.begin();
  //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, true, false);
  type = ps2x.readType();
  Joystick.setXAxisRange(0, 255);
  Joystick.setZAxisRange(0, 255);
  Joystick.setYAxisRange(0, 255);
  Joystick.setRzAxisRange(0, 255);
}

byte ReadOneByte() {
  int ByteRead;
  while (!BTSerial.available());
  ByteRead = BTSerial.read();
  return ByteRead;
}

void loop() {
  ReadOneByte() ;
  // Always be getting fresh data
  if (error == 1) //skip loop if no controller found
    return;
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
  ps2x.read_gamepad(false, 0);
  Joystick.setButton(0, ps2x.Button(PSB_TRIANGLE));
  Joystick.setButton(1, ps2x.Button(PSB_CIRCLE));
  Joystick.setButton(2, ps2x.Button(PSB_CROSS));
  Joystick.setButton(3, ps2x.Button(PSB_SQUARE));
  Joystick.setButton(4, ps2x.Button(PSB_L2));
  Joystick.setButton(5, ps2x.Button(PSB_R2));
  Joystick.setButton(6, ps2x.Button(PSB_L1));
  Joystick.setButton(7, ps2x.Button(PSB_R1));
  Joystick.setButton(8, ps2x.Button(PSB_SELECT));
  Joystick.setButton(9, ps2x.Button(PSB_START));
  Joystick.setButton(10, ps2x.Button(PSB_L3));
  Joystick.setButton(11, ps2x.Button(PSB_R3));
  Joystick.setXAxis(ps2x.Analog(PSS_LX));
  Joystick.setYAxis(ps2x.Analog(PSS_LY));
  Joystick.setZAxis(ps2x.Analog(PSS_RY));
  Joystick.setRzAxis(ps2x.Analog(PSS_RX));
  if (ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed
    Joystick.setYAxis(0);
  }
  if (ps2x.Button(PSB_PAD_RIGHT)) {
    Joystick.setXAxis(255);
  }
  if (ps2x.Button(PSB_PAD_LEFT)) {
    Joystick.setXAxis(0);
  }
  if (ps2x.Button(PSB_PAD_DOWN)) {
    Joystick.setYAxis(255);
  }
}

0 ответов

Другие вопросы по тегам