0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Linux設(shè)計的倒車?yán)走_系統(tǒng)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-05-25 09:12 ? 次閱讀

一、項目背景介紹

隨著社會的不斷發(fā)展,人們對于汽車的安全性要求越來越高,而倒車?yán)走_系統(tǒng)就是為了增強汽車駕駛者的安全性而被廣泛使用。在這種情況下,我們開發(fā)了一個基于Linux設(shè)計的倒車?yán)走_系統(tǒng),該系統(tǒng)可以采用迅為4412主控板,運行Linux3.5內(nèi)核,使用USB攝像頭、TFT真彩顯示屏、超聲波測距模塊和蜂鳴器等硬件。

image-20230524162414354

二、創(chuàng)新點

本項目的創(chuàng)新點包括:

  1. 采用開源Linux系統(tǒng):采用Linux系統(tǒng),具有很好的可擴展性和靈活性,可以實現(xiàn)更為豐富和復(fù)雜的功能。
  2. 多個模塊的協(xié)同工作:本項目涉及到了攝像頭模塊、超聲波測距模塊、處理模塊、告警模塊和顯示模塊等多個模塊,這些模塊需要協(xié)同工作才能實現(xiàn)完整的功能。
  3. 實現(xiàn)了告警功能:本項目采用了蜂鳴器來實現(xiàn)告警功能,根據(jù)距離調(diào)整PWM輸出給出不同級別的告警聲音,能夠提醒駕駛者注意障礙物。

三、使用技術(shù)介紹

  1. 迅為4412主控板:本項目采用了迅為4412主控板,該主控板具有較高的性能和穩(wěn)定性,能夠滿足系統(tǒng)的運行要求。
  2. Linux操作系統(tǒng):本項目采用了開源的Linux操作系統(tǒng),具有很好的可擴展性和靈活性,適合進行自定義開發(fā)。
  3. V4L2協(xié)議:V4L2協(xié)議是Linux下的一個視頻設(shè)備驅(qū)動程序接口,可以方便地實現(xiàn)USB攝像頭的圖像采集。
  4. 超聲波測距模塊:通過GPIO口與主控板相連,使用定時器產(chǎn)生超聲波并計算與接收到回波之間的時間差,從而計算出與障礙物之間的距離。
  5. PWM輸出控制:根據(jù)距離調(diào)整PWM輸出給出不同級別的告警聲音。
  6. TFT真彩顯示屏:本項目采用了TFT真彩顯示屏,能夠?qū)崿F(xiàn)高清晰度的圖像顯示。
  7. 系統(tǒng)管理模塊:負(fù)責(zé)管理整個系統(tǒng)的啟動、配置和錯誤處理等操作。例如,可以將系統(tǒng)的啟動腳本寫在/etc/rc.local中,通過調(diào)用shell腳本來實現(xiàn)系統(tǒng)的初始化和啟動。

四、系統(tǒng)架構(gòu)

整個系統(tǒng)由以下幾個模塊組成:

  1. 攝像頭模塊:負(fù)責(zé)采集車尾環(huán)境圖像,并傳輸給處理模塊。
  2. 超聲波測距模塊:負(fù)責(zé)與障礙物之間的距離測量,并將結(jié)果傳輸給處理模塊。
  3. 處理模塊:負(fù)責(zé)視頻顯示、距離信息的處理、告警功能的實現(xiàn)。
  4. 告警模塊:負(fù)責(zé)根據(jù)距離調(diào)整PWM輸出給出不同級別的告警聲音,并使用蜂鳴器輸出告警信息。
  5. 顯示模塊:負(fù)責(zé)將處理模塊生成的圖像顯示在TFT真彩顯示屏上。
  6. 系統(tǒng)管理模塊:負(fù)責(zé)管理整個系統(tǒng)的啟動、配置和錯誤處理等操作。

五、功能設(shè)計

  1. 攝像頭模塊 由于Linux系統(tǒng)具有很好的驅(qū)動支持,因此可以直接使用V4L2協(xié)議來獲取USB攝像頭的圖像。獲取圖像后,需要通過DMA方式將數(shù)據(jù)傳輸給處理模塊進行處理。
  2. 超聲波測距模塊 超聲波測距模塊可以通過GPIO口與主控板相連,使用定時器產(chǎn)生超聲波并計算與接收到回波之間的時間差,從而計算出與障礙物之間的距離。
  3. 處理模塊 處理模塊負(fù)責(zé)將攝像頭采集到的圖像和超聲波測距模塊測得的距離信息整合處理,并根據(jù)距離信息來控制告警模塊。
  4. 告警模塊 告警模塊根據(jù)處理模塊傳遞過來的距離信息來控制PWM輸出,并使用蜂鳴器輸出告警信息。
  5. 顯示模塊 顯示模塊負(fù)責(zé)將處理模塊生成的圖像顯示在TFT真彩顯示屏上,并實現(xiàn)顯示屏的刷新和管理操作。
  6. 系統(tǒng)管理模塊 系統(tǒng)管理模塊負(fù)責(zé)管理整個系統(tǒng)的啟動、配置和錯誤處理等操作。例如,可以將系統(tǒng)的啟動腳本寫在/etc/rc.local中,通過調(diào)用shell腳本來實現(xiàn)系統(tǒng)的初始化和啟動。

六、攝像頭圖像顯示應(yīng)用代碼

#include 
 #include           /* See NOTES */
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include  
 #include 
 ?
 /* 圖片的象素數(shù)據(jù) */
 typedef struct PixelDatas {
     int iWidth;      /* 寬度: 一行有多少個象素 */
     int iHeight;     /* 高度: 一列有多少個象素 */
     int iBpp;        /* 一個象素用多少位來表示 */
     int iLineBytes;  /* 一行數(shù)據(jù)有多少字節(jié) */
     int iTotalBytes; /* 所有字節(jié)數(shù) */ 
     unsigned char *VideoBuf; //存放一幀攝像頭的數(shù)據(jù)
     //指向了存放攝像頭數(shù)據(jù)的空間地址
 }T_PixelDatas;
 ?
 T_PixelDatas Pixedata; //存放實際的圖像數(shù)據(jù)
 ?
 /*
         USB攝像頭相關(guān)參數(shù)定義
 */
 struct v4l2_buffer tV4l2Buf;
 int iFd;
 int ListNum;
 unsigned char* pucVideBuf[4];  // 視頻BUFF空間地址
 void camera_pthread(void);
 ?
 //LCD屏相關(guān)的參數(shù)
 unsigned char *lcd_mem=NULL; /*LCD的內(nèi)存地址*/
 struct fb_fix_screeninfo finfo; /*固定形參*/
 struct fb_var_screeninfo vinfo; /*可變形參*/
 void LCD_Init(void);
 void show_pixel(int x,int y,int color);
 ?
 ?
 int main(int argc ,char *argv[])
 {
     if(argc!=2)
     {
         printf("./app /dev/videoX
");
         return -1;
     }
     
     LCD_Init(); //LCD屏初始化
     
     camera_init(argv[1]);  //攝像頭設(shè)備初始化
     
     //開始采集攝像頭數(shù)據(jù),并實時顯示在LCD屏幕上
     camera_pthread();
     return 0;
 }
 ?
 ?
 ?
 //LCD屏初始化
 void LCD_Init(void)
 {
     /*1.打開設(shè)備文件*/
     int fd=open("/dev/fb0",O_RDWR);
     if(fd<0)
     {
         printf("/dev/fb0設(shè)備文件打開失敗!
");
         return;
     }
     
     /*2. 讀取LCD屏的參數(shù)*/
     ioctl(fd,FBIOGET_FSCREENINFO,&finfo);//固定參數(shù)
     printf("映射的長度:%d
",finfo.smem_len);
     
     ioctl(fd,FBIOGET_VSCREENINFO,&vinfo);//可變參數(shù),32位
     printf("分辨率:%d*%d,%d
",vinfo.xres,vinfo.yres,vinfo.bits_per_pixel);
 ?
     /*3. 映射LCD的地址到進程空間*/
     lcd_mem=mmap(NULL,finfo.smem_len,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0);
     if(lcd_mem==NULL)
     {
         printf("lcd_mem映射失敗!
");
         return;
     }
     memset(lcd_mem,0xFFFFFFFF,finfo.smem_len);
 }
 ?
 /*畫點*/
 void show_pixel(int x,int y,int color)
 {
     unsigned long *show32 = NULL;
     /* 定位到 LCD 屏上的位置*/
     show32 =(unsigned long *)(lcd_mem + y*vinfo.xres*vinfo.bits_per_pixel/8 + x*vinfo.bits_per_pixel/8);
     *show32 =color; /*向指向的 LCD 地址賦數(shù)據(jù)*/
 }
 ?
 ?
 //顯示攝像頭的數(shù)據(jù)
 void Show_VideoData(int w,int h,unsigned char *rgb)
 {
     int i,j;
     int x0,x=0,y=0;
     int color; //顏色 值
     unsigned char r,g,b;
     x0=x;
     for(i=0;i

七、超聲波測距驅(qū)動代碼

#include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 ?
 #include 
 #include 
 #include 
 ?
 #include 
 ?
 static int chaoshengbo_irq=0;
 ?
 #define GPB_CON  0x11400040
 #define GPB_DAT  0x11400044
 ?
 static u32 *gpb_con=NULL;
 static u32 *gpb_dat=NULL;
 ?
 /*
 硬件連接:
 輸出腳: GPX1_0 ---ECHO
 輸入腳: GPB_7 
 */
 static void tiny4412_work_func(struct work_struct *work)
 {   
     printk("GPB=%d
",*gpb_dat&1<<7);
 ?
     ktime_t my_time1,my_time2;
     unsigned int i,j;
     unsigned int time_cnt=0;
 ?
     my_time1=ktime_get();  //獲取當(dāng)前時間
     i=ktime_to_us(my_time1); //轉(zhuǎn) us
 ?
     while(gpio_get_value(EXYNOS4_GPX1(0))){} //高電平卡住
 ?
     
     my_time2=ktime_get(); //獲取當(dāng)前時間
     j=ktime_to_us(my_time2); //轉(zhuǎn) us
 ?
     printk("us:%d
",j-i);
 }
 ?
 static DECLARE_WORK(caoshengbotiny4412_work,tiny4412_work_func);
 ?
 /*
 中斷處理函數(shù)
 */
 irqreturn_t irq_handler_chaoshengbo(int irq, void *dev)
 {
     schedule_work(&caoshengbotiny4412_work); /*正常情況下:  是在中斷服務(wù)函數(shù)里面*/
     return IRQ_HANDLED; /*表示中斷已經(jīng)處理過了*/
 }
 ?
 static void timer_function(unsigned long data);
 static DEFINE_TIMER(timer_caoshengbo, timer_function,0,0);
 ?
 static void timer_function(unsigned long data)
 {
     static u8 state;
     state=!state;
     
     if(state)*gpb_dat|=1<<7;
     else *gpb_dat&=~(1<<7);
     
 ?
     mod_timer(&timer_caoshengbo,jiffies+msecs_to_jiffies(500)); 
 }
 ?
 static int __init tiny4412_chaoshengbo_init(void)
 {
     int i,err;
     /*獲取中斷號*/
     chaoshengbo_irq=gpio_to_irq(EXYNOS4_GPX1(0));
     printk("中斷號:%d
",chaoshengbo_irq);
     
     /*外部中斷注冊*/
     err=request_irq(chaoshengbo_irq,irq_handler_chaoshengbo,IRQ_TYPE_EDGE_RISING,"tiny4412_chaoshengbo",NULL);
     if(err!=0)printk("中斷注冊失敗!
");
 ?
     /*映射內(nèi)存*/
     gpb_con=ioremap(GPB_CON,4);
     gpb_dat=ioremap(GPB_DAT,4);
 ?
     /*配置模式*/
     *gpb_con&=~(0xF<<4*7); //輸出模式   
     *gpb_con|=0x1<<4*7;
     
     mod_timer(&timer_caoshengbo,jiffies+msecs_to_jiffies(100));         
     return 0;
 }
 ?
 static void __exit tiny4412_chaoshengbo_exit(void)
 {
     free_irq(chaoshengbo_irq,NULL);
     iounmap(gpb_con);
     iounmap(gpb_dat);
     del_timer(&timer_caoshengbo);
 }
 ?
 module_init(tiny4412_chaoshengbo_init);  /*指定驅(qū)動的入口函數(shù)*/
 module_exit(tiny4412_chaoshengbo_exit);  /*指定驅(qū)動的出口函數(shù)*/
 MODULE_LICENSE("GPL");      /*指定驅(qū)動許可證*/
 ?
 ?
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18916

    瀏覽量

    300819
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2899

    文章

    43797

    瀏覽量

    369162
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11171

    瀏覽量

    208480
  • 倒車?yán)走_
    +關(guān)注

    關(guān)注

    4

    文章

    73

    瀏覽量

    23832
  • 雷達系統(tǒng)
    +關(guān)注

    關(guān)注

    6

    文章

    241

    瀏覽量

    28597
收藏 人收藏

    評論

    相關(guān)推薦

    倒車雷達電路

    倒車雷達電路PCB打樣找華強 http://www.hqpcb.com 樣板2天出貨
    發(fā)表于 11-30 20:58

    倒車雷達

    倒車雷達PCB打樣找華強 http://www.hqpcb.com 樣板2天出貨
    發(fā)表于 12-01 09:00

    倒車雷達語音IC分享

    由深圳語音芯片廠家-深圳典科電子有限公司向大家推薦的一款會說話的“倒車雷達語音芯片”-DKB035-8S系列語音芯片。當(dāng)我們倒車的時候倒車雷達
    發(fā)表于 03-25 21:51

    倒車雷達設(shè)計

    如題倒車雷達設(shè)計,用單片機c51控制,有仿真圖
    發(fā)表于 05-08 21:29

    使用倒車雷達設(shè)計

    使用倒車雷達設(shè)計[audio][/audio]
    發(fā)表于 12-05 15:43

    倒車雷達應(yīng)用

    勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載94:倒車雷達實例特權(quán)同學(xué),版權(quán)所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1i5LMUUDfile:///C
    發(fā)表于 04-26 05:45

    怎么實現(xiàn)基于PSoC芯片的倒車雷達控制系統(tǒng)的設(shè)計?

    怎么實現(xiàn)基于PSoC芯片的倒車雷達控制系統(tǒng)的設(shè)計?
    發(fā)表于 05-17 06:59

    請問怎樣去設(shè)計一種倒車雷達系統(tǒng)?

    倒車雷達系統(tǒng)的硬件該怎樣去設(shè)計?倒車雷達系統(tǒng)的軟件該怎樣去設(shè)計?
    發(fā)表于 05-17 07:01

    實現(xiàn)汽車倒車雷達系統(tǒng)的設(shè)計方法

    @[汽車倒車雷達系統(tǒng)的設(shè)計與實現(xiàn)(初稿)]畢業(yè)設(shè)計(論文)題目:汽車倒車雷達系統(tǒng)的設(shè)計與實現(xiàn)電氣
    發(fā)表于 11-12 06:38

    何為倒車雷達

    為了便于開發(fā),我做了一塊擴展板子:擴展板有一些常用器件,這樣開發(fā)MSP430 F5529程序的時候,就不用杜邦線連接了。當(dāng)然也可以選擇杜邦線連接器件,效果都一樣。超聲波模塊的讀?。汉螢?b class='flag-5'>倒車雷達?車輛倒車時候的一個警報
    發(fā)表于 11-23 09:19

    四探頭倒車雷達

    是探頭倒車雷達
    發(fā)表于 04-05 21:11

    倒車雷達

    倒車雷達              倒車雷達是汽車泊車或者
    發(fā)表于 01-04 14:07 ?1514次閱讀

    汽車倒車雷達系統(tǒng)的設(shè)計

    以STC12C5A60S2單片機和倒車主控芯片GM3101為核心部件,輔以溫度傳感器、液晶顯示器、語音芯片等外圍器件組成倒車雷達系統(tǒng),實現(xiàn)對有效測量范圍內(nèi)障礙物的精密距離測量、危險等級
    發(fā)表于 09-23 15:19 ?554次下載
    汽車<b class='flag-5'>倒車</b><b class='flag-5'>雷達</b><b class='flag-5'>系統(tǒng)</b>的設(shè)計

    基于Ameba的倒車雷達系統(tǒng)

    倒車雷達已經(jīng)非常普遍,這個專案做一個倒車雷達系統(tǒng)。將這個倒車
    的頭像 發(fā)表于 02-02 17:09 ?3498次閱讀

    汽車倒車雷達系統(tǒng)的設(shè)計與實現(xiàn)(一)

    @[汽車倒車雷達系統(tǒng)的設(shè)計與實現(xiàn)(初稿)]畢業(yè)設(shè)計(論文)題 目: 汽車倒車雷達系統(tǒng)的設(shè)計與實現(xiàn)
    發(fā)表于 11-07 09:21 ?12次下載
    汽車<b class='flag-5'>倒車</b><b class='flag-5'>雷達</b><b class='flag-5'>系統(tǒng)</b>的設(shè)計與實現(xiàn)(一)