一、硬件选型与成本控制(总成本<¥200)
组件 | 型号 | 单价 | 数量 | 小计 | 购买渠道 |
---|---|---|---|---|---|
Arduino Nano | CH340芯片版 | ¥25 | 1 | ¥25 | 淘宝/拼多多 |
震动电机 | 1020空心杯电机(3-4V) | ¥2.5 | 5 | ¥12.5 | 电子元件商城 |
电机驱动模块 | L9110S双路电机驱动 | ¥3.8 | 3 | ¥11.4 | 淘宝 |
蓝牙模块 | HC-05从机模块 | ¥18 | 1 | ¥18 | 淘宝 |
手套基材 | 劳保棉线手套 | ¥5 | 1 | ¥5 | 本地超市 |
其他耗材 | 杜邦线、热熔胶等 | - | - | ¥30 | 已有/电子市场 |
总计 | ¥101.9 |
二、硬件接线方案
graph TD
A[Arduino Nano] -->|D2| B(L9110S模块1 IN1)
A -->|D3| C(L9110S模块1 IN2)
A -->|D4| D(L9110S模块2 IN1)
A -->|D5| E(L9110S模块2 IN2)
A -->|D6| F(L9110S模块3 IN1)
A -->|D7| G(L9110S模块3 IN2)
B --> H[电机1]
C --> H
D --> I[电机2]
E --> I
F --> J[电机3]
G --> J
A -->|TX/RX| K[HC-05蓝牙模块]
L[3.7V锂电池] --> M[L9110S VCC]
L --> N[Arduino VIN]
-
电机布局:
-
电机1:右手拇指指腹(翻晒阻力反馈)
-
电机2:右手掌心(蒸汽压力反馈)
-
电机3:左手手腕(系统警报反馈)
-
三、Arduino代码实现(C语言)
手把手教你完成Arduino代码的编写和上传,并提供最简化的操作流程。你只需要跟着以下步骤操作即可。
3.1 Arduino代码:从零开始详细步骤
1. 安装Arduino软件
- 下载地址:https://www.arduino.cc/en/software
选择适合你电脑系统的版本(Windows/Mac),安装时全部点“下一步”即可。
2. 连接Arduino到电脑
- 用USB线将Arduino Nano连接到电脑,电脑会自动安装驱动(如果失败,参考这个教程:点击这里)。
3. 创建新代码文件
- 打开Arduino软件,你会看到一个空白窗口。
- 直接复制以下代码(替换掉窗口里默认的所有内容):
// 震动手套简化版代码(小白专用)
void setup() {
// 设置3号、5号引脚为输出(对应两个手指的电机)
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
// 初始化串口通信(用于调试)
Serial.begin(9600);
}
void loop() {
// 如果电脑发送了指令(比如字符'A')
if (Serial.available() > 0) {
char cmd = Serial.read();
// 如果收到'A',启动3号引脚电机(强度50%)
if (cmd == 'A') {
analogWrite(3, 128); // 128代表50%功率(范围0-255)
Serial.println("震动大拇指!");
}
// 如果收到'B',停止所有电机
else if (cmd == 'B') {
analogWrite(3, 0);
analogWrite(5, 0);
Serial.println("停止震动!");
}
}
}
4. 上传代码到Arduino
- 在软件顶部菜单选择:
工具 > 开发板 > Arduino Nano
工具 > 端口 > 选择你的Arduino端口(例如COM3或/dev/cu.usbmodem*)
https://www.arduino.cc/wiki/static/dd361e5f9c43b4bb4e0466b15399e6d6/6a791/board-port.png - 点击左上角的 **→** 按钮(“上传”),等待显示“上传成功”。
3.2、硬件连接:最简版本(2个电机)
1. 所需材料
- Arduino Nano ×1
- 震动电机 ×2
- 电阻(220Ω) ×2
- MOSFET晶体管 ×2
- 电池(3.7V) ×1
- 面包板 ×1(可选,简化接线)
2. 接线图(跟着颜色做)
https://i.imgur.com/7Q0g4r2.png
- 红色线:电池正极 → 电机的正极(两个电机并联)
- 黑色线:电池负极 → MOSFET的源极(Source,引脚1)
- 黄色线:Arduino引脚3 → 电阻 → MOSFET的栅极(Gate,引脚3)
- 蓝色线:电机负极 → MOSFET的漏极(Drain,引脚2)
(第二个电机同理,接Arduino引脚5)
🔥 注意:MOSFET有方向!平的一面朝上,引脚从左到右为1(Gate), 2(Drain), 3(Source)
如果接反会烧坏,不确定请搜索“IRLB8721引脚图”
3.3、测试:让电机动起来!
- 保持Arduino通过USB连接电脑。
- 打开Arduino软件,点击右上角的 放大镜图标(“串口监视器”)。
- 在右下角输入框输入
A
然后点“发送”,观察大拇指电机是否震动。 - 输入
B
停止震动。
下面的代码备选
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX,TX
void setup() {
Serial.begin(9600);
BTSerial.begin(9600);
pinMode(2, OUTPUT); // 电机1控制引脚
pinMode(3, OUTPUT);
pinMode(4, OUTPUT); // 电机2控制引脚
pinMode(5, OUTPUT);
pinMode(6, OUTPUT); // 电机3控制引脚
pinMode(7, OUTPUT);
}
void loop() {
if (BTSerial.available()) {
char cmd = BTSerial.read();
// 示例指令格式:M1-200 (电机1震动200ms)
if(cmd == 'M') {
int motorNum = BTSerial.parseInt();
int duration = BTSerial.parseInt();
switch(motorNum) {
case 1:
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
delay(duration);
digitalWrite(2, LOW);
break;
case 2:
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
delay(duration);
digitalWrite(4, LOW);
break;
case 3:
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
delay(duration);
digitalWrite(6, LOW);
break;
}
}
}
}
四、Unity通信集成(C#脚本)
4.1 与Unity通信(无需蓝牙,先用有线测试)
1. Unity设置
- 在Unity中导入 Ardity插件(免费,下载地址:点击这里)
- 创建一个空物体,挂载以下脚本:
using UnityEngine;
using Ardity;
public class SimpleVibrate : MonoBehaviour {
void Update() {
if (Input.GetKeyDown(KeyCode.A)) {
// 发送字符'A'到Arduino
SerialPortManager.Instance.SendMessage("A");
}
if (Input.GetKeyDown(KeyCode.B)) {
// 发送'B'停止
SerialPortManager.Instance.SendMessage("B");
}
}
}
2. 运行测试
- 在Unity中点击Play,按键盘A/B键,观察电机是否响应。
常见问题解决
- 电机不震动
- 检查电池是否有电(用LED灯测试)
- 用万用表测量Arduino引脚3/5是否有电压(应有0~5V变化)
代码上传失败
- 重新拔插USB线,重启Arduino软件
- 确保选择了正确的开发板和端口
下一步:升级到无线(蓝牙)
如果你完成了以上步骤,可以购买 HC-05蓝牙模块(约¥30),接线如下:
- 蓝牙模块的 TX → Arduino的 RX(D0引脚)
- 蓝牙模块的 RX → Arduino的 TX(D1引脚)
- 蓝牙模块的 VCC → Arduino的 5V
- 蓝牙模块的 GND → Arduino的 GND
然后在Unity中改用蓝牙通信(需安装Android插件)。不过建议先掌握有线版本!
参考:
using System.Collections;
using UnityEngine;
using System.IO.Ports;
public class HapticController : MonoBehaviour {
private SerialPort serialPort;
void Start() {
// 蓝牙串口连接(需配对HC-05)
serialPort = new SerialPort("COM5", 9600); // COM端口根据实际修改
serialPort.Open();
}
// 触发震动示例:蒸笼揭盖时
public void OnSteamLidOpen() {
SendVibrationCommand(1, 500); // 电机1震动500ms
}
// 发送指令方法
private void SendVibrationCommand(int motorID, int durationMs) {
if(serialPort.IsOpen) {
string command = $"M{motorID}-{durationMs}\n";
serialPort.Write(command);
}
}
void OnDestroy() {
if(serialPort != null && serialPort.IsOpen) {
serialPort.Close();
}
}
}
五、PICO4设备适配关键
1. 安卓蓝牙权限配置
-
在
AndroidManifest.xml
中添加:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
-
修改Unity Player Settings:
Target API Level ≥ 23,勾选"Internet Access"和"Bluetooth"
2. 无线通信优化
-
使用
Android Bluetooth API
替代串口通信(需安装Android Bluetooth Low Energy插件
) -
示例代码段:
// 在PICO端使用AndroidJavaObject调用蓝牙
AndroidJavaObject bluetoothAdapter = new AndroidJavaObject("android.bluetooth.BluetoothAdapter");
AndroidJavaObject device = bluetoothAdapter.Call<AndroidJavaObject>("getRemoteDevice", "00:12:6F:XX:XX:XX"); // HC-05地址
六、触觉反馈场景映射
交互事件 | 触觉反馈方案 |
---|---|
药材切片力度过大 | 电机1高频震动(100Hz,200ms) |
蒸笼蒸汽压力超标 | 电机2持续震动(强度渐变) |
晒场药材未及时翻动 | 电机3间隔震动(每30秒提醒) |
工艺步骤完成 | 三电机同步短震(庆祝特效) |
七、延迟优化方案
-
协议精简:
将指令格式简化为单字节(如0x01
表示电机1震动200ms) -
预加载震动模式:
在Arduino存储常用震动模式(如M1-200
),Unity发送模式编号而非具体参数 -
蓝牙参数调整:
修改HC-05波特率为115200(需AT指令配置)
八、验证测试流程
-
硬件连通性测试:
-
使用Arduino IDE串口监视器发送指令测试电机响应
-
-
Unity基础通信:
-
在PC端运行Unity,通过USB连接Arduino测试震动触发
-
-
PICO无线联调:
-
将Unity工程打包至PICO4,测试蓝牙指令传输
-
-
场景集成测试:
-
在九蒸九晒流程中嵌入触觉反馈事件
-
按照此方案,即使零电子基础,也可在 48小时内 完成触觉手套原型搭建。重点在于保持蓝牙通信稳定,建议优先使用USB直连调试,后期转为无线。