×

使用CH32V307和HuskyLens的视线跟随器

消耗积分:2 | 格式:zip | 大小:1.16 MB | 2022-10-18

分享资料个

描述

硬件构建

这个怎么运作

HuskyLens 是一款人工智能机器视觉传感器,用于检测和跟踪线路。赫斯基镜头的数据为我们提供了是否检测到线条的详细视图。如果检测到,则提取 (x, y)。有了这些数据,CH32V307 开发板就被编程为使用电机驱动器屏蔽来控制电机。这篇博客解释了使用 CH32V307 开发板和 HuskyLens 制作基于视觉的线追随者。

基本硬件组件

CH32V307开发板

dsc00242_yHADKYUp4b.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

成套工具

dsc00247_hbSJBpOPuJ.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

CH32V307V-EVT-R1

CH32V307V-EVT-R1 是一款基于 WCH CH32V307 RISC-V 微控制器的开发板,具有以太网端口、USB Type-C 端口和八个可通过接头访问的 UART 接口。

WCH 设计的 RISC-V4F 32 位 RISC-V 内核高达 144MHz,支持单周期乘法和硬件除法,以及硬件浮点单元 (FPU)。它具有高达 64KB 的 SRAM 内存,可存储高达 256KB 的 Flash。

该开发板具有网络 - 千兆以太网 MAC、10 Mbps PHY、USB - 1x USB 2.0 OTG 全速接口、1x USB 2.0 主机/设备接口,内置 480 Mbps PHY、8x USART、2x CAN 接口、2 线调试接口, SDIO, FSMC 内存接口, DVP 数字视频接口, 80x GPIO 端口, 16 个外部中断, 2x I2C, 3x SPI, 2x I1S, 2x 12-bit DAC, 2-unit 16-channel 12-bit ADC, 16 -通道 TouchKey,10 个定时器,2 个通用 DMA 控制器,总共 18 个通道,4 个放大器。

CH32V307 具有电源管理功能,可提供以下封装:LQFP64M 和 LQFP100。

dsc00250_Qh2oBsuvyC.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

这是开发板的很多规格。

赫斯基镜头

HuskyLens 是一款易于使用的 AI 机器视觉传感器。具备人脸识别、物体追踪、物体识别、线路追踪、颜色识别、标签(二维码)识别等多种功能。

您可以从https://www.dfrobot.com/product-1989.html购买赫斯基镜头?

_dsc7764_cJqG1Yhojw.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

赫斯基镜头

第 1 步:开始使用 CH32V307

首先,我们使用此链接下载 MounRiver Studio (MRS) 。

新建Mounriver工程,选择CH32V307 [RISC-V]系列,模板类型选择RT-Thread ,点击finish。

ss3_asIUmeTaC2.png?auto=compress%2Cformat&w=740&h=555&fit=max

设置 RT-Thread Studio

在开发 Mounriver IDE 时,我遇到了正式支持 WCH 板和其他开发板的 RT-Thread Studio。出于这个原因,我以后将在这个项目中使用RT-Thread Studio

首先,从这里下载 IDE并将其安装在您的 PC 上。

打开RT-Thread SDK Manager,在WCH平台下安装CH32V307V-R1。这可能需要一些时间。

ssa2_qDCWAuxIQG.png?auto=compress%2Cformat&w=740&h=555&fit=max

安装后,创建一个新项目。将文件命名为 LFR,选择 Board CH32v307V-R1和 RT-thread 为最新。单击完成按钮。

ssa3_vNy3vMI6hL.png?auto=compress%2Cformat&w=740&h=555&fit=max

我们编写了一个基本程序来切换内置 LED。

 

GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	while(1)
	{
	    GPIO_SetBits(GPIOA,GPIO_Pin_0);
	    rt_thread_mdelay(500);
	    GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	    rt_thread_mdelay(500);
	}

 

dsc00283_q2DyOcgwtf.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 2 • LED1 关闭

第 2 步:连接 HuskyLens

使用 K-Flash将固件更新到HUSKYLENSWithModelV0.4.9Class.kfpkg 。

debf8f653a8c2724ab2e2927050507c6.png?auto=compress%2Cformat&w=740&h=555&fit=max

安装 HUSKYLENS 库

首先,首先下载并安装 HUKYLENS 库。

将“HUSKYLENS”复制到我们的项目目录下如下图

ss1_HNcaVKa00d.png?auto=compress%2Cformat&w=740&h=555&fit=max

连接图

CH32V307 USART3 引脚为 PB10 和 PB11。这些用于与 HuskyLens 通信。如图所示,L293D 电机驱动器屏蔽连接到 Arduino 接头。

CH32V307 -> 赫斯基镜头

Vcc -> Vcc

接地 -> 接地

USART3_Tx(PB10) -> RX

USART3_Rx(PB11) -> TX

block1_1uT3X0TCJN.png?auto=compress%2Cformat&w=740&h=555&fit=max

如上所述进行连接。

dsc00287_GytEMmhpB1.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

与赫斯基镜头接口

HuskyLens 协议设置 您需要设置 HuskyLens 的协议类型。协议应为“序列号 115200”。当然也可以采用Auto Detect协议,简单易用。

d3919d141fb0fc8ecf3b2fb06bd73b7a.png?auto=compress%2Cformat&w=740&h=555&fit=max

您可以在下面找到用于与 Huskylens 交互的示例代码。

 

int main(void)
{
	for(char s=0; sUSART2 */
       {
           USART_SendData(USART3, TxBuffer[TxCnt++]);
           while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); /* waiting for sending finish */
       }

    Delay_Ms(100);
    while(!Rxfinish); /* waiting for receiving int finish */
    printf("RxBuffer:%s\r\n", RxBuffer);

            while(1)
            {
            	while(TxCnt < TxSize) /* USART3--->USART2 */
            	       {
            	        USART_SendData(USART3, TxBuffer[TxCnt++]);
            	        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET) ;
            	       }

            	    Delay_Ms(1000);
            }
}

 

ssa4_7Pq3JoAieE.png?auto=compress%2Cformat&w=740&h=555&fit=max

回复

 

while (!huskylens.begin(USART3))
    {
    printf("Begin failed!\n");
    printf("1.Please recheck the \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>Serial 9600)\n");
    printf("2.Please recheck the connection.\n");
    Delay_Ms(1000);
    }

    Delay_Ms(100);

    while(1)
    {
    	if (!huskylens.request()) printf("Fail to request data from HUSKYLENS, recheck the connection!");
    	else if(!huskylens.isLearned()) printf("Nothing learned, press learn button on HUSKYLENS to learn one!");
    	else if(!huskylens.available()) printf("No block or arrow appears on the screen!");
    	else
    	{
    	printf("###########");
		while(huskylens.available())
			{
			HUSKYLENSResult result = huskylens.read();
			printResult(result);
			}
    	}
    }
void printResult(HUSKYLENSResult result){
    if (result.command == COMMAND_RETURN_BLOCK){
        Serial.println(String()+F("Block:xCenter=")+result.xCenter+F(",yCenter=")+result.yCenter+F(",width=")+result.width+F(",height=")+result.height+F(",ID=")+result.ID);
    }
    else if (result.command == COMMAND_RETURN_ARROW){
        Serial.println(String()+F("Arrow:xOrigin=")+result.xOrigin+F(",yOrigin=")+result.yOrigin+F(",xTarget=")+result.xTarget+F(",yTarget=")+result.yTarget+F(",ID=")+result.ID);
    }
    else{
        Serial.println("Object unknown!");
    }
}

 

ssac_aVlD6F1dT1.png?auto=compress%2Cformat&w=740&h=555&fit=max

操作与设置

向左或向右拨动功能键,直到屏幕顶部显示“线路跟踪”字样。

长按功能键进入线跟踪功能的参数设置。

向右或向左拨动功能键,直到选中“学习多个”,然后短按功能键,向左拨动关闭“学习多个”开关,即进度条上的方形图标转动向左转。然后短按功能键即可完成此参数。

您也可以通过设置“LED 开关”来打开 LED。这在黑暗的环境中非常有用。

向左拨功能键,直到选中“保存并返回”,短按功能键保存参数,参数自动返回。

线学习:建议在 HuskyLens 的视野范围内,保持内联学习,没有交叉线。将“+”符号指向该行。然后 HuskyLens 会自动检测线条,屏幕上会出现一个白色箭头。此时,短按“学习键”即可完成学习过程。屏幕上会出现一个蓝色的路线方向箭头。

dsc00289_UFxpZzdbAR.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

火车

线预测:当 HuskyLens 检测到已学习的线时,屏幕上会自动出现一个蓝色箭头。箭头的方向表示线的预测方向。

dsc00293_QwZhyhP7Af.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

预测

现在设备已准备好进行线路检测。

whatsapp_image_2021-02-01_at_2_44_32_am_(1)_hBmZmrrAP1.jpeg?auto=compress%2Cformat&w=740&h=555&fit=max

线检测 - 图像

第 3 步:连接电机驱动器

由于 CH32V307 板具有 Arduino 兼容接头,因此我购买了一个 L293D 双电机驱动器扩展板,可以轻松插入开发板。

dsc00325_AyLi3l3pSQ.JPG?auto=compress%2Cformat&w=740&h=555&fit=max

CH32V307板+电机驱动

我们为电机 1 和电机 2 分配和配置 PWM 引脚,其中引脚 PA8 和 PA0 分配给电机 1,引脚 PB6 和 PB8 分配给电机 2。

电机测试使用以下代码完成。

 

/*
 * Pin PA8 and PA0 - Motor 1
 * Pin PB6 and PB8 - Motor 2
*/

u8 speed = 100; // -255 to +255
int main(void)
{
	USART_Printf_Init(115200);
	printf("Speed Control");
	TIM1_PWMOut_Init( 100, 48000-1, speed, speed); // fwd
        delay(5000);
	TIM1_PWMOut_Init( 100, 48000-1, -speed, -speed); // rev
	while(1);
}

 

第 4 步:框图

完整的连接可以按照框图完成,看起来像这样。

block2_HMpETQxYjh.png?auto=compress%2Cformat&w=740&h=555&fit=max

框图

第 5 步:外壳设计

我花了 4 美元从当地商店买了一个标准的机器人底盘。我们在底盘的左右两侧安装了 BO 电机和一个用于平衡重量的滚珠脚轮。

whatsapp_image_2021-01-31_at_2_12_00_am_u9kf7wy4ur.jpeg?auto=compress%2Cformat&w=740&h=555&fit=max

带 BO 电机和车轮的底盘

接下来,我们用给定的 L 夹安装赫斯基镜头,它会像这样转动。

whatsapp_image_2021-01-31_at_2_12_00_am_(2)_XCm1DjubS0.jpeg?auto=compress%2Cformat&w=740&h=555&fit=max

HuskyLens - 线跟随器

现在我们将 CH32V307 和电机驱动器添加到机箱中。我有 2 个锂离子电池来运行这个机器人。这些电池串联以提供 7.4V。这也可以用锂聚合物电池代替。

第6步:让我们看看它是否有效

最后,是时候运行机器人了。我运行 HuskyLens 传感器并连续打印计算出的速度,这就是我得到的。

whatsapp_image_2021-02-01_at_2_44_32_am_C9wHk5YO6D.jpeg?auto=compress%2Cformat&w=740&h=555&fit=max

线检测 - 图像

虽然它不是一个完美的线路跟随器,但通过校准 PID 常数,我们可以实现更平滑的运行。

如果您在构建此项目时遇到任何问题,请随时问我。请建议您希望我接下来做的新项目。

如果它真的对您有帮助,请竖起大拇指,并关注我的频道以获取有趣的项目。:)

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !