本文源自“玄鐵杯第二屆RISC-V應(yīng)用創(chuàng)新大賽”活動,由OCC整理發(fā)布。
本項目利用D1 Dock Pro的USB拍照程序,結(jié)合L298N電機驅(qū)動模塊和紅外探測循跡光電傳感器模塊,制作了一個擁有智能尋路+避障功能的小車。該項目為“玄鐵杯第二屆RISC-V應(yīng)用創(chuàng)新大賽”活動中的優(yōu)秀作品。
關(guān)于自動尋路小車的技術(shù)細(xì)節(jié),請看本文詳細(xì)介紹。
01項目介紹
隨著我國人工智能技術(shù)的進(jìn)一步發(fā)展,自動駕駛汽車吸引了越來越多的目光,巡線是其行走控制方法之一,人們對智能循跡小車適應(yīng)各種復(fù)雜路況的性能、安全平穩(wěn)性等的要求越來越高,所以我們小組想要做一個智能尋路+避障小車。
智能小車成品
02Demo的整體框架
03具體實施方案
1. 首先,根據(jù)哪吒開發(fā)板的原理框圖了解開發(fā)板的工作原理,不同類型的引腳能實行怎樣的功能,怎么使各引腳工作起來。
2. 在電腦上安裝Ubuntu環(huán)境,進(jìn)行編譯環(huán)境配置,源碼下載,編譯和燒寫。
3. 成功嘗試了使用哪吒開發(fā)板運行的第一個HelloWorld程序和USB拍照程序。
4. 上網(wǎng)購買智能小車的所有部件:1個亞克力雙層智能小車套件;2個L298N電機驅(qū)動模塊;三種類型的杜邦線各一排;1個四路紅外探測循跡光電傳感器模塊;4節(jié)5號電池。
5. 安裝、連接、測試小車的行走功能。
6. 編寫代碼,調(diào)節(jié)紅外探測的靈敏度使小車能夠較為準(zhǔn)確地感知周圍環(huán)境并且運行測試成功。
7. 調(diào)試代碼,完善小車的功能。
04軟件、硬件介紹
軟件:Oracle VM VirtualBox Ubuntu 14.04虛擬機系統(tǒng)、全志USB燒錄驅(qū)動、AllwinnertechPhoeniSuitRelease工具。
硬件:哪吒開發(fā)板、USB數(shù)據(jù)傳輸、USB供電、海康威視攝像機、組裝好的智能小車。
05作品源碼
#include#include #include #include #define EXPORT_GPIO1 "echo 2027 > /sys/class/gpio/export" #define EXPORT_GPIO2 "echo 2020 > /sys/class/gpio/export" #define EXPORT_GPIO3 "echo 2021 > /sys/class/gpio/export" #define EXPORT_GPIO4 "echo 2022 > /sys/class/gpio/export" #define UEXPORT_GPIO1 "echo 2027 > /sys/class/gpio/unexport" #define UEXPORT_GPIO2 "echo 2020 > /sys/class/gpio/unexport" #define UEXPORT_GPIO3 "echo 2021 > /sys/class/gpio/unexport" #define UEXPORT_GPIO4 "echo 2022 > /sys/class/gpio/unexport" #define GPIO1_OUTPUT "echo out > /sys/class/gpio/gpio2027/direction" #define GPIO2_OUTPUT "echo out > /sys/class/gpio/gpio2020/direction" #define GPIO3_OUTPUT "echo out > /sys/class/gpio/gpio2021/direction" #define GPIO4_OUTPUT "echo out > /sys/class/gpio/gpio2022/direction" #define LOWGPIO1 "echo 0 > /sys/class/gpio/gpio2027/value" #define LOWGPIO2 "echo 0 > /sys/class/gpio/gpio2020/value" #define LOWGPIO3 "echo 0 > /sys/class/gpio/gpio2021/value" #define LOWGPIO4 "echo 0 > /sys/class/gpio/gpio2022/value" #define HIGHGPIO1 "echo 1 > /sys/class/gpio/gpio2027/value" #define HIGHGPIO2 "echo 1 > /sys/class/gpio/gpio2020/value" #define HIGHGPIO3 "echo 1 > /sys/class/gpio/gpio2021/value" #define HIGHGPIO4 "echo 1 > /sys/class/gpio/gpio2022/value" //紅外 #define EXPORT_HW1 "echo 2023 > /sys/class/gpio/export" #define EXPORT_HW2 "echo 2024 > /sys/class/gpio/export" #define EXPORT_HW3 "echo 2025 > /sys/class/gpio/export" #define EXPORT_HW4 "echo 2026 > /sys/class/gpio/export" #define HW1_INPUT "echo in > /sys/class/gpio/gpio2023/direction" #define HW2_INPUT "echo in > /sys/class/gpio/gpio2024/direction" #define HW3_INPUT "echo in > /sys/class/gpio/gpio2025/direction" #define HW4_INPUT "echo in > /sys/class/gpio/gpio2026/direction" #define UNEXPORT_HW1 "echo 2023 > /sys/class/gpio/unexport" #define UNEXPORT_HW2 "echo 2024 > /sys/class/gpio/unexport" #define UNEXPORT_HW3 "echo 2025 > /sys/class/gpio/unexport" #define UNEXPORT_HW4 "echo 2026 > /sys/class/gpio/unexport" #define run 1 #define left 3 #define right 4 #define back 2 #define stop 5 void INIT() { system(EXPORT_GPIO1); system(EXPORT_GPIO2); system(EXPORT_GPIO3); system(EXPORT_GPIO4); system(EXPORT_HW1); system(EXPORT_HW2); system(EXPORT_HW3); system(EXPORT_HW4); system(GPIO1_OUTPUT); system(GPIO2_OUTPUT); system(GPIO3_OUTPUT); system(GPIO4_OUTPUT); system(HW1_INPUT); system(HW2_INPUT); system(HW3_INPUT); system(HW4_INPUT); //printf("1 "); } void RUN() { system(LOWGPIO1);//0 system(HIGHGPIO2);//1 system(HIGHGPIO3);//1 system(LOWGPIO4);//0 //printf("2 "); } void STOP() { system(LOWGPIO1); system(LOWGPIO2); system(LOWGPIO3); system(LOWGPIO4); //printf("3 "); } void LEFT() { system(LOWGPIO1);//0 system(HIGHGPIO2);//1 system(HIGHGPIO3);//1 system(HIGHGPIO4);//1 } void RIGHT() { system(HIGHGPIO1);//1 system(HIGHGPIO2);//1 system(HIGHGPIO3);//1 system(LOWGPIO4);//0 } void BACK() { system(HIGHGPIO1);//1 system(LOWGPIO2);//0 system(LOWGPIO3);//0 system(HIGHGPIO4);//1 } void MOTORRUN(int cmd) { switch(cmd) { case 1: RUN(); break; case 2: BACK(); break; case 3: LEFT(); break; case 4: RIGHT(); break; case 5: STOP(); break; } } int GETHW(int gpio) { char path[64]; char value_str[3]; int fd; snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", gpio); fd = open(path, O_RDONLY); if (fd < 0) { perror("Failed to open gpio value for reading!"); return -1; } if (read(fd, value_str, 3) < 0) { perror("Failed to read value!"); return -1; } close(fd); return (atoi(value_str)); } void TRACE() { int l1=GETHW(2023); int l2=GETHW(2024); int r1=GETHW(2025); int r2=GETHW(2026); //printf("%d,%d,%d,%d",l1,l2,r1,r2); if(l1&&l2&&r1&&r2){ MOTORRUN(run); printf("直走 "); } else if(l1+l2 r1+r2){ //MOTORRUN(back); printf("左轉(zhuǎn) "); sleep(0.5); MOTORRUN(left); } else if(!r1&&!r2&&!l1&&!l2){ printf("停止 "); MOTORRUN(stop); } } int main(void) { INIT(); while(1) { TRACE(); // printf("2022"); // sleep(1); // RUN(); sleep(0.5); // STOP(); }return 0; }
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2551文章
51099瀏覽量
753567 -
智能小車
+關(guān)注
關(guān)注
87文章
549瀏覽量
81741 -
自動駕駛
+關(guān)注
關(guān)注
784文章
13812瀏覽量
166456 -
RISC-V
+關(guān)注
關(guān)注
45文章
2277瀏覽量
46159
原文標(biāo)題:應(yīng)用速遞 | 如何制作一個智能尋路+避障的小車?
文章出處:【微信號:芯片開放社區(qū),微信公眾號:芯片開放社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論