通过树莓派和Arduino Nano来使用PS5手柄控制机械臂
1. 概述
在这个项目中,你将学习如何使用 PS55 双感手柄、树莓派 5 和 Arduino Nano Nano 来控制一个六自由度机械臂。
PS5手柄通过蓝牙连接到树莓派5。树莓派使用Python读取摇杆和按钮的数值,然后通过USB串行通信将简单的命令数字发送给Arduino Nano。Arduino Nano接收到这些命令后,会控制机械臂上的相应舵机运动。
因此,完整的控制路径如下所示:
如果你希望了解机器人中游戏手柄遥操作的工作原理,这个项目是一个很好的起点。你将不再通过手机应用或Arduino按钮直接控制机械臂,而是使用一个合适的游戏手柄来操控,就像小型的机器人操作系统一样。
在此版本中,重点仅放在机械臂上。之后,同样的设置可以扩展到使用L298N电机驱动器控制机器人汽车。这意味着PS5手柄最终可以同时控制机械臂和移动底座。
2. 事物
开始前,请准备好主要部件和工具。
硬件组件
你需要:
•树莓派5
•Arduino Nano
•PS55 双感手柄
•六自由度铝制伺服机械臂
•Arduino Nano 伺服扩展板或伺服屏蔽板
•6 个伺服电机
•外部伺服电源
•Arduino Nano 用 USB 数据线
•树莓派5电源
•带有 Raspberry Pi OS 的 microSDSD 卡
•必要时使用跳线
软件和工具
你还需要:
•树莓派操作系统
•Python 3
•Pygame
•PySerial
•Arduino IDE
•Arduino 伺服电机库
•Visual Studio Code
•VS Code Code 远程 - SSH SSH 扩展
•GitHub 用于代码托管
•Hackster.io 或 Instructables 用于文档
未来升级的可选配件
在下一个版本中,当机械臂安装在机器人车上时,您可能还需要:
•Arduino Uno
•L298N电机驱动器
•机器人汽车底盘
•直流电机
•电机电池
•额外的USB线缆或串行连接
3. 故事
我开始这个项目,是因为我想用一种更实用、更有趣的方式来控制我的机械臂。
这个机械臂已经配备了伺服电机、支架、夹爪和Arduino Nano伺服扩展板。它可以移动,但我并不想以简单的方式控制它。我想要的是一种更接近真实机器人系统控制方式的方案——比如使用摇杆或游戏手柄来操控。
由于我手头有PS5手柄和Raspberry Pi 5,因此想法是使用PS5手柄作为主要输入设备。Raspberry Pi会读取手柄的数据,然后将运动指令发送给Arduino Nano。接着,Arduino Nano负责控制伺服电机的运动。
我查看了一些使用Xbox手柄与树莓派和Arduino结合的旧项目。这些项目帮助我理解了基本原理,但我的搭建方式有所不同。我使用的是PS5手柄、树莓派5和Arduino Nano。
因此,我并没有直接复制所有内容,而是逐步重建了整个流程。
首先,我将树莓派5设置为无头模式。然后使用 VS Code Code 并配合 Remote - SSH SSH 扩展连接到树莓派。这样工作流程变得更加简便,因为我可以在 VS Code 中直接编辑 Python 文件,同时仍能在树莓派上运行代码。
之后,我通过蓝牙将PS5手柄与树莓派配对了。
控制器运行正常后,我通过USB将Arduino Nano连接到树莓派。Nano显示为/dev/ttyUSB0,这证实了树莓派能够识别它。
机械臂的原始Arduino代码原本设计为通过HC-05蓝牙模块接收指令。但在这个项目中,这已经不再需要了,因为树莓派已经负责处理PS5控制器的蓝牙连接。因此,我将Arduino代码修改为直接从USB串口接收指令。
当我从树莓派发送第一个测试命令并使一个舵机移动时,这证实了主控制链正在正常工作。
从那里,我映射了PS5手柄的按键、映射了Arduino的命令编号,测试了每个舵机的运动,并最终编写了一个稳定的Python控制脚本。
4. 系统概览
该系统由四个主要部分组成:
PS5手柄并不直接连接到Arduino,而是通过蓝牙连接到树莓派。
树莓派运行一个Python脚本。该脚本读取PS5手柄的输入,决定应发送哪个命令,并通过USB串口将命令发送给Arduino Nano。
Arduino Nano Nano 接收到指令后,会驱动相应的舵机运动。
以下是基本的系统流程:
这种配置效果很好,因为树莓派更适合读取蓝牙控制器输入并运行Python逻辑,而Arduino Nano则更适合生成稳定的舵机控制信号。
简单来说:
5. 硬件架构
硬件分为两个重要部分:
信号连接负责发送指令,电源连接则负责为舵机提供足够的电流。
树莓派5通过USB-C电源供电。Arduino Nano通过USB线连接到树莓派,该USB线既用于串行通信,也用于为Arduino Nano的逻辑部分供电。
但是,请不要使用树莓派或Nano USB线来为舵机供电。舵机电机可能消耗大量电流,尤其是在多个关节运动或手臂承受负载时。如果电源不正确,手臂可能会出现晃动、复位或异常行为。
正确的电源概念是:
硬件连接如下所示:
外部电源应为伺服板上的伺服电源轨道供电。请确保伺服电源适用于您的伺服电机。
6. 设置机械臂套件
首先仔细组装机械臂。
该项目使用了一款六自由度的铝制伺服机械臂。该机械臂配备多个伺服关节和一个双指夹爪。您自己的机械臂可能看起来略有不同,但原理相同:每个伺服电机控制机械臂的一个关节或部分。
在组装机械臂时,不要急于处理机械部分。伺服电机安装位置不当可能导致机械臂动作异常或过早达到机械极限。
以下是一些实用的建议:
•小心地固定伺服喇叭。
•不要用手强行固定任何关节。
•测试前请将手臂保持在中性位置。
•确保电线没有被夹在支架之间。
•不要过度拧紧旋转接头。
•确保夹具能够自由开合。
•在施加全功率前,请轻柔地检查每个关节。
组装好手臂后,下一步是了解每个命令的作用。这一点非常重要,因为Arduino代码使用的是命令编号,但你需要知道哪个命令控制哪个舵机。
手臂朝向我,这是我得到的指令映射:
根据机械臂的组装方式,您的舵机方向可能会有所不同,因此每次测试时最好只执行一个指令。
7. 设置Arduino Nano
Arduino Nano 控制伺服电机。
在原始的机械臂设置中,Arduino代码是通过SoftwareSerial接收来自HC-05蓝牙模块的指令而设计的。
对于这个项目,我们不需要HC-05模块。PS5控制器已经通过蓝牙连接到树莓派,因此树莓派会通过USB向Arduino Nano发送指令。
这意味着我们需要将Arduino的输入方式从蓝牙串口改为普通的USB串口。
旧的想法看起来是这样的:
对于这个项目,请将其改为:
因此,旧代码在任何地方使用:
替换为:
这使得Arduino Nano能够通过USB直接从树莓派接收命令字节。
编辑代码后,使用Arduino IDE将其上传到Arduino Nano。
如果你使用的是Arduino Nano克隆板,可能需要选择:
上传草图后,将Nano从笔记本电脑断开连接,并将其连接到Raspberry Pi 5。
8. 为 Raspberry Pi 55 配置 VS Code
本项目以 VS Code 为主要工作环境。
无需打开独立的终端工具并在不同窗口之间切换,你可以使用 VS Code Code 直接连接到树莓派,编辑文件、打开 Pi 的终端,并在一处运行项目。
安装 VS Code
在你的笔记本电脑上安装 Visual Studio Code。
安装 VS Code Code 后,打开它并安装 Remote - SSH SSH 扩展。
在 VS Code 中:
此扩展允许 VS Code 通过 SSH SSH 连接到树莓派。
为树莓派设置无头模式使用
树莓派5在无显示器模式下运行,这意味着在正常使用过程中,我无需连接显示器或键盘。
我使用 Raspberry Pi Imagerager 准备了 microSDSD 卡。在设置过程中,我启用了 SSH SSH 并配置了 Wi-Fi。
重要设置如下:
将SD卡插入树莓派并开机后,等待几分钟使其启动。
将 VS Code Code 连接到树莓派
在 VS Code 中,按:
然后搜索:
当 VS Code Code Code 要求输入 SSH SSH 地址时,请输入:
如果需要平台,请选择:
然后输入您的树莓派密码。
连接成功后,VS Code Code 将打开一个与树莓派连接的新窗口。
你可以通过打开 VS Code 的终端来确认自己已进入 Raspberry Pi:
终端应显示类似以下内容:
这意味着你的 VS Code Code 终端直接运行在树莓派上。
打开项目文件夹
在连接到树莓派的 VS Code Code 终端中,创建并打开项目文件夹:
在 VS Code 中,您也可以通过以下方式打开文件夹:
现在所有 Python 文件都可以直接在 VS Code 中创建和编辑。
9. 配对PS5手柄
现在将PS5手柄与树莓派配对。
在连接到树莓派的 VS Code Code 终端中,检查蓝牙是否已启用:
如果已激活并正在运行,请继续。
打开蓝牙控制工具:
在 bluetoothctl 中运行:
现在将PS5手柄置于配对模式。按住:
保持按住直到控制器指示灯开始闪烁。
当控制器出现在蓝牙扫描结果中时,请配对并连接它:
将 XX:XX:XX:XX:XX:XXXX 替换为屏幕上显示的 MAC MAC 地址。
配对后,请检查摇杆设备:
在这个项目中,PS5手柄以以下形式出现:
然后测试一下:
移动摇杆并按下按钮。如果数字发生变化,说明控制器正在工作。
10. PS5游戏手柄控制键映射
不要假设PS5的按键编号,务必始终进行测试。
控制器映射可能因 Linux 如何读取控制器而有所不同。因此,在编写最终的控制脚本之前,请先为每个摇杆和按钮进行映射。
你可以在 VS Code 中创建映射脚本。
在你的 /home/pi/ps5_arm 文件夹中,创建一个名为:
使用该脚本来识别按钮和轴的编号。
在此项目中,已确认的PS5映射为:
方向值如下:
按钮映射如下:
方向键被映射为 HAT 0:
正是这种映射使得最终的控制脚本变得准确。
11. 测试树莓派与Arduino的串行通信
在将PS5控制器和机械臂连接之前,先测试一下树莓派是否能与Arduino Nano通信。
使用USB将Arduino Nano连接到Raspberry Pi。
在连接到树莓派的 VS Code Code 终端中,运行:
输出显示:
重要的部分是:
这就是Arduino Nano。
现在在 VS Code 中创建一个简单的测试脚本,向 Nano 发送一条命令。
创建一个名为:
使用这个基础测试:
关键在于这一点:
请勿发送:
bytes([19]) 发送实际的命令编号 19。
b"19" 发送的文本字符是 1 和 9,这与 Arduino 的预期不符。
当伺服在本次测试中移动时,证实了树莓派与Arduino Nano之间的通信正常。
12. 抬起你的手臂:PS5控制的机械臂
现在控制器和Arduino的串行通信已经可以独立工作了,是时候将它们结合起来。
树莓派的Python脚本将:
在 VS Code 中创建最终的 Python 文件:
这是连接PS5手柄、树莓派、Arduino Nano和机械臂的主要文件。
起初,直接控制是有效的,但我注意到一个问题:当按钮按得太快时,输入信号会出现波动。这可能导致机械臂出现抖动或行为不可预测。
为了使动作更加稳定,最终脚本中包含:
死区忽略小的摇杆噪音。
去抖功能有助于防止按钮快速闪烁。
命令 hold hold 可确保该命令在短时间内保持稳定。
速率限制可防止树莓派发送命令过快。
紧急停止会向机械臂发送命令0以停止其运行。
这使得控制更加出色且安全。
13. 最终控制布局
在测试了不同的控制布局后,我更倾向于将基础伺服放在L1和R1上。
这使得底座更容易控制,尤其是在接近其运动极限时。
最终控制布局如下:
布局背后的命令映射如下:
此控制布局并非强制要求,您可以根据个人习惯进行调整,但这个版本在我的设置下运行效果良好。
本文编译自hackster.io





