0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CW32生态社区 来源: CW32生态社区 作者:CW32生态社区 2024-09-25 12:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、认识机器人

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

常见的一些基本概念有:

01定义:

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

02组成:

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

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

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

03分类:

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

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

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

04关键技术:

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

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

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

05人工智能:

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

06应用领域:

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

二、初探CW32的四足机器人控制(用于玩和学习)

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

01硬件组成

wKgZombzjKKAHgquAABZwtnVU_467.webp

(1)主控原理图

wKgaombzjKOAZGc4AABkFvOl6NE04.webp

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

wKgZombzjKOACK32AAFddmlmHQg35.webp

主要使用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指令,用户可根据需要更改串口波特率、设备名称等参数。具有成本低、功耗低、接收灵敏高等优点。

wKgaombzjKOAXhw7AABACFpM9Yc06.webp

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

GND GND
5V 5V
TXD PA10
RXD PA9

wKgZombzjKSAAlbqAAAW6L7WF2852.webp

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

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

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

wKgaombzjKSAOvZdAACeEsUmERM76.webp

正常通讯界面如下:

wKgZombzjKSAPqUbAAC-zGdbxXs18.webp

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

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

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

(3)舵机控制

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

wKgaombzjKWAYuusAABi1EUI_0085.webp

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

wKgZombzjKWAT5eIAABcbIHlI1c33.webp

wKgaombzjKWAV3NlAABT1p51hjk16.webp

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 度;

wKgZombzjKaAbDnOAABS3GCMMY061.webp

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

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

(4)结构安装

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

安装后的实物图如下:

wKgaombzjKaAHbUIAABQzpPdB7A52.webp

引脚定义如下:

wKgZombzjKaANNlhAAA7XhNrl4E53.webp

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

wKgaombzjKeAdL95AAA5DOlP8GY60.webp

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

02 软件组成

(1)使用的外设资源

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

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

wKgZombzjKiAfzyiAAAsEAxkrr471.webp

wKgaombzjKmAS2AnAABy4GaMq5080.webp

wKgZombzjKmAVY4MAABRbn5KIjc74.webp

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

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

wKgaombzjKqAXiFEAABJzkmTOxI97.webp

(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);    
}

三、展望与未来

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

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

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

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

    关注

    1

    文章

    100

    浏览量

    15732
  • CW32
    +关注

    关注

    1

    文章

    323

    浏览量

    1956
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    机器人成群结队亮相NVIDIA GTC 2026

    GTC 不仅是 AI 开发者与创新者的盛会,也成了各类机器人的秀场,人形机器人、机械臂,到机器人
    的头像 发表于 04-01 09:13 1821次阅读

    电压放大器在压电移动机器人运动输出特性实验中的应用

    实验名称: 基于惯性致动的压电移动机器人运动输出特性测试实验 研究方向: 惯性致动、压电移动机器
    的头像 发表于 03-20 11:24 149次阅读
    电压放大器在<b class='flag-5'>四</b><b class='flag-5'>足</b>压电移动<b class='flag-5'>机器人</b>运动输出特性实验中的应用

    再谈低温烧结银的应用:从春晚机器人出镜的幕后推手说起

    未来》和《立上游》:**MagicBot Z1/Gen1+MagicDog ,集群伴舞、多机协同,主打快速响应+低延迟+高集成。 **松延动力:《奶奶的最爱》:**E1/N2/Bumi+仿生机器人
    发表于 02-17 14:07

    入门宇树机器人开发:从SDK源码探索到实战操作

    宇树机器人(Unitree)作为全球领先的机器人研发企业,其推出的unitree_sdk2是面向旗下 Go2、H1、B2 等系列机器人
    的头像 发表于 02-06 16:43 3367次阅读
    入门宇树<b class='flag-5'>机器人</b><b class='flag-5'>开发</b>:从SDK源码探索到实战操作

    英泰学堂与行业专家共话机器人技术未来

    2月2日,英泰学堂举办的《机器人技术实现及场景应用》主题培训在7栋一楼多功能厅成功开展。本次培训特邀行业专家白金龙先生主讲,培训内容紧扣机器人技术前沿动态,全面覆盖硬件选型、感知系
    的头像 发表于 02-04 17:07 1342次阅读

    请问CW32中的CW是啥意思?

    CW32中的CW是啥意思?
    发表于 02-02 07:10

    普渡D5在全球首个机器人登高挑战赛中斩获轮式机器人组冠军

    ,上演了一场技术与性能的巅峰对决。最终,深圳市普渡科技股份有限公司的轮式机器人PUDU D5凭借13秒01的优异成绩,大幅领先排名第二的宇树Go2-W,成功斩获轮式
    的头像 发表于 01-07 15:24 322次阅读
    普渡D5在全球首个<b class='flag-5'>机器人</b>登高挑战赛中斩获轮式<b class='flag-5'>四</b><b class='flag-5'>足</b><b class='flag-5'>机器人</b>组冠军

    如何快速在MDK下添加CW32芯片进行开发

    如何快速在MDK下添加CW32芯片进行开发
    发表于 12-22 16:23

    普渡机器人发布行业级机器人PUDU D5系列, 引领多形态具身智能发展

    12月3日,全球服务机器人领军企业普渡机器人正式发布新款行业级自主导航机器人 PUDU D5 系列,该产品专为复杂、非结构化及大面积户外
    的头像 发表于 12-03 14:30 457次阅读

    CW32L012小型机器人控制评估板活动 机器人+智能小车 开箱评测

    一、评测前言 非常感谢CW32生态社区,开源分享了许多比较好玩、优质的项目。这次活动都尾声了还能有幸申请购买到 机器人+小车-智能小车(套件数量不多)的评测套件,多谢C32生态社区
    发表于 11-24 23:44

    CW32 MCU用什么IDE开发

    推荐使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE开发CW32 MCU应用,其中新版本IAR EWARM直接支持CW32 MCU,Keil MDK-ARM则需要
    发表于 11-12 07:52

    最新发布!泰科机器人发布首款自研双人形机器人

    泰科机器人凭借十多年的技术积淀与持续创新,已成功推出多款高性能人形机器人肢的解决方案。今天,泰科机器人再次迎来重大突破——首款自主研发的双
    的头像 发表于 09-02 14:34 3659次阅读
    最新发布!泰科<b class='flag-5'>机器人</b>发布首款自研双<b class='flag-5'>足</b>人形<b class='flag-5'>机器人</b>

    机器人看点:越疆机器人正式发布六仿生机器狗 智元公布机器人运动控制模型专利

    ”具身机器人平台的企业。 此前越疆机器人发布的六仿生机器狗是集“认知、动作、机动”三大核心能力于一体的创新产品,而且六架构既具备优于
    的头像 发表于 07-09 15:03 2469次阅读

    年出货约2万台!中国厂商主导全球机器人市场

    电子发烧友网报道(文 / 吴子鹏)近日,国际数据公司(IDC)发布《全球机器人市场份额,2024:中国厂商领跑,具身智能开启多元行业应用》报告。数据显示,2024 年全球
    的头像 发表于 07-03 00:57 9019次阅读

    盘点#机器人开发平台

    地瓜机器人RDK X5开发套件地瓜机器人RDK X5开发套件产品介绍 旭日5芯片10TOPs算力-电子发烧友网机器人
    发表于 05-13 15:02