debug
常见错误提示
ImportError:no module named xxx
原因:没有把stepper.py这个文件拖到你的板子里。
拖过去之后,需要重启,使模块生效。
MemoryError:FB Alloc Collision!!!
原因:模板匹配的模板文件太大了,内存爆了
AttributeError:‘tuple’ object has no attrbute ‘rect’
原因:一个tupple没有rect这个方法。
固件和IDE不匹配,升级固件就好了。
防患于未然,希望自己不要出现以上错误。
记录耗费时间
假如运行程序后,图像一卡一卡的,那么说明帧率小。
例程
OpenMV与OpenCV的区别
OpenMV是一个硬件项目,集成了图像的算法,硬件是专用的(开源)。
OpenCV是一个通用的软件项目,需要操作系统的支持,在嵌入式上跑需要移植和裁剪相当大的代码量。
例程
01基础
02板级控制
arduino_i2c_slave 从设备
arduino_spi_slave 从设备
注:以上两个例程,未实现,以上研究一下arduino。
cpufreq_scaling CPU频率缩放
此示例显示如何使用cpufreq模块动态更改CPU频率。
注:maixpy好像没有这个模块
没有把stepper.py这个文件拖到你的板子里。见:模块的使用
拖过去之后,需要重启,使模块生效
但是小白这个板子没有找到maixpyU盘main.py。
openmv运行如下,cpu频率倍增。
i2c_control i2c控制
注:需要插入Thermopile扩展板,未实现。
pyb模块在Maixpy 也没有。
OpenMv实践
那为什么是有上图这个问题呢,经过查询,个人感觉是没有确认本机的从机设备地址。
(注:未实践,需要lic设备)
大家在使用Ginkgo USB-I2C适配器,有个非常重要的信息就是所控制的从机地址必须要知道,否则就无法正确的和I2C从机进行通信,一般来说,在I2C设备的数据手册中都会明确提出这个设备的I2C地址是多少,不过在有的时候,可能手边没有这个设备的地址信息,但是也想和它建立通信,这种情况怎么办呢?下面我们就可以用我们的适配器并配合我们提供的一个小工具来找到这个设备的地址。
实现的基本原理,我们先假设这个I2C从机设备是7bit模式地址,然后我们以此发送所有地址数据,然后判断从机是否正常应答,如果正常应答了,说明这个地址就是这个I2C从机的地址,否则就不是他的地址。
软件界面如下:
从软件输出的信息可以看到,当发送0xD0地址的时候,从机正常应答了,而发送其他地址的时候从机都没应答,这就能说明从机设备地址就是0xD0。
read_adc读取ADC
rtc实时时钟
spi_control spi控制
使用OpenMV的SPI总线。
LCD 扩展板没有使用内置的lcd驱动,而是使用了SPI。
注:未实现,需要插入LCD扩展板来运行这个例子
servo_control舵机控制
注:未实现,未连接舵机。
timer_control定时器控制
定时器
回调函数
如:tim = Timer(4, freq=1)
tim.callback(tick)
usb_vcp usb虚拟串口
使用USB VCP类按需将图像发送到PC
注:未实现,需传图像
03Drawing-画图
copy2fb把图像复制到framebuffer
# 导入 image
img = image.Image("/example.bmp", copy_to_fb=True)
注:未实现,未插SD卡,未插入图片
其他有pyb模块未实现
已实现:
color_drawing在图像里画线
运行程序,发现灰、红、绿、蓝循环变色。
灰度图
c = ((i * 255) + (img.width()/2)) / img.width()
img.draw_line((i, 0, i, img.height()-1), color = int(c))
画线函数img.draw_line((x0, y0, x1, y1), color=White),从(x0,y0),到(x1,y1)画一条直线。如果是灰度图,color是0-255的一个数,0代表黑,255代表白;如果是RGB图像,color是(r,g,b)的一个元组,r g b分别代表红绿蓝。
RGB图
for i in range(img.width()):
c = ((i * 255) + (img.width()/2)) / img.width()
img.draw_line((i, 0, i, img.height()-1), color = [int(c), 0, 0])
因为是rgb图,所以color = [int(c), 0, 0],而不是一个单纯的0-255的数字。
注:python的元组类型一定要用[ ]或者()括起来,否则会报错。
同理
绘制箭头
如:img.draw_arrow(x0, y0, x1, y1, color = (r, g, b), size = 30, thickness = 2)
绘制圆形
如:img.draw_circle(x, y, radius, color = (r, g, b), thickness = 2, fill = False)
绘制十字
如:img.draw_cross(x, y, color = (r, g, b), size = 10, thickness = 2)
绘制椭圆
img.draw_ellipse(x, y, radius_x, radius_y, rot, color = (r, g, b), thickness = 2, fill = False)
注:如果第一个参数是缩放器,则此方法需要查看x,y,radius x和radius y。 否则,它需要一个(x,y,radius_x,radius_y)元组。
flood_fill洪水填充
洪水填充就是 像洪水一样填充图像中低矮凹陷的地方。如键盘间隙。
例:
img = sensor.snapshot().flood_fill(x, y, seed_threshold=0.05, floating_thresholds=0.05, color=(255, 0, 0), invert=False, clear_background=False)
image_drawing绘制图片
在帧缓冲区中绘制图像。在这种情况下,绘制我们当前正在绘制的图像,这会导致图形故障。 传递可选的掩码图像以控制绘制的像素。
如:img.draw_image(img, w//4, h//4, x_scale=0.5, y_scale=0.5)
keypoints_drawing绘制特征点
img.draw_keypoints([(x, y, rot)], color = (r, g, b), size = 20, thickness = 2, fill = False)
line_drawing绘制线段
如:img.draw_line(x0, y0, x1, y1, color = (r, g, b), thickness = 2)
rectangle_drawing绘制线段
text_drawing绘制文字
如:img.draw_string(x, y, “Hello World!”, color = (r, g, b), scale = 2, mono_space = False)