Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 278|回复: 0

【教程】工业场景下mycobot 280 for arduino实现传送带控制

[复制链接]
发表于 2022-11-13 19:00 | 显示全部楼层 |阅读模式
本帖最后由 沧海笑1122 于 2022-11-13 19:02 编辑

工业场景下mycobot实现传送带控制

【续前】
   上一篇《mycobot 280 for arduino上手笔记》记录了我在mycobot 280 for arduino漂流瓶计划中的上手情况。本文从一个小实例入手,一起体验一下一个完整的工业场景下的传送带(皮带秤)项目。
      本项目主要功能描述:
基于PC,结合mycobot pythonAPI和称重传感器,做了一个工业场景的小玩具。使用玩具传送带输送小零件到秤盘,使用m5stack basic作为主机搭建一个电子秤,用来称量传送带下来的零件重量,用m5stackbasic的uart送给pc;将pc作为上位机,在上位机上,用python写了一个简单的图形界面,玩家可以设置称重数值,实时显示称重数据以及进度棒。
项目启动时,机械臂落臂启动传送带电源,在接近目标重量时,驱动机械臂实现抬臂动作断开电源,终止传送带运输。
因为我拿到的mycobot for arduino,没有夹具,我就在上面固定了一个模拟手指的乐高配件,用来模拟手指落臂时按动电源开关,抬臂时释放电源开关,从而实现对传送带的运行控制。
先看一下视频,了解一下这个项目的运行情况。
B站视频链接。
有趣指数:★★★☆
难度指数:★★☆
一如既往地好玩且容易上手。
一、软件准备
  
  
内容
版本
备注
1
Mega 2560固件
V1.0
Mega 2560与PC和ATOM通信
2
ATOM固件
V4.1
ATOM与Mega 2560通信并且对伺服电机的控制
3
mycobot pythonAPI
V2.9.6
Python开发项目的GUI,对mycobot280的控制
4
UIFLOW
1.9.5离线版
给m5stack basic写一个称重、uart传送程序

二、硬件准备
  
  
内容
版本
备注
1
Mega 2560
Arduino 或兼容

2
m5stack basic
M5Stack

3
称重传感器
形变传感器+HX711

4
USB-TTL转换器

m5stack basic与PC通信,上送称重数据
5
杜邦线
3根
Mega2560与ATOM通信
6
玩具传送带
2*1.5V供电,直流齿轮皮带传送
需要对电源开关进行改装,实现按压供电,释放断电
备注:实现Mega 2560和ATOM之间uart通信,三根连线就可以了。如表:
  
  
Mega 2560
myCobot 280-Arduino
1
19
RX
2
18
TX
3
GND
GND
注:mega2560 采用serial1(详见配置库)与ATOM(myCobot 280-Arduino)进行通信
三、搭建过程及步骤
Step1:烧写Mega 2560和ATOM固件
   详见我上一个入手帖子。https://www.arduino.cn/thread-111714-1-1.html
Step2:编写m5stack basic侧程序,满足称重以及数据上送上位机的功能
m5stackbasic1_a.png
说明:
(1)    串口初始化,同时也设定了接线方式:
m5stack basic与PC接线
  
  
m5stack basic
USB-TTL
1
17
RX
2
16
TX
3
GND
GND
2)    计算折算系数,
用m5stack basic读到传感器的数据均为原始数据,需要用一只100g的砝码,一只200g的砝码进行校正后,计算出折算为“克”的折算系数。本次我们计算出的系数是-7.81。
(3)    计算读取到的称重传感器数据,并且计算折算系数后,显示为称重值(单位:克)。
(4)    将读取到的数据,用uart1,每个20ms发送一次。在此建议可以做一个平均值或者中值滤波消抖,减少在零件跌落料斗过程中的冲击,后续可以完善。
(5)    这是清零按钮对应的事件,100ms做按钮消抖。
以上即为uiflow写的一个简单的电子秤程序,同时可以通过uart1经过TTL-USB发送至PC上位机。一键download就可以写入m5stack basic,非常方便。为了便于连接和调试,我用了uiflow的离线版。如果您的网络条件好,还是建议用在线版。
Step3:使用myblockly 调试得到按压(落臂)、释放(抬臂)动作的参数。
  详见我上一个入手贴的最后部分。https://www.arduino.cn/thread-111714-1-1.html

Step4:编写PC上位机侧程序,安装mycobot pythonAPI
上位机流程图a.drawio.png


(1)首先用tkinter库写了GUI界面。用户可以设定称重控制的阈值,比如本次调试中,我设置了5g。
1112a_副本.png
(2)导入了mycobotpython API,初始化过程中,完成抬臂动作。
python2_副本.png

(3)对OK按钮回调后,首先落臂导通传送带电源,传送带开始运转,电子秤实时监测重量,loding()函数负责对串口称重数据读取,判断是否到达阈值,如果到达则发送抬臂动作。
代码如下
  1. #============
  2. # 功能:1、设置称重值,电子秤从串口送回适时测试数据,在GUI显示。
  3. #       2、使用processing bar 显示称重的进展情况
  4. #       3、一旦达到目标值99%(测试中检验),则给mycobot下达指令,进行停止操作
  5. # date: 2022-11-10
  6. # version: 0.2
  7. # 联调:结合mycobot 按钮和释放动作
  8. #============


  9. from tkinter import *
  10. import tkinter.ttk
  11. import serial
  12. import time
  13. from pymycobot.mycobot import MyCobot
  14. from pymycobot.genre import Coord

  15. #====全局变量初始化
  16. global val #实测重量
  17. val=0.0

  18. global iset #比例系数,根据设置值来计算,setvalue/100
  19. iset=5/5

  20. global c_set #输入框,形成称重判断标准
  21. c_set=0.0

  22. global action_flag
  23. action_flag=False


  24. # 设置下载最大值
  25. maxbyte = 100

  26. #======MyCobot初始化
  27. mc = MyCobot('COM23',115200)
  28. mc.power_off()
  29. time.sleep(2)
  30. mc.power_on()
  31. time.sleep(2)
  32. print('is power on?')
  33. print(mc.is_power_on())
  34. time.sleep(2)
  35. mc.send_angles([95.97,(-46.4),(-133.3),94.3,(-0.9),15.64],50) #抬臂动作
  36. time.sleep(2)
  37. #==================

  38. #串口初始化
  39. try:
  40.     arduino = serial.Serial("COM25", 115200 , timeout=1)         
  41. except:
  42.     print("Port connection failed")
  43. ReadyToStart = True

  44. #显示处理条函数
  45. def show():
  46.     mc.send_angles([95.6,(-67.2),(-130.3),101.9,(-2.2),23.11],50) #down
  47.     # 设置进度条的目前值
  48.     progressbarOne['value'] = 0
  49.     # 设置进度条的最大值
  50.     progressbarOne['maximum'] = maxbyte
  51.     # 调用loading方法
  52.     loading()

  53. #处理过程函数
  54. def loading():
  55.     global byte
  56.     global val
  57.     global action_flag
  58.     c_set=setvalue.get()
  59.     iset=100/float(c_set)  #计算比例系统
  60.     byte = arduino.readline().decode('utf-8')
  61.    
  62.     try:            
  63.         if len(byte) !=0 :               
  64.             val= byte
  65.         else:
  66.             pass
  67.     except:            
  68.         pass   
  69.    
  70.     #print(1-(float(c_set)-float(val))/float(c_set))  #调试用
  71.    
  72.     if (1-(float(c_set)-float(val))/float(c_set))>=0.99 and action_flag==False: #当剩余值小于5%。则发出动作
  73.         print("triger")
  74.         mc.send_angles([95.97,(-46.4),(-133.3),94.3,(-0.9),15.64],50) #up
  75.         action_flag=True #确保只动作一次,除非reset
  76.     # 设置处理棒指针进度
  77.     progressbarOne['value'] =(1-(float(c_set)-float(val))/float(c_set))*100
  78.     #float(val)*iset
  79.     #在label4显示实施称重数据
  80.     strvar.set(str(float(val)))
  81.     # 经过100ms后再次调用loading方法
  82.     progressbarOne.after(20, loading)
  83. #reset按钮回调函数
  84. def reset_click():
  85.     global action_flag
  86.     action_flag=False  #复位标志字,为下一次动作做准备
  87.     pass

  88. #OK按钮回调函数
  89. def ok_click():
  90.     show()
  91.     pass


  92. #UI界面设计===========
  93. #主窗口
  94. win =  tkinter.Tk()
  95. win.title("Mycobot")

  96. #创建一个frame窗体对象,用来包裹标签
  97. frame = tkinter.Frame (win,  borderwidth=2, width=450, height=250)
  98. # 在水平、垂直方向上填充窗体
  99. frame. pack ()
  100. # 创建 "位置1"
  101. Label1 = tkinter.Label ( frame, text="Set value (g)")
  102. # 使用 place,设置第一个标签位于距离窗体左上角的位置(40,40)和其大小(width,height)
  103. # 注意这里(x,y)位置坐标指的是标签左上角的位置(以NW左上角进行绝对定位,默认为NW)
  104. Label1.place (x=35,y=15, width=80, height=30)
  105. # 设置数据输入setvalue
  106. setvalue = tkinter.Entry (frame, text="位置2",fg='blue',font=("微软雅黑",16))
  107.                 #,bg='purple',fg='white')
  108. # 以右上角进行绝对值定位,位置在距离窗体左上角的(166,15)
  109. setvalue.place(x=166,y=15,  width=60, height=30)

  110. # 设置标签3
  111. Label3 = tkinter.Label (frame, text="Real Value (g)")
  112.                 #,bg='green',fg='white')
  113. # 设置水平起始位置相对于窗体水平距离的0.6倍,垂直的绝对距离为80,大小为60,30
  114. Label3.place(x=35,y=80, width=80, height=30)
  115. # 设置标签4,放置实测重量值,默认0.0g
  116. strvar = StringVar()
  117. Label4 = tkinter.Label (frame, textvariable=strvar,text="0.0",fg='green',font=("微软雅黑",16))

  118.                 #,bg='gray',fg='white')
  119. # 设置水平起始位置相对于窗体水平距离的0.01倍,垂直的绝对距离为80,并设置高度为窗体高度比例的0.5倍,宽度为80
  120. Label4.place(x=166,y=80,height=30,width=60)

  121. progressbarOne = tkinter.ttk.Progressbar(win, length=300, mode='determinate')
  122. progressbarOne.place(x=66,y=156)

  123. # 使用按钮控件调用函数
  124. resetbutton = tkinter.Button(win, text="Reset", width=15, height=2,command=reset_click).pack(side = 'left',padx = 80,pady = 30)

  125. # 使用按钮控件调用函数
  126. okbutton = tkinter.Button(win, text="OK", width=15, height=2,command=show).pack(side = 'left', padx = 20,pady = 30)



  127. #开始事件循环
  128. win. mainloop()
复制代码
Step5:程序分步调试后的联调
   程序进行分步调试:
(1)    调试电子秤,确保称重正确,用砝码做校正。确保数据上送串口正确,用串口助手进行读取,确保数据正常。
(2)    机械臂联调传送带,因为本次漂流瓶我们没有夹具和配件,就用乐高积木堆叠了一个简单的按钮,在落臂后,触发传送带电源,传送带开始运转;抬臂之后,电源断开,传送带停止传送。
(3)    联合调试:将GUI设定阈值,触发机械臂落臂上电,传送带开始运转(零件运送并落入料斗,实时称重),到达阈值(5g)后触发机械臂抬臂断电。

系统图_b.jpg

图中标注说明:
(1)    mycobot 280 for arduino
(2)    传送带电源按钮:按下供电,释放则断电
(3)    Mega2560
(4)    M5Stack Basic
(5)    传送带(2*1.5V电机驱动,齿轮+皮带传送)
(6)    称重传感器与料斗
(7)    ATOM
(8)    USB-TTL

小结
这是一个工业场景下的小玩具,目的在于展示mycobot280 for arduino的机械臂控制功能,玩家通过传感器加m5stackbasic的方式,向上位机传送称重数据,间接反馈传送带的运转状态,上位机通过设定阈值,实时接收称重数据,来监测传送带零件运输情况,达到阈值后,触发抬臂动作。从而完成了整个控制过程。
程序很简单,上位机只有150行。难度很小,适合入门者上手。关于对机械臂电气、机械以及参数的认识、调整、获取,可以参考我上一个入门笔记。
感谢大象机器人的漂流瓶计划,感谢arduino.cn提供交流平台,感谢m5stack社区的宽容友好。

沧海合十。

【附件】程序代码和UIFLOW代码附上,供参考。
CH_codes_20221113.zip (4.44 KB, 下载次数: 0)

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-6 11:19 , Processed in 0.080068 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表