一、項目背景介紹
隨著社會的不斷發展,人們對于汽車的安全性要求越來越高,而倒車雷達系統就是為了增強汽車駕駛者的安全性而被廣泛使用。在這種情況下,我們開發了一個基于Linux設計的倒車雷達系統,該系統可以采用迅為4412主控板,運行Linux3.5內核,使用USB攝像頭、TFT真彩顯示屏、超聲波測距模塊和蜂鳴器等硬件。
二、創新點
本項目的創新點包括:
- 采用開源Linux系統:采用Linux系統,具有很好的可擴展性和靈活性,可以實現更為豐富和復雜的功能。
- 多個模塊的協同工作:本項目涉及到了攝像頭模塊、超聲波測距模塊、處理模塊、告警模塊和顯示模塊等多個模塊,這些模塊需要協同工作才能實現完整的功能。
- 實現了告警功能:本項目采用了蜂鳴器來實現告警功能,根據距離調整PWM輸出給出不同級別的告警聲音,能夠提醒駕駛者注意障礙物。
三、使用技術介紹
- 迅為4412主控板:本項目采用了迅為4412主控板,該主控板具有較高的性能和穩定性,能夠滿足系統的運行要求。
- Linux操作系統:本項目采用了開源的Linux操作系統,具有很好的可擴展性和靈活性,適合進行自定義開發。
- V4L2協議:V4L2協議是Linux下的一個視頻設備驅動程序接口,可以方便地實現USB攝像頭的圖像采集。
- 超聲波測距模塊:通過GPIO口與主控板相連,使用定時器產生超聲波并計算與接收到回波之間的時間差,從而計算出與障礙物之間的距離。
- PWM輸出控制:根據距離調整PWM輸出給出不同級別的告警聲音。
- TFT真彩顯示屏:本項目采用了TFT真彩顯示屏,能夠實現高清晰度的圖像顯示。
- 系統管理模塊:負責管理整個系統的啟動、配置和錯誤處理等操作。例如,可以將系統的啟動腳本寫在/etc/rc.local中,通過調用shell腳本來實現系統的初始化和啟動。
四、系統架構
整個系統由以下幾個模塊組成:
- 攝像頭模塊:負責采集車尾環境圖像,并傳輸給處理模塊。
- 超聲波測距模塊:負責與障礙物之間的距離測量,并將結果傳輸給處理模塊。
- 處理模塊:負責視頻顯示、距離信息的處理、告警功能的實現。
- 告警模塊:負責根據距離調整PWM輸出給出不同級別的告警聲音,并使用蜂鳴器輸出告警信息。
- 顯示模塊:負責將處理模塊生成的圖像顯示在TFT真彩顯示屏上。
- 系統管理模塊:負責管理整個系統的啟動、配置和錯誤處理等操作。
五、功能設計
- 攝像頭模塊 由于Linux系統具有很好的驅動支持,因此可以直接使用V4L2協議來獲取USB攝像頭的圖像。獲取圖像后,需要通過DMA方式將數據傳輸給處理模塊進行處理。
- 超聲波測距模塊 超聲波測距模塊可以通過GPIO口與主控板相連,使用定時器產生超聲波并計算與接收到回波之間的時間差,從而計算出與障礙物之間的距離。
- 處理模塊 處理模塊負責將攝像頭采集到的圖像和超聲波測距模塊測得的距離信息整合處理,并根據距離信息來控制告警模塊。
- 告警模塊 告警模塊根據處理模塊傳遞過來的距離信息來控制PWM輸出,并使用蜂鳴器輸出告警信息。
- 顯示模塊 顯示模塊負責將處理模塊生成的圖像顯示在TFT真彩顯示屏上,并實現顯示屏的刷新和管理操作。
- 系統管理模塊 系統管理模塊負責管理整個系統的啟動、配置和錯誤處理等操作。例如,可以將系統的啟動腳本寫在/etc/rc.local中,通過調用shell腳本來實現系統的初始化和啟動。
六、攝像頭圖像顯示應用代碼
#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
?
/* 圖片的象素數據 */
typedef struct PixelDatas {
int iWidth; /* 寬度: 一行有多少個象素 */
int iHeight; /* 高度: 一列有多少個象素 */
int iBpp; /* 一個象素用多少位來表示 */
int iLineBytes; /* 一行數據有多少字節 */
int iTotalBytes; /* 所有字節數 */
unsigned char *VideoBuf; //存放一幀攝像頭的數據
//指向了存放攝像頭數據的空間地址
}T_PixelDatas;
?
T_PixelDatas Pixedata; //存放實際的圖像數據
?
/*
USB攝像頭相關參數定義
*/
struct v4l2_buffer tV4l2Buf;
int iFd;
int ListNum;
unsigned char* pucVideBuf[4]; // 視頻BUFF空間地址
void camera_pthread(void);
?
//LCD屏相關的參數
unsigned char *lcd_mem=NULL; /*LCD的內存地址*/
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]); //攝像頭設備初始化
//開始采集攝像頭數據,并實時顯示在LCD屏幕上
camera_pthread();
return 0;
}
?
?
?
//LCD屏初始化
void LCD_Init(void)
{
/*1.打開設備文件*/
int fd=open("/dev/fb0",O_RDWR);
if(fd<0)
{
printf("/dev/fb0設備文件打開失敗!
");
return;
}
/*2. 讀取LCD屏的參數*/
ioctl(fd,FBIOGET_FSCREENINFO,&finfo);//固定參數
printf("映射的長度:%d
",finfo.smem_len);
ioctl(fd,FBIOGET_VSCREENINFO,&vinfo);//可變參數,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 地址賦數據*/
}
?
?
//顯示攝像頭的數據
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
七、超聲波測距驅動代碼
#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(); //獲取當前時間
i=ktime_to_us(my_time1); //轉 us
?
while(gpio_get_value(EXYNOS4_GPX1(0))){} //高電平卡住
?
my_time2=ktime_get(); //獲取當前時間
j=ktime_to_us(my_time2); //轉 us
?
printk("us:%d
",j-i);
}
?
static DECLARE_WORK(caoshengbotiny4412_work,tiny4412_work_func);
?
/*
中斷處理函數
*/
irqreturn_t irq_handler_chaoshengbo(int irq, void *dev)
{
schedule_work(&caoshengbotiny4412_work); /*正常情況下: 是在中斷服務函數里面*/
return IRQ_HANDLED; /*表示中斷已經處理過了*/
}
?
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("中斷注冊失敗!
");
?
/*映射內存*/
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); /*指定驅動的入口函數*/
module_exit(tiny4412_chaoshengbo_exit); /*指定驅動的出口函數*/
MODULE_LICENSE("GPL"); /*指定驅動許可證*/
?
?
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5093文章
19178瀏覽量
307708 -
物聯網
+關注
關注
2914文章
44938瀏覽量
377076 -
Linux
+關注
關注
87文章
11345瀏覽量
210404 -
倒車雷達
+關注
關注
4文章
76瀏覽量
23926 -
雷達系統
+關注
關注
6文章
247瀏覽量
28769
發布評論請先 登錄
相關推薦
倒車雷達應用
勇敢的芯伴你玩轉Altera FPGA連載94:倒車雷達實例特權同學,版權所有配套例程和更多資料下載鏈接:http://pan.baidu.com/s/1i5LMUUDfile:///C
發表于 04-26 05:45
何為倒車雷達
為了便于開發,我做了一塊擴展板子:擴展板有一些常用器件,這樣開發MSP430 F5529程序的時候,就不用杜邦線連接了。當然也可以選擇杜邦線連接器件,效果都一樣。超聲波模塊的讀取:何為倒車雷達?車輛倒車時候的一個警報
發表于 11-23 09:19
汽車倒車雷達系統的設計
以STC12C5A60S2單片機和倒車主控芯片GM3101為核心部件,輔以溫度傳感器、液晶顯示器、語音芯片等外圍器件組成倒車雷達系統,實現對有效測量范圍內障礙物的精密距離測量、危險等級
發表于 09-23 15:19
?554次下載
評論