13岁少女硬核DIY:如何将一只普通手套变成VR控制器
将一只普通手套变成VR控制器
(映维网Nweon 2025年12月01日)萨哈娜·文卡塔拉曼(Sahana Venkataraman)是一位13岁的科技和历史爱好者,并正致力于利用虚拟现实技术来提高人们对南亚历史中遭到忽视的历史奇迹。日前,她分享了自己是如何通过DIY将一只普通手套变成VR控制器:
我制作了一只手套,戴上它后,你只需动动手指就能移动虚拟物体!!下面是我如何一步步实现它的概述,你也可以照着做👇

所需材料:
Arduino Uno开发板
USB A转USB B数据线
2个弯曲传感器 —— 务必确保它们是弯曲传感器,而不是”柔性压力传感器”,这两者经常混淆。类似这种:https://ca.robotshop.com/products/22-10k-flexible-sensor?qd=033c88268cfeac91575a5458c805bdf9
一个转换器(如果你的笔记本电脑没有USB接口的话)
一双手套(准备弄坏也无所谓的那种)
热熔胶枪和胶棒
一台性能尚可的笔记本电脑 —— 需要安装的软件:Unity、代码编辑器(如VS Code)和Arduino IDE。
公对母跳线 或者 一根你不介意拆掉的旧线缆 + 一把小刀、剥线钳和剪刀
针和线
步骤1:设置Unity项目
1.1:创建一个新的Unity 3D项目
打开Unity App。
转到Projects标签页→New Project→Universal 3D。
将其重命名为类似”GloveProject”的名字。
当你点击Open Project时,会开始加载一个新窗口——这就是Unity编辑器,我们将在其中创建场景。
1.2:添加包含物体的场景
在左侧的Hierarchy面板中,添加:
一个立方体——这将是我们用手套操控的物体。将其重命名为”TargetCube”。
(按回车键或点击查看完整尺寸图片)

一个”Create Empty”——这是下拉菜单中的第一个选项。将其重命名为”GloveManager”。
步骤2:在Unity中设置UDP接收器
2.1:创建UDP接收器C#脚本

如上图所示,右键点击Assets→Create→Scripting→Empty C# Script。将脚本重命名为”Udpreceiver.cs”。
在右侧的面板中,点击”open”来编辑代码。代码应该会在你笔记本电脑上下载的代码编辑器中打开(我使用的是Visual Studio Code)。将以下代码粘贴到你的代码编辑器中:
using UnityEngine;using System.Net;using System.Net.Sockets;using System.Text;public class UdpReceiver : MonoBehaviour{ public int port = 5065; // MUST match the Python script UDP_PORT public GameObject targetObject; // assign in Inspector private UdpClient client; private IPEndPoint remoteEndPoint; private string lastMessage = ""; private bool initialized = false; void Start() { try { client = new UdpClient(port); client.Client.Blocking = false; // don't hang if no data remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); initialized = true; Debug.Log("UDP Receiver started on port " + port); } catch (System.Exception e) { Debug.LogError("UDP Receiver error: " + e.Message); } } void Update() { if (!initialized || client == null) return; try { if (client.Available > 0) { byte[] data = client.Receive(ref remoteEndPoint); lastMessage = Encoding.ASCII.GetString(data).Trim(); // Expecting "v1,v2" string[] parts = lastMessage.Split(','); if (parts.Length >= 2) { int sensor1, sensor2; if (int.TryParse(parts[0], out sensor1) && int.TryParse(parts[1], out sensor2)) { if (targetObject != null) { Vector3 p = targetObject.transform.position; // --------------------------- // SENSOR 1 (A0): forward/back (Z) // Bent ≈ 340, straight ≈ 550 // --------------------------- float mapped1 = MapTo01(sensor1, 340f, 550f); // bent, straight mapped1 = Mathf.Pow(mapped1, 2f); // exaggerate float nearZ = 0.5f; // close to camera float farZ = 50f; // far away float newZ = Mathf.Lerp(nearZ, farZ, mapped1); // --------------------------- // SENSOR 2 (A1): up/down (Y) // Bent ≈ 400, straight ≈ 600 // More bend = down, less bend = up // --------------------------- float mapped2 = MapTo01(sensor2, 400f, 600f); // bent, straight mapped2 = Mathf.Pow(mapped2, 2f); // exaggerate float bottomY = 0f; // cube low position float topY = 5f; // cube high position float newY = Mathf.Lerp(bottomY, topY, mapped2); // Apply both targetObject.transform.position = new Vector3(p.x, newY, newZ); } } } } } catch (System.Exception) { // ignore transient UDP errors } } float MapTo01(float value, float min, float max) { if (max <= min) return 0.0f; float t = (value - min) / (max - min); return Mathf.Clamp01(t); } void OnApplicationQuit() { if (client != null) { client.Close(); client = null; } }}
此代码接收我们稍后将插入的传感器的数据,并弥合了传感器数据与Unity中立方体之间的差距。
按Cmd/Ctrl+S保存。
2.2:将脚本附加到我们的Unity场景
回到Unity编辑器中,在Hierarchy面板下,点击我们创建的”GloveManager”。
在右侧的Inspector面板中,应该有一个名为”Add Component”的按钮。点击它,搜索UDP receiver并添加。
现在,UDP receiver下方应该有一个字段,用于指定目标对象。将Hierarchy面板中的”TargetCube”拖拽到该字段中。

步骤3:为Arduino编程
3.1:通过USB-A转USB-B数据线连接Arduino
使用任何Arduino Uno(兼容板或官方板均可)——用USB线连接到笔记本电脑,如果需要的话使用转换器。
3.2:将以下代码上传到新项目文件中
如果你以前没用过IDE,这步就是点击那个写着”New Sketch”的蓝色按钮。
粘贴并上传:
const int flex1Pin = A0;const int flex2Pin = A1;void setup() { Serial.begin(9600); pinMode(flex1Pin, INPUT_PULLUP); pinMode(flex2Pin, INPUT_PULLUP);}void loop() { int v1 = analogRead(flex1Pin); int v2 = analogRead(flex2Pin); Serial.print(v1); Serial.print(","); Serial.println(v2); delay(30);}3.3:关闭IDE中的串口监视器
一次只能有一个程序使用串口,所以请关闭IDE的串口监视器。
步骤4:创建Python→UDP桥接
这部分将Arduino传感器读数转发到Unity。
4.1:设置终端和脚本
打开你笔记本电脑的代码终端,通过粘贴以下命令然后按回车来安装pyserial:pip3 install pyserial
通过粘贴以下命令/按回车,告诉终端你想将接下来要写的代码存储在你的桌面文件夹:cd ~/Desktop
通过粘贴以下命令创建脚本:nano arduino_to_udp.py
这会带你到一个空编辑器,在那里你将粘贴以下代码:
import serialimport socketSERIAL_PORT = "/dev/cu.usbmodemXXXX" # your actual portBAUD_RATE = 9600UDP_IP = "127.0.0.1"UDP_PORT = 5065def main():ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)print("Forwarding serial → UDP")while True:data = ser.readline().decode("utf-8", errors="ignore").strip()if not data:continuesock.sendto(data.encode(), (UDP_IP, UDP_PORT))print("Serial:", data)if __name__ == "__main__":main()注意到第4行写着”/dev/cu.usbmodemXXXX”了吗?用你的实际端口名称替换掉这整个名字。你可以通过导航到Arduino IDE,点击Tools并查看”Port”下拉菜单旁边显示的名称来找到它。那就是你要用的那个。
修改完代码后,按Ctrl+O(是字母O),然后按回车确认,再按Ctrl+X退出。
步骤5:硬件部分!!
现在我们可以做更有趣的事情了——连接传感器,让整个系统真正工作起来!
5.1:准备工作——准备好导线
如果你有公对母跳线,我羡慕你。你不需要解剖任何充电线缆——可以忽略这一步。对于像我这样没有这种便利条件的人,以下是我如何让它工作的:
务必确保在使用小刀和剪刀时非常小心
用剪刀剪掉一根你不需要的旧线缆的末端——可以是耳机线、充电线等。你会得到一段裸露的线缆。
用小刀,沿着线缆外部绝缘层的中心切开,小心不要割伤自己或损坏内部线芯。这样应该更容易剥掉绝缘层。在接触到内部线芯之前,可能还需要剥掉几层东西。
大多数标准充电线有4根线,这正是我们需要的数量。取4根线,将所有4根线的两端都剥掉一到两厘米的绝缘层。我没有剥线钳,所以用了小刀——只能说这花了我一些时间。
5.2:连接导线
让我们从连接第一个传感器开始。将2根导线的金属丝拧在一起,然后插入到GND和A0——应该看起来像这样:

现在,我们将每根导线的自由端缠绕在传感器各自的引脚上。传感器应该有两个引脚,所以将GND线缠绕在一个引脚上,将A0线缠绕在另一个引脚上。确保两根导线的金属丝没有任何部分相互接触。
通过USB线将你的Arduino连接到笔记本电脑。确保IDE应用程序中的串口监视器已关闭,然后运行终端代码(将以下内容粘贴到终端:python3 arduino_to_udp.py)。
你应该至少得到一个数字读数(我们只连接了一个传感器)。确保当你相应地弯曲传感器时,读数有显著变化。记录传感器完全弯曲和伸直时的读数。如果读数不合理,尝试:
调整连接到Arduino板子的连接
确保两根导线没有相互接触
这通常能解决问题。当你确定连接稳定且工作正常后,用热熔胶将导线粘在传感器引脚上。确保只粘引脚的中下部,不要碰到传感器实际塑料底座——这里要非常小心。
如果你有公对母跳线,将公头插入GND和A0,母头可以套在传感器引脚上。
对第二个传感器重复完全相同的操作,只是将导线插入另一个GND端口和A1(而不是A0)。最终的Arduino导线连接应该看起来像这样:

最终连接
传感器1:
导线A→Arduino GND→传感器引脚
导线B→Arduino A0→传感器引脚
传感器2:
导线C→Arduino GND→传感器引脚
导线D→Arduino A1→传感器引脚
步骤6:将传感器缝到手套
将传感器放在手套的食指和中指上(我把它放在手的前面/手掌侧,但你可以选择任意一侧——事后看来,放在手背可能更好)。
用线在传感器上方缝出环扣,不要穿过传感器本身。一个在传感器顶端,一个在中间,一个靠近底部。
通过在靠近手套中部的位置(如下图)用线环固定导线,并在该线环上加点热熔胶,来确保导线有一定的松弛度。我还在指尖附近加了几点热熔胶,以防止传感器从缝制的线环中滑出。

步骤7:运行最终程序!!!
回到Unity编辑器,点击屏幕顶部的播放按钮。如果你戴着手套弯曲手指,立方体应该开始移动了!中指控制它的高度,食指控制它的远近。就这样,你成功了!现在你只需动动手指就能控制虚拟物体了!
结构概述
项目总结如下:
传感器发送数据到Arduino IDE→将数据转发到终端→发送到Unity中的UDP接收器→根据Unity 3D场景中的C#脚本控制”TargetCube”
结论
制作这个手套真的很有趣,但有时也相当令人沮丧。无论如何,我会说这一切都是值得的。
目前,它还只是一个立方体。但这个设置实际上是一个可用于任何事物的空白输入设备:
在VR中抓取和投掷物体
在虚拟博物馆中按下看不见的按钮
改变颜色、触发动画或浏览菜单
最终,用你的双手而不仅仅是眼睛来探索那些未充分代表的南亚历史奇迹
很酷的一点是,一旦你完成了一次这样的布线,你就不需要重复那些困难的部分。你可以继续重复使用同一只手套和代码来为新想法、场景和体验制作原型。
通过这个项目,我学到了从”我有一个想法”到”这个东西存在并且能工作”实际需要付出什么。这个过程并不总是顺利的。在某些时候,你会想把你的Arduino掰成两半。但无论如何都要坚持下去。当整个系统协同工作时,每一个令人沮丧的时刻都变得值得了:)


