小米CyberGear电机 STM32软件修改CAN_ID

需要同时控制多个CyberGear小米电机时,需要更改电机的CAN_ID。原本在其给的上位机进行修改,发现其需要指定的USB-CAN模块(维特),手头没有,网购需要三四天,时间太长。想着能不能通过STM32进行修改,先前从网上找的一些代码,已经驱动了小米电机正常运动,所以其CAN通讯没问题。

首先借鉴网络资源:小米CyberGear微电机 软件修改CAN_ID 注意事项_小米微电机app最新版本更新内容-CSDN博客。知道大概怎么改。然后找了源代码,发现跟别人的不一样:

void set_CANID_cybergear(MI_Motor *Motor,uint8_t CAN_ID)

{

       uint8_t tx_data[8]={0};

       txMsg.ExtId = Communication_Type_CanID<<24|CAN_ID<<16|Master_CAN_ID<<8|Motor->CAN_ID;

    Motor->CAN_ID = CAN_ID;//将新的ID导入电机结构体

    can_txd();      

}

很长的一个等式,看的晕头转向。

花了两三个小时,发现驱动不了。然后,开始顺着代码从头到尾读一读(真不想读)。然后发现这个地方txMsg初始化不完整,而源代码初始化实在电机初始化中。更改ID时,小米电机不能初始化。所以将小米电机初始化中的代码,复制出来一部分,贴到这里:

//设置电机CAN_ID(通信类型7)更改当前电机CAN_ID , 立即生效,**需在电机使能前使用**

void set_CANID_cybergear(MI_Motor *Motor,uint8_t CAN_ID)

{

       uint8_t tx_data[8]={0};

         txMsg.StdId = 0;            //配置CAN发送:标准帧清零

    txMsg.ExtId = 0;            //配置CAN发送:扩展帧清零    

    txMsg.IDE = CAN_ID_EXT;     //配置CAN发送:扩展帧

    txMsg.RTR = CAN_RTR_DATA;   //配置CAN发送:数据帧

    txMsg.DLC = 0x08;           //配置CAN发送:数据长度

       txMsg.ExtId = Communication_Type_CanID<<24|CAN_ID<<16|Master_CAN_ID<<8|Motor_CAN_ID;

  can_txd();  

       Motor->CAN_ID = CAN_ID;//将新的ID导入电机结构体

}

在cybergear.h增加:

#define Motor_CAN_ID 0x7F // 当前电机ID,默认0x7F

#define Motor_CAN_ID_NEW 0x1F // 拟使用ID

在main函数中增加:

       while(1){

              set_CANID_cybergear(&mi_motor[0],Motor_CAN_ID_NEW);

              HAL_Delay(500);

       }

重新给电机上电。等几秒后,再将上述代码注释掉,并修改#define Motor_CAN_ID 0x1F。之后电机的ID就是0x1F啦。

### 关于Cyber Dog STM32项目的文档与教程 #### 设备端代码设计概述 对于基于STM32的智能设备开发,特别是针对像赛博小狗这样的复杂项目,理解如何构建和优化设备端代码至关重要。在初次设置过程中遇到的问题表明,在Android客户端首次连接到STM32控制器时需手动更新Token[^1]。这提示开发者应考虑改进初始化流程以提高用户体验。 #### 数据传输机制 为了确保稳定性和效率,STM32硬件部分被配置为通过Wi-Fi定期向云端发送传感器采集的信息[^2]。这种周期性的数据同步有助于远程监控系统的状态并及时调整操作策略。 #### CAN总线通信接口编程实例 当涉及到更具体的组件交互时,比如控制小米电机,可以通过定义特定的消息格式来实现高效可靠的CAN总线通信。例如,`check_param_cybergear()` 函数展示了如何构造一条用于查询指定编号下的电机参数请求消息,并将其封装成标准CAN帧发出[^3]: ```c void check_param_cybergear(MI_Motor *Motor, uint8_t index) { uint8_t tx_data[8] = {0}; /* 构建扩展ID */ txMsg.ExtId = (Communication_Type_GetSingleParameter << 24 | Master_CAN_ID << 8 | Motor->CAN_ID); /* 设置数据域 */ tx_data[0] = index >> 8; // 高字节 tx_data[1] = index & 0xFF; // 低字节 /* 发送CAN报文 */ MyCAN_Transmit(txMsg.ExtId, txMsg.DLC, tx_data); } ``` 此段代码片段不仅适用于单一参数读取场景,也为其他类型的命令提供了模板参考[^4]。 #### 控制模式切换示例 另外值得注意的是,在某些应用场景下可能需要动态改变执行机构的工作方式。例如,将默认的位置伺服模式改为速度闭环或其他形式,则可以在相应的头文件中重新定义宏定义或调用API完成转换工作[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fengyuzhe13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值