全国大学生智能汽车大赛(一):摄像头识别赛道代码

全国大学生智能汽车大赛(二):摄像头识别赛道代码

全国大学生智能汽车大赛(三):上下位机通信协议及代码

一、 上下位机通信协议及代码

/*******************************
 * 屏幕显示
 * 蓝牙通信
 *作者:躺躺我啊
 *最终修改日期:2021.6.20
*TC264D
*******************************/
 
#include "headfile.h"
uint8 data[30];
 
//向上位机发送信息用
extern int speed_now_int,speed_out_int;
extern int x_error_int,y_error_int;
 
void data_init(void)
{
    data[0]  = 0x55; //帧数据头
    data[1]  = 0xaa; //帧数据头
    data[28] = 0x55; //帧数据尾
    data[29] = 0xaa; //帧数据尾
}
 
void send_to_pc(void)
{
    data[2]  = speed_now_int / 256;    //编码器输出,高8位
    data[3]  = speed_now_int % 256;    //编码器输出,低8位
    data[4]  = speed_out_int / 256;    //电机PWM占空比,高8位
    data[5]  = speed_out_int % 256;    //电机PWM占空比,低8位
    data[6]  = steer.out / 256;        //舵机控制输出,高8位
    data[7]  = steer.out % 256;        //舵机控制输出,低8位
    data[8]  = steer.ll  / 256;        //电感1输出值,高8位
    data[9]  = steer.ll  % 256;        //电感1输出值,低8位
    data[10] = steer.l   / 256;        //电感2输出值,高8位
    data[11] = steer.l   % 256;        //电感2输出值,低8位
    data[12] = steer.lm  / 256;        //电感3输出值,高8位
    data[13] = steer.lm  % 256;        //电感3输出值,低8位
    data[14] = steer.m   / 256;        //电感4输出值,高8位
    data[15] = steer.m   % 256;        //电感4输出值,低8位
    data[16] = steer.r   / 256;        //电感5输出值,高8位
    data[17] = steer.r   % 256;        //电感5输出值,低8位
    data[18] = steer.rm  / 256;        //电感6输出值,高8位
    data[19] = steer.rm  % 256;        //电感6输出值,低8位
    data[20] = steer.rr  / 256;        //电感7输出值,高8位
    data[21] = steer.rr  % 256;        //电感7输出值,低8位
    data[22] = steer.all / 256;        //电感总输出值,高8位
    data[23] = steer.all % 256;        //电感总输出值,低8位
    data[24] = x_error_int / 256;      //横向电感偏差,高8位
    data[25] = x_error_int % 256;      //横向电感偏差,低8位
    data[26] = y_error_int / 256;      //纵向电感偏差,高8位
    data[27] = y_error_int % 256;      //纵向电感偏差,低8位
 
    wireless_send_buff(&data[0],30);   //向上位机发送数据
}
 
void show_all(void)
{
    char txt[32] = "xiaoli";
 
    sprintf(txt, "1_ll:%4d 2_l:%4d 3_lm:%4d", steer.ll, steer.l, steer.lm);         //显示电感值
    ips200_showstr(0,0,txt);
 
    sprintf(txt, "7_rr:%4d 6_r:%4d 5_rm:%4d", steer.rr, steer.r, steer.rm);         //显示电感值
    ips200_showstr(0,1,txt);
 
    sprintf(txt, "4_mid:%4d", steer.m);                                             //显示电感值
    ips200_showstr(0,2,txt);
 
    sprintf(txt, "L_all:%4d ", steer.all);                                         //显示电感总值
    ips200_showstr(0,3,txt);
 
    sprintf(txt, "x_left: %4d", steer.x_left);                                      //显示左横电感总值
    ips200_showstr(0,4,txt);
 
    sprintf(txt, "x_right:%4d",steer.x_right);                                      //显示右横电感总值
    ips200_showstr(0,5,txt);
 
    sprintf(txt, "x_err:%4.1f  x_big:%4d", steer.x_error, steer.x_bigerror);        //显示电感偏差
    ips200_showstr(0,6,txt);
 
    sprintf(txt, "y_err:%4.1f  y_big:%4d", steer.y_error, steer.y_bigerror);        //显示电感偏差
    ips200_showstr(0,7,txt);
 
    sprintf(txt, "steer.out:%4d",steer.out);                                        //显示舵机控制输出
    ips200_showstr(0,8,txt);
 
    sprintf(txt, "speed_now:%.1f",speed_param.now);                                 //显示电机PWM
    ips200_showstr(0,9,txt);
 
    sprintf(txt, "speed_set:%.1f",speed_param.set);                                 //显示电机PWM
    ips200_showstr(0,10,txt);
 
    sprintf(txt, "speed_out:%.1f",speed_param.out);                                //显示电机PWM
    ips200_showstr(0,11,txt);
 
    sprintf(txt, "speed_real:%.1f",speed_param.speed_real);                        //显示实际速度
    ips200_showstr(0,12,txt);
 
    sprintf(txt, "counts_flag:%d  counts:%d",speed_param.counts_flag,speed_param.counts);  //显示实际速度
    ips200_showstr(0,13,txt);
 
    sprintf(txt, "distance:%.1f",speed_param.distance);                             //显示实际速度
    ips200_showstr(0,14,txt);
 
    sprintf(txt, "direct_flag:%d",steer.direct_flag);                               //显示丢线相关信息
    ips200_showstr(0,15,txt);
 
    sprintf(txt, "circle_flag:%d stage:%d",steer.circle_flag,steer.circle_stage);   //显示环岛相关信息
    ips200_showstr(0,16,txt);
 
    sprintf(txt, "trident_flag:%d time:%d",steer.trident_flag,steer.trident_time);  //显示三叉相关信息
    ips200_showstr(0,17,txt);
 
}
 
//蜂鸣器,time为蜂鸣次数
void bark(int time)
{
    int i = 0;
    for (i = 0;i < time;i++)
    {
        gpio_set(P33_10,1);          //开启蜂鸣器
        systick_delay_ms(STM0, 400); //延时
        gpio_set(P33_10,0);          //关闭蜂鸣器
    }
}

二、 推荐IO分配

摄像头:8个数据口,一个串口,两eru中断
        数据口:00_0 00_1 00_2 00_3 00_4 00_5 00_6 00_7
        配置串口:摄像头RX:02_2     摄像头TX:02_3
        VSY:02_0
        HREF:程序不需要,所以不接
        PCLK:02_1

        四路运放 A0 A1 A2 A3 等

四个编码器:
    LSB:33_7   DIR:33_6
    LSB:02_8   DIR:00_9
    LSB:10_3   DIR:10_1
    LSB:20_3   DIR:20_0

8路pwm:

        21_2 21_3 21_4 21_5 02_4 02_5 02_6 02_7

ICM20602:
    CLK:    P20_11  
    MOSI:    P20_14 
    MISO:    P20_12 
    CS:    P20_13
    SPI0

TFT屏幕:
    CLK     15_3 
    MOSI     15_5 
    MISO     15_4    //实际上TFT没有这个引脚 这里仅仅占位而已  
    CS0     15_2 
    BL         15_4     //复用控制背光
    REST     15_1 
    DC         15_0  
    SPI2

舵机:P33_9


        尽量不要使用以下引脚,以下引脚属于boot引脚,不合理的使用容易导致单片机无法启动等问题,因此建议大家尽量不要使用:
        P14_2 
        P14_3
        P14_4
        P14_5
        P14_6 
        P10_5 
        P10_6