智能车竞赛的WiFi图传代码

目录

说明:

一、my_spi_wifi.c文件

1.1 预编译和全局变量

1.2 my_spi_wifi_init函数

1.3 my_spi_wifi_rece函数

1.4 my_spi_wifi_image_init函数

1.5 my_spi_wifi_image_send函数

1.6 my_spi_wifi_image_senfOriginal函数

1.7 my_spi_wifi_image_SendOriginal_BX函数

1.8 my_wifi_image_send函数

 二、my_spi_wifi.h文件


说明:

根据逐飞的库,进行了wifi图传代码的封装

编译环境:ADS 1.80

一、my_spi_wifi.c文件

1.1 预编译和全局变量

#include "zf_common_headfile.h"
//选择协议,必选一个,不然没办法通信
//#define UTP
#define TCP


uint8 wifi_spi_test_buffer[] = "初始化成功\n";
uint8 wifi_spi_get_data_buffer[256];
uint32 data_length = 0;
// 图像备份数组,在发送前将图像备份再进行发送,这样可以避免图像出现撕裂的问题
IFX_ALIGN(4) uint8 image_copy[MT9V03X_H*MT9V03X_W];

1.2 my_spi_wifi_init函数

/*  @wifi初始化函数
 *  @说明:根据逐飞库修改而来
 *  @作者:吴广金
 *  @时间:2024年3月7日
 * */
void my_spi_wifi_init(void)
{
    while(wifi_spi_init(WIFI_SSID_TEST, WIFI_PASSWORD_TEST))
    {
        printf("\r\n connect wifi failed. \r\n");
        system_delay_ms(100);                                                   // 初始化失败 等待 100ms
    }
    printf("\r\n module version:%s",wifi_spi_version);                          // 模块固件版本
    printf("\r\n module mac    :%s",wifi_spi_mac_addr);                         // 模块 MAC 信息
    printf("\r\n module ip     :%s",wifi_spi_ip_addr_port);                     // 模块 IP 地址

    // zf_device_wifi_spi.h 文件内的宏定义可以更改模块连接(建立) WIFI 之后,是否自动连接 TCP 服务器、创建 UDP 连接
    if(0 == WIFI_SPI_AUTO_CONNECT)                                              // 如果没有开启自动连接 就需要手动连接目标 IP
    {
        while(wifi_spi_socket_connect(                                          // 向指定目标 IP 的端口建立连接
#ifdef UDP//建立udp连接
            "UDP",                                                              // 指定使用UDP方式通讯
#endif
#ifdef TCP //建立TCP连接
            "TCP", // 指定使用TCP方式通讯
#endif
            WIFI_SPI_TARGET_IP,                                                 // 指定远端的IP地址,填写上位机的IP地址
            WIFI_SPI_TARGET_PORT,                                               // 指定远端的端口号,填写上位机的端口号,通常上位机默认是8080
            WIFI_SPI_LOCAL_PORT))                                               // 指定本机的端口号
        {
            // 如果一直建立失败 考虑一下是不是没有接硬件复位
            printf("\r\n Connect UDP/TCP Servers error, try again.");
            system_delay_ms(100);                                               // 建立连接失败 等待 100ms
        }
    }
    // 发送测试数据至服务器
    data_length = wifi_spi_send_buffer(wifi_spi_test_buffer, sizeof(wifi_spi_test_buffer));
    wifi_spi_udp_send_now();
    if(!data_length)
    {
        printf("\r\n send success.");
    }
    else
    {
        printf("\r\n %ld bytes data send failed.", data_length);
    }


}

1.3 my_spi_wifi_rece函数

/*  @wifi接收函数
 *  @说明:根据逐飞库修改而来
 *  @作者:吴广金
 *  @返回值:uint32类型,返回接收到的数据
 *  @时间:2024年3月7日
 * */
uint32 my_spi_wifi_rece(void)
{
    data_length = wifi_spi_read_buffer(wifi_spi_get_data_buffer, sizeof(wifi_spi_get_data_buffer));
    if(data_length)                                                         // 如果接收到数据 则进行数据类型判断
    {
        printf("\r\n Get data: <%s>.", wifi_spi_get_data_buffer);
        if(!wifi_spi_send_buffer(wifi_spi_get_data_buffer, data_length))
        {
            wifi_spi_udp_send_now();
            printf("\r\n send success.");
            memset(wifi_spi_get_data_buffer, 0, data_length);          // 数据发送完成 清空数据
        }
        else
        {
            printf("\r\n %ld bytes data send failed.", data_length);
            return data_length;
        }
    }


}

1.4 my_spi_wifi_image_init函数

/*  @图像发送函数初始化
 *  @说明:根据逐飞库修改而来
 *  @作者:吴广金
 *  @时间:2024年3月7日
 * */
void my_spi_wifi_image_init(void)
{
    //初始化逐飞上位机助手,推荐在摄像头初始化后
    // 逐飞助手初始化 数据传输使用高速WIFI SPI
    seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI);
    //配置图传参数
    // 发送总钻风图像信息(仅包含原始图像信息)
    seekfree_assistant_camera_information_config(SEEKFREE_ASSISTANT_MT9V03X, image_copy, MT9V03X_W, MT9V03X_H);

}

1.5 my_spi_wifi_image_send函数

/*  @图像发送函数(人视角正转图像)
 *  @说明:这时上位机显示的图像为人视角的正面图,但与实际图像处理上的坐标不一样
 *  @作者:吴广金
 *  @时间:2024年3月7日
 * */
void my_spi_wifi_image_send(void)
{
    uint8 i = 0;
    uint8 j = 0;
    uint16 offset;
    // 在发送前将图像备份再进行发送,这样可以避免图像出现撕裂的问题
    for(i = 120-1 ;i > 0;i--)
    {
        offset = i*188;
        for(j = 0;j<188;j++)
        {
            //图像复制
            image_copy[offset+j] = out[(119-i)*188+j];
            //扫线情况
            if((119-i)>34&&(119-i)<82&&((119-i)%2==1))
             {
               //左右两条边线
               if(j==all_out_left[((119-i)-35)/2])
                   image_copy[offset+j] = 0xFD;
               if(j==all_out_right[((119-i)-35)/2])
                   image_copy[offset+j] = 0xFD;
               //中间边线
               if(j==all_out_scan_mid[((119-i)-35)/2])
                   if((((119-i)-35)/2)==12)
                       image_copy[offset+j] = 0xFD;
                   else
                       image_copy[offset+j] = 0;
             }
        }
    }
    // 发送图像
    seekfree_assistant_camera_send();
#ifdef UDP
//    wifi_spi_udp_send_now();
#endif
}

1.6 my_spi_wifi_image_senfOriginal函数

/*  @图像发送函数(原始图像)
 *  @说明:这时上位机显示的图像为实际图像
 *  @作者:吴广金
 *  @时间:2024年3月7日
 * */
void my_spi_wifi_image_sendOriginal(void)
{
    // 在发送前将图像备份再进行发送,这样可以避免图像出现撕裂的问题
    memcpy(image_copy, out, MT9V03X_IMAGE_SIZE);
    // 发送图像
    seekfree_assistant_camera_send();
#ifdef UDP
//    wifi_spi_udp_send_now();
#endif
}

1.7 my_spi_wifi_image_SendOriginal_BX函数

/*  @图像发送函数(原始图像+边线)
 *  @说明:这时上位机显示的图像为实际图像
 *  @作者:吴广金
 *  @时间:2024年3月7日
 * */
void my_spi_wifi_image_sendOriginal_BX(void)
{
    uint8 i = 0;
    uint8 j = 0;
    uint16 offset;
    // 在发送前将图像备份再进行发送,这样可以避免图像出现撕裂的问题
    memcpy(image_copy, out, MT9V03X_IMAGE_SIZE);
    for( i = 0;i < 120;i ++)
    {
        offset = i*188;
        for(j = 0;j < 188;j ++)
        {
            //扫线情况
            if(i>34&&i<82&&(i%2==1))
             {
               //左右两条边线
               if(j==all_out_left[(i-35)/2])
                   image_copy[offset+j] = 0xFD;
               if(j==all_out_right[(i-35)/2])
                   image_copy[offset+j] = 0xFD;
               //中间边线
               if(j==all_out_scan_mid[(i-35)/2])
                   if(((i-35)/2)==12)
                       image_copy[offset+j] = 0xFD;
                   else
                       image_copy[offset+j] = 0;
             }
        }
    }
    // 发送图像
    seekfree_assistant_camera_send();
#ifdef UDP
//    wifi_spi_udp_send_now();
#endif
}

1.8 my_wifi_image_send函数

/*  @图像发送函数(选择函数)
 *  @说明:选择一种图形传输方式进行传输
 *  @参数(IMAGE_SEND data):图像传输的枚举
 *  @作者:吴广金
 *  @时间:2024年3月7日
 * */
void my_wifi_image_send(IMAGE_SEND data)
{
    switch(data){
        case 0:
            break;
        case FRONTVIEW:
            my_spi_wifi_image_send();//人视角图像
            break;
        case ORIGINAL:
            my_spi_wifi_image_sendOriginal();//原始图像
            break;
        case OUTER:
            my_spi_wifi_image_sendOriginal_BX();//原始图像+扫线
            break;
        default:
            break;
    }
}

 二、my_spi_wifi.h文件

#ifndef __MYSPIWIFI_H_
#define __MYSPIWIFI_H_
#include "zf_common_headfile.h"
#define WIFI_SSID_TEST          "MERCURY_1646"  //wifi账号
#define WIFI_PASSWORD_TEST      "858714786"      //wifi密码

typedef enum
{
    FRONTVIEW = 1,
    ORIGINAL = 2,
    OUTER = 3,
}IMAGE_SEND;
void my_spi_wifi_init(void);
//接收函数
uint32 my_spi_wifi_rece(void);
void my_spi_wifi_image_init(void);
void my_spi_wifi_image_send(void);
void my_spi_wifi_image_sendOriginal(void);
void my_spi_wifi_image_sendOriginal_BX(void);
void my_wifi_image_send(IMAGE_SEND data);
#endif

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
智能车竞赛循迹代码一般会根据不同的比赛规则和赛道情况而有所不同,以下是一份简单的循迹代码示例,仅供参考: ``` //定义舵机和电机引脚 int servo_pin = 2; int motor_pin1 = 3; int motor_pin2 = 4; //定义循迹模块引脚 int line_pin1 = A0; int line_pin2 = A1; int line_pin3 = A2; int line_pin4 = A3; int line_pin5 = A4; //定义循迹模块的值 int line_value1, line_value2, line_value3, line_value4, line_value5; void setup() { //初始化引脚模式 pinMode(servo_pin, OUTPUT); pinMode(motor_pin1, OUTPUT); pinMode(motor_pin2, OUTPUT); } void loop() { //读取循迹模块的值 line_value1 = analogRead(line_pin1); line_value2 = analogRead(line_pin2); line_value3 = analogRead(line_pin3); line_value4 = analogRead(line_pin4); line_value5 = analogRead(line_pin5); //根据循迹模块的值控制舵机和电机 if(line_value3 > 500) { //中间循迹模块检测到黑线 digitalWrite(motor_pin1, HIGH); digitalWrite(motor_pin2, LOW); } else if(line_value2 > 500 && line_value3 < 500) { //左边循迹模块检测到黑线 digitalWrite(servo_pin, HIGH); digitalWrite(motor_pin1, HIGH); digitalWrite(motor_pin2, LOW); } else if(line_value4 > 500 && line_value3 < 500) { //右边循迹模块检测到黑线 digitalWrite(servo_pin, LOW); digitalWrite(motor_pin1, HIGH); digitalWrite(motor_pin2, LOW); } else { //所有循迹模块都没有检测到黑线 digitalWrite(servo_pin, HIGH); digitalWrite(motor_pin1, LOW); digitalWrite(motor_pin2, LOW); } } ``` 需要注意的是,这份代码示例仅适用于一般情况下的循迹,如果您需要参加智能车竞赛,建议您根据比赛规则和赛道情况,对代码进行相应的优化和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

跳河轻生的鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值