|
19| 0
|
试用RainbowLink V2:一盒搞定二哈2的供电与通信 |
|
本帖最后由 云天 于 2026-3-7 18:41 编辑 RainbowLink V2:一盒搞定二哈2的供电与通信,让桌面告别“蜘蛛网” 关键词:USB协议转换器、TTL串口、二哈2供电、Python控制、隔离保护 【这个小方盒,野心不小】 最近,我有幸拿到了DFRobot最新推出的RainbowLink V2(SKU:TEL0190)——一款集多种通讯协议与可调电源输出于一体的USB协议转换器。它不仅在单个小巧的盒子里集成了全隔离的RS485、RS232以及两路TTL接口,还能同时输出12V、5V和3.3V电压,为各类工农业传感器提供稳定供电。我手上恰好有一块HuskyLens 2(二哈2) 视觉传感器,它工作时对供电稳定性要求较高,且通常需要同时连接串口和电源,导致桌面线缆繁杂。这次,我打算用RainbowLink V2来驱动二哈2,看看它是否真能以一己之力简化硬件连接,实现无需额外主控板,仅通过笔记本电脑的串口直接读取传感器数据,从而验证其在实际项目中的实用价值。 ![]() 测试目标:
硬件连接 以往调试二哈2功能时,需要一块主控板,如果不使用扩展板或扩展板无5V供电,都需要单独的电源线(负责为二哈2单独供电),桌面总是乱糟糟。而RainbowLink V2的出现,让这一切变得极其简洁:
整个连接过程不超过2分钟,得益于其双接口兼容排针排母及杠杆式快接端子,无需螺丝刀,一按一插即可,导线固定得非常牢固。 ![]() 在开始编程前,请确保已安装必要的Python库。打开终端或命令提示符,执行以下命令:
这些库将分别用于串口通信、图像处理、数值计算和鼠标控制。 硬件连接好后,软件层面的开发异常顺畅。RainbowLink V2的驱动安装后,四个COM口在设备管理器中直接显示为“RainbowLink TTL1”、“RainbowLink TTL2”等,与外壳丝印完美对应,再也不用手动猜测哪个端口是哪个。接下来,我通过三个典型的视觉应用场景,全面测试了这套组合的稳定性与易用性。 第一步:获取人脸关键点数据 首先运行最基础的人脸识别程序。我使用Python的pyserial库,基于二哈2官方协议编写了驱动类HuskylensV2_Serial,它负责通过RainbowLink V2的TTL1通道与二哈2通信。关键代码非常简单:#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 使用笔记本电脑串口驱动二哈2视觉传感器(HuskyLens V2) 基于 pyserial 实现,无需主控板和 PinPong 库。 """ import time import logging import queue import serial import serial.tools.list_ports # 导入原协议类及常量(请确保 dfrobot_huskylensv2.py 在同一目录下) from dfrobot_huskylensv2 import HuskylensV2, ALGORITHM_FACE_RECOGNITION class HuskylensV2_Serial(HuskylensV2): """ 使用 pyserial 实现的 Huskylens V2 串口驱动类。 继承原协议的 HuskylensV2,只重写底层读写方法。 """ def __init__(self, port=None, baudrate=115200, timeout=1, debug_level=logging.INFO): """ :param port: 串口号,如 'COM3' 或 '/dev/ttyUSB0'。若为 None 则自动检测(不保证准确)。 :param baudrate: 波特率,二哈2默认为115200。 :param timeout: 读取超时时间(秒)。 :param debug_level: 日志级别(如 logging.DEBUG, logging.INFO)。 """ logging.getLogger().setLevel(debug_level) self.ser = None self.port = port self.baudrate = baudrate self.timeout = timeout self.q = queue.Queue() # 接收字节缓存队列 super().__init__() # 初始化父类协议部分 self._connect_serial() def _connect_serial(self): """打开串口连接""" if self.port is None: # 自动检测可用串口(可能不准确,建议手动指定) ports = serial.tools.list_ports.comports() for p in ports: if 'USB' in p.description or 'UART' in p.description: self.port = p.device break if self.port is None: raise IOError("未找到可用串口,请手动指定 port 参数") try: self.ser = serial.Serial(self.port, self.baudrate, timeout=self.timeout) logging.info(f"已打开串口 {self.port}") except Exception as e: raise IOError(f"无法打开串口 {self.port}: {e}") def _write_to_huskyLens(self): """发送数据到二哈2(重写父类方法)""" if not self.ser or not self.ser.is_open: raise IOError("串口未打开") command = self.send_buffer[0:self.send_index] # 父类生成的发送缓冲区 logging.debug("_write_to_huskyLens ----->") self.print_hex(command) # 打印十六进制(调试用) self.ser.write(command) time.sleep(0.1) # 给传感器一点处理时间 def _read_from_huskyLens(self): """从二哈2读取一个字节(非阻塞,从队列中取)""" if not self.ser or not self.ser.is_open: raise IOError("串口未打开") # 如果队列为空,则尝试从串口读取最多64字节并放入队列 if self.q.empty(): data = self.ser.read(64) # 非阻塞,因为有 timeout 设置 for b in data: self.q.put(b) # 从队列中取出一个字节,若无则返回 None try: return self.q.get_nowait() except queue.Empty: return None def close(self): """关闭串口""" if self.ser and self.ser.is_open: self.ser.close() logging.info("串口已关闭") def __del__(self): self.close() # ==================== 主程序示例 ==================== if __name__ == "__main__": # 请根据实际情况修改串口号 SERIAL_PORT = "COM41" # Windows 示例 # SERIAL_PORT = "/dev/ttyUSB0" # Linux 示例 # SERIAL_PORT = "/dev/cu.usbserial-1420" # macOS 示例 BAUDRATE = 9600 # 初始化传感器 hl = HuskylensV2_Serial(port=SERIAL_PORT, baudrate=BAUDRATE, debug_level=logging.INFO) # 握手测试 if not hl.begin(): print("连接失败,请检查接线和端口") exit() print("连接成功!") # 切换至人脸识别算法(可改为其他算法,如 ALGORITHM_OBJECT_TRACKING 等) if hl.switchAlgorithm(ALGORITHM_FACE_RECOGNITION): print("已切换至人脸识别") else: print("算法切换失败") exit() # 主循环:持续获取识别结果 try: while True: total = hl.getResult(ALGORITHM_FACE_RECOGNITION) if total is None: print("获取结果超时") continue # 遍历所有检测到的目标 for i in range(total): obj = hl.getCachedResultByIndex(ALGORITHM_FACE_RECOGNITION, i) if obj: # 基础信息 print(f"ID: {obj.ID}, 中心: ({obj.xCenter}, {obj.yCenter}), " f"尺寸: {obj.width}x{obj.height}, 置信度: {obj.confidence}") # 如果是人脸识别,还可以输出关键点(FaceResult 特有属性) if hasattr(obj, 'leye_x'): print(f" 左眼: ({obj.leye_x}, {obj.leye_y}), " f"右眼: ({obj.reye_x}, {obj.reye_y}), " f"鼻子: ({obj.nose_x}, {obj.nose_y})") time.sleep(0.5) except KeyboardInterrupt: print("用户中断,退出程序") finally: hl.close() 程序运行后,二哈2开始稳定返回人脸数据,即使快速移动头部,数据流也未出现卡顿或丢失。这得益于RainbowLink V2稳定的TTL信号和独立的5V供电——二哈2的电源完全由RainbowLink V2的5V输出口提供,无需外接电池,整个系统仅通过一根Type-C线就完成了供电和数据传输,桌面干净利落。 第二步:实时绘制人脸形象 有了数据,就可以发挥OpenCV的威力了。我编写了一个draw_fancy_face函数,利用二哈2返回的双眼、鼻子、嘴角等关键点,在画布上绘制出更生动的人脸:眼睛用带瞳孔的圆表示,鼻子用菱形,嘴巴则根据嘴角位置画出一条微笑的弧线。代码中只需将第一步获取的FaceResult对象传入绘图函数即可。 import cv2import numpy as np def draw_fancy_face(img, face): # 绘制眼睛(带高光) cv2.circle(img, (face.leye_x, face.leye_y), 6, (255,255,255), -1) cv2.circle(img, (face.leye_x, face.leye_y), 2, (0,0,0), -1) # ... 绘制鼻子、嘴巴等(省略细节) while True: total = hl.getResult(ALGORITHM_FACE_RECOGNITION) img = np.zeros((480,640,3), dtype=np.uint8) for i in range(total): face = hl.getCachedResultByIndex(ALGORITHM_FACE_RECOGNITION, i) draw_fancy_face(img, face) cv2.imshow("Face", img) cv2.waitKey(10) 实际运行时,OpenCV窗口以30fps左右实时刷新,绘制的人脸轮廓与真实手部动作几乎同步。RainbowLink V2的低延迟通信让这种实时交互成为可能,而稳定的5V供电确保了二哈2在全速运算时不会掉帧。 ![]() ![]() 第三步:手势控制电脑鼠标 最激动人心的环节到了——用手势控制电脑。切换到二哈2的手部识别算法后,程序会获取21个手部关键点,并实时计算拇指尖与食指尖的距离。当两指张开时,指尖中心点的位置被映射到屏幕坐标,通过平滑算法驱动鼠标移动;当两指快速捏合时,则触发单击或双击操作。 # 初始化手势控制器(开启左右镜像,使操作更自然) gesture = HandGestureControl(mirror_x=True) while True: total = hl.getResult(ALGORITHM_HAND_RECOGNITION) for i in range(total): hand = hl.getCachedResultByIndex(ALGORITHM_HAND_RECOGNITION, i) ret = gesture.process_hand(hand) # 内部自动移动鼠标和检测点击 if ret: distance, pinched = ret # 在窗口上显示距离和捏合状态 # 绘制手部骨架并显示 cv2.imshow("Hand Control", img) if cv2.waitKey(10) & 0xFF == ord('q'): break 得益于RainbowLink V2提供的稳定供电和干净信号,整个手势控制过程非常流畅。鼠标指针的移动与手部动作对应,捏合触发的单击。经过半小时连续运行,二哈2未出现任何通信中断现象,RainbowLink V2的5V输出口满足了二哈2的供电需求。 ![]() 【演示视频】 【测试中的闪光点与思考】
如果你也受够了桌面上杂乱无章的USB线和电源适配器,或者正在寻找一个能安全、稳定驱动如二哈2这类“用电大户”传感器的工具,RainbowLink V2绝对值得一试。它用实力证明,专业和整洁可以兼得。 【项目附件】 附件中包括,测试过程所有python文件及二哈2python驱动库dfrobot_huskylensv2.py |
沪公网安备31011502402448© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed