当前位置: 首页 > news >正文

2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂

第一弹赛题的选择与前期方案的准备

opencv调用摄像头bug的解决

机械臂的组装

采用三个舵机,组成一个三自由度的机械臂。
如图所示
并且利用电磁吸盘的方式,完成对棋子的抓取工作,后面的事实证明,在预算不足的情况下,队友手搓的机械臂,发挥了大作用。

机械臂的调试代码

import time
import RPi.GPIO as GPIOclass ArmControl:def __init__(self):GPIO.setwarnings(False)# 初始化舵机引脚self.servos = {'base': 16,'shoulder': 20,'elbow': 21}# 设定每个九宫格位置对应的舵机角度self.position_angles = {0:(60 ,60 , 90), 9: (94, 69, 46),  # 位置1: 基座97°,肩部14°,肘部0° true1 9 18: (89, 67, 48),  # 位置2: 基座90°,肩部14°,肘部0° true1 8 17: (83, 63, 51),  # 位置3: 基座82°,肩部14°,肘部0° true1 7 16: (96,61, 67),   # 位置4: 基座97°,肩部5°,肘部3°  true1 6 15: (89, 61, 73),   # 位置5: 基座90°,肩部0°,肘部0° true1 5 14: (82, 61, 74),   # 位置6: 基座82°,肩部5°,肘部3° true1 4 13: (98, 60, 89),  # 位置7: 基座99°,肩部0°,肘部45° true1 3 12: (89, 60, 93),  # 位置8: 基座90°,肩部0°,肘部45°  true1 2 11: (80, 60, 97) ,  # 位置9: 基座80°,肩部0°,肘部46° true1 1 1'A1': (75,64,63),  # 位置1: 基座97°,肩部14°,肘部0° 'B1':(104,67,49),  # 位置1: 基座97°,肩部14°,肘部0° true'C1':(106,66,67),  # 位置1: 基座97°,肩部14°,肘部0° ture'D1':(108, 70, 102),  # 位置1: 基座97°,肩部14°,肘部0°'A2':(75, 69,43),  # 位置1: 基座97°,肩部14°,肘部0° true 1'B2':(75, 64, 67),  # 位置1: 基座97°,肩部14°,肘部0° true'C2':(73, 64, 85),  # 位置1: 基座97°,肩部14°,肘部0°'D2':(70, 70, 112),  # 位置1: 基座97°,肩部14°,肘部0°}# 设置GPIO模式GPIO.setmode(GPIO.BCM)# 设置舵机引脚self.pwm = {}self.last_time = 0  # 上一次设置时间self.debounce_time = 0.5  # 防抖时间(秒)for servo in self.servos.values():GPIO.setup(servo, GPIO.OUT)self.pwm[servo] = GPIO.PWM(servo, 50)  # 50Hzself.pwm[servo].start(0)def set_servo_angle(self, pwm, target_angle, speed):"""将舵机平滑旋转到指定角度,并实现防抖逻辑"""current_time = time.time()  # 获取当前时间# 防抖逻辑if current_time - self.last_time < self.debounce_time:return  # 如果距离上次设置时间小于防抖时间,则不执行# 计算占空比duty = self.angle_to_duty_cycle(target_angle)# 确保占空比在合理范围内if duty < 0:duty = 0elif duty > 12:  # 假设最大是180度duty = 12pwm.ChangeDutyCycle(duty)time.sleep(speed)  # 按速度控制时间延迟pwm.ChangeDutyCycle(0)  # 停止PWM信号self.last_time = current_time  # 更新最后设置时间def move_servo(self, servo_name, angle):"""指定舵机移动到指定角度"""self.set_servo_angle(self.pwm[self.servos[servo_name]], angle, 0.5)  # 设置速度为0.5秒def move_to_position(self, position):"""移动机械臂到指定棋盘位置(1-9)"""if position in self.position_angles:angles = self.position_angles[position]  # 获取角度元组self.move_servo('base', angles[0])# 移动基座time.sleep(1)self.move_servo('elbow', angles[2])time.sleep(1)self.move_servo('shoulder', angles[1])# 移动肩部# 移动肘部def remove_to_position(self, position):"""移动机械臂到指定棋盘位置(1-9)"""if position in self.position_angles:angles = self.position_angles[position]  # 获取角度元组self.move_servo('shoulder', angles[1])# 移动基座time.sleep(1)self.move_servo('elbow', angles[2])time.sleep(1)self.move_servo('base', angles[0])else:print("无效的位置编号!")def angle_to_duty_cycle(self, angle):"""将角度转换为PWM占空比(0到100之间)"""return (angle / 18) + 2  # 示例转换,具体根据舵机类型调整def cleanup(self):"""清理GPIO设置"""for pwm in self.pwm.values():pwm.stop()GPIO.cleanup()if __name__ == "__main__":arm = ArmControl()try:# 将舵机初始化到位置 0print("Moving to position 0...")arm.remove_to_position(0)time.sleep(2)  # 等待,确保舵机到达位置# 返回到位置 0print("Returning to position 0...")arm.move_to_position('B1')time.sleep(2)  # 等待,确保舵机到达位置# 然后移动到位置 1print("Moving to position 1...")#arm.remove_to_position(0)time.sleep(2)  # 等待,确保舵机到达位置except KeyboardInterrupt:print("Process interrupted!")finally:arm.cleanup()  # 清理GPIO设置

机械臂的问题

首先,三个舵机一定要与树莓派共地,不然机械臂可能会出现,随机乱动的情况。
其次,一定要根据三个舵机的功率,去计算机械臂的功率,然后选取非常稳定的稳压模块去给其供电。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 搅拌站智能化改造,数字化管理如何助力降本增效?
  • 走心解答hashCode与equals,尽量说明白
  • Windows图形界面(GUI)-MFC-C/C++ - 树形视图(Tree Control) - CTreeCtrl
  • 超声波眼镜清洗机哪个更好用?四款清洁力强的超声波清洗机推荐
  • 24.8.9.11数据结构|链栈和队列
  • 程序人生-Hello’s P2P
  • vue3引入模块报错:无法找到模块“xxx”的声明文件
  • Java 守护线程练习 (2024.8.12)
  • linux 下 QT5如何编译成32位或64的方法
  • 小白零基础学数学建模系列-Day3-线性回归模型的构建与评估
  • 基于STM32开发的智能农业环境监测系统
  • 看过来!数学建模国赛常见问题汇总
  • 全面介绍`npm`的基本使用
  • ISAM2运行流程
  • Mojo 实现排序功能
  • canvas绘制圆角头像
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • KMP算法及优化
  • php中curl和soap方式请求服务超时问题
  • Shell编程
  • 飞驰在Mesos的涡轮引擎上
  • 汉诺塔算法
  • 写给高年级小学生看的《Bash 指南》
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • (¥1011)-(一千零一拾一元整)输出
  • (2)Java 简介
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (6)STL算法之转换
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三分钟)速览传统边缘检测算子
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .Net Core和.Net Standard直观理解
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .net 中viewstate的原理和使用
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • @font-face 用字体画图标
  • [20161214]如何确定dbid.txt
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [CCF-CSP] 202303-4 星际网络II
  • [Datawhale AI夏令营 2024 第四期] 从零入门大模型微调之旅的总结
  • [EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件
  • [FBCTF2019]RCEService1
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态
  • [github配置] 远程访问仓库以及问题解决
  • [HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页
  • [LeetCode] 178. 分数排名
  • [Leetcode] Permutations II