19浏览
查看: 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,看看它是否真能以一己之力简化硬件连接,实现无需额外主控板,仅通过笔记本电脑的串口直接读取传感器数据,从而验证其在实际项目中的实用价值。
试用RainbowLink V2:一盒搞定二哈2的供电与通信图4
【一盒驱动二哈2】
       测试目标:
  • 供电能力:二哈2官方推荐5V供电,RainbowLink V2的5V输出口能否稳定支撑?
  • 通信能力:通过RainbowLink V2的TTL通道,用Python串口与二哈2通信,实时获取并绘制人脸关键点。
  • 易用性:接线、驱动安装是否像宣传的那样“傻瓜式”?

      硬件连接
       以往调试二哈2功能时,需要一块主控板,如果不使用扩展板或扩展板无5V供电,都需要单独的电源线(负责为二哈2单独供电),桌面总是乱糟糟。而RainbowLink V2的出现,让这一切变得极其简洁:
  • 电源连接:用一根Type-C线将RainbowLink V2连接至电脑,它便获得了5V输入。
  • 二哈2供电:从RainbowLink V2的 “PWR OUT”区域,将 “5V” 和 “GND” 端子,用两根导线连接到二哈2的 “5V” 和 “GND” 引脚。
  • TTL通信:从RainbowLink V2的 “TTL1” 通道,将 “TX”(接二哈2 RX)、 “RX”(接二哈2 TX)和 “GND” 连接好。注意,GND需要与电源地共地,RainbowLink V2的PWR OUT的GND和TTL的GND在内部是相通的,非常方便。

       整个连接过程不超过2分钟,得益于其双接口兼容排针排母及杠杆式快接端子,无需螺丝刀,一按一插即可,导线固定得非常牢固。
试用RainbowLink V2:一盒搞定二哈2的供电与通信图3
【软件与Python实战:三步玩转二哈2】
       在开始编程前,请确保已安装必要的Python库。打开终端或命令提示符,执行以下命令:
  1. pip install pyserial opencv-python numpy pyautogui
复制代码
       这些库将分别用于串口通信、图像处理、数值计算和鼠标控制。
       硬件连接好后,软件层面的开发异常顺畅。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 cv2
import 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在全速运算时不会掉帧。


试用RainbowLink V2:一盒搞定二哈2的供电与通信图2


试用RainbowLink V2:一盒搞定二哈2的供电与通信图5

      第三步:手势控制电脑鼠标
       最激动人心的环节到了——用手势控制电脑。切换到二哈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的供电需求。
试用RainbowLink V2:一盒搞定二哈2的供电与通信图6

【演示视频】



【测试中的闪光点与思考】
  • “电源+数据”一线通:这是RainbowLink V2最打动我的地方。它彻底解决了工农业传感器(如二哈2、部分激光雷达)需要外部供电的痛点。我甚至可以同时开启5V给二哈2,再开启12V给一个LED灯带,所有电源和数据都通过这一个盒子与电脑交互,桌面的整洁度提升巨大。
  • 全隔离设计的“安全感”:虽然本次未测试RS485/RS232的隔离性能,但在工业环境中,这种“信号电源全隔离”设计能有效保护昂贵的电脑主板免受意外高压或地线环流冲击,这份安全感是普通转换器无法提供的。
  • Python生态的完美契合:对于创客和开发者来说,能用熟悉的Python直接操作,意味着可以快速调用OpenCV、PyAutoGUI等库,实现各种创意交互。RainbowLink V2作为一个可靠的硬件桥梁,让软件创意落地更加顺畅。

       对于像我一样经常捣鼓各种传感器、单片机的创客来说,RainbowLink V2不仅仅是一个“四合一”的协议转换器。它更像是一个桌面的能源与数据交互中心。
       如果你也受够了桌面上杂乱无章的USB线和电源适配器,或者正在寻找一个能安全、稳定驱动如二哈2这类“用电大户”传感器的工具,RainbowLink V2绝对值得一试。它用实力证明,专业和整洁可以兼得。
【项目附件】
       附件中包括,测试过程所有python文件及二哈2python驱动库dfrobot_huskylensv2.py





您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail