![1_1716033410840_2.jpg](正在上传 100%) ![0_1716033410840_1.jpg](正在上传 100%)
import time,sensor,image,math,pyb
from servo import Servos
#from pyb import Pin#可有可无
from machine import I2C, Pin
#摄像头初始化函数
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.VGA) # High Res!
sensor.set_windowing((80, 640)) #该部分是摄像头分辨率调整,条形码建议640x80或反之
sensor.skip_frames(30)
sensor.set_auto_gain(False) # must turn this off to prevent image washout...
sensor.set_auto_whitebal(False) # must turn this off to prevent image washout...
clock = time.clock()
i2c = I2C(sda=Pin('P5'), scl=Pin('P4'))#pca9685初始化,下面预计为舵机使用iic地址配置
servo = Servos(i2c, address=0x40, freq=50, min_us=500, max_us=2500, degrees=180)
pin1 = Pin('P1', Pin.IN, Pin.PULL_UP) ##将P1口作为阈值控制口 OUT_PP PULL_NONE
key1=0
#所有舵机度数为90度时机械臂与地面垂直
servo.position(0,90)#初始化舵机位置,从下到上6个舵机
time.sleep_ms(1000)
servo.position(1,90)#按支架方向度数减小是向前
time.sleep_ms(1000)
servo.position(2,90)#该舵机度数增大是向前
time.sleep_ms(1000)
servo.position(3,90)#该舵机度数增大是向前申
time.sleep_ms(1000)
servo.position(4,90)#旋转机械爪舵机,一般不用动,90度是水平状态
servo.position(5,80)#机械爪张合舵机(120度完全闭合,减小度数张开)
time.sleep_ms(2000)
#按键中断函数
def callback_PIN1(line):
global key1#全局变量
key1=1
pyb.delay(5)#按键消抖,下面内容为外部中断配置
extint = pyb.ExtInt(pin1, pyb.ExtInt.IRQ_FALLING, pyb.Pin.PULL_UP, callback_PIN1)
#条形码识别函数(详细可参考星曈官网)
def barcode_name(code):
if(code.type() == image.EAN2):
return "EAN2"
if(code.type() == image.EAN5):
return "EAN5"
if(code.type() == image.EAN8):
return "EAN8"
if(code.type() == image.UPCE):
return "UPCE"
if(code.type() == image.ISBN10):
return "ISBN10"
if(code.type() == image.UPCA):
return "UPCA"
if(code.type() == image.EAN13):
return "EAN13"
if(code.type() == image.ISBN13):
return "ISBN13"
if(code.type() == image.I25):
return "I25"
if(code.type() == image.DATABAR):
return "DATABAR"
if(code.type() == image.DATABAR_EXP):
return "DATABAR_EXP"
if(code.type() == image.CODABAR):
return "CODABAR"
if(code.type() == image.CODE39):
return "CODE39"
if(code.type() == image.PDF417):
return "PDF417"
if(code.type() == image.CODE93):
return "CODE93"
if(code.type() == image.CODE128):
return "CODE128"
#用字典将大中小和左中右位置对应
barcode_positions = {}
#条形码扫描函数
def scan_barcode(position_label):
while True:#死循环,未检测到条形码则一直检测
clock.tick()
img = sensor.snapshot()
codes = img.find_barcodes()
if codes:#该部分可参考星曈官网示例
for code in codes:
img.draw_rectangle(code.rect())
barcode_type = barcode_name(code)
payload = code.payload()
barcode_positions[payload] = position_label
print("Barcode %s, Payload \"%s\", position %s" % (barcode_type, payload, position_label))
return # Successfully detected a barcode, exit the loop
else:
print("No barcode detected, retrying...")
#扫描右侧函数
def scan_move_right():
for pos0 in range(90,80,-2):
servo.position(0,pos0)
time.sleep_ms(50)
time.sleep_ms(500)
#中间扫描函数
def scan_move_middle():
for pos1 in range(90,50,-2):
servo.position(1,pos1)
time.sleep_ms(50)
time.sleep_ms(500)
for pos3 in range(90,160,2):
servo.position(3,pos3)
time.sleep_ms(30)
time.sleep_ms(500)
for pos2 in range(90,105,2):
servo.position(2,pos2)
time.sleep_ms(50)
time.sleep_ms(500)
#扫描左侧函数
def scan_move_left():
for pos0 in range(90,102,2):
servo.position(0,pos0)#(100度左右适宜,可能略有误查)
time.sleep_ms(50)
time.sleep_ms(500)
#扫描后复位到中间
def scan_move_back():
for pos0 in range(80,91,2):#扫描完所有条形码后机械臂转回中间
servo.position(0,pos0)
time.sleep_ms(50)
time.sleep_ms(500)
for pos1 in range(52,90,2):
servo.position(1,pos1)
time.sleep_ms(50)
time.sleep_ms(500)
#扫描后的抓取函数左中右一次性抓取
def catch_move(barcode_positions,key):
if barcode_positions.get(key)=='L':
for pos0 in range(90,101,2):
servo.position(0,pos0)
time.sleep_ms(50)
time.sleep_ms(500)
for pos1 in range(90,50,-2):
servo.position(1,pos1)
time.sleep_ms(50)
time.sleep_ms(500)
for pos3 in range(90,75,-2):
servo.position(3,pos3)
time.sleep_ms(50)
time.sleep_ms(500)
for pos2 in range(90,150,2):
servo.position(2,pos2)
time.sleep_ms(50)
time.sleep_ms(500)
servo.position(5,110)
time.sleep_ms(500)
for pos1 in range(50,90,2):
servo.position(1,pos1)
time.sleep_ms(50)
time.sleep_ms(500)
for pos0 in range(100,160,2):
servo.position(0,pos0)
time.sleep_ms(50)
time.sleep_ms(2000)
#if key1==1 and pin1.value()==0:#按键按下则打开机械爪并旋转复位,否则机械臂不动
#servo.position(3,110)#机械爪张开
#time.sleep_ms(1000)
#servo.position(0,90)
#time.sleep_ms(5000)
#else:
#servo.position(0,180)
#time.sleep_ms(1000)
if barcode_positions.get(key)=='M':
servo.position(0,90)
time.sleep_ms(500)
for pos1 in range(90,50,-2):
servo.position(1,pos1)
time.sleep_ms(50)
time.sleep_ms(500)
for pos3 in range(90,75,-2):
servo.position(3,pos3)
time.sleep_ms(50)
time.sleep_ms(500)
for pos2 in range(90,150,2):
servo.position(2,pos2)
time.sleep_ms(50)
time.sleep_ms(500)
servo.position(5,110)
time.sleep_ms(500)
for pos1 in range(50,90,2):
servo.position(1,pos1)
time.sleep_ms(50)
time.sleep_ms(500)
for pos0 in range(90,160,2):
servo.position(0,pos0)
time.sleep_ms(50)
time.sleep_ms(2000)
#if key1==1 and pin1.value()==0:#按键按下则打开机械爪并旋转复位,否则机械臂不动
#servo.position(3,110)#机械爪张开
#time.sleep_ms(1000)
#servo.position(0,90)
#time.sleep_ms(5000)
#else:
#servo.position(0,180)
#time.sleep_ms(1000)
if barcode_positions.get(key)=='R':
for pos0 in range(90,80,-2):
servo.position(0,pos0)
time.sleep_ms(50)
time.sleep_ms(500)
for pos1 in range(90,50,-2):
servo.position(1,pos1)
time.sleep_ms(50)
time.sleep_ms(500)
for pos3 in range(90,75,-2):
servo.position(3,pos3)
time.sleep_ms(50)
time.sleep_ms(500)
for pos2 in range(90,150,2):
servo.position(2,pos2)
time.sleep_ms(50)
time.sleep_ms(500)
servo.position(5,110)
time.sleep_ms(500)
for pos1 in range(50,90,2):
servo.position(1,pos1)
time.sleep_ms(50)
time.sleep_ms(500)
for pos0 in range(80,160,2):
servo.position(0,pos0)
time.sleep_ms(50)
time.sleep_ms(2000)
#if key1==1 and pin1.value()==0:#按键按下则打开机械爪并旋转复位,否则机械臂不动
#servo.position(3,110)#机械爪张开
#time.sleep_ms(1000)
#servo.position(0,90)
#time.sleep_ms(5000)
#else:
#servo.position(0,180)
#time.sleep_ms(1000)
#######################################################################
#以下为本次抓取程序,上述为各部分函数
#检测中间物体的条形码
scan_move_middle()
time.sleep_ms(500)
scan_barcode("M")
#向左移动
scan_move_left()
time.sleep_ms(500)
#左边识别条形码
scan_barcode("L")
#向右移动
#右边识别条形码
scan_move_right()
scan_barcode("R")
time.sleep_ms(500)
scan_move_back()
time.sleep_ms(500)
#以下为抓取物料顺序,更改引号内内容即可
catch_move(barcode_positions,"middle")
if key1==1 and pin1.value()==0:#按键按下则打开机械爪并旋转复位,否则机械臂不动
servo.position(5,80)#机械爪张开
time.sleep_ms(1000)
for i in range(160,90,-2):
servo.position(0,i)
time.sleep_ms(50)
time.sleep_ms(500)
catch_move(barcode_positions,"small")
if key1==1 and pin1.value()==0:#按键按下则打开机械爪并旋转复位,否则机械臂不动
servo.position(5,80)#机械爪张开
time.sleep_ms(1000)
for i in range(160,90,-2):
servo.position(0,i)
time.sleep_ms(50)
time.sleep_ms(500)
catch_move(barcode_positions,"big")
if key1==1 and pin1.value()==0:#按键按下则打开机械爪并旋转复位,否则机械臂不动
servo.position(5,80)#机械爪张开
time.sleep_ms(1000)
for i in range(160,90,-2):
servo.position(0,i)
time.sleep_ms(50)
time.sleep_ms(500)
#这样大中小就和方位对应起来了
#比如定义一个moveto(L/M/R)ifL左移,ifR右移,if不动
#机械臂移动到中方块处moveto(barcode_positions["middle"])然后拿走
#回到初始位置
#移到小方块处moveto(barcode_positions["small"])拿走
#回到初始位置
#移到大方块处moveto(barcode_positions["big"])拿走
#回到初始位置
![0_1716033374049_IMG_20240518_195556.jpg](正在上传 100%)