Sru*_*unt 5 bluetooth arduino unity-game-engine hc-05
我想通过蓝牙将我的Unity 3D 游戏与Arduino等微控制器连接,为此我使用(HC\xe2\x80\x9005) 蓝牙模块。
\n为此,资源商店中有一个名为Arduino Bluetooth Plugin Link 的插件。\n收费为 19 美元。
\n有没有其他方法可以通过使用免费功能和编码来做到这一点?
\n是的。
不是 100% 确定,但我认为蓝牙的工作方式与 USB 连接非常相似。这是 Unity 中 Arduino 的 C# 控制器的示例,可与 Arduino USB 连接配合使用:
using System;
using System.IO.Ports;
using UnityEngine;
using UnityEngine.UI;
public class ArduinoController : MonoBehaviour
{
[Header("Messages")]
[SerializeField] private String m_MessageReaded = "";
[SerializeField] private String m_MessageSended = "";
[Header("SerialPort values")]
[SerializeField] private String m_COM = "COM7";
[SerializeField] private int m_baudrate = 115200;
[SerializeField] private int m_readTimeout = 10;
[SerializeField] private int m_writeTimeout = 10;
[SerializeField] private float m_delay = 0.05f;
private SerialPort m_serialPort;
private float m_lastSentTime;
//Initialize and open SerialPort, set timers
void Start()
{
m_serialPort = new SerialPort(m_COM, m_baudrate)
{
ReadTimeout = m_readTimeout,
WriteTimeout = m_writeTimeout
};
OpenPort(m_serialPort);
m_lastSentTime = Time.time;
}
// Update is called once per frame
void Update()
{
ManageArduinoCommunication();
}
//Encapsulated try-catch to open the port
void OpenPort(SerialPort port)
{
try
{
port.Open();
print("Open Port " + port.PortName);
}
catch (Exception e)
{
print("Do not open Port " + port.PortName);
}
}
public void ManageArduinoCommunication()
{
if (m_serialPort != null)
{
if (m_serialPort.IsOpen)
{
//WRITE TO ARDUINO
WriteToArduino();
//READ FROM ARDUINO
ReadFromArduino();
}
}
else
{
OpenPort(m_serialPort);
}
}
private void WriteToArduino()
{
m_MessageSended = "";
if (!Input.GetKeyDown(KeyCode.LeftShift))
{
if (Input.GetKeyDown(KeyCode.Alpha2))
{
m_MessageSended = "openGate";
m_serialPort.WriteLine(m_MessageSended);
}
if (Input.GetKeyDown(KeyCode.Alpha4))
{
m_MessageSended = "closeGate";
m_serialPort.WriteLine(m_MessageSended);
}
}
}
private void ReadFromArduino()
{
if (Time.time - m_lastSentTime >= m_delay)
{
try
{
m_MessageReaded = m_serialPort.ReadLine();
}
catch (TimeoutException e)
{
// no-op, just to silence the timeouts.
// (my arduino sends 12-16 byte packets every 0.1 secs)
}
m_lastSentTime = Time.time;
}
}
private void OnApplicationQuit()
{
m_serialPort.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
然后您需要 Arduino 端的代码类似于以下内容:
//define PINS
#define DOOR_PIN_OPEN 26
#define DOOR_PIN_OPEN_2 27
#define DOOR_PIN_CLOSE 30
#define DOOR_PIN_CLOSE_2 31
//declare variables
bool isOpen = false;
String message = "";
void setup() {
//Set pinModes
pinMode(DOOR_PIN_OPEN,OUTPUT);
pinMode(DOOR_PIN_OPEN_2,OUTPUT);
pinMode(DOOR_PIN_CLOSE,OUTPUT);
pinMode(DOOR_PIN_CLOSE_2,OUTPUT);
//Set initial values
digitalWrite(DOOR_PIN_OPEN, HIGH);
digitalWrite(DOOR_PIN_OPEN_2, HIGH);
digitalWrite(DOOR_PIN_CLOSE, LOW);
digitalWrite(DOOR_PIN_CLOSE_2, LOW);
Serial.begin(115200);
}
void loop() {
if(Serial.available() > 0){
ReadSensorsStates();
//CheckSerialInputs();
ReadFromUnity();
UpdateSensorsStates();
}
else{
//Serial.println("not available");
}
}
void ReadSensorsStates(){
//Start the sensors reading
isOpen = ( digitalRead(DOOR_PIN_OPEN) == LOW );
//Serial.println(isOpen);
}
void CheckSerialInputs(){
}
void ReadFromUnity()
{
message = Serial.readString();
message = message.substring(0,message.length() -2); //purge \0\n
if( message == "openGate" ){
Serial.println(message);
delay(500);
digitalWrite(DOOR_PIN_OPEN, HIGH);
digitalWrite(DOOR_PIN_CLOSE, LOW);
}
if(message == "closeGate"){
Serial.println(message);
delay(500);
digitalWrite(DOOR_PIN_OPEN, LOW);
digitalWrite(DOOR_PIN_CLOSE, HIGH);
}
//reset variables
message = "";
delay(200);
}
void UpdateSensorsStates()
{
//code to update sensorsStates
}
Run Code Online (Sandbox Code Playgroud)
有了所有这些信息,您肯定可以弄清楚蓝牙是否需要任何额外的配置或修改,如果是这种情况请告诉我们^^
| 归档时间: |
|
| 查看次数: |
6382 次 |
| 最近记录: |