一、认识
机器人是一种自动执行任务的机器,它可以人类或其它生物的某些功能,并按照预设的程序或通过技术来执行任务。
常见的一些基本概念有:
01定义:
机器人是具有感知、决策和执行功能的。它可以接受外部,进行处理,并据此执行一定的动作。
02组成:
感知系统:如摄像头、等,用于接收外部信息。
:如、等,用于处理信息和做出决策。
执行系统:如臂、等,用于执行具体的动作。
03分类:
:用于制造业,如焊接、组装、搬运等。
服务机器人:用于服务业,如医疗、清洁、娱乐等。
特种机器人:用于特殊环境,如深海探测、空间探测等。
04关键技术:
驱动技术:包括电动、液压、气动等驱动方式。
感知技术:包括视觉、触觉、听觉等多种感知方式。
导航与定位技术:如GPS、激光导航、惯性导航等。
05人工智能:
使机器人具备自主学习、推理和决策的能力。
06应用领域:
机器人广泛应用于制造业、医疗、家政、军事、农业、教育等多个领域。
二、初探CW32的四足机器人控制(用于玩和学习)
本项目使用8自由度舵机控制的四足机器人。主要用于爱好者学习参考。可实现基本控制姿态:前进、左转、右转、打滑、伸展、站立、躺平、摆手。有兴趣的朋友,也可以增加新步态控制。
01组成
(1)主控原理图
其中核心板,选用CW32F030C8T6核心板。
主要使用CW32F030C8T6以下特性:
- 内核:® Cortex®-M0+ -- 最高主频 64MHz
- 工作温度:-40℃ 至 105℃;工作电压:1.65V 至 5.5V
- 存储容量
最大 64K 字节 FLASH,数据保持 25 年 @85℃
最大 8K 字节 ,支持奇偶校验
128 字节 OTP 存储器
- 管理
4 ~ 32MHz 晶体
32kHz 低速晶体振荡器
内置 48MHz RC 振荡器
内置 32kHz RC 振荡器
内置 10kHz RC 振荡器
内置 150kHz RC 振荡器
内置 PLL 锁相环
时钟监测系统
允许独立关断各外设时钟
16位高级控制定时器,支持6路捕获/比较通道和3对互补PWM输出,死区时间和灵活的同步功能
四组 16 位通用定时器
三组 16 位基本定时器
窗口定时器
独立看门狗定时器
三路低功耗 ,支持小数波特率
两路 SPI 12Mbit/s
两路 接口 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 |
蓝牙APPAPP,可扫描。
测试APP,请在苹果下载DX-SMART。
使用时,打开手机蓝牙助手应用DX-SMART,设置UUID为BT16模块,搜索蓝牙设备连接BT04-E设备。
正常通讯界面如下:
温馨提示:使用其它蓝牙模块时,注意2个问题:
1. 波特率设置时,蓝牙模块需与单片机相符。
2. 如果搜索不到设备,或Serve失败时,需指定正确的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个舵机。编号定义分别为①~⑧。
安装后的实物图如下:
引脚定义如下:
在脚角安装时,舵机的控制角度范围需要测试并确定。以下图为例,展示了①-④号舵机的角度限制范围:
程序中需要对每个舵机的旋转角度范围做限制,才可输出。否则,在旋转时,受死角影响发生过载易产生损坏。
02 软件组成
(1)使用的外设资源
(一)CW32F030内部集成4 个通用定时器(GM),每个GTIM 完全独立且功能完全相同,各包含一个16bit 自动重装载计数器并由一个可预分频器驱动。GTIM 支持定时器模式、计数器模式、触发启动模式和门控模式4 种基本工作模式,每组带4 路独立的捕获/ 比较通道,可以测量输入信号的脉冲宽度(输入捕获)或者产生输出波形(输出比较和PWM)。
项目中使用了通用定时器GTIM1GTIM2的PWM输出功能。
(二)CW32F030的通用异步(UART) 支持异步全双工、同步半双工和单线半双工模式,支持硬件数据流控和多机;可编程数据帧结构;可以通过小数波特率发生器提供宽范围的波特率选择。UART 工作在双时钟域下,允许在深度休眠模式下进行数据的接收,接收完成中断可以唤醒MCU 回到运行模式。
项目中使用了串口UART3外设资源。
(2)主要实现代码
主程序:
int mn()
{
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.ns = 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.ReloValue =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);
}
三、展望与未来
由于该项目为初探控机器人控制,使用的是现有硬件资源进行组装调试。后期有机会可以设计一款小巧控制板,装入结构,形成独立机器人。
另外,姿态控制算法在本实验中并未提及,数学基础较好的爱好者可作深入研究。
本次项目为作者初次尝试,如有不足之处,欢迎批评指证。
上一篇:智能机器人行业的进化:开发门槛大降,大模型部署高性能低功耗兼得
下一篇:100T极致算力+全链路开发支持,地瓜机器人为具身智能造“基座”
- 热门资源推荐
- 热门放大器推荐
- LTC2945IUD-1 在 -48V 系统中使用低侧检测进行电源监控的典型应用
- 用于 24V 汽车应用的 LTC4367IDD 过压电源保护控制器的典型应用
- LTC2635-HZ12 四通道、12 位数模转换器的典型应用
- 使用 ROHM Semiconductor 的 BU4821 的参考设计
- 使用 Analog Devices 的 AD9625 的参考设计
- LT1307CS8 高压反激式转换器的典型应用电路
- AD7858L 3V 至 5V 单电源、200ksps、8 通道、12 位采样 ADC 的典型应用
- AND8337/D、1.2V、1.5V DC 至 DC 单路输出电源参考设计
- DER-713 - 使用 InnoSwitch3-EP PowiGaN 和 MinE-CAP 的 65 W 高功率密度适配器
- LDK120C11R 1.1V低压降稳压器典型应用(可调版)电路

非常经典的关于LLC的杨波博士论文
OP413EY
MI-QC63T-IVY






京公网安备 11010802033920号