• 方案介紹
    • 1、項目介紹
    • 2、硬件介紹
    • 3 項目框圖
    • 4、代碼講解
    • 5、效果展示
    • 6、結(jié)言
    • 7、代碼
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

周邊風(fēng)險物檢測

05/28 16:59
195
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

code.zip

共1個文件

1、項目介紹

本次參加‘第二屆“2024 汽車應(yīng)用創(chuàng)意挑戰(zhàn)賽”’,由DigiKey得捷&ADI贊助。本次主要參與的方向是安全技術(shù)。

使用檢測器模塊時刻檢測周邊的物體距離和相對速度,并展示到上位機。

樹莓派作為數(shù)據(jù)中心,用于展示數(shù)據(jù),用于風(fēng)險檢測報警。

2、硬件介紹

距離檢測模塊,使用激光來回時間差檢測距離,測試距離快且準(zhǔn)確。具有30°左右的視界,可以測試各個角度的物體距離。內(nèi)部具有一個arm m0核,用于快速檢測距離,并具有一個可信寄存器,用于決定是否取用距離值的可信度。

樹莓派5采用運行頻率為2.4GHz的64位四核Arm Cortex-A76處理器,用了新的四核2.4 GHz Cortex-A76 Arm CPU(舊型號最初是Cortex-A72,主頻為1.5 GHz,但固件更新將其提升到1.8 GHz),新的南橋承載板承諾提高USB 3的吞吐量,并搭載了新的VideoCore VII GPU(樹莓派4上的VideoCore VI主頻為500 MHz,而VideoCore VII主頻為800 MHz)。整個板子上還有許多小的改進,包括帶有安裝孔的內(nèi)置風(fēng)扇連接器、雙攝像頭連接器,以及與更高速卡兼容的MicroSD卡讀卡器

3 項目框圖

距離檢測模塊,已按照100ms的時間差,計算距離值,并于上次的距離值進行計算,獲取即時速度。

樹莓派作為數(shù)據(jù)中心,等待網(wǎng)路的數(shù)據(jù),用于展示。

4、代碼講解

連接樹莓派服務(wù)器

static EventGroupHandle_t s_wifi_event_group;
#define HOST_IP_ADDR                 "192.168.2.137"
#define HOST_PORT                         6666

static int s_retry_num = 0;
static  char payload[256] = "Message from car race: 'hello'!!";
int car_sock  = 0;
void tcp_client_task()
{
    struct sockaddr_in dest_addr;
    inet_pton(AF_INET, HOST_IP_ADDR, &dest_addr.sin_addr);
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(HOST_PORT);
 
    car_sock =  socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if (car_sock < 0) {
        printf("[%s.%d] Unable to create socket: errno %dn",__func__,__LINE__, errno);
        return;
    }

    printf("[%s.%d]Socket created, connecting to %s:%dn",__func__,__LINE__, HOST_IP_ADDR, HOST_PORT);
        char rx_buffer[128];
    int err = connect(car_sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    if (err != 0) {
        printf("[%s.%d] Socket unable to connect: errno %dn",__func__,__LINE__, errno);
        return;
    }
    printf("[%s.%d] Successfully connectedn",__func__,__LINE__);
        
    err = send(car_sock, payload, strlen(payload), 0);
    if (err < 0) {
        printf("[%s.%d] Error occurred during sending: errno %dn",__func__,__LINE__, errno);
        return;
    }

    memset(rx_buffer, 0, sizeof(rx_buffer));
    int len = recv(car_sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
    if (len < 0) {
        printf("[%s.%d]recv failed: errno %dn",__func__,__LINE__, errno);
    } else {
        printf("[%s.%d]Received %d bytes from %s:n",__func__,__LINE__, len, HOST_IP_ADDR);
        printf("[%s.%d]data: %sn",__func__,__LINE__, rx_buffer);
    }
}

發(fā)送數(shù)據(jù)給數(shù)據(jù)中心

void sock_send_data(char *payload,int len)
{
        if(!car_sock) return;
    int err = send(car_sock, payload, len, 0);
    if (err < 0) {
        printf("[%s.%d] Error occurred during sending: errno %dn",__func__,__LINE__, errno);
    }

}

等待客戶端連接,并讀取數(shù)據(jù)

 while(1){
                addrlen=sizeof(struct sockaddr_in);
                connfd = accept(sockfd, (struct sockaddr *)&client_addr,&addrlen);
                if(connfd < 0){
                        perror("accept:");
                        goto err;
                }
                printf("連接的客戶端IP地址:%sn",inet_ntoa(client_addr.sin_addr));
                printf("連接的客戶端端口號:%dn",ntohs(client_addr.sin_port));
                write(connfd,"hello you!",10);
                while(1){
                        memset(buf,0,sizeof(buf));
                        ret = read(connfd,buf,sizeof(buf));
                        if(ret < 0){
                                perror("read:");
                                break;
                        }else if(ret == 0){
                                printf("write close!n");
                                break;
                        }else{
                                printf("recv:%sn",buf);
                        }
                }
                close(connfd);        
        }

根據(jù)數(shù)據(jù)計算可用的距離值

uint16_t cal_distance(uint16_t *data)
{
        uint8_t cnts = 0;
        uint8_t max = 0;
        uint16_t valall = 0;
        uint16_t maxval = 0;
        uint16_t minval = 0xffff;
        while(max < 5){
                if(data[max]){
                        valall+=data[max];
                        if(maxval < data[max]){
                                maxval = data[max];
                        }
                        if(data[max] < minval){
                                minval = data[max];
                        }
                        cnts++;
                }
                max++;
        }
        if(3 <= cnts){
                valall = valall-maxval-minval;
                valall = valall/(cnts-2);
        }else{
                valall = 0;
        }
        return valall;
} 

計算速度

double preDis = 0;
double cuDis = 0;
double cuSudu = 0;
cuDis = cal_distance(spadz5);
cuSudu = (preDis - cuDis)*10;
preDis = cuDis;

5、效果展示

計算結(jié)果 有當(dāng)前物體與我距離,當(dāng)前物體的速度數(shù)據(jù)。

6、結(jié)言

非常開心能夠參加本次活動,項目設(shè)計有點簡單,初次使用樹莓派,很多細(xì)節(jié)不太了解,會持續(xù)使用樹莓派,學(xué)習(xí)更多知識。

本次活動學(xué)習(xí)到了很多知識,群里大佬們的知識很豐富,讓人心向往之。祝是非網(wǎng)論壇和得捷合作更多更好,提供更多更好的競賽活動,再次感謝是非網(wǎng)論壇和得捷。

7、代碼

參考附件

  • code.zip
    下載
DigiKey得捷

DigiKey得捷

DigiKey 總部位于美國明尼蘇達州錫夫里弗福爾斯市,是一家獲得原廠授權(quán)的全球性、全類目電子元器件和自動化產(chǎn)品分銷商。我們通過分銷來自 2,300 多家優(yōu)質(zhì)品牌制造商的 1,020 多萬種元器件獲得了強大的技術(shù)優(yōu)勢。DigiKey 還為工程師、設(shè)計師、開發(fā)者和采購專業(yè)人員提供豐富的數(shù)字解決方案、無障礙互動和工具支持,以幫助他們提升工作效率。在中國,客戶可以通過電子郵件、電話和客服獲得全方位技術(shù)支持。如需了解更多信息和獲取 DigiKey 廣泛的產(chǎn)品,請訪問 www.digikey.cn 并關(guān)注我們的微信、微博、騰訊視頻和 BiliBili 賬號。

DigiKey 總部位于美國明尼蘇達州錫夫里弗福爾斯市,是一家獲得原廠授權(quán)的全球性、全類目電子元器件和自動化產(chǎn)品分銷商。我們通過分銷來自 2,300 多家優(yōu)質(zhì)品牌制造商的 1,020 多萬種元器件獲得了強大的技術(shù)優(yōu)勢。DigiKey 還為工程師、設(shè)計師、開發(fā)者和采購專業(yè)人員提供豐富的數(shù)字解決方案、無障礙互動和工具支持,以幫助他們提升工作效率。在中國,客戶可以通過電子郵件、電話和客服獲得全方位技術(shù)支持。如需了解更多信息和獲取 DigiKey 廣泛的產(chǎn)品,請訪問 www.digikey.cn 并關(guān)注我們的微信、微博、騰訊視頻和 BiliBili 賬號。收起

查看更多

相關(guān)推薦