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

embedded/2024/9/25 8:07:32/

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

opencv调用摄像头bug的解决

机械臂的组装

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

机械臂的调试代码

python">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设置

机械臂的问题

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


http://www.ppmy.cn/embedded/94220.html

相关文章

学习笔记第二十二天

1. time 函数 time_t time(time_t *t); 功能&#xff1a;获取当前时间&#xff08;自1970年1月1日00:00:00 UTC以来的秒数&#xff09;。 参数&#xff1a;t 是一个指向 time_t 类型的指针&#xff0c;用于存放返回的时间值。如果传递 NULL&#xff0c;函数将不 会使用此参数…

Turble海龟画图介绍

Turble海龟画图介绍 这一生无需比较&#xff0c;一笔写不出两个我&#xff0c;我就是我&#xff0c;半身风雨半寒凉&#xff0c;半梦半醒半人间。风往北吹人往南走&#xff0c;爱与不爱都要落落大方&#xff0c;顺其自然&#xff0c;心安即是家&#xff0c;心若向阳&#xff0c…

基于R语言绘制GGE双标图2

参考资料&#xff1a; 严威凯等: 双标图分析在农作物品种多点试验中的应用【作物学报】 https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf 1、如何判断双标图是否充分体现数据中的规律 在对双标图的解释中&#xff0c;有一个隐含的假设&#xff0c;就是所…

Java设计模式详细讲解

目录 设计模式概述 1.1 什么是设计模式1.2 设计模式的类型1.3 设计模式的历史与发展1.4 设计模式在软件开发中的重要性 创建型模式 2.1 单例模式2.2 工厂方法模式2.3 抽象工厂模式2.4 建造者模式2.5 原型模式 结构型模式 3.1 适配器模式3.2 装饰器模式3.3 代理模式3.4 外观模…

RDF引用XML资源的示例

使用XML Schema定义RDF资源的步骤 定义XML Schema&#xff1a; 首先&#xff0c;需要有一个XML Schema&#xff08;XSD&#xff09;来定义资源的结构。XML Schema提供了详细的数据类型和结构定义。 映射XML Schema到RDF&#xff1a; 创建一个RDF词汇表&#xff08;vocabulary&…

动画魔法秀:JavaScript前端动画实战指南

标题&#xff1a;动画魔法秀&#xff1a;JavaScript前端动画实战指南 在现代Web开发中&#xff0c;动画不仅能够提升用户体验&#xff0c;还能使网页更加生动有趣。JavaScript作为实现前端动画的重要工具之一&#xff0c;提供了多种方式来创建平滑且吸引人的动画效果。本文将详…

前端【详解】缓存

HTTP 缓存 https://blog.csdn.net/weixin_41192489/article/details/136446539 CDN 缓存 CDN 全称 Content Delivery Network,即内容分发网络。 用户在浏览网站的时候&#xff0c;CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求 CDN边缘节点的缓存机制与HTTP 缓存相同…

JSON Schema详解!JSON格式

引言 JSON Schema 是一种用于描述和验证 JSON 数据结构的规范。它定义了 JSON 数据中各个元素的类型、格式、约束和关系&#xff0c;确保了数据的一致性和可靠性。在软件开发、API 设计以及数据交换过程中&#xff0c;JSON Schema 发挥着重要作用。本文将详细介绍 JSON Schema…