介绍在嵌入式linux下完成倒车影像小项目的流程,学习pwm驱动蜂鸣器,编写超声波驱动,读取壁障距离,读取摄像头的画面实时显示。
倒车影像项目 模拟: 汽车中控台---倒车影像。
组成部分:
【1】lcd屏: 实时显示摄像头采集的数据。
【2】摄像头: 放在车尾,采集图像传输给lcd屏进行显示。
【3】 倒车雷达: 超声波测距--->测量车尾距离障碍物的距离。
【4】蜂鸣器: 根据倒车雷达测量的距离,控制频率。
1.1 超声波测距模块 声波测距: 已知声音在空气中传播的速度。
硬件接线:
echo------->gpx1_0 (开发板第9个io口): 中断引脚----->检测回波----输入
trig ------->gpb_7 (开发板第8个io口): 输出触发信号。
超声波驱动读取距离:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static unsigned int distance_irq; /*存放中断号*/static u32 *gpb_dat=null;static u32 *gpb_con=null;static u32 distance_time_us=0; /*表示距离的时间*//*工作队列处理函数: */static void distance_work_func(struct work_struct *work){ u32 time1,time2; time1=ktime_to_us(ktime_get()); /*获取当前时间,再转换为 us 单位*/ /*等待高电平时间结束*/ while(gpio_get_value(exynos4_gpx1(0))){} time2=ktime_to_us(ktime_get()); /*获取当前时间,再转换为 us 单位*/ distance_time_us=time2-time1; //printk(us=%d\n,time2-time1); /*us/58=厘米*/}/*静态方式初始化工作队列*/static declare_work(distance_work,distance_work_func);/*中断处理函数: 用于检测超声波测距的回波*/static irqreturn_t distance_handler(int irq, void *dev){ /*调度工作队列*/ schedule_work(&distance_work); return irq_handled;}static void distance_function(unsigned long data);/*静态方式定义内核定时器*/static define_timer(distance_timer,distance_function,0,0);/*内核定时器超时处理函数: 触发超声波发送方波*/static void distance_function(unsigned long data){ static u8 state=0; state=!state; /*更改gpio口电平*/ if(state) { *gpb_dat|=1<<7; } else { *gpb_dat&=~(1<<7); } /*修改定时器的超时时间*/ mod_timer(&distance_timer,jiffies+msecs_to_jiffies(100));}static int distance_open(struct inode *inode, struct file *file){ return 0;}#define get_us_time 0x45612static long distance_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long argv){ u32 *us_data=(u32*)argv; int err; u32 time_us=distance_time_us; switch(cmd) { case get_us_time: err=copy_to_user(us_data,&time_us,4); if(err!=0)printk(拷贝失败!\n); break; } return 0;}static int distance_release(struct inode *inode, struct file *file){ return 0;}/*定义文件操作集合*/static struct file_operations distance_fops={ .open=distance_open, .unlocked_ioctl=distance_unlocked_ioctl, .release=distance_release};/*定义杂项设备结构体*/static struct miscdevice distance_misc={ .minor=misc_dynamic_minor, .name=tiny4412_distance, .fops=&distance_fops};static int __init tiny4412_distance_dev_init(void) { int err; /*1. 映射gpio口地址*/ gpb_dat=ioremap(0x11400044,4); gpb_con=ioremap(0x11400040,4); *gpb_con&=~(0xf<<4*7); *gpb_con|=0x1<<4*7; /*配置输出模式*/ /*2. 根据gpio口编号,获取中断号*/ distance_irq=gpio_to_irq(exynos4_gpx1(0)); /*3. 注册中断*/ err=request_irq(distance_irq,distance_handler,irq_type_edge_rising,distance_device,null); if(err!=0)printk(中断注册失败!\n); else printk(中断:超声波测距驱动安装成功!\n); /*4. 修改定时器超时时间*/ mod_timer(&distance_timer,jiffies+msecs_to_jiffies(100)); /*杂项设备注册*/ misc_register(&distance_misc); return 0;}static void __exit tiny4412_distance_dev_exit(void) { /*5. 注销中断*/ free_irq(distance_irq,null); /*6. 停止定时器*/ del_timer(&distance_timer); /*7. 取消io映射*/ iounmap(gpb_dat); iounmap(gpb_con); /*注销杂项设备*/ misc_deregister(&distance_misc); printk(中断:超声波测距驱动卸载成功!\n);}module_init(tiny4412_distance_dev_init);module_exit(tiny4412_distance_dev_exit);module_license(gpl);module_author(tiny4412 wbyq);
1.2 pwm方波控制蜂鸣器 pwm方波:
内核自带的pwm方波驱动
app代码:
#include #include #include #define pwm_ioctl_set_freq 1#define pwm_ioctl_stop 0/*主程序*/int main(int argc,char**argv){ int fb; fb=open(/dev/pwm,2); if(fb全称: video4linux2
v4l2 : 针对uvc免驱usb设备设计框架。专用于usb摄像头的数据采集。
免驱 : 驱动已经成为标准,属于内核自带源码的一部分。
v4l2框架本身注册的也是字符设备,设备节点: /dev/videox
v4l2 框架: 提供ioctl接口,提供了有很多命令,可以通过这些命令对摄像头做配置。
比如: 输出的图像尺寸,输出图像格式(rgb、yuv、jpg),申请采集数据的缓冲区。
配置摄像头采集队列步骤:
mmap函数映射。
摄像头代码,读取摄像头画面:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include framebuffer.h#define pwm_device /dev/pwm /*pwm方波设备文件*/#define distance_device /dev/tiny4412_distance /*超声波测距设备文件*/#define uvc_video_device /dev/video15 /*uvc摄像头设备节点*/#define get_us_time 0x45612 /*获取超声波测量的距离: ioctl命令*/#define pwm_ioctl_set_freq 1 /*控制pwm方波频率: ioctl命令*/#define pwm_ioctl_stop 0 /*停止pwm方波输出: ioctl命令*/int distance_fd; /*超声波设备的文件描述符*/int pwm_fd; /*pwm方波设备的文件描述符*/int uvc_video_fd; /*uvc摄像头设备文件描述符*/int image_width; /*图像的宽度*/int image_height; /*图像的高度*/unsigned char *video_memaddr_buffer[4]; /*存放摄像头映射到进程空间的缓冲区地址*//*函数功能: 用户终止了进程调用*/void exit_sighandler(int sig){ //停止pwm波形输出,关闭蜂鸣器 ioctl(pwm_fd,pwm_ioctl_stop,0); close(pwm_fd); close(distance_fd); exit(1);}/*函数功能: 读取超声波数据的线程*/void *distance_getpthread_func(void *dev){ /*1. 打开pwm方波驱动*/ pwm_fd=open(pwm_device,o_rdwr); if(pwm_fd100) /*100厘米: 警告区域*/ { printf(警告区域!\n); ioctl(pwm_fd,pwm_ioctl_set_freq,2); } else /*小于> 8; b = (y + (454 * u)) >> 8; *(ptr++) = (r > 255) ? 255 : ((r 255) ? 255 : ((g 255) ? 255 : ((b
滤光片-可见光反射镜应用与简介
铅酸蓄电池修复—你知道失水的元凶吗?
如何使用Freeze技术实现低功耗设计
一个非常简单的三晶体管音频放大器电路
微服务架构中的数据一致性解决方案与实践
Linux应用开发_倒车影像项目介绍
详解如何为D类放大器选取合适的参数
详解血糖监测设备市场发展趋势
最受欢迎的时尚手机,OPPOR9s清新绿线下火热开卖
多联机无法使用手操器并且显示C0故障代码是怎么回事
安森美VE-Trac SiC用于主驱逆变器的优势
小米、魅族、华为荣耀、乐视、360等,谁会在千元机市场最终胜出?
LED将要实现通透效果_led透明屏
风冷式无霜冷柜电路工作原理
浅谈DIC在不锈钢材料中的应用
二氧化碳记录仪在大棚内的作用是怎样的
荣耀FlyPods怎么样 值不值得买
新房怎么除甲醛最有效,甲醛空气净化器是首选
Seyond全品类亮相CES 推动高性能激光雷达行业认可
5G可以来做自动化和人工智能的管理?