[ARM入门] CW32L012 灵眸X1 小车测评

[复制链接]
869|1
CWH007 发表于 2025-11-25 19:39 | 显示全部楼层 |阅读模式
, ,
#每日话题# CW32L012
帅照:
不说废话,先上资料~
  • CW32L012开发板/资料/活动合集 - 飞书云文档

CW32L012用户手册下载:
  • CW32L012C8T6-武汉芯源半导体官网|专注32位MCU芯片设计

官方系统教学文档:
  • CW32小车 正式发布版 - 飞书云文档


开箱介绍
  • 在CW小程序下单了灵眸小车,包装非常扎实,外层有专用纸箱缓冲。我选择的是焊接好的成品,开箱后除了小车本体,还有电池和充电器,真正做到了开箱即用,为想快速上手的玩家省去了不少麻烦。



小车功能实现:红外遥控
  • 小车集成度很高,红外接收头已经焊接在主板上,位于车身后方,接收角度很广。

  • 主工程代码功能齐全,我重点梳理和优化了红外遥控相关的逻辑,使其更加清晰。核心在于红外指令的解码与状态机切换。


char oled_disbuff[25];
uint32_t ir_cmd = 0; // 红外指令码
uint8_t car_state, last_car_state;
int16_t speed = 0;
uint8_t change_car_state_flag;

// 函数声明
static void decode_ir_control(void);
static void update_car_state(void);
static void update_display(void);
static void initialize_hardware(void);

/**
* @brief 主函数
*/
int32_t main(void)
{
    // 硬件初始化
    initialize_hardware();
   
    // 设置初始状态
    car_state = 0; // 上电默认停止
    speed = 200;   // 默认速度
   
    // 主循环
    while (1)
    {
        // 核心:解码红外指令并控制小车
        decode_ir_control();
        
        // 更新小车运动状态
        update_car_state();
        
        // 更新OLED显示,实时反馈
        update_display();
    }
}

/**
* @brief 硬件初始化
*/
static void initialize_hardware(void)
{
    SYSCTRL_Configuration();
    LED_Init();
    Buz_Init();
    IR_Init();      // 红外接收初始化
    OLED_Init();
    Motor_Init();
    ADC_Init();     // 用于电源监测
}

/**
* @brief 解码红外指令并执行相应动作
*/
static void decode_ir_control(void)
{
    // 获取红外码值,使用常见的NEC编码格式
    if(IR_GetDecodeResult(&ir_cmd)) {
        
        // 根据不同的红外码值执行不同功能
        switch(ir_cmd) {
            case 0xFF02FD: // [电源]键:急停
                car_state = 0;
                Buz_PlayTone(1500, 200); // 高音提示音
                break;
               
            case 0xFF629D: // [VOL+]:前进
                car_state = 1;
                break;
               
            case 0xFFA857: // [VOL-]:后退
                car_state = 2;
                break;
               
            case 0xFF22DD: // [|<<]:左转
                car_state = 3;
                break;
               
            case 0xFFC23D: // [>>|]:右转
                car_state = 4;
                break;
               
            case 0xFF6897: // [1]键:低速
                speed = 150;
                break;
               
            case 0xFF9867: // [2]键:中速
                speed = 200;
                break;
               
            case 0xFFB04F: // [3]键:高速
                speed = 250;
                Buz_PlayTone(800, 100); // 高速警告音
                break;
               
            default:
                break;
        }
        
        // 每次有效按键都让LED闪烁一下,提供触觉反馈
        LED_Toggle();
    }
}

/**
* @brief 更新小车状态
*/
static void update_car_state(void)
{
    switch(car_state) {
        case 0: // 停止
            Car_Stop();
            LED_Off();
            break;
        case 1: // 前进
            Car_Run(speed);
            break;
        case 2: // 后退
            Car_Run(-speed);
            break;
        case 3: // 左转
            Car_Left(speed);
            break;
        case 4: // 右转
            Car_Right(speed);
            break;
    }
}

/**
* @brief 更新OLED显示
*/
static void update_display(void)
{
    OLED_Printf(1, 0, OLED_6X8, "IR Control Ready");
    OLED_Printf(1, 16, OLED_6X8, "State:%d", car_state);
    OLED_Printf(1, 32, OLED_6X8, "Speed:%d", speed);
    OLED_Printf(1, 48, OLED_6X8, "CMD:%08lX", ir_cmd); // 显示最新红外码
    OLED_Update();
}
简单来说,小车上电后即进入红外监听模式。我用的是一款通用的NEC编码红外遥控器,无需额外配置,代码已经将常见的按键(如音量键、曲目切换键)映射为了小车的行进指令。按键响应迅速,控制精准,几乎没有延迟。

总结通过这次测评,红外遥控这种经典的控制方式给了我很大的惊喜。它不需要复杂的蓝牙配对或网络配置,即按即控,稳定可靠,非常适合在实验室或者家中固定场所进行演示和调试。灵眸小车完善的红外解码库使得这一功能的实现变得异常简单。对于初学者而言,从红外遥控入门来理解中断、解码和状态机这些概念,是再合适不过的了。这台小车再一次证明,强大的底层框架能让开发者专注于功能与创意。如果你也想体验这种“指哪打哪”的经典控制乐趣,CW32社区的灵眸小车绝对是一个不会让你失望的选择。
友情链接(【CW32L012小车测评】到手小车测评其中基本功能 - 哔哩哔哩
参考博客:STM32F103正点原子学习笔记系列——REMOTE - 知乎
红外收发通信模块-IR333-IRM3638,———EEWorld参考设计中心

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yangjiaxu 发表于 2025-11-30 19:59 | 显示全部楼层
看这个小车真的很帅啊,不错不错  制作成本怎样 贵不贵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0