1、項(xiàng)目介紹
本次參加‘第二屆“2024 汽車應(yīng)用創(chuàng)意挑戰(zhàn)賽”’,由DigiKey得捷&ADI贊助。本次主要參與的方向是安全技術(shù)。
使用檢測(cè)器模塊時(shí)刻檢測(cè)周邊的物體距離和相對(duì)速度,并展示到上位機(jī)。
樹(shù)莓派作為數(shù)據(jù)中心,用于展示數(shù)據(jù),用于風(fēng)險(xiǎn)檢測(cè)報(bào)警。
2、硬件介紹
距離檢測(cè)模塊,使用激光來(lái)回時(shí)間差檢測(cè)距離,測(cè)試距離快且準(zhǔn)確。具有30°左右的視界,可以測(cè)試各個(gè)角度的物體距離。內(nèi)部具有一個(gè)arm m0核,用于快速檢測(cè)距離,并具有一個(gè)可信寄存器,用于決定是否取用距離值的可信度。
樹(shù)莓派5采用運(yùn)行頻率為2.4GHz的64位四核Arm Cortex-A76處理器,用了新的四核2.4 GHz Cortex-A76 Arm CPU(舊型號(hào)最初是Cortex-A72,主頻為1.5 GHz,但固件更新將其提升到1.8 GHz),新的南橋承載板承諾提高USB 3的吞吐量,并搭載了新的VideoCore VII GPU(樹(shù)莓派4上的VideoCore VI主頻為500 MHz,而VideoCore VII主頻為800 MHz)。整個(gè)板子上還有許多小的改進(jìn),包括帶有安裝孔的內(nèi)置風(fēng)扇連接器、雙攝像頭連接器,以及與更高速卡兼容的MicroSD卡讀卡器。
3 項(xiàng)目框圖
距離檢測(cè)模塊,已按照100ms的時(shí)間差,計(jì)算距離值,并于上次的距離值進(jìn)行計(jì)算,獲取即時(shí)速度。
樹(shù)莓派作為數(shù)據(jù)中心,等待網(wǎng)路的數(shù)據(jù),用于展示。
4、代碼講解
連接樹(shù)莓派服務(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("連接的客戶端端口號(hào):%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ù)計(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;
}
計(jì)算速度
double preDis = 0;
double cuDis = 0;
double cuSudu = 0;
cuDis = cal_distance(spadz5);
cuSudu = (preDis - cuDis)*10;
preDis = cuDis;
5、效果展示
計(jì)算結(jié)果 有當(dāng)前物體與我距離,當(dāng)前物體的速度數(shù)據(jù)。
6、結(jié)言
非常開(kāi)心能夠參加本次活動(dòng),項(xiàng)目設(shè)計(jì)有點(diǎn)簡(jiǎn)單,初次使用樹(shù)莓派,很多細(xì)節(jié)不太了解,會(huì)持續(xù)使用樹(shù)莓派,學(xué)習(xí)更多知識(shí)。
本次活動(dòng)學(xué)習(xí)到了很多知識(shí),群里大佬們的知識(shí)很豐富,讓人心向往之。祝是非網(wǎng)論壇和得捷合作更多更好,提供更多更好的競(jìng)賽活動(dòng),再次感謝是非網(wǎng)論壇和得捷。
7、代碼
參考附件