专栏名称: CW32生态社区
以开放、共享、互助为理念,致力于构建武汉芯源半导体CW32系列MCU生态社区。无论是嵌入式MCU小白还是想要攻破技术难题的工程师,亦或是需求解决方案的产品经理,都可在CW32生态社区汲取营养、共同成长。
目录
相关文章推荐
51好读  ›  专栏  ›  CW32生态社区

【CW32开发】初探四足机器人

CW32生态社区  · 公众号  ·  · 2024-09-22 18:46

正文

请到「今天看啥」查看全文



点击蓝字CW32生态社区 关注我们

认识机器人

机器人是一种自动执行任务的机器,它可以模拟人类或其它生物的某些功能,并按照预设的程序或通过人工智能技术来执行任务。


常见的一些 基本概念 有:

0 1
定义:

机器人是具有感知、决策和执行功能的自动化设备。它可以接受外部信息,进行处理,并据此执行一定的动作。

0 2
组成:

感知系统:如摄像头、传感器等,用于接收外部信息。

控制系统:如电脑、单片机等,用于处理信息和做出决策。

执行系统:如机械臂、驱动器等,用于执行具体的动作。

0 3
分类:

工业机器人:用于制造业,如焊接、组装、搬运等。

服务机器人:用于服务业,如医疗、清洁、娱乐等。

特种机器人:用于特殊环境,如深海探测、空间探测等。

04
关键技术:

驱动技术:包括电动、液压、气动等驱动方式。

感知技术:包括视觉、触觉、听觉等多种感知方式。

导航与定位技术:如GPS、激 光导航 、惯性导航等。

05
人工智能:

使机器人具备自主学习、推理和决策的能力。

06
应用领域:

机器人广泛应用于制造业、医疗、家政、军事、农业、教育等多个领域。

初探CW32的四足机器人控制

(用于玩和学习)

本项目使用8自由度舵机控制的四足机器人。主要用于爱好者学习参考。可实现基本控制姿态:前进、左转、右转、打滑、伸展、站立、躺平、摆手。有兴趣的朋友,也可以增加新步态控制。

0 1


硬件组成

(1)主控原理图


其中MCU核心板,选用 CW32F030C8T6 核心板。


主要使用CW32F030C8T6以下产品特性:

  • 内核:ARM® Cortex®-M0+  --  最高主频 64MHz

  • 工作温度:-40℃ 至 105℃;工作电压:1.65V 至 5.5V

  • 存储容量

最大 64K 字节 FLASH,数据保持 25 年 @85℃

最大 8K 字节 RAM,支持奇偶校验

128 字节 OTP 存储

  • 时钟管理

4 ~ 32MHz 晶体振荡器

32kHz 低速晶体振荡器

内置 48MHz RC 振荡器

内置 32kHz RC 振荡器

内置 10kHz RC 振荡器

内置 150kHz RC 振荡器

内置 PLL 锁相环

时钟监测系统

允许独立关断各外设时钟

  • 定时器

16位高级控制定时器,支持6路捕获/比较通道和3对互补PWM输出,死区时间和灵活的同步功能

四组 16 位通用定时器

三组 16 位基本定时器

窗口看门狗定时器

独立看门狗定时器

  • 通信接口

三路低功耗 UART,支持小数波特率

两路 SPI 接口 12Mbit/s

两路 I2C 接口 1Mbit/s

IR 调制器

(2)蓝牙模块

DX-BT04-E蓝牙模块:采用BK3432芯片,支持SPP V3.0+BLE V4.2蓝牙协议。支持AT指令,用户可根据需要更改串口波特率、设备名称等参数。具有成本低、功耗低、接收灵敏高等优点。

DX-BT04-E 模块与单片机连线 :

GND GND
5V 5V
TXD PA10
RXD PA9

蓝牙APP
安卓手机APP,可扫描下载。

IOS测试APP,请在苹果商城下载DX-SMART。

使用时,打开手机蓝牙助手应用DX-SMART,设置UUID为BT16模块,搜索蓝牙设备连接BT04-E设备。

正常通讯界面如下:

温馨提示: 使用其它蓝牙模块时,注意2个问题:

1. 波特率设置时,蓝牙模块需与单片机相符。

2. 如果搜索不到设备,或Service失败时,需指定正确的UUID,方可通讯。


(3)舵机控制

舵机是运动控制的主要执行机构。价格便宜,随处可见。值得注意的是,就是因为便宜,堵转过载时容易损坏。

本项目实验时,也是随机找了几个舵机,没有作区分使用。


SG90舵机目前在高档遥控玩具,如航模、包括飞机模型、潜艇模型、遥控机器人中已经使用得比较普遍。

SG90舵机上有三根线,分别是GND(棕色线)、VCC(红色线 接5V)和SIG(黄色线),也就是地线、电源线和信号线。

SG90舵机控制:  一般需要一个20ms 周期的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms 范围内的角度控制脉冲部分对应0度-180度机械周期的调节范围。以180 度角度伺服为例,那么对应的控制关系是这样的:

0.5ms ---------- 0 度;

1.0ms ---------- 45 度;

1.5ms ---------- 90 度;

2.0ms ---------- 135 度;

2.5ms ---------- 180 度;

值得一提的是:控制精度。本实验使用的舵机配套的塑料齿。淘宝各卖家没有提供具体齿数。

作者认为,这个控制精度在玩具类应用上没有特别高要求。但需要明白这个角度控制精度为360度/齿数。

(4)结构安装

该项目使用8个舵机。编号定义分别为①~⑧。

安装后的实物图如下:

引脚定义 如下:

在脚角安装时,舵机的控制角度范围需要测试并确定。以下图为例,展示了①-④号舵机的角度限制范围:

程序中需要对每个舵机的旋转角度范围做限制,才可输出。否则,电机在旋转时,受死角影响发生过载易产生损坏。

0 2


软件组成

(1)使用的外设资源

(一)CW32F030内部集成4 个通用定时器(GTIM),每个GTIM 完全独立且功能完全相同,各包含一个16bit 自动重装载计数器并由一个可编程预分频器驱动。GTIM 支持定时器模式、计数器模式、触发启动模式和门控模式4 种基本工作模式,每组带4 路独立的捕获/ 比较通道,可以测量输入信号的脉冲宽度(输入捕获)或者产生输出波形(输出比较和PWM)。

项目中使用了通用定时器GTIM1\GTIM2的PWM输出功能。

(二)CW32F030的通用异步收发器(UART) 支持异步全双工、同步半双工和单线半双工模式,支持硬件数据流控和多机通信;可编程数据帧结构;可以通过小数波特率发生器提供宽范围的波特率选择。UART 控制器工作在双时钟域下,允许在深度休眠模式下进行数据的接收,接收完成中断可以唤醒MCU 回到运行模式。

项目中使用了串口UART3外设资源。

(2)主要实现代码

主程序:

int




    
 main(){       Board_Iint();
USART_SendString(CW_UART3,"Power on!"); fuwei2(); while (1) { if(UART_Flag == 1) { if(RxDate == 'a')//站立 { zhanli(); } if(RxDate == 'b')// 躺平 { tangping(); }
if(RxDate == 'c')//摆手 { baishou(); } if(RxDate == 'd')//摇摆 { yaobai(); Delay_ms(500); yaobai(); Delay_ms(500); } if(RxDate == 'e')//左转 { zhanli(); Delay_ms(1000); zhanli2(); Delay_ms(1000); zuozhuan(); Delay_ms(1000); zuozhuan(); } if(RxDate == 'f')//打滑 { dahua(); dahua(); } if(RxDate == 'g')//前进 { zhanli(); Delay_ms(200); qianjin(); Delay_ms(200); qianjin(); Delay_ms(200); qianjin(); } if(RxDate == 'h')//右转 { youzhuan(); youzhuan(); youzhuan(); } UART_Flag=0; } }}

蓝牙串口中断:

void UART3_IRQHandler(void)//串口3中断服务函数{     if (USART_GetITStatus(CW_UART3, USART_IT_RC) != RESET)//如果接受到了消息    {        RxDate = USART_ReceiveData_8bit(CW_UART3);//将寄存器的数据转存在TxRxBuffer        UART_Flag=1;        USART_SendData_8bit(CW_UART3, RxDate);//将收到的消息发回给串口                USART_ClearITPendingBit(CW_UART3, USART_IT_RC);    }}
/*复位或躺平姿态*/void fuwei2 (void){ Servo_SetAngle(90); Delay_ms(500); Servo_SetAngle2(90); Delay_ms(500); Servo_SetAngle3(90); Delay_ms(500); Servo_SetAngle4(90); Delay_ms(500); Servo_SetAngle5(90); Delay_ms(500); Servo_SetAngle6(90); Delay_ms(500); Servo_SetAngle7(90); Delay_ms(500); Servo_SetAngle8(90); Delay_ms(500); }

舵机角度限制,并输出控制。

void Servo_SetAngle(float Angle){    if(Angle<10)Angle=10;  if(Angle>135)Angle=135;    PWM_SetCompare1(Angle / 180 * 2000 + 500);}void Servo_SetAngle2(float Angle){    if(Angle<45)Angle=45;  if(Angle>170)Angle=170;  PWM_SetCompare2(Angle / 180 * 2000 + 500);}
void Servo_SetAngle3(float Angle){ if (Angle<45)Angle=45; PWM_SetCompare3(Angle / 180 * 2000 + 500);}
void Servo_SetAngle4(float Angle){ if(Angle>135)Angle=135; PWM_SetCompare4(Angle / 180 * 2000 + 500);}
void Servo_SetAngle5(float Angle){ if(Angle<50)Angle=50; PWM_SetCompare5(Angle / 180 * 2000 + 500);}
void Servo_SetAngle6(float Angle){ if(Angle>130)Angle=130; PWM_SetCompare6(Angle / 180 * 2000 + 500);}

void Servo_SetAngle7(float Angle){ Angle=180-Angle; if(Angle>130)Angle=130; PWM_SetCompare7(Angle / 180 * 2000 + 500);}
void Servo_SetAngle8(float Angle){ Angle=180-Angle; if(Angle<50)Angle=50; PWM_SetCompare8(Angle / 180 * 2000 + 500);}

通用定时器 GTIM 控制初始化。

void GTIM_GPIOInit(void){    GPIO_InitTypeDef GPIO_InitStruct;     __RCC_GPIOB_CLK_ENABLE();    __RCC_GPIOA_CLK_ENABLE();      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;    GPIO_InitStruct.Pins = GPIO_PIN_0|GPIO_PIN_1;    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;    GPIO_Init(CW_GPIOB, &GPIO_InitStruct);    PB00_AFx_GTIM1CH3();    PB01_AFx_GTIM1CH4();       GPIO_InitStruct.Pins =   GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_7;     GPIO_Init(CW_GPIOA, &GPIO_InitStruct);    PA00_AFx_GTIM2CH1();    PA01_AFx_GTIM2CH2();    PA02_AFx_GTIM2CH3();    PA03_AFx_GTIM2CH4();    PA06_AFx_GTIM1CH1();    PA07_AFx_GTIM1CH2();}
void g_tim_init(void){ GTIM_InitTypeDef GTIM_InitStruct ; __RCC_GTIM1_CLK_ENABLE(); // GTIM1时钟使能 __RCC_GTIM2_CLK_ENABLE(); // GTIM1时钟使能 GTIM_GPIOInit(); GTIM_InitStruct.Mode = GTIM_MODE_TIME; GTIM_InitStruct.OneShotMode = GTIM_COUNT_CONTINUE; GTIM_InitStruct.Prescaler =GTIM_PRESCALER_DIV64; GTIM_InitStruct.ReloadValue =20000; //20MS GTIM_InitStruct.ToggleOutState = DISABLE; GTIM_TimeBaseInit(CW_GTIM1, >IM_InitStruct); GTIM_TimeBaseInit(CW_GTIM2, >IM_InitStruct); GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL1, GTIM_OC_OUTPUT_PWM_LOW); GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL2, GTIM_OC_OUTPUT_PWM_LOW); GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL3, GTIM_OC_OUTPUT_PWM_LOW); GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL4, GTIM_OC_OUTPUT_PWM_LOW); GTIM_OCInit(CW_GTIM2, GTIM_CHANNEL1, GTIM_OC_OUTPUT_PWM_LOW); GTIM_OCInit(CW_GTIM2, GTIM_CHANNEL2, GTIM_OC_OUTPUT_PWM_LOW); GTIM_OCInit(CW_GTIM2, GTIM_CHANNEL3, GTIM_OC_OUTPUT_PWM_LOW); GTIM_OCInit(CW_GTIM2, GTIM_CHANNEL4, GTIM_OC_OUTPUT_PWM_LOW); GTIM_Cmd(CW_GTIM1, ENABLE); GTIM_Cmd(CW_GTIM2, ENABLE); }

展望与未来

由于该项目为初探控机器人控制,使用的是现有硬件资源进行组装调试。后期有机会可以设计一款小巧控制板,装入结构中心,形成独立机器人。

另外,姿态控制算法在本实验中并未提及,数学基础较好的爱好者可作深入研究。

本次项目为作者初次尝试,如有不足之处,欢迎批评指证。


演示视频如下:




END

往期回顾

REVIEW

【产品应用】CW32电动工具产品开源

【产品应用】基于CW32的智能充电宝(方案开源)

【产品应用】CW-W88水泵通用控制板设计方案(已开源)

【产品应用】基于CW32的角磨机控制器产品方案

【产品方案】基于CW32F030C8的低压无刷风机无感控制器

【产品方案】基于CW32的无刷直流空心杯电机有感控制驱动方案

【产品方案】基于CW32的无刷直流空心杯电机无感方波控制驱动方案

从0到1,开启产品级智能硬件设计之路!

CW32生态社区(WX)群






扫码加入QQ群

3群| 610403240

获取资料及 “开发者扶持计划” 第一手资讯










请到「今天看啥」查看全文