如何使用无线PS2控制器驾驶机器人坦克

电子说

1.3w人已加入

描述

第1步:工具和材料

机器人

机器人

机器人

机器人

机器人

机器人

机器人

此项目使用了以下工具:

焊铁和焊丝(链接/链接)。直流电机已经将电线焊接到其端子上。..。..但它最终会断裂,您可能需要重新焊接它。所以考虑一下好的烙铁和电线neaby。

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-bridge和Wemos之间的信号,以及2个用于5V和Gnd的男性 - 男性跳线。如果您计划添加一些传感器,则可能需要更多。

B型USB电缆。您需要这个来上传您的代码。大多数电路板已经有自己的电缆。

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

第2步:组装机器人

机器人

机器人

机器人

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

在以前的项目中我开发了自己的机器人结构,使用方便可访问的材料(无需复杂的工具,3D打印机或激光切割机)。

后来我决定给一个从网上商店获得的机器人工具包。

起初看来装配会很复杂或者我会遇到缺少部件的问题(考虑到组成部件的部件数量)。但是这个套件让我很惊讶!在我看来,所有的部件质量都很好,并配有几个备件。因此,在工作台下方丢失的螺丝将不会使您的项目无法实现,我发现这是非常好的(特别是在丢失几个螺钉后)。

另一个积极的一点是,所有的安装机器人所需的工具包含在套件中(一对艾伦扳手和螺丝刀)。我相信这使得该套件非常适合没有大量工具的初学者!

作为一个消极的方面,我会强调缺乏文档。机器人的装配手册(中文电子表格文件)不是非常用户友好,并且没有很多在线教程。所以我决定在上面的视频中记录组装机器人的过程!另一个关注点涉及机器人结构的材料。底座完全由铝制成,如果印刷电路板的插针接触框架,可能会导致短路。

您可以使用其他在线套件。您甚至可以制作自己的结构,如下所述。

步骤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引脚=》 H桥Gnd引脚

数字引脚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 pin =》 Arduino数字引脚4

IN3引脚=》 Arduino数字引脚8

IN4 pi n =》 Arduino数字引脚7

ENB引脚=》 Arduino数字引脚6

5V引脚=》 Arduino 5V引脚

Gnd引脚=》 Arduino Gnd引脚

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 = D-pad up按钮;

PSB_PAD_DOWN = D-pad向下按钮;

PSB_PAD_LEFT = D-pad左按钮

PSB_PAD_RIGHT = D-pad右按钮

动作按钮:

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’板,在计算机的USB端口选择正确的COM端口,插板并上传代码。

上传完成后,拔掉USB线,然后放上电池。代码将开始运行并且Arduino板将自动连接PS2操纵杆。首次使用时打开串口监视器并检查连接状态。如果无法连接操纵杆,有一些事情应该做:

重置Arduino Uno板。尝试几次(对我来说,它通常在第三次复位后工作);

检查操纵杆是否打开(和充电电池)。接收器有一些LED指示灯将指示操纵杆是否配对。同时检查Arduino的RX和TX引脚是否在接收到新命令时闪烁(并更新状态串行端口);

检查连接。..。..组件之间的跳线可能有问题。

代码说明:

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

#include

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

// 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 //ENB

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

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

// 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);

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

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”);

break;

case 1:

Serial.println(“DualShock Controller Found”);

break;

case 2:

Serial.println(“GuitarHero Controller Found”);

break;

}

在主循环期间,Arduino将读取每个D-pad按钮(UP,DOWN,LEFT和RIGTH)并设置输出引脚的不同值,以便移动轮子。快速延迟后,将启动一个新循环。

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

// 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”);

}

如果你按照我的方式连接引脚,你将得到以下输出:

输出ENAIN1IN2ENBIN3IN4

FORWARD1023 *LOWHIGH1023 *HIGHLOW

BACKWARD1023 * 《无线电通信/》HIGHLOW1023 *LOWHIGH

RIGHT1023 *HIGHLOW1023 *HIGHLOW

LEFT1023 *LOWHIGH0 *LOWHIGH

STOP0 ***0 ***

*我使用了PWM输出作为ENA和ENB引脚。这样,1023表示具有最大长度的脉冲(引脚始终接通),0表示不存在脉冲(引脚始终断开)。如果在这里使用不同的(较小的)值,则预计电机运行较慢,因为它们的端子中的平均电压会较小。

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

At在给定的时间内,所有控制台都采用了两根模拟摇杆的操纵杆。这些新的输入允许力敏感的输入产生变速动作并在各种视频游戏中变得流行。

在第二个例子中,我想使用模拟开关来操纵坦克,并推动一对按钮作为油门和刹车/倒车。这种配置在许多赛车游戏中非常流行,例如Mario Kart。按下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); // read left stick

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);

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);

}

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

步骤8:草图#3 - 左右模拟棒(差分驱动器)

机器人

这是我的最爱控制坦克的方法(虽然它在资源方面不是最佳的)!这让我觉得我用双手控制着一台真正的大机器!

在这段代码中,我用两根木棍来设定每条轨道的方向和速度。左手杆将命令左侧轨道,右侧手柄将控制右侧轨道。

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

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);

根据棒的位置,代码将设置数字引脚以设置每个电机的方向。/p》

我在启用(1023)时使用了固定值,但我根据模拟棒的实际值使用了一个变量值。我定义了一个死区(+ -50),微控制器将禁用电机。

// 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);

}

步骤9:草图#4 - 仅限左模拟棒

机器人

在此最后一个Sketch应用程序我使用一个操纵杆来控制机器人。它在使用资源方面是优势(你将有很多按钮可以配置不同的动作),但很难理解。

每个轨道的速度在x和x上有所不同。 y操纵杆的位置。这样,可以在每个轨道上应用不同的速度,并以不同的速度/方向移动机器人。

第10步:最后的注意事项

机器人

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分