Member 11940917 Ответов: 0

Visual basic, Arduino, bluetooth и SNES контроллер


Друзья, я пытаюсь сделать контроллер SNES, который работает через bluetooth на моем ноутбуке, с последовательными портами. У моего ноутбука родной bluetooth. Микроконтроллер Arduino с помощью модуля bluetooth отправляет символы в мою программу, созданную на Visual Basic. Программа на Visual Basic преобразует эти символы в символы клавиатуры. Проблема заключается в чувствительности клавиш. Когда я настраиваю клавиатуру как контроллер в любом эмуляторе SNES, клавиши не работают как обычные клавиши клавиатуры. Например, если контроллер отправляет символ «D» программе на Visual Basic и «D» означает «идти вправо» на эмуляторе, «идти вправо» не работает, как если бы я нажал «D» на реальном клавиатура. Я оставлю код как для Arduino, так и для программы, разработанной на Visual Basic. Друзья, пожалуйста, как сделать так, чтобы чувствительность клавиатуры функционировала как настоящая клавиатура? не могли бы вы мне помочь, пожалуйста ? спасибо всем за внимание

Код Arduino
 #include <SoftwareSerial.h>
SoftwareSerial BTMasterHC05(2, 3); // RX do BT | TX do BT
 char statusbutton = 0;
// Controller buttons
// (based on button-to-clock pulse assignment)
#define SNES_B        32768  // 1000000000000000
#define SNES_Y        16384  // 0100000000000000
#define SNES_SELECT   8192   // 0010000000000000
#define SNES_START    4096   // 0001000000000000
#define SNES_UP       2048   // 0000100000000000
#define SNES_DOWN     1024   // 0000010000000000
#define SNES_LEFT      512   // 0000001000000000
#define SNES_RIGHT     256   // 0000000100000000
#define SNES_A         128   // 0000000010000000
#define SNES_X          64   // 0000000001000000
#define SNES_L          32   // 0000000000100000
#define SNES_R          16   // 0000000000010000
 
// Arduino pins vs. SNES controller pins
// (default is latch 2, clock 3, data 4)
int LatchPin  = 5; // Latch
int ClockPin  = 6; // Clock
int DataPin   = 7; // Serial Data
 
// Current controller data
unsigned int ControllerData = 0;
 
// Setup the controller and serial output
void setup() {
  Serial.begin(57600);
  BTMasterHC05.begin(9600);
  pinMode(LatchPin,OUTPUT);
  pinMode(ClockPin,OUTPUT);
  pinMode(DataPin,INPUT);
 
  digitalWrite(LatchPin,HIGH);
  digitalWrite(ClockPin,HIGH);
}
 
// Read controller
void controllerRead() {
  // Reset controller states and data
  ControllerData = 0;
  digitalWrite(LatchPin,LOW);
  digitalWrite(ClockPin,HIGH);
 
  // Controller needs to latch the state of all buttons
  digitalWrite(LatchPin,HIGH);
  delayMicroseconds(12);
  digitalWrite(LatchPin,LOW);
  delayMicroseconds(6);
 
  // Read controller data (initial reading)
  ControllerData = digitalRead(DataPin);
 
  // Send 16 clock pulses, one for each button. 
  for (int i = 0; i < 16; i ++) {
	digitalWrite(ClockPin,LOW);
	delayMicroseconds(6);
	ControllerData = ControllerData << 1;
	ControllerData = ControllerData + digitalRead(DataPin) ;
	delayMicroseconds(6);
	digitalWrite(ClockPin,HIGH);
  }
 
  // Do a NOT, so '1' will be pressed buttons and '0' to the rest
  ControllerData = ~ControllerData;
}
 
// Program code
void loop() {
  // Read controller data
  controllerRead();
  
    while(BTMasterHC05.available() > 0){
      statusbutton =(char) BTMasterHC05.read();
      //imprime na Serial caso receba caracteres
      Serial.println(statusbutton);
    }
     
 
  //Mantem a leitura do HC-06 e envia para Serial do Arduino
  if (BTMasterHC05.available()){
    Serial.write( BTMasterHC05.read());
 }
 
  //Mantém a Leitura no Arduino e Envia para o HC-06
  if (Serial.available()){
    BTMasterHC05.write(Serial.read());
  }
 
  if (ControllerData != 0) {
	Serial.print("Pressed:");
	if (ControllerData & SNES_B) {
	  BTMasterHC05.write('J');
	}
	if (ControllerData & SNES_Y) {
	  BTMasterHC05.write('U');
	}
	if (ControllerData & SNES_SELECT) {
	BTMasterHC05.write('2');
	}
	if (ControllerData & SNES_START) {
	  BTMasterHC05.write('1');
	}
	if (ControllerData & SNES_UP) {
	  BTMasterHC05.write('W');
	}
	if (ControllerData & SNES_DOWN) {
	  BTMasterHC05.write('S');
	}
	if (ControllerData & SNES_LEFT) {
	 BTMasterHC05.write('A');
	}
	if (ControllerData & SNES_RIGHT) {
	  BTMasterHC05.write('D');
	}
	if (ControllerData & SNES_A) {
	 BTMasterHC05.write('K');
	}
	if (ControllerData & SNES_X) {
	  BTMasterHC05.write('I');
	}
	if (ControllerData & SNES_L) {
	  BTMasterHC05.write('L');
	}
	if (ControllerData & SNES_R) {
	BTMasterHC05.write('R');
	}
  }
  
  delay(16);
}


Извините за комментарии на португальском языке, но я считаю, что вы можете понять код.

Спасибо всем.

Что я уже пробовал:

А здесь-программный код Visual Basic.

Imports System
Imports System.IO.Ports
Imports System.Threading

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim sports As String() = System.IO.Ports.SerialPort.GetPortNames

        If sports Is Nothing Then
            MsgBox("Não foram encontradas portas seriais nesse computador")
        End If

        For i = 0 To UBound(sports)
            ComboBox1.Items.Add(sports(i))
            ComboBox1.SelectedIndex = 0
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            SerialPort1.PortName = ComboBox1.SelectedItem
            SerialPort1.BaudRate = 57600
            SerialPort1.DataBits = 8
            SerialPort1.Parity = IO.Ports.Parity.None
            SerialPort1.StopBits = IO.Ports.StopBits.One

            SerialPort1.Open()
            MsgBox("Conectou !")
            lbl_1.Text = "divirta-se ! ;-)"

        Catch ex As Exception
            SerialPort1.Close()

            MsgBox("Erro ao conectar porta Serial")
        End Try
    End Sub

       Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Dim strongo As String = SerialPort1.ReadExisting()

        If strongo = "W" Then
            SendKeys.Send("w")
        Else
        End If

        If strongo = "S" Then
            SendKeys.Send("s")
        End If

        If strongo = "D" Then

            SendKeys.Send("d")
        End If

        If strongo = "A" Then
            SendKeys.Send("a")

        End If

        If strongo = "1" Then
            SendKeys.Send("p")
        End If

        If strongo = "K" Then
            SendKeys.Send("k")
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        MsgBox("Esta é mais uma aplicação desenvolvida por Dan Fayal ! Obrigado por usar !")

        SerialPort1.Close()
    End Sub

End Class

0 Ответов