【有基础可跳过】促使我们做上手指南的原因永远都是以降低用户使用难度为目的,但一些基础知识(Python语法)我们还是需掌握熟悉的,而大部分的小伙伴是从K210(MaixPy)换代升级到M2DOCK(MaixPy3)的,但我们区分这两者之间的不同吗?显然刚接触的小伙伴们是不清楚的。
充足的准备能让后续的上手旅程更事半功倍(为了不掉坑里~)文档以M2DOCK的全功能套餐来演示,我们收到后会有一套M2DOCK板卡、Type-C线以及SD镜像卡,但还需准备一个USB3.0读卡器以作备用。
上手指南搭配流程图一起食用更佳~
文档示例环境:Windows10镜像版本:v831-m2dock-maixpy3-0.5.4-20230505
对于V831的镜像文件名字是有对应的规则,以后大家可以根据自己的需求来进行下载。就以v831-m2dock-maixhub-0.5.1-20220701.zip和v831-m2dock-maixpy3-0.5.1-20220701.zip来对比说明
上述镜像均为开源版,只适用于TF卡烧录启动
系统相当于燃机的原料,我们把系统烧录完成好后接着下一步安装需使用到的软件。
注意事项(超重要!):下载时确保我们安装的软件包版本(大于0.5.0)且在安装过程中会弹出安装驱动程序的提示,请根据提示安装驱动并确保安装完成才能进行下一步操作。
接下来根据注意事项来自行下载安装包并安装好驱动及软件,根据示例文档熟悉界面的基础用法。
一起搭配我们的【M2DOCK开箱大放送】视频食用更佳噢~
第一步:USBType-C数据线【需自行准备的话】请准备质量可靠或者是手机附赠的数据线,质量差的数据线会因电压问题造成开发板处于非正常工作状态导致后续影响使用,有些Type-C线只能供电。
第二步:把我们准备的镜像卡插入M2DOCK的卡槽内,并确定烧录的版本(大于0.5.1)即可。
第三步:将M2DOCK与电脑通过OTG标识的USB口连接,确认设备通电亮起(power)电源红灯,请看下图红圈别接错USB口的位置,OTG标识的丝印在板子背面。
第四步:确认屏幕出现logo或二维码(wiki)表示系统启动开始工作,同时电脑会弹出U盘标识(意味着板卡系统已准备就绪)即可进行下一环开始使用!
然后勾选卸载驱动(重要!!一定要勾选)进行卸载即可,U盘自动弹出也代表底层硬件正常可用。
如果U盘还是没有如上述步骤出现,可以重烧系统或重启设备或考虑换台电脑操作,有可能是个别系统驱动不兼容导致的,实在是解决不了请找官方的淘宝客服。
开始体验运行代码前,我们先了解M2DOCK支持多种编程方式,分别是Linuxshell(adb)命令行、Jupyternotebook(Python)开发、U盘编辑运行(Python)等。Linuxshell更多的是专业开发者或是熟悉Linux终端的同学进行使用,而如果是无基础的萌新更推荐其余两种方式。
下文全以适配软件MaixPy3IDE的使用来示例。
IDE软件启动时会附带一个keep_adb.exe命令行终端的程序提供给熟悉linux终端操作开发板的同学,软件版本0.4.2后keep_adb服务会自动调用adb配置映射(forward)端口(22,18811,18812)与板子连接的ide服务是否工作。
如何进行判断:可以在交互终端输入ps|grepmjpg查看是否存在下图红框所指示的服务。
最后确认系统防火墙是否阻止了软件底层所需要TCP1881118812的端口号(主用于运行程序和图像传输)
启动MaixPy3IDE时会弹出Jupyter的编辑网页,我们先来测试板卡的连接以及外设是否正常可用。
复制下列代码块,再点击上方菜单栏中的运行,测试板子连接是否正常。
importplatformprint(platform.platform())importtimeprint(time.asctime())
由运行后打印出的结果我们可知以下信息:
当确定板卡的连接状态正常后,我们来测试屏幕以及摄像头的功能是否正常。
运行以下程序后可在代码下方看见摄像头实时获取的图像。
frommaiximportcamera,display,image#引入python模块包whileTrue:img=camera.capture()#从摄像头中获取一张图像display.show(img)#将图像显示出来
图中我们看见运行程序后可实时看到摄像头捕捉的画面,正面我们的屏幕以及摄像头都是正常可用的。
如果屏幕没有显示内容:那么首先确认一下镜像镜像版本,并且确认一下外设和驱动对的上。
上文我们使用了Maixpy3IDE搭载的Jupyter(Python)运行代码并测试了屏幕及摄像头的功能,接下来我们来体验Linuxshell命令行的使用并给M2DOCK进行联网。
M2Dock带有2.4G无线模组,可以用来连接2.4G频段的无线网络,因镜像的更新(WiFi)链接方式有两种可供大家选择,但是文档示例以最新镜像方法为示例标准,更多可查询下文给出的参考链接。
使用下面的命令来连接名称:Sipeed_Guest密码:qwert123的无线网络。
wifi_connect_ap_testSipeed_Guestqwert123
上文我们尝试了怎么使用Linuxshell来进行联网操作,这里我们来尝试使用U盘配置开机脚本。
对于M2DOCK如何使用U盘设置开机脚本呢?其实很简单只需要一下几个步骤:
第一步:把(待存)脚本存成名为main.py的文件,然后根据第二步判断存放位置。第二步:判断U盘目录下是否有app的文件夹,如果有就把main.py存进app文件夹后进行下一步,如果没有直接把main.py存放在U盘即可进行下一步。第三步:存放好后使用电脑操作系统自带的移除U盘方式来保证文件在没有损坏的情况下保存进板卡,否则会因为不当操作而导致main.py没有正常保存到U盘(板卡系统)里面。
注意事项:MaixPy3IDE运行时会停止M2Dock的开机脚本程序,所以我们应该在电脑托盘找到并退出MaixPy3IDE或者选择仅使用板子上的TypeC串口来进行供电以查看开机运行脚本效果。
以下为root目录下main.py文件里的出厂默认开机脚本:
#!/usr/bin/envpythonfrommaiximportcamera,display,image,nnimage.load_freetype("/home/res/sans.ttf")qrcode=image.open('/home/res/qrcode.png')canvas=image.new((display.width(),display.height()),(0xFF,0xFF,0xFF),"RGB")canvas.draw_image(qrcode,(canvas.width-qrcode.width)//2,(canvas.height-qrcode.height)//2)info="wiki.sipeed.com/maixpy3"w,h=image.get_string_size(info,1.2)canvas.draw_string((canvas.width-w)//2+5,canvas.height-h-5,info,1.2,color=(0x00,0x00,0x00))foriinrange(120):img=camera.capture().draw_image(canvas,alpha=0.7)display.show(img)
在使用U盘进行传输文件之前我们需要先了解电脑端U盘的目录与M2DOCK文件系统目录的对应规则。
规则:电脑上的U盘对应着M2DOCK文件系统的/root目录。
传输文件操作如下:(前提M2DOCK通过OTG口连接电脑端)
通过上文我们清楚了如何使用Python运行程序、如何使用Linuxshell进行联网以及使用U盘设置开机脚本,熟悉的朋友们都知道MAIX系列主打的就是视觉+AI芯片,那图像处理是我们必不可少的体验过程。
图像处理还分传统以及AI视觉,而在M2dock上我们主要学习传统的背景知识以及用法。
这个章节更多的讲述的是认识一些经典外设并学会使用调用它的示例。
这一章节讲述的是在M2DOCK上如何实现播放视频以及录音播放的使用示例。
到达进阶使用这里后,这里则需要小伙伴们具备一些Linux基础了才能继续往下走学习。
全志V831使用TinaLinux系统移植自OpenWrt。
Opkg是一个轻量快速的套件管理系统,目前已成为Opensource界嵌入式系统标准。常用于路由、交换机等嵌入式设备中,用来管理软件包的安装升级与下载。
有时镜像包更新但我们确不想再次进行烧录板子以作更新,这时可以手工更新MaixPy3达到更新目的。
M2DOCK是双Type-c接口的(分别是UART/OTG)而OTG接口是默认作为USB从机来使用的。
如果想使用USB摄像头则需手动更改端口为主机模式,从板子上的串口USB(UART)来操作板子,并执行以下命令修改OTG口为主机模式使用。
echo"usb_host">/sys/devices/platform/soc/usbc0/otg_role将USBOTG口作为从机M2Dock默认的OTG口就是USB从机设备,如有其他原因需重新设置成从机设备的话,只需在M2DOCK上执行以下命令即可。
echo"usb_device">/sys/devices/platform/soc/usbc0/otg_role更换屏幕目前开发板支持的屏幕有1.3寸、2.4寸、2.8寸的IPS屏,且只是支持在我们淘宝上售卖的显示屏;对于别的屏幕有需求的,可以走商务通道进行定制。
目前MaixII-Dock开发板目前支持的摄像头有sp2305、vs3205、ov2685(只支持在官方店上再售卖的摄像头,有别的摄像头需求可以进行商务定制),摄像头之间的切换同样时需要更换设备树文件,更换方式上面的更换屏幕一样的。
有需求的可以自行尝试,但是对于V831还是推荐使用MaixPy3和MaixHub。
无论是在K210还是M2DOCK(V831)上一定要学会使用我们公开的文档资料,去借助资料的力量帮助自己在学习的道路上往前走,学会借助资源完善自身的不足,可以让你少走很多的坑以及弯路。
上文我们说过了MAIX系列主打的就是视觉+AI的特性,所以AI算法应用也是上手体验里不可少的一环。
训练自己的AI模型有两种方法:分别是在线训练以及本地训练。
这个章节可以搭配下文的编译与开发一起食用更佳噢~
当你走到这时已经代表你熟悉(V831)的基础操作准备深层了解,以下的文档是为了开发者写的参考文,希望可以基于此让更多的伙伴进入Linux嵌入式开发的领域。
完成上面的环境配置后,这里提供了可运行的Demo内容就是如何使用V831LINUXC++进行图像视觉处理和开发,在此我们提供了串口+mvcvai的示例项目,供开发者评估使用,此处不涉及到ISP调试,需要进一步ISP图像调试则需要联系SIPEED。
操作步骤:连接上板子的OTG接口后,在/libmaix/libmaix/examples/app_dls831目录下使用make下进行编译(编写好的脚本会自动把编译好的文件上传并运行)。
我们可以看到程序是保持稳定三十帧的运行速率。
接下来我们来认识一下现有的库:分别是AI、Opencv、Openmv、LVGL。
YOLOv2是一种基于深度学习的目标检测算法,它是YOLO(youonlylookonce)的改进版本。
YOLOv2相比于YOLO主要有以下几个不同的改进点:
YOLOv2的优点主要有以下几个方面:
接下来我们来尝试采用人脸模型为测试:
为了照顾C程序在/libmaix/components/maix_cv_image/src/libmaix_cv_image.cpp下对Opencv的函数又做了一层封装,当时还没有全面用C++但现在已经全部迁移到C++了。
可以在提供的libmaix/components/maix_dls831/src/dls831_uvai.cpp的例子中,看到是如何采用了Opencv实现滤波和二值化等操作。
voidAdaptiveThreshold(cv::Mat&src,cv::Mat&dst,doubleMaxval,intSubsize,doublec,adaptiveMethodmethod=meanFilter){if(src.channels()>1)cv::cvtColor(src,src,cv::COLOR_RGB2GRAY);cv::Matsmooth;switch(method){casemeanFilter:cv::blur(src,smooth,cv::Size(Subsize,Subsize));//均值滤波break;casegaaussianFilter:cv::GaussianBlur(src,smooth,cv::Size(Subsize,Subsize),0,0);//高斯滤波break;casemedianFilter:cv::medianBlur(src,smooth,Subsize);//中值滤波break;default:break;}smooth=smooth-c;src.copyTo(dst);for(intr=0;r
//绘制十字线for(size_ti=0;i image.find_blobs(thresholds,roi=Auto,x_stride=2,y_stride=1,invert=False,area_threshold=10,pixels_threshold=10,merge=False,margin=0,threshold_cb=None,merge_cb=None)根据上面的链接描述,我们再看看imlib中的使用几乎一模一样。 imlib_find_lines(&out,img,&roi,x_stride,y_stride,threshold,theta_margin,rho_margin);在上面提供的例子中就采用了寻找直线的功能。 串口的使用非常的简单,我们先设置好波特率,数据位,停止位等参数,打开串口后挂载到select中,当串口收到数据后会打印一个字节出来。 uint8_t_set_rgbs_color(uint8_t*color_buf){uint8_tret=0;uint8_ti=0;uint8_tj=0;uint8_tk=0;uint8_ttx[25]={0};uint8_trgb[3]={0};uint8_tbyte=0;uint8_tibit=0;uint8_t*p=color_buf;for(i=0;i<2;i++){rgb[0]=p[0];rgb[1]=p[1];rgb[2]=p[2];for(j=0;j<3;j++){uint8_tcolorBit[4]={0};byte=rgb[j];for(ibit=0;ibit<4;ibit++){colorBit[ibit]=(((byte>>(2*ibit+1))&1)*0x60+((byte>>(2*ibit+0))&1)*0x06+0x88);}tx[k++]=colorBit[3];tx[k++]=colorBit[2];tx[k++]=colorBit[1];tx[k++]=colorBit[0];}p+=3;}tx[0]&=0x0f;//spineedclearheadhighleveltx[0]|=0x40;tx[24]=0b1000000;//spineedclearendhighlevelret=spi_xfer_data(tx,25,(int)(4/1.05e-6));returnret;}PWM通过写寄存器的方式直接对三个PWM进行初始化操作。 第一步:我们可以通过命令去查找mpu6050在IIC上的地址 i2cdetetc-y2 我们可从上图得知有两个地址:62以及68,62是板卡上自带的三轴传感器,而68则是我们的mpu6050挂载在IIC上的地址。 第二步:拿到地址后也可以通过命令直接去查看mpu6050中寄存器的值 i2cdump-y20x68 第三步:分别取出高八位和低八位的值后,拼接起来后再通过一层换算才能得到真实的数据,以加速度、角速度和温度为例,打印出换算后的个值。 很多的问题的出现都是误操导致的,如果AQ里没有你遇见的问题,那就自己尝试解决问题,一步一步往回溯源根据报错信息遗漏哪一步哪一环。