5.2 交通卡片控制小车

5.2 交通卡片控制小车#

5.2.1 简介#

交通卡片控制小车,卡片有前进,左转,右转,掉头,停止,速度40,速度60,速度80,红灯,绿灯,AI视觉模块进行识别交通卡片,通过对应的卡片使小车进行相应的动作。

5.2.2 流程图#

b18

5.2.3 代码#

from machine import I2C,UART,Pin,PWM
from Sengo2 import *
import time

# 等待Sengo2完成操作系统的初始化。此等待时间不可去掉,避免出现Sengo2尚未初始化完毕主控器已经开发发送指令的情况
time.sleep(3)

# 选择UART或者I2C通讯模式,Sengo2出厂默认为I2C模式,短按模式按键可以切换
# 4种UART通讯模式:UART9600(标准协议指令),UART57600(标准协议指令),UART115200(标准协议指令),Simple9600(简单协议指令),
#########################################################################################################
# port = UART(2,rx=Pin(16),tx=Pin(17),baudrate=9600)
port = I2C(0,scl=Pin(21),sda=Pin(20 ),freq=400000)

# Sengo2通讯地址:0x60。如果I2C总线挂接多个设备,请避免出现地址冲突
sengo2 = Sengo2(0x60)

err = sengo2.begin(port)
print("sengo2.begin: 0x%x"% err)
 
# 1、sengo2可以识别10张交通卡片
# 2、如需识别自定义的卡片,首先可以尝试集成的深度学习算法;如果效果或者功能不理想,可以购买Sentry2,烧录Sentry2MV固件,自行采集图片训练模型,然后编写python脚本调用模型;
# 4、sengo2最多可以同时识别2排4列共8张卡片,一般按照由上向下、由左向右的顺序输出结果信息;
# 5、正常使用时,应由主控器发送指令控制Sengo2算法的开启与关闭,而非通过摇杆手动进行操作;
# 6、满足特定限制条件下,Sengo2可以并行运行多个识别算法
err = sengo2.VisionBegin(sengo2_vision_e.kVisionCard)
print("sengo2.VisionBegin(sengo2_vision_e.kVisionCard):0x%x"% err)

#Initialize the passive buzzer
buzzer = PWM(Pin(12))

# right wheel
pin1=Pin(14,Pin.OUT)
pin2=PWM(Pin(16))
pin2.freq(50)

# left wheel
pin3=Pin(15,Pin.OUT)
pin4=PWM(Pin(17))
pin4.freq(50)

#速度变量
right_speed = 50000
left_speed = 50000

# As a function of the car going forward.
def car_forward(): 
  pin1.value(0)
  pin2.duty_u16(right_speed) 
  pin3.value(0)
  pin4.duty_u16(left_speed)

# As a function of the car going backwards.
def car_back(): 
  pin1.value(1)
  pin2.duty_u16(50000 - right_speed)  
  pin3.value(1)
  pin4.duty_u16(50000 - left_speed)

# As a function of the car going left.
def car_left(): 
  pin1.value(0)
  pin2.duty_u16(25000)  
  pin3.value(1)
  pin4.duty_u16(25000)
# As a function of the car going right.
def car_right(): 
  pin1.value(1)
  pin2.duty_u16(25000)  
  pin3.value(0)
  pin4.duty_u16(25000)

# As a function of the car stopping.
def car_stop(): 
  pin1.value(0)
  pin2.duty_u16(0)  
  pin3.value(0)
  pin4.duty_u16(0)

#设置速度为50000的40%,对应速度40的卡片
def speed_40():
    #声明要修改全局变量
    global left_speed,right_speed
    buzzer_play(20000)
    left_speed = int(50000 * 0.4)
    right_speed = int(50000 * 0.4)

#设置速度为50000的60%,对应速度60卡片
def speed_60():
    #声明要修改全局变量
    global left_speed,right_speed
    buzzer_play(30000)
    left_speed = int(50000 * 0.6)
    right_speed = int(50000 * 0.6)

#设置速度为50000的80%,对应速度80卡片
def speed_80():
    #声明要修改全局变量
    global left_speed,right_speed
    buzzer_play(40000)
    left_speed = int(50000 * 0.8)
    right_speed = int(50000 * 0.8)

#设置速度成功提示音
def buzzer_play(speed):
    print("left_speed = %d",left_speed)
    if left_speed != speed:
        buzzer.freq(1000)    # 1000Hz高频
        buzzer.duty_u16(32768)  # 50%占空比(65536/2)
        time.sleep_ms(100)    # 持续100ms
        buzzer.duty_u16(0)   # 关闭声音
        time.sleep_ms(50)     # 短音间隔50ms

while True:
    # Sengo2不主动返回检测识别结果,需要主控板发送指令进行读取。读取的流程:首先读取识别结果的数量,接收到指令后,Sengo2会刷新结果数据,如果结果数量不为零,那么主控再发送指令读取结果的相关信息。请务必按此流程构建程序。
    obj_num = (sengo2.GetValue(sengo2_vision_e.kVisionCard, sentry_obj_info_e.kStatus))
    #判断避免识别到多张卡片时出现混乱
    if obj_num == 1:
        for i in range(1,obj_num+1):
            #获取卡片标签值
            Tags = sengo2.GetValue(sengo2_vision_e.kVisionCard,sentry_obj_info_e.kLabel,i)
            if Tags == 1:
                car_forward()
            elif Tags == 2:
                car_left()
            elif Tags == 3:
                car_right()
            elif Tags == 4:
                car_back()
            elif Tags == 5:
                car_stop()
            elif Tags == 8:
                speed_40()
            elif Tags == 9:
                speed_60()
            elif Tags == 10:
                speed_80()
    else : car_stop()
    time.sleep(0.2)    

5.2.4 代码结果#

上传代码成功后,AI视觉模块会对拍到的画面进行识别,判断是否有交通卡片,如果有则想卡片的标签值赋值到变量Tags,通过对变量Tags的值进行判断,Tags = 1 小车前进,Tags = 2 小车左转 ,Tags = 3 小车右转 ,Tags = 4 小车后退 ,Tags = 5 小车停止 ,Tags = 8 小车速度设置为全速(50000)的40% , Tags = 9 小车速度设置为全速(50000)的60% ,Tags = 10 小车速度设置为全速(50000)的80%。(注意:只有要设置的速度与当前速度不一致时才会发出“滴”的声音)