G
uncaught exception in Timer(4) interrupt handler RuntimeError:这定时器多少有点叛逆。
通过串口把协议发送过去之后,这个定时器工作了两三秒之后就会报这个异常
import sensor, image,time,lcd
from pyb import UART,Timer,LED
sensor.reset()
print("初始化摄像头成功")
sensor.set_pixformat(sensor.RGB565)
print("设置彩图成功")
sensor.set_framesize(sensor.QVGA)
print("设置图像像素为QVGA")
sensor.skip_frames(1)#里面如果是数字就是跳过几帧,如果是time=1000就是跳过1s的帧数
print("设置跳帧成功,如果卡摄像头将这句话注释")
sensor.set_auto_whitebal(False)
print("关闭白平衡成功")
sensor.set_auto_gain(False)
print("关闭自动增益成功")
clock = time.clock()
print("记录帧率")
lcd.init()
print("初始化LCE屏幕成功")
uart = UART(3,115200,8,None,1)#初始化串口
print("初始化串口成功")
#进行初始化
#===================================================================================================
data = []#一个列表
LED_Red = LED(1)
LED_Green = LED(2)
LED_Blue = LED(3)
#设置了一个感兴趣区,如果框不住请调整 160宽度是最小的,但是不建议
left_roi= [0,0,240,120]
#第一个模糊阈值
red_color0 = (0, 100, -26, 65, -25, 59)
green_color0 = (0, 100, -73, 21, -40, 65)
yellow_color0 = (43, 100, -37, 58, -22, 72)
#第二个模糊阈值
red_color1 = (55, 98, 35, 59, 0, 19)
green_color1 = (0, 100, -128, -35, -128, 127)
yellow_color1 = (94, 100, -18, 5, 2, 40)
#交通灯的阈值(经过曝光处理)主要使用这个阈值
red_threshold_01 = (29, 100, 38, 96, 20, 63)
green_threshold_01 = (29, 91, -96, -18, 19, 67)
yellow_threshold_01 = (34, 100, -31, 42, 48, 84)
#阈值
#===================================================================================================
Flaglight = 0 #标志灯
tim = Timer(4,freq=1)
tim.deinit()
QR_flag = 0
light_flag = 0
show_numTab = ["0","1","2","3","4","5","6","7","8","9"]
qr_number = 0
traffic_number = 0
#设置标志位
#===================================================================================================
#摄像头识别停止或者识别失败的的协议?
returnData = [0x55,0x02,0x92,0x02,0x02,0x00,0x00,0xBB]
#摄像头正在识别的协议
runData = [0x55,0x02,0x92,0x03,0x02,0x00,0x00,0xBB]
#俩控制摄像头循迹和舵机上下调节的协议
returnData2 = [0x55,0x02,0x91,0x02,0x02,0x00,0x00,0xBB]
runData2 = [0x55,0x02,0x91,0x03,0x02,0x00,0x00,0xBB]
#返回协议
#===================================================================================================
#二维码定时器
def QR_timer(timer):
global QR_flag,qr_number,returnData
print("Timer Delaying")
qr_number = qr_number-1
if(qr_number == 0):
qr_number = 2
QR_flag = 2
tim.deinit()
#交通灯定时器
def traffic_light_timer(timer):
global light_flag,traffic_number,returnData2
print("Timer Delaying")
traffic_number = traffic_number-1
if(traffic_number == 0):
traffic_number = 9
light_flag = 2
tim.deinit()
#定时器延时10s
#===================================================================================================
#发送函数
def USART_Send(src,length):
for i in range(length):
uart.writechar(src[i])
#发送函数
#===================================================================================================
#二维码 #协议是回传数据 #QR_flag等于1回传,等于2回传识别失败
def Color_Check(srcbuf):
global QR_flag,qr_number
if(QR_flag == 1):
for code in img.find_qrcodes():
QR_flag = 0
tim.deinit()#停止定时器
print(code)
qr_Tab = code.payload()
uart.writechar(0x55)
uart.writechar(0x02)
uart.writechar(0x92)
uart.writechar(0x01)
uart.writechar(len(qr_Tab))
for qrdata in qr_Tab:
uart.writechar(ord(qrdata))
uart.writechar(0xBB)
if(QR_flag == 2):
for rdata in returnData:
uart.writechar(rdata)
QR_flag = 0
#二维码识别函数
#===================================================================================================
def find_max(blobs):
max_size=0
for blob in blobs:
if blob.pixels() > max_size:
max_blob = blob
max_size = blob.pixels()
return max_blob #寻找最大的色块
#==================================================================================================
#交通灯的核对
def traffic_Check(srcbuf):
global light_flag,traffic_number
if(light_flag == 1):
#看参数根据距离更改
#,x_stride =5,y_stride=5 增加识别的速度
# pixels_threshold=30 最小的色块
# area_threshold=30 最小边界框区域
# merge=True 合并色块
# margin=2 合并的时候边界距离
yellow = img.find_blobs([yellow_threshold_01],roi=left_roi,x_stride =5,y_stride=5, pixels_threshold=30, area_threshold=30, merge=True, margin=2)
green = img.find_blobs([green_threshold_01] ,roi=left_roi,x_stride =5,y_stride=5, pixels_threshold=30, area_threshold=30, merge=True, margin=2)
red = img.find_blobs([red_threshold_01], roi=left_roi, x_stride =5,y_stride=5, pixels_threshold=30, area_threshold=30, merge=True, margin=2)
if green:
max_blob1 = find_max(green)
img.draw_edges(max_blob1.min_corners(), color=(0,0,255))
img.draw_cross(max_blob1[5], max_blob1[6],color=(0,0,255))
print("绿色")
tim.deinit()
light_flag = 0
uart.writechar(0x55)
uart.writechar(0x02)
uart.writechar(0x02)
uart.writechar(0x02)
uart.writechar(0x00)
uart.writechar(0x00)
uart.writechar(0x04)
uart.writechar(0xBB)
elif yellow:
max_blob1 = find_max(yellow)
img.draw_edges(max_blob1.min_corners(), color=(0,0,255))
img.draw_cross(max_blob1[5], max_blob1[6],color=(0,0,255))
print("黄色")
tim.deinit()
light_flag = 0
uart.writechar(0x55)
uart.writechar(0x02)
uart.writechar(0x02)
uart.writechar(0x03)
uart.writechar(0x00)
uart.writechar(0x00)
uart.writechar(0x05)
uart.writechar(0xBB)
elif red:
max_blob1 = find_max(red)
img.draw_edges(max_blob1.min_corners(), color=(0,0,255))
img.draw_cross(max_blob1[5], max_blob1[6],color=(0,0,255))
print("红色")
tim.deinit()
light_flag = 0
uart.writechar(0x55)
uart.writechar(0x02)
uart.writechar(0x02)
uart.writechar(0x01)
uart.writechar(0x00)
uart.writechar(0x00)
uart.writechar(0x03)
uart.writechar(0xBB)
#else:
#red = img.find_blobs([red_color1],x_stride=3,y_stride=3)
#yellow = img.find_blobs([yellow_color1],x_stride=3,y_stride=3)
#green = img.find_blobs([green_color1],x_stride=3,y_stride=3)
#if green:
#LED_Red.off()
#LED_Green.on()
#LED_Blue.off()
#tim.deinit()
#uart.writechar(0x55)
#uart.writechar(0x02)
#uart.writechar(0x02)
#uart.writechar(0x02)
#uart.writechar(0x00)
#uart.writechar(0x00)
#uart.writechar(0x04)
#uart.writechar(0xBB)
#elif yellow:
#LED_Red.on()
#LED_Green.on()
#LED_Blue.off()
#tim.deinit()
#uart.writechar(0x55)
#uart.writechar(0x02)
#uart.writechar(0x02)
#uart.writechar(0x03)
#uart.writechar(0x00)
#uart.writechar(0x00)
#uart.writechar(0x05)
#uart.writechar(0xBB)
#elif red:
#LED_Red.on()
#LED_Green.off()
#LED_Blue.off()
#tim.deinit()
#uart.writechar(0x55)
#uart.writechar(0x02)
#uart.writechar(0x02)
#uart.writechar(0x01)
#uart.writechar(0x00)
#uart.writechar(0x00)
#uart.writechar(0x03)
#uart.writechar(0xBB)
##else:
##print("meng yi ge")
##uart.writechar(0x55)
##uart.writechar(0x02)
##uart.writechar(0x02)
##uart.writechar(0x03)
##uart.writechar(0x00)
##uart.writechar(0x00)
##uart.writechar(0x05)
##uart.writechar(0xBB)
if(light_flag == 2):
for rdata in returnData2:
uart.writechar(rdata)
light_flag = 0
#交通灯识别函数(注释的是 识别阈值更低级别 的识别)
#可以连用,但是要在串口发送之前关闭定时器跟标志位
#===================================================================================================
print("准备进入主循环")
#55 02 91 01 00 00 00 BB 交通灯识别串口协议
#55 02 92 01 00 00 00 BB 二维码识别串口协议
while(True):
img = sensor.snapshot()#.lens_corr(1.8)#如果二维码识别不到把注释去掉
img.draw_rectangle( left_roi, color=(255,0,0))
if(uart.any()):
print("收到串口发送的数据")
data = uart.read(8)
print(data)
if( len(data) >= 8):
if((data[0] == 0x55)&(data[1] == 0x02)&(data[7] == 0xBB)):
if(data[2] == 0x91):
print("识别交通灯")
if(data[3] == 0x01):
if(light_flag == 0):
light_flag = 1
traffic_number = 9
print("开始识别")
sensor.set_auto_exposure(False, 1000)#这里设置曝光时间
print(sensor.get_exposure_us())
tim.callback(traffic_light_timer)
else:
print("正在识别")
for rdata in runData2:
print(rdata)
uart.writechar(rdata)
if(data[3] == 0x02):
print("停止识别")
light_flag = 2
tim.deinit()
if(data[2] == 0x92):
print("识别二维码")
if(data[3] == 0x01):
if(QR_flag == 0):
QR_flag = 1
qr_number = 9
print("开始识别")
#这里设置自动曝光
sensor.set_auto_exposure(True)
print("二维码的曝光参数%d"%sensor.get_exposure_us())
tim.callback(QR_timer)
else:
print("正在识别")
for rdata in runData:
print(rdata)
uart.writechar(rdata)
if(data[3] == 0x02):
print("停止识别")
QR_flag = 2
tim.deinit()
#主循环函数
#===================================================================================================
traffic_Check(data)
Color_Check(data)
lcd.display(img)
#重点循环
#===================================================================================================
请在这里粘贴代码