0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:wv 2019-09-04 09:18 次阅读

第1步:工具和材料

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

此项目使用了以下工具:

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

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

    关注

    112

    文章

    15147

    浏览量

    170940
  • 机器人
    +关注

    关注

    206

    文章

    26965

    浏览量

    201283
收藏 人收藏

    评论

    相关推荐

    开源项目!教你如何复刻自平衡赛车机器人、智能家居中控、竞技机器人先进模糊控制器

    ;gt;>点此查看全文 3.全志XR806基于FreeRTOS下部署竞技机器人先进模糊控制器 前言 很荣幸参与到由全志在线举办的XR806开发板试用活动。本人热衷于各种的开发板的开发,同时
    发表于 12-26 09:17

    LabVIEW的六轴工业机器人运动控制系统

    LabVIEW开发六轴工业机器人运动控制系统 本项目开发了一个高效的工业机器人控制系统,重点关注于运动学算法和轨迹规划算法的实现和测试。LabVIEW作为一个关键技术,在项目中扮演了核
    发表于 12-21 20:03

    ROS让机器人开发更便捷,基于RK3568J+Debian系统发布!

    领域的集大成者,主要应用于机器人控制领域,如AGV工业机器人控制器、智能机械臂控制器机器人导航
    发表于 11-30 16:01

    Arduino教学机器人的使用教程

    本文档的主要内容详细介绍的是Arduino教学机器人的使用教程
    发表于 09-27 06:53

    使用Arduino和PAJ7620手势传感制作手势控制机器人

    使用Arduino和PAJ7620手势传感制作手势控制机器人,简单程序即可实现。小小的传感可以识别各种手势。它采用内置的空间传感,可以
    发表于 09-27 06:17

    教你做个PID控制巡线机器人

    在本项目中,我们将学习如何使用带PID控制器的线跟随机器人使用Arduino Nano来解决迷宫。
    发表于 09-25 06:54

    基于Matlab和VR技术的移动机器人建模及仿真

    ,虚拟模型准确地模拟了真实移动机器人的动力学特征 ; 通过对模型的参数修改 ,为实现对真实机器人的最优控制和设计提供了可信的参考方案
    发表于 09-20 06:24

    【IoT毕设】机智云平台+STM32+树莓派的草莓采摘机器人控制系统

    采摘耗时长成本大的问题,提出了一种全向移动的草莓采摘机器人系统方案。 系统的硬件电路主要包括以STM32F407ZGT6为核心的主控制器、电源电路、WIFI模块、激光测距单元、电机驱动模块。系统
    发表于 08-16 17:35

    DIY机器人控制器

    电子发烧友网站提供《DIY机器人控制器.zip》资料免费下载
    发表于 07-10 15:22 1次下载
    DIY<b class='flag-5'>机器人</b><b class='flag-5'>控制器</b>

    PLC与机器人控制器的关系

    机器人控制器机器人系统的核心部件,负责接收来自PLC或其他传感器的指令,并根据这些指令控制机器人的运动和操作。
    发表于 07-10 11:07 1789次阅读

    【科普】干货!带你从0了解移动机器人(四) ——移动机器人导航技术

    :**位置准确,小巧玲珑,铺设、更换路径更容易,控制通讯方便,不必担心声光干扰。 03磁导航 磁导航的原理是在移动机器人(AGV/AMR)行驶路径上埋置金属线,给金属线加载导航频率,通过机器人
    发表于 06-28 09:52

    【科普】干货!带你从0了解移动机器人(三) ——自主导航系统及上位机软件设计与实现

    传感数据获取环境信息,规划路径并选择最优路径到达目的地的算法。运动控制算法是指移动机器人在到达目的地后,根据传感数据调整方向和速度的算法。这些算法需要在移动
    发表于 06-28 09:36

    坦克机器人开源分享

    电子发烧友网站提供《坦克机器人开源分享.zip》资料免费下载
    发表于 06-20 11:34 0次下载
    <b class='flag-5'>坦克</b><b class='flag-5'>机器人</b>开源分享

    浅谈儿童陪护机器人

    儿童陪护机器人中得到了广泛应用。 在儿童陪护机器人中,步进电机芯片主要用于转动控制。在此过程中,控制器通过对步进电机芯片输出的脉冲信号进行控制
    发表于 05-11 15:12

    基于STM32单片机PS2鼠标使用库文件设计源代码

    基于STM32单片机PS2鼠标使用库文件设计源代码
    发表于 04-26 14:58 5次下载