【CW32L012小车测评】到手小车测评其中基本功能

电子说

1.4w人已加入

描述

开箱介绍

在CW小程序中购买了小车,其中的包装特别好,外面有个箱子来装着,其中我们将外包装拆开,可以看见我们本次购买的小车的本体,我购买的是焊接完成的,所以我可以开箱直接试用,方便很多,如果大家追求方便可以购买成品,如果想锻炼其中也有推荐的开发套件可以自行焊接。

其中到手的主要物品在这里:

CW32

其中还有电池和电池充电器,就没拍摄进来。

小车展示

CW32

小车正面图

其中小车底板。经过后面才发现其中前面小车的LED灯没有焊接,估计是人工焊接的时候忘记焊接LED灯,导致我以为其中是没有LED,导致后面循迹一直出现问题,后面补了3个灯实现补光操作。

小车资料

其中让我感觉社区搭建很不错,其中的资料都是在飞书中可以找到,我下载了其中的小车代码,然后在keil5中进行调试。

小车功能实现

红外和循迹控制小车

其中main函数的代码估计是调试代码放上来其中的注释有点多,后面简约通过ai修改了一下,将其中的功能大致分为几个部分。

char oled_disbuff[25];

uint8_t key;

uint16_t SpeedDelay = 150;

uint8_t car_state, last_car_state;

int16_t speed = 0, last_speed;

uint8_t change_speed_flag, speed_illegal_flag, change_car_state_flag, avoidance_flag, Gray_voice_flag;

float Hc04_val;

float power_val;

// 函数声明

static void handle_key_input(void);

static void update_car_state(void);

static void update_display(void);

static void initialize_hardware(void);

/**

 * @brief 主函数

 * @param None

 * @retval int32_t

 */

int32_t main(void)

{

    // 硬件初始化

    initialize_hardware();

    // 设置初始舵机角度

    Set_car_Angle5(90);

    // 初始化状态变量

    last_car_state = car_state;

    last_speed = speed;

    // 主循环

    while (1)

    {

        // 处理按键输入

        handle_key_input();

        // 传感器数据更新

        Hc04_val = Get_Disance();           //获取超声波

        power_val = get_power_val();    //计算电压

        // 发送速度到语音模块

        //send_spd_to_voice();

        // 避障功能

        //avoidance_fun();

        check_Gray_and_changeState();

        // 更新小车状态

        update_car_state();

        // 更新显示

        update_display();

                IR_fun();

    }

}

/**

 * @brief 硬件初始化函数

 * @param None

 * @retval None

 */

static void initialize_hardware(void)

{

    SYSCTRL_Configuration();

    LED_Init();

    Buz_Init();

    BTIM1_Init();

    key_Init();

    Uart_Init();                    // UART1 PA9(T) 10

    AC6328A_Init();                 // UART2 PA2(T) 3

    Servo_car_tail_Init();          // GTIM1  PB8

    IR_Init();

    OLED_Init();

    HC_SR04_Init();

    WS2812_Init();

    Motor_Init();                   // 与舵机共用GTIM1 PB3 4 5 12 

    ADC_track_Init();               // 舵机和ADC循迹采集口共用   循迹ADC  PA1 4 5 6

}

/**

 * @brief 处理按键输入

 * @param None

 * @retval None

 */

static void handle_key_input(void)

{

    key = get_keyval();

    switch (key)

    {

        case 1:

            buz_flag = 1;

            car_state = 0;           // 停止状态

            change_car_state_flag = 1;

            break;

        case 2:

            buz_flag = 1;

            car_state = 6;           // 前进状态

            speed = 200;

            change_car_state_flag = 1;

            break;

        default:

            break;

    }

}

/**

 * @brief 更新小车状态

 * @param None

 * @retval None

 */

static void update_car_state(void)

{

    switch (car_state) 

    {

        case 0: // 停止

            Car_Stop();

            WS_shadow(2);

            Send_RGB(1, 0, 0, 0);

            Send_RGB(3, 0, 0, 0);

            break;

        case 1: // 前进

            if (gray_flag == 0) 

                Car_Run(speed);

            check_Gray_and_changeState();

            Send_RGB(2, 0, 255, 0);

            Send_RGB(1, 0, 0, 0);

            Send_RGB(3, 0, 0, 0);

            break;

        case 2: // 后退

            Car_Run(-speed);

            Send_RGB(2, 255, 0, 0);

            Send_RGB(1, 0, 0, 0);

            Send_RGB(3, 0, 0, 0);

            break;

        case 3: // 左转

            Car_Left(speed);

            Send_RGB(1, 255, 0, 0);

            Send_RGB(2, 0, 0, 0);

            Send_RGB(3, 0, 0, 0);

            break;

        case 4: // 右转

            Car_Right(speed);

            Send_RGB(3, 255, 0, 0);

            Send_RGB(1, 0, 0, 0);

            Send_RGB(2, 0, 0, 0);

            break;

        case 5: // 摇尾巴

            wagtail();

            Car_Stop();

            WS_shadow(2);

            Send_RGB(1, 0, 0, 0);

            Send_RGB(3, 0, 0, 0);

            break;

        case 6: // 循迹

             GrayscaleSensor_fun(); // 当前被注释

            break;

        default: 

            break;

    }

}

/**

 * @brief 更新OLED显示

 * @param None

 * @retval None

 */

static void update_display(void)

{

    uint8_t D1, D2, D3;

    // 显示超声波距离

    if (Hc04_val == 0xffff || Hc04_val == 0) 

        OLED_Printf(1, 8, OLED_6X8, "HC04_Error       ");

    else 

        OLED_Printf(1, 8, OLED_6X8, "Distance:%.0fcm  ", Hc04_val);

    // 获取循迹传感器数据

    get_track_data(&D1, &D2, &D3);

    // 显示系统状态信息

    OLED_Printf(1, 0, OLED_6X8, "Hello");

    OLED_Printf(1, 16, OLED_6X8, "%d", car_state);

    OLED_Printf(1, 24, OLED_6X8, "%d", avoidance_flag);

    OLED_Printf(1, 32, OLED_6X8, "Sensor:%d %d %d", D1, D2, D3);

    OLED_Printf(1, 40, OLED_6X8, "Power_Voltage:%.2f", power_val);

    // 更新OLED显示

    OLED_Update();

}

/**

 * @brief 系统时钟配置

 * @param None

 * @retval None

 */

void SYSCTRL_Configuration(void)

{

    /* 0. HSI使能并校准 */

    SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV1);

    /* 1. 设置HCLK和PCLK的分频系数 */

    SYSCTRL_HCLKPRS_Config(SYSCTRL_HCLK_DIV1);

    SYSCTRL_PCLKPRS_Config(SYSCTRL_PCLK_DIV1);

    SYSCTRL_SystemCoreClockUpdate(96000000);

}

/**

 * @brief 检查小车状态变化

 * @param None

 * @retval None

 */

void check_car_state(void)

{

    if (last_car_state != car_state)

    {

        last_car_state = car_state;

        change_car_state_flag = 1;

    }

    if (last_speed != speed)

    {

        last_speed = speed;

        change_speed_flag = 1;

    }

}

简单的来说,其中小车上电就是超声波避障的功能,但拥有小车的我们谁不想控制小车,让小车循迹呢。其中大致框架已经帮我们写好了,我们只需要简单的调用就能实现操作,其中主函数启动红外功能,在while循环中接收指令码,就能实现小车的移动功能。

CW32

外红功能展示。

CW32

循迹功能展示,其中使用按键1开启和按键2关闭。

因为手头没有白灯,只有蓝灯导致其中红外循迹可能有点不准。

总结

其中小车的功能性和趣味性很足,其中还有更多的功能蓝牙控制,超声波循迹等待大家探索,我也是特别喜欢小车,拥有一台属于自己的小车是多少电子人的追求,也是简单上手也体验到小车运动的快乐,大家喜欢的话,可以在CW32社区中查询灵眸小车。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • 热点推荐
  • CW32

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分