亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带有 PS2 控制器的 Arduino 机器人(PlayStation 2 操纵杆)

组件和用品

Arduino UNO
× 1
SparkFun 双 H 桥电机驱动器 L298
× 1
DIY 机器人坦克套件
× 1
索尼 PS2 无线控制器
× 1

应用和在线服务

Arduino IDE

关于这个项目

在本教程中,我将向您展示如何使用无线 PlayStation 2 (PS2) 操纵杆来驾驶机器人坦克。该项目的核心使用了一块 Arduino Uno 板。它接收来自无线控制器的命令并设置电机的速度。也可以使用其他开发板(NodeMCU、Firebeetle 等),本教程中介绍的原理可以应用于其他模型的机器人和小工具。

我以前设计过一个 Blynk 控制的机器人坦克。它连接到 Wi-Fi 网络并接收来自 Blynk 服务器的命令。使用运行 Blynk 应用程序的智能手机作为遥控器,并使用不同的输入方法:按钮、滑动条甚至智能手机的加速度计。您可以在此处找到有关此项目的更多信息:https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

我还对语音命令进行了一些实验。如果您想在不用手的情况下远程控制机器人,或者如果您想让动作受限的人可以访问它,这可能会很有用。例如,人们可能会想到机器人声控轮椅。使用了一个 DIY 机器人套件,以及一些我最喜欢的工具:Adafruit.io、IFTTT 和 Arduino IDE。完整说明:

https://www.hackster.io/igorF2/wi-fi-voice-controlled-robot-using-google-assistant-79802c

您可以使用不同的套件,甚至可以使用简单的材料设计自己的机器人,而无需使用复杂的工具,例如 3D 打印机和激光切割机。您可以在我以前的教程之一中找到示例:

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

第 1 步:工具和材料

本项目使用了以下工具:

  • 烙铁和电线 (链接/链接)。直流电机已经带有焊接在其端子上的电线......但它最终会破裂,您可能需要重新焊接它。因此,请考虑附近有一个好的烙铁和电线。
  • EVA发泡片材 (或其他非导电材料)。我在这个项目中使用的机器人底盘是铝制的,电路板安装在这个金属部件上。我在板和金属板之间使用了一层泡沫板,以避免可能的短路。
  • 双面胶带 .它用于将泡沫板粘合到电路板上,以及用于安装 H 桥模块。
  • 剪刀 , 用于切割一些泡沫板矩形。

我的项目使用了以下硬件部件:

  • 基于 Arduino Uno 的开发板 (链接/链接/链接/链接)。它用作机器人的主控制器。它非常易于使用和使用 Arduino IDE 进行编程,非常适合电子和编程初学者。
  • L298N 双通道 H 桥模块 (链接/链接/链接/链接)。该模块允许将来自 Wemos(或 Arduino)的 3.3V 信号放大到电机所需的 12V。
  • DIY 机器人底盘坦克 (关联)。这个很棒的套件包含建造坦克所需的一切:两个直流电机、齿轮、履带、螺栓、螺母等。它已经配备了组装底盘所需的工具,非常适合初学者!
  • PS2 无线遥控器 (关联)。该视频游戏控制器可以向接收器无线发送命令,接收器可以通过串行通信与微控制器连接。
  • 18650 3.7V 电池 (x3) (链接/链接)。我曾经为整个电路供电。这个坦克使用12V电机。我使用了三个串联的 3.7V 电池为它们供电。
  • 3S 18650 电池座 (链接/链接/链接)。可串联放置三节18650电池,并可轻松固定在水箱背面。
  • 18650 电池充电器 (链接/链接)。您的电池最终会耗尽电量。发生这种情况时,电池充电器会派上用场。
  • 跳线 (链接/链接)。我使用 6 个公母跳线用于 h 桥和 Wemos 之间的信号,以及 2 个公母跳线用于 5V 和 Gnd。如果您计划添加一些传感器,您可能需要更多。
  • B 型 USB 数据线 .你需要这个来上传你的代码。大多数电路板已经自带电缆。

上面的链接只是建议您在哪里可以找到本教程中使用的项目(并且可能支持我以后的教程)。随意在其他地方搜索它们并在您最喜欢的本地或在线商店购买。

第 2 步:组装机器人

该项目的第一部分是机器人结构的组装。

在之前的项目中,我开发了自己的机器人结构,使用容易获得的材料(不需要复杂的工具、3D 打印机或激光切割机)。您可以在以下链接中找到该项目:

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

后来我决定给一个从网上商店获得的机器人套件的​​机会。您可以在以下链接中找到机器人底盘的链接:http://bit.ly/2ycI8fP。如果您正在寻找套件,我认为这是一个不错的选择!我在另外两个教程中使用了它,您可以在下面的链接中看到:

https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

https://www.hackster.io/igorF2/wi-fi-voice-controlled-robot-using-google-assistant-79802c

起初,组装似乎很复杂,或者我会遇到诸如缺少零件之类的问题(考虑到组成套件的零件数量)。但是这个套件真的让我很惊讶!在我看来,所有的零件质量都很好,套件中还附有几个备件。因此,在工作台下方丢失一颗螺丝不会使您的项目无法执行,我发现这非常好(尤其是在丢失了几颗螺丝之后)。

另一个优点是安装机器人所需的所有工具都包含在套件中(几个内六角扳手和螺丝刀)。我相信这使得该套件非常适合没有很多工具的初学者!

作为一个消极方面,我要强调缺乏文档。机器人组装工

ual(中文电子表格文件)对用户不是非常友好,而且网上没有很多关于该坦克的教程。所以我决定在上面的视频中记录组装我的机器人的过程!另一个关注点涉及机器人结构的材料。底座完全由铝制成,如果印刷电路板的引脚接触框架会导致短路。

您还可以使用其他在线工具包。您甚至可以创建自己的结构,如下所述。

第 3 步:连接电路

机器人背部安装了一个由三块18650电池组成的电源组。它为机器人提供 11.1V (3 x 3.7V) 电压。这足以为 12V 直流电机供电。

L298N 双通道 H 桥用于控制电机。它接收 Arduino 板的一些 5V 信号,并为电机提供更高的电压。它还允许电机在两个方向上运行,这取决于这些输入信号的组合。

各设备按原理图连接。

遵循您需要连接的引脚列表:

Arduino Uno 输入/输出:

  • 数字引脚 3 => H 桥 ENA 引脚
  • 数字引脚 5 => H 桥 IN1 引脚
  • 数字引脚 4 => H 桥 IN2 引脚
  • 数字引脚 8 => H 桥 IN3 引脚
  • 数字引脚 7 => H 桥 IN4 引脚
  • 数字引脚 6 => H 桥 ENB 引脚
  • 5V 引脚 => H 桥 5V 引脚
  • Gnd pin => H-bridge Gnd pin
  • 数字引脚 10 => PS2 接收器引脚 6
  • 数字引脚 11 => PS2 接收器引脚 2
  • 数字引脚 12 => PS2 接收器引脚 1
  • 数字引脚 13 => PS2 接收器引脚 7
  • 3.3V 引脚 => PS2 接收器引脚 5
  • Gnd 引脚 => PS2 接收器引脚 4

H 桥输入/输出:

  • ENA 引脚 => Arduino 数字引脚 3
  • IN1 引脚 => Arduino 数字引脚 5
  • IN2 引脚 => Arduino 数字引脚 4
  • IN3 引脚 => Arduino 数字引脚 8
  • IN4 引脚 => Arduino 数字引脚 7
  • ENB 引脚 => Arduino 数字引脚 6
  • 5V 引脚 => Arduino 5V 引脚
  • 接地引脚 => Arduino 接地引脚
  • Gnd pin => 电池组负极线
  • 12V 引脚 => 电池组正极线
  • OUT1 => 右电机负极线
  • OUT2 => 右电机正极线
  • OUT3 => 左电机正极线
  • OUT4 => 左电机负极线

PS2 接收器:

  • 引脚 1(数据)=> Arduino 数字引脚 12
  • 引脚 2(命令)=> Arduino 数字引脚 11
  • 引脚 4(接地)=> Arduino Gnd 引脚
  • 引脚 5(电源)=> Arduino 3.3V 引脚
  • 引脚 6(注意)=> Arduino 数字引脚 10
  • 引脚 7(时钟)=> Arduino 数字引脚 13

第 4 步:设置 Arduino IDE

对于这个项目,我使用 Arduino IDE 对 Arduino 板进行编程。

1.下载并安装 Arduino IDE 最新版本

您可以在 Arduino 的网站上找到适用于 Windows、Linux 或 MAC OSX 的最新版本:https://www.arduino.cc/en/main/software

免费下载,将其安装到您的计算机上并启动。

2.添加库

在这个项目中,我使用了 Arduino PS2X 库。

在 https://github.com/madsci1016/Arduino-PS2X 下载库。解压文件,将文件夹复制到 Arduino IDE 库/工具文件夹。

…………

现在您的开发环境已准备就绪,让我们继续下一步!

第 5 步:解释 PS2 无线控制器库

PS2 无线控制器是您的机器人项目的绝佳工具。它有数量惊人的按钮:20 个数字按钮和 2 个模拟摇杆。这样,您就有无限可能来控制您的机器人。

我使用 Bill Porter 的 PS2X 库 (https://github.com/madsci1016/Arduino-PS2X) 将控制器连接到 Arduino Uno 板。

它为控制器定义了一个 PS2X 类,其中包含一些从操纵杆读取模拟和数字输入的方法。使用以下代码(在设置之前或期间)创建此类的对象:

PS2X ps2x;  

定义对象后,必须使用以下函数将其链接到 Arduino I/O 引脚:

error =ps2x.config_gamepad(clock,command,attention,data, pressure?, rumble?);  

如果连接或控制器本身有问题,此函数可能会返回一些错误。

库中使用的主要功能是用于读取数字和模拟输入的功能。读取和数字输入,使用以下方法:

ps2x.Button(button);  

在哪个按钮 是要读取的按钮的名称。每个按钮的映射如下:

方向按钮:

  • PSB_PAD_UP =方向键向上按钮;
  • PSB_PAD_DOWN =方向键向下按钮;
  • PSB_PAD_LEFT =方向键左键
  • PSB_PAD_RIGHT =方向键右键

操作按钮:

  • PSB_GREEN 或 PSB_TRIANGLE =绿色三角形按钮
  • PSB_RED 或 PSB_CIRCLE =红色圆圈按钮
  • PSB_BLUE 或 PSB_CROSS =蓝色 x 按钮
  • PSB_PINK 或 PSB_SQUARE =粉红色方形按钮

触发器:

  • PSB_L1 =左侧触发按钮 1
  • PSB_R1 =右侧触发按钮 1
  • PSB_L2 =左侧触发按钮 2
  • PSB_R2 =右侧触发按钮 2

棒:

  • PSB_L3 =左摇杆按钮(是的,您可以按下摇杆作为按钮)
  • PSB_R3 =右摇杆按钮

菜单:

  • PSB_SELECT =选择按钮
  • PSB_START =开始按钮

使用以下方法读取摇杆的模拟值(用 0 到 255 之间的整数转换器):

ps2x.Analog(stick_axis);  

其中stick_axis 代表棍子和要读取的方向,如下:

  • PSS_LY =左摇杆的 y 位置
  • PSS_LX =左摇杆的 x 位置
  • PSS_RY =右摇杆的 y 位置
  • PSS_RX =右摇杆的 x 位置

有了这些基本功能,您就可以在您的项目中使用 PS2 控制器了!在以下步骤中,我展示了一些结合这些按钮的 Arduino 草图示例!

第 6 步:草图 #1 - Dpad 按钮

旧的视频游戏,例如 SEGA Master System 和 Mega Drive 以及 Nintendo SNES,没有力敏按钮。方向按钮只是开/关按钮。对于这个第一个例子,我想模拟那些游戏机的旧视频游戏中的控件类型。

对于第一个 Sketch,我使用 Dpad 按钮作为机器人的输入。机器人使用每个按钮来执行一项基本运动:向前、向右转、向左转或向后移动。

这些按钮具有二进制输出。这样,微控制器只会知道按钮被按下了,但不会理解它们被按下的力度。这样,一旦点击给定的按钮,电机就会全速运行。

如果你按照我的原理图连接了所有东西,你会得到以下输出:

  • PSB_PAD_UP =向前移动
  • PSB_PAD_DOWN =向后移动
  • PSB_PAD_LEFT =左转
  • PSB_PAD_RIGHT =右转

正如我之前所说,电机将以固定速度移动。向左转或向右转时,电机反方向运行,使机器人绕轴转动。

Arduino 代码:

下载代码并在 Arduino IDE 上打开它。如果您使用与我相同的引脚排列,您可能无需更改代码中的任何内容(尽管可能需要,如果电机的方向不同

上传代码,选择“Arduino/Genuino Uno”板,选择正确的COM口,将板子插在电脑的USB口上,上传代码。
上传完成后,拔掉USB线,把电池。代码将开始运行,Arduino 板将自动连接 PS2 游戏杆。首次使用时打开串口监视器并检查连接状态。如果它无法与操纵杆连接,您应该做一些事情:

  • 重置 Arduino Uno 板。尝试几次(对我来说,它通常在第三次重置后有效);
  • 检查操纵杆是否打开(以及电池是否充满电)。接收器有一些 LED 指示灯会指示操纵杆是否已配对。还要检查 Arduino 的 RX 和 TX 引脚是否在收到新命令时闪烁(并更新串行端口上的状态);
  • 检查连接...组件之间的跳线可能有问题。

代码解释:

在这个项目中,我只需要使用 PS2X_lib.h 库。代码开头加了I。

#include   

定义连接到 h 桥的 Arduino 的引脚。如果您使用与我相同的 connectios,您将拥有以下配置。如果您选择使用不同的引脚,请更新这部分代码。

// 这些用于设置桥接驱动程序的方向。 #define ENA 3 //ENA #define MOTORA_1 4 //IN3 #define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1 #define MOTORB_2 7 //IN2 #define ENB 6 //ENB  

在设置之前声明了一些全局变量(p2sx , 错误 , 输入振动 )。第一个是 PS2X 类的实例。连接期间的错误状态将存储在 error 整数。 输入振动 将指示控制器的类型(DualShock 或 GuitarHero 控制器)以及它是否应该根据给定的命令振动。

我在设置过程中做的第一件事是配置 I/O 引脚状态(作为输出)并将使能引脚设置为低电平。这样,您将在启动时禁用两个电机,并且机器人在等待其余代码时不会随机移动。

// 配置输出引脚 pinMode(ENA, OUTPUT); pinMode(MOTORA_1,输出); pinMode(MOTORA_2,输出); pinMode(ENB,输出); pinMode(MOTORB_1,输出); pinMode(MOTORB_2,输出); // 禁用两个电机 digitalWrite(ENA,0);数字写入(ENB,0);  

然后我开始串行端口通信(用于调试代码)。选择合适的波特率并在串行监视器上设置相同的速度。

// 开始串口通信 Serial.begin(57600);  

最后,使用连接到操纵杆接收器的 Arduino 引脚(分别为时钟、命令、注意力和数据)配置 ps2x 对象。它可能会返回一个错误(显示在串行监视器上)。控制器的类型也将取消显示(尽管此时您可能已经知道您手中的控制器类型 :D)。

error =ps2x.config_gamepad(13,11,10,12, true, true); //设置引脚和设置:GamePad(clock, command, attention, data, Pressures?, Rumble?) 检查错误 // 检查错误 if(error ==0){ Serial.println("Found Controller,configuration successfully" ); } else if(error ==1) Serial.println("未找到控制器,检查接线或重置Arduino"); else if(error ==2) Serial.println("找到控制器但不接受命令"); else if(error ==3) Serial.println("控制器拒绝进入压力模式,可能不支持。"); // 检查控制器类型 type =ps2x.readType(); switch(type) { case 0:Serial.println("未知控制器类型");休息; case 1:Serial.println("DualShock Controller Found");休息; case 2:Serial.println("GuitarHero Controller Found");休息; }  

在主循环期间,Arduino 将读取每个 D-pad 按钮(向上、向下、向左和向右)并为输出引脚设置不同的值,以移动轮子。短暂延迟后,开始新的循环。

以下部分显示了如果按下 UP 按钮,如何向前移动机器人。 MOTORA_1 和 MOTORA_2 引脚定义电机 A 的旋转方向。 ENA 将定义运动是否启用(电机 ON/OFF)。请注意,它是一个“模拟”输出(实际上是一个 PWM 输出)。它的值应该在 0 到 1023 之间。这将调制 PWM,并改变 h 桥输出的平均电压(在 0 到 12V 之间)。如果平均电压太低,电机将根本无法移动。

// 向前移动 if(ps2x.Button(PSB_PAD_UP)) { digitalWrite(MOTORA_1,LOW);数字写入(MOTORA_2,高);数字写入(MOTORB_1,高);数字写入(MOTORB_2,低);模拟写入(ENB,1023);模拟写入(ENA,1023); Serial.println("前进"); }  

*我为 ENA 和 ENB 引脚使用了 PWM 输出。这样,1023 将代表具有最大长度的脉冲(引脚始终打开),而 0 表示没有脉冲(引脚始终关闭)。如果此处使用不同(较小)的值,则电机预计会运行得更慢,因为它们端子的平均电压会更小。

第 7 步:草图 #2 - 模拟棒和数字按钮(L2 和 R2)

在特定时间,所有控制台都采用带有两个模拟摇杆的操纵杆。这些新输入允许力敏感输入,这些输入创造了变速动作,并在各种视频游戏中流行起来。

在第二个示例中,我想使用模拟开关来控制油箱,并使用一对按钮作为油门和刹车/倒车。这种配置在很多赛车游戏中都很流行,比如马里奥赛车。按R2键加速坦克,L2键倒车,并根据左摇杆的x位置设置移动方向。

我使用的那种机器人套件没有很大的惯性(如果电机上的电压设置为 0V,它不会持续移动一段时间)。这样,就不需要定义制动机器人的命令了。

大多数代码已经在上一步中解释过了。一个区别是我定义了两个变量来存储每个电机的速度(从 0 到 1023)。

int motor_right_speed =0;
int motor_left_speed =0;

在主循环中,Arduino 将读取左摇杆的 x 位置。它将接收一个 0 到 255 之间的值并将其映射到 -1023 到 1023 之间。

该值将加(或减)到每个电机的速度上,以在每个轨道的速度之间产生差异,使机器人向左或向右转。

int nJoyL =ps2x.Analog(PSS_LX); // 读取左摇杆 nJoyL =map(nJoyL, 0, 255, 1023, -1023); motor_right_speed =1023; motor_left_speed =1023; if (nJoyL <0) { motor_right_speed =motor_right_speed + nJoyL; } if (nJoyL> 0) { motor_left_speed =motor_left_speed - nJoyL; }  

如果按下 R2 按钮,则油箱将向前移动。这样,Arduino 为电机引脚设置了适当的值。 ENA 和 ENB 为每个电机创建“模拟”输出,其值与每个电机所需的速度成正比(基于左摇杆的 x 位置)。

L2会做类似的事情,但电机的方向相反。

if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,LOW);数字写入(MOTORA_2,高);数字写入(MOTORB_1,高);数字写入(MOTORB_2,低);模拟写入(ENA,motor_right_speed);模拟写入(ENB,motor_left_speed); } if(ps2x.Button(PSB_L2)​​) { digitalWrite(MOTORA_1,HIGH);数字写入(MOTORA_2,低);数字写入(MOTORB_1,低);数字写入(MOTORB_2,高);模拟写入(ENA,motor_right_speed);模拟写入(ENB,motor_left_speed); } if(!ps2x.Button(PSB_L2)​​ &&!ps2x.Button(PSB_R2)) {analogWrite(ENA, 0);模拟写入(ENB,0); }  

如果没有按下任何按钮,电机将被禁用。

第 8 步:草图 #3 - 左右模拟摇杆(差分驱动)

这是我最喜欢的控制坦克的方式(尽管它在资源方面不是最佳的)!这让我觉得我在用双手控制一台真正的大型机器!

在这段代码中,我使用两个摇杆来设置每个轨道的方向和速度。左摇杆控制左轨迹,右摇杆控制右轨迹。

代码与之前描述的几乎相同。但这次我想读取两个棒的 y 位置:

int nJoyL =ps2x.Analog(PSS_LY); // 读取左摇杆 int nJoyR =ps2x.Analog(PSS_RY); // 读取右摇杆 nJoyL =map(nJoyL, 0, 255, 1023, -1023); nJoyR =map(nJoyR, 0, 255, -1023, 1023);  

根据摇杆的位置,代码将设置数字引脚以设置每个电机的方向。

我在启用 (1023) 上使用了一个固定值,但我会根据模拟摇杆的实际值使用一个可变值。我定义了一个死区 (+-50),其中微控制器将禁用电机。

// 执行基于两个模拟摇杆的动作 if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH);数字写入(MOTORA_2,低);模拟写入(ENA,1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,LOW);数字写入(MOTORA_2,高);模拟写入(ENA,1023); } if (abs(nJoyR)<50) {analogWrite(ENA, 0); }  

第 9 步:草图 #4 - 仅左侧模拟摇杆

在最后一个 Sketch 应用程序中,我使用一个操纵杆来控制机器人。它在资源使用方面是最佳选择(您将有许多按钮用于配置不同的操作),但很难理解。

每个轨道的速度取决于操纵杆的 x 和 y 位置。这样,就可以在每个轨道上应用不同的速度,并以不同的速度/方向移动机器人。此处使用的代码源自以下教程。看看吧!

https://www.impulseadventure.com/elec/robot-differential-steering.html

第 10 步:最终考虑

我在这个项目中付出了很多努力,以使其尽可能清晰和具有教育意义。如果您喜欢它,请不要忘记“喜欢”和“分享”它。您的支持对我很重要! :D

如果您仍然不遵循我的教程,请查看其他有关机器人技术的教程!我希望你喜欢他们!

https://www.hackster.io/igorF2/joy-robot-robo-da-alegria-bba54f

https://www.hackster.io/igorF2/widc-wi-fi-controlled-fpv-robot-8f1e09

https://www.hackster.io/igorF2/nunchuk-controlled-robotic-arm-with-arduino-b1c0fa

https://www.hackster.io/igorF2/wi-fi-browser-controlled-robotic-arm-89b63d

请考虑通过一小笔比特币捐赠来支持我未来的项目! :D

BTC充值地址:1FiWFYSjRaL7sLdr5wr6h86QkMA6pQxkXJ

代码

  • 草图 #1
  • 草图 #2
  • 草图 #3
  • 草图 #4
草图 #1Arduino
// Igor Fonseca @2019 的 PS2 坦克// 使用 PS2 操纵杆控制机器人坦克,使用方向键// 基于 Bill Porter 2011 年使用 PS2X 库的示例// 以上所有文本必须包括在内在任何重新分发中。// 包含库#include // 这些用于设置桥驱动程序的方向。#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBPS2X ps2x; //创建PS2控制器类//现在,该库不支持热插拔控制器,这意味着//您必须始终在连接控制器后重新启动Arduino,//或在连接控制器后再次调用config_gamepad(pins)。整数错误 =0; byte type =0;byte vibrate =0;void setup(){ // 配置输出引脚 pinMode(ENA, OUTPUT); pinMode(MOTORA_1,输出); pinMode(MOTORA_2,输出); pinMode(ENB,输出); pinMode(MOTORB_1,输出); pinMode(MOTORB_2,输出); // 禁用两个电机 digitalWrite(ENA,0);数字写入(ENB,0); // 开始串行通信 Serial.begin(57600);错误 =ps2x.config_gamepad(13,11,10,12, true, true); //设置引脚和设置:GamePad(clock, command, attention, data, Pressures?, Rumble?) 检查错误 // 检查错误 if(error ==0){ Serial.println("Found Controller,configuration successfully" ); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type");休息; case 1:Serial.println("DualShock Controller Found");休息; case 2:Serial.println("GuitarHero Controller Found");休息; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller // Perform movements based on D-pad buttons // MOVE FORWARD if(ps2x.Button(PSB_PAD_UP)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move forward"); } // TURN RIGHT if(ps2x.Button(PSB_PAD_RIGHT)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Turn right"); } // TURN LEFT if(ps2x.Button(PSB_PAD_LEFT)){ digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Turn left"); } // MOVE BACK if(ps2x.Button(PSB_PAD_DOWN)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move back"); } if (!ps2x.Button(PSB_PAD_DOWN) &&!ps2x.Button(PSB_PAD_UP) &&!ps2x.Button(PSB_PAD_RIGHT) &&!ps2x.Button(PSB_PAD_LEFT)) { analogWrite(ENB, 0); analogWrite(ENA, 0); } delay(50); } }
Sketch #2Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using D-pad buttons// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include // These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBint motor_right_speed =0;int motor_left_speed =0;PS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type");休息; case 1:Serial.println("DualShock Controller Found");休息; case 2:Serial.println("GuitarHero Controller Found");休息; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL =ps2x.Analog(PSS_LX); // read left stick nJoyL =map(nJoyL, 0, 255, 1023, -1023); int motor_right_speed =1023; int motor_left_speed =1023; if (nJoyL <0) { motor_right_speed =motor_right_speed + nJoyL; } if (nJoyL> 0) { motor_left_speed =motor_left_speed - nJoyL; } if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(ps2x.Button(PSB_L2)) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(!ps2x.Button(PSB_L2) &&!ps2x.Button(PSB_R2)) { analogWrite(ENA, 0); analogWrite(ENB, 0); } delay(50); } }
Sketch #3Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using D-pad buttons// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include // These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBPS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type");休息; case 1:Serial.println("DualShock Controller Found");休息; case 2:Serial.println("GuitarHero Controller Found");休息; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL =ps2x.Analog(PSS_LY); // read left stick int nJoyR =ps2x.Analog(PSS_RY); // read right stick nJoyL =map(nJoyL, 0, 255, 1023, -1023); nJoyR =map(nJoyR, 0, 255, -1023, 1023); // Perform movements based on both analog sticks if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); analogWrite(ENA, 1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); analogWrite(ENA, 1023); } if (abs(nJoyR)<50) { analogWrite(ENA, 0); } if(nJoyL>50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); } if(nJoyL<-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); } if (abs(nJoyL)<50) { analogWrite(ENB, 0); } delay(50); } }
Sketch #4Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using left analog stick// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include  //for v1.6// These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBint motor_right_speed =0;int motor_left_speed =0;PS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type");休息; case 1:Serial.println("DualShock Controller Found");休息; case 2:Serial.println("GuitarHero Controller Found");休息; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyX =ps2x.Analog(PSS_LX); // read x-joystick int nJoyY =ps2x.Analog(PSS_LY); // read y-joystick nJoyX =map(nJoyX, 0, 255, -1023, 1023); nJoyY =map(nJoyY, 0, 255, 1023, -1023); // OUTPUTS int nMotMixL; // Motor (left) mixed output int nMotMixR; // Motor (right) mixed output // CONFIG // - fPivYLimt :The threshold at which the pivot action starts // This threshold is measured in units on the Y-axis // away from the X-axis (Y=0). A greater value will assign // more of the joystick's range to pivot actions. // Allowable range:(0..+127) float fPivYLimit =1023.0; // TEMP VARIABLES float nMotPremixL; // Motor (left) premixed output float nMotPremixR; // Motor (right) premixed output int nPivSpeed; // Pivot Speed float fPivScale; // Balance scale between drive and pivot // Calculate Drive Turn output due to Joystick X input if (nJoyY>=0) { // Forward nMotPremixL =(nJoyX>=0)? 1023.0 :(1023.0 + nJoyX); nMotPremixR =(nJoyX>=0)? (1023.0 - nJoyX) :1023.0; } else { // Reverse nMotPremixL =(nJoyX>=0)? (1023.0 - nJoyX) :1023.0; nMotPremixR =(nJoyX>=0)? 1023.0 :(1023.0 + nJoyX); } // Scale Drive output due to Joystick Y input (throttle) nMotPremixL =nMotPremixL * nJoyY/1023.0; nMotPremixR =nMotPremixR * nJoyY/1023.0; // Now calculate pivot amount // - Strength of pivot (nPivSpeed) based on Joystick X input // - Blending of pivot vs drive (fPivScale) based on Joystick Y input nPivSpeed =nJoyX; fPivScale =(abs(nJoyY)>fPivYLimit)? 0.0 :(1.0 - abs(nJoyY)/fPivYLimit); // Calculate final mix of Drive and Pivot nMotMixL =(1.0-fPivScale)*nMotPremixL + fPivScale*( nPivSpeed); nMotMixR =(1.0-fPivScale)*nMotPremixR + fPivScale*(-nPivSpeed); motor_left_speed =nMotMixL; motor_right_speed =nMotMixR; if (motor_right_speed> 50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else if (motor_right_speed <-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2, HIGH); } else { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, LOW); } if (motor_left_speed> 50) { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, HIGH); } else if (motor_left_speed <-50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); } else { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, LOW); } analogWrite(ENA, abs(motor_left_speed)); analogWrite(ENB, abs(motor_right_speed)); if (abs(motor_left_speed> 50) || abs(motor_left_speed> 50)) { Serial.println("Moving!"); } delay(50); } }

示意图


制造工艺

  1. 使用 Arduino 和 Raspberry Pi 构建您的 Internet 控制的视频流机器人
  2. Unopad - 带有 Ableton 的 Arduino MIDI 控制器
  3. 带伺服电机的机器人避障
  4. 使用 Arduino 和 Android 设备控制 Roomba 机器人
  5. Nunchuk 控制机械臂(使用 Arduino)
  6. Arduino Nano:使用操纵杆控制 2 个步进电机
  7. Arduino Joystick
  8. 构建一个由 PS2 控制器控制的战斗机器人
  9. 使用 Android 应用程序控制 Arduino 机械臂
  10. 用 Arduino Nano 制作吃饭机器人 |金螺丝
  11. 使用 Dabble 控制的 Arduino 制成的 4 轮机器人
  12. MeArm 机器人的操纵杆控制器 - 记录坐标