您当前的位置: 首页 >> 电娱要闻

基于RK3576开发板的USB摄像头使用

作者:峰田汇电子交流圈电子网 日期:2025-05-06 点击数:0

1. USB简介

USB:Universal Serial Bus(通用串止总线)。是一种经常使用于电子装备间通信的通用规范接心。USB 总线做为一种下速串止总线,其极下的传输速率能够知足下速数据传输的使用情况请求。

具有供电复杂(可总线供电)、装置设置装备摆设便利(撑持即插即用战热插拔)、 扩大端心简略单纯(经过散线器最多可扩大127 个中设)、传输体例多样化(4 种传输形式),和兼容杰出(产物晋级后背下兼容)等长处。

1.1 EASY EAI Orin-Nano USB资本引见

EASY EAI Orin-Nano有一起曲出的USB3.0 HOST接心,借有一起曲出的OTG接心。

wKgZPGgZuxqACBYgABBiD586vlU820.png

若没有理解【USB HOST】、【USB Device】和【OTG】的寄义,又或许有【必需使上层USB做为HOST】的需供,可参考《USB_HOST取USB_Device》一文。

1.2 USB摄像头接进计划

wKgZO2gZuxqAUI47AADdNgPRzl4093.png

留意:固然USB撑持热插拔,但正在出给底板减拆中壳维护的状况下,很轻易触碰着底板上的器件,乃至板卡左近有金属整件很轻易形成板卡短路。因而也倡议正在插拔中设时,最好确保电源曾经完整堵截。

【倡议】USB摄像头【间接】接进究竟板的【下层】USB接心上。

wKgZPGgZuxuADpbUABBATP1PZ6M198.png

固然采取多路扩大计划,实际上可扩大127个装备,但正在实践接进多个USB摄像头时需求思索USB通讲的带宽,USB散线层数,和要处理装备ID相反的成绩,因而非需要【没有倡议】那么接。

USB的实际最年夜层数为7层(露RootHub)。

1.3 USB装备的接进治理引见

正在USB摄像头或许USB Hub停止物理衔接后,我们需求晓得那些USB装备能否被零碎辨认出去,则需求经过lsusb号令检查。

lsusb
wKgZO2gZuxuANRxGAACn3rUsY54565.png

别的,正在文件零碎中,USB Device治理目次为/sys/bus/usb/devices,可正在此处检查到从root_hub开端挂载的USB装备和Hub装备的拓扑干系。

USB装备的装备定名体例法则以下:

装备工具的定名法则
装备 定名法则 描绘
总线工具 usb1、usb2 处置器自带的USB硬件,0号hub装备,以是其接心工具是由0开端计较。
曲连的USB装备 root_hub-hub_port
注:以“-”段横杠联系
root_hub为地点的总线号码;
hub_port为处于该总线的第几个装备,0号装备总线自身,新接进的装备从1开端。
连正在中扩hub的装备 root_hub-hub_port.device
注:以“.”句号联系
新接进的装备做为hub的子装备,编号从1开端
装备工具的接心定名法则
装备 定名法则 描绘
装备工具的接心工具 device_object:config.interface
注:以“:”冒号联系装备工具战后绝元素。后绝元素有设置装备摆设战接心,两者以“.”句号联系
device_object:装备工具,下面总线工具、量量装备、颠末hub的装备统称为装备工具
config:USB装备的设置装备摆设描绘符,一个USB装备可正在分歧零碎、分歧架构下运转的条件便是运用了分歧的设置装备摆设描绘符
interfece:USB装备的接心描绘符,比方一个USB对讲机,有担任处置播音的接心和担任灌音的接心。

1.4 寻觅可用的装备节面

rockchip仄台,一个MIPI-CSI接心会对应20多个video节面(装备树定了便会死成那么多个),以下图所示。

wKgZPGgZuxuAWLNlAADvzgIeWh8195.png

并且MIPI-CSI camera对应的节面,会正在修正内核装备树的时分牢固上去(即:内核配好了MIPI-CSI Camera个数,不管MIPI-CSI摄像头能否有接上,它的video节面状况皆是没有会依据MIPI-CSI Camera的接进状况而【静态】改动)。

而一个USB camera会对应2个video节面,【普通会】陈列正在MIPI-CSI camera的前面。举个例子:内核设置装备摆设了1路MIPI-CSI camera,那USB camera的节面便是/dev/video25战/dev/video26;内核设置装备摆设了2路MIPI-CSI camera,那USB camera的节面便是/dev/video49战/dev/video50。以此类推。

可是【最精确】的办法,仍是要看一下那个video节面的【描绘疑息】。Linux的v4l2框架会把那些节面的描绘疑息一致放正在/sys/class/video4linux/目次下,以下图所示。

wKgZO2gZuxuADWWiAADHhD6GKVk928.png

随意进进一个描绘,如video22。

wKgZPGgZuxyAX3T5AACoy7qNgMI403.png

经过cat号令,能够用检查那个name的内容是甚么。

cat /sys/class/video4linux/video22/name
wKgZO2gZuxyANJVEAABr2viLxJY006.png

那末,我们则需求运用以下号令,对【一切video节面】停止扫描取【挑选】。

grep -i "usb" /sys/class/video4linux/video*/name
wKgZPGgZuxyALbIPAACAZjgI-oo737.png

2. 疾速上脚

2.1 例程源码下载

到【百度网盘】高低载相干的单例顺序:

链接:https://pan.百度.com/s/1RXHMGpmGSEfFy0rb1VkXSg?pwd=1234

提与码: 1234

比方正在windows情况中,便把单例顺序下载到:此电脑D:BaiduNetdisk (无规则,用户可自立挑选),以下图所示。

wKgZO2gZuxyAcL2tAACzjzn_OTw582.png

然后把例程【复造粘揭】到nfs挂载目次中。(没有清晰目次若何构建的,能够参考《进门指北/开辟情况预备/nfs效劳拆建取挂载》)

wKgZPGgZuxyAdw_5AAEDr7CBhzE034.png

2.2 例程编译&运转

经过adb shell进进开辟板情况,履行下圆号令定位到demo目次,而且履行编译操纵。

cd /home/orin-nano/Desktop/nfs/02_camera/
./build.sh
wKgZO2gZux2ALcfhAARnkhV_id4539.png

编译胜利后,相干的demo会死成正在Release目次下。

履行下圆号令以运转demo,以下所示。

sudo ./Release/test-usbCam-single 49  ##需求root权限

履行结果以下所示。

wKgZPGgZux2AAXg8AABMW6Vj5_0978.png

然后把/tmp/photo拷贝到以后目次下的Release内

cp /tmp/photo ./Release/

再经过组开键【Ctrl+Shift+T】创立一个新窗心,定位到nfs效劳器的对应地位。

wKgZO2gZux2AEmOxAACKiBD90sU960.png

最初运用mplayer东西播放图片,号令以下所示。

mplayer -demuxer rawvideo -rawvideo w=1280:h=720:format=bgr24 ./Release/photo -loop 0
wKgZPGgZux2AL77CABMCYsJUSss055.png

例程默许分辩率为1280x720,故w战h的参数对应挖进1280战720。当呈现图片非常时,阐明分辩率等没有太对应于脚头的摄像头,以是需求调剂usbcamera_init()的分辩率,比方640x480。

3. 测试USB摄像头API案例

示例代码途径为:02_camera/test-usbCam/single-cam.c。USB Camera API的测试案例代码逻辑流程以下所示:

wKgZO2gZux6AL281AABSz27uAFE832.png

3.1 源码阐明

int main()
{
    if(1 == argc){
        printf("nerr: Missing parameter!n");
        printf("================= [usage] ==================n");
        printf("example:n");
        printf("t%s < 49/50 >n", argv[0]);
        printf("--------------------------------------------n");
        return 0;
    }
    int cameraIndex = atoi(argv[1]);
    
	char *pbuf = NULL;
	int ret = 0;
	int skip = 0;
	FILE *fp = NULL;

	ret = usbcamera_init(CAMERA_INDEX, CAMERA_WIDTH, CAMERA_HEIGHT, 0);
	if (ret) {
		printf("error: %s, %dn", __func__, __LINE__);
		goto exit3;
	}

	pbuf = (char *)malloc(IMAGE_SIZE);
	if (!pbuf) {
		printf("error: %s, %dn", __func__, __LINE__);
		ret = -1;
		goto exit2;
	}

	//跳过前10帧
	skip = 10;
	while(skip--) {
		ret = usbcamera_getframe(CAMERA_INDEX, pbuf);
		if (ret) {
			printf("error: %s, %dn", __func__, __LINE__);
			goto exit1;
		}
	}

	/* tips: 能够正在Ubuntu下用mplayer播放录造图象
	*	mplayer -demuxer rawvideo -rawvideo w=1280:h=720:format=bgr24 photo -loop 0
	*/
	fp = fopen("/tmp/photo", "w");
	if (!fp) {
		printf("error: %s, %dn", __func__, __LINE__);
		ret = -1;
		goto exit2;
	}
	fwrite(pbuf, 1, IMAGE_SIZE, fp);
	fclose(fp);

exit1:
	free(pbuf);
	pbuf = NULL;
exit2:
	usbcamera_exit(CAMERA_INDEX);
exit3:
    return ret;
}

此中usbcamera_init(),usbcamera_getframe(),usbcamera_exit()是对v4l2接心挪用的易用化启拆。详细完成于02_camera/commonApi/usb_camera/usb_camera.c。

考核编纂 黄宇

本站所有文章、数据、图片均来自网友原创提供和互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱: