怎样使用游戏控制器和Arduino控制机器人

电子说

1.3w人已加入

描述

Arduino和类似的兼容板是世界各地DIY修补匠的首选设备之一。无论您是刚开始使用Arduino的初学者,还是已经开始使用它们的人,他们都为无数很棒的项目提供了平台。

今天,我们将探索一种创新的方式使用处理和Xbox360控制器来控制伺服器。如果您已经很精通游戏开发,那么您可能会对我们的使用Unity的Custom Game Controller教程感兴趣。

如果这是您第一次尝试Arduino摆弄,则本教程将假设您具有一点先验知识,您可能会在这里找到我们的Arduino指南。同样,如果您是第一次使用Java,可能会有些混乱。虽然Processing使用该平台的简化版本,但这些Java概念和提示仍可能会有所帮助。

您需要的内容

1个Arduino。我们今天使用的是UNO。

1个业余伺服器。一切适用于Arduino引脚的东西。

1个有线Xbox360控制器。尽管从技术上讲,这几乎可以与任何控制器一起使用。

多条连接线。

除了这些内容之外,您还需要下载Processing和Arduino IDE

准备Arduino

机器人

首先,我们需要附加伺服器。接线颜色在这里可能会有所不同,但一般来说,红色引脚会连接到 5v 引脚,并且棕色或黑色连接到 GND 引脚。数据线通常为黄色或橙色,连接到 pin 10 。

检查接线并连接Arduino到计算机。打开Arduino IDE。

机器人

打开位于文件》示例》 Firmata》 StandardFirmata 的StandardFirmata草图。此草图设置了用于通过串行端口进行外部控制的电路板,与我们在使用Python控制Arduino的文章中使用的草图相同。将草图上传到板上。

如果上传失败,请在工具菜单中检查您是否选择了正确的板和端口详细信息。

我们的Arduino准备就绪!

设置处理程序

打开处理程序,您将得到一个空白的草图。在这里做任何事情之前,我们将需要安装一些库。转到素描菜单,然后选择导入库》添加库。这将打开 Contribution Manager ,对于那里的所有Arduino用户而言,它们看起来都很熟悉。

机器人

我们需要安装三个库来完成这项工作。首先是 Game Control Plus 库。这就是允许我们将游戏控制器与处理一起使用的原因。使用搜索窗口找到它,然后单击右下角的安装。 Game Control Plus需要为其配置工具安装另一个库,所以现在就开始获取它。搜索 G4P 库并安装它。

最后,我们需要 Arduino(firmata)库。您猜对了,进行搜索,然后单击安装。安装完这些东西之后,我们就可以开始测试一切正常。我们今天正在使用Windows 10,但是可用于大多数平台(包括Raspberry Pi)进行处理。想象一下可能性!

测试Arduino

在我们开始创建自定义草图之前,我们先来测试Arduino和Servo和Processing。打开文件》示例,然后从 Contributed Libraries/Arduino(firmata)文件夹中选择 ArduinoServo 。我们将使用它来测试我们的伺服器,但首先我们可能需要更改几件事。

向下滚动草图并找到以下行:

println(Arduino.list());

如果已将其注释掉,请在 println(Arduino.list()); 之前删除两个斜杠,然后保存草图。通过单击播放图标运行它,并注意底部的控制台。这将列出连接到您的 COM 端口的所有内容。

就我而言,我的Arduino在COM 8上这里列出的第三个端口。这很重要,因为下面一行中的代码有一个 Array ,其值确定要使用哪个COM端口。

机器人

需要更改它以反映我们的COM端口。对我来说,它是第三个位置,或索引编号2:

arduino = new Arduino(this, Arduino.list()[2], 57600);

我们需要对此代码进行其他一些小的更改才能对其进行测试。向下滚动到设置Arduino引脚的位置,并在此处注释掉其中一行。将另一个更改为 Pin 10 。

//arduino.pinMode(4, Arduino.SERVO);

arduino.pinMode(10, Arduino.SERVO);

我们需要在 Draw()中执行相同的操作方法:

arduino.servoWrite(10, constrain(mouseX / 2, 0, 180));

// arduino.servoWrite(4, constrain(180 - mouseX / 2, 0, 180));

保存草图并运行。您应该能够通过在程序生成的窗口上来回移动鼠标来移动伺服器。

机器人

如果它不适用于您,检查伺服接线,并检查COM端口的阵列位置是否正确。一旦您知道Arduino与Processing的配合很好,就该继续了。

配置控制器

我们正在使用的Game Control Plus库也具有强大的配置。确保已插入控制器,打开 Configurator 示例项目,然后运行它。您将获得如下菜单:

机器人

单击您的控制器名称,将弹出一个更大的配置窗口。

机器人

这看起来似乎很艰巨,但是它的设计尽可能简单。在左侧填写第一个键,其中包含您要用作变量的名称。此变量将控制伺服器的位置,因此我将其称为 servoPos 。

在其旁边的框中,您可以对其功能进行简要说明。现在,拿起控制器并移动您希望与伺服器一起使用的操纵杆。进行一些实验后,发现右指尖与“ X旋转”框相对应。在 servoPos 变量和此框之间拖动一条线。

机器人

现在,我们需要将配置保存为数据文件。在窗口的右上方,填写设备角色字段和文件名字段。

文件名很重要,因为您会在您的代码中使用它。我将其命名为 xbs 来保持简单。点击验证,然后点击保存。这将为我们的控制器编写一个包含说明的文件,以后可以使用。

机器人

准备自定义草图文件夹

让我们进行设置我们的工作文件夹。打开一个空白的处理草图,并以您喜欢的任何名称保存。这样会在保存位置为其创建一个目录。

现在导航至 Documents/Processing/libraries/GameControlPlus/examples/Configurator ,然后复制标有 data 。此文件夹包含我们刚刚创建的配置文件。导航到新保存的空白草图的目录,然后粘贴数据文件夹。

机器人

创建自定义草图

现在所有内容到位,我们可以使用我们的两个库开始制作草图。我们将逐步进行此操作,但如果您想继续前进,可以下载完整的草图和数据文件夹。请注意,您可能仍需要修改代码以反映您的Arduino COM端口。

首先导入我们需要的所有库:

import processing.serial.*;

import net.java.games.input.*;

import org.gamecontrolplus.*;

import org.gamecontrolplus.gui.*;

import cc.arduino.*;

import org.firmata.*;

我们还需要声明 ControlDevice , I/O 和 Arduino 以及 float 来保存值从我们的指尖开始:

ControlDevice cont;

ControlIO control;

Arduino arduino;

float thumb;

我们的 setup()方法会创建一个小窗口(控制器的实例),并将设备与我们的配置进行匹配文件。在此重要的是正确获取配置数据文件的文件名:

void setup() {

size(360, 200);

control = ControlIO.getInstance(this);

cont = control.getMatchedDevice(“xbs”);

if (cont == null) {

println(“not today chump”); // write better exit statements than me

System.exit(-1);

}

// println(Arduino.list());

arduino = new Arduino(this, Arduino.list()[2], 57600);

arduino.pinMode(10, Arduino.SERVO);

}

我们还在此阶段检查是否没有适用的控制器,然后退出该程序是否需要。虽然不需要使用 size()创建的窗口,但稍后会向我们提供一些有关是否从控制器中获取有用值的反馈。我们也像测试时一样初始化Arduino并将其固定在此处。

现在,我们创建一个小方法来从控制器中获取输入值,并将其映射到我们的伺服器将能够使用的值:

public void getUserInput() {

thumb = map(cont.getSlider(“servoPos”).getValue(), -1, 1, 0, 180);

}

这一行代码使用我们的数据文件来获取命名控件 servoPos ,该控件链接到控制器的右指尖,并从中读取值。然后它将值映射,并将值存储在我们的 thumb float变量中。

现在此代码从未调用过,我们现在将对其进行修复。

void draw() {

getUserInput();

background(thumb,100,255);

arduino.servoWrite(10, (int)thumb);

}

draw()与Arduino IDE中的 loop()方法相似。每帧,它调用 getUserInput()方法并更新拇指值。它使用此值来更改 background()的红色值,从而使我们可以直观地看到值的变化。然后使用 arduino.servoWrite()函数将此值写入伺服器。请注意,我们必须将 thumb 强制转换为整数值,因为ServeWrite函数将两个整数(引脚号和角度)作为参数。

检查代码是否存在错误,保存并单击运行。在稍稍延迟了Arduino的初始化之后,它看起来应该像这样:

使用游戏控制器和Arduino进行控制:已完成!

尽管经验丰富的代码库可以为我们提供帮助,但该项目在很多方面对于经验不足的编码人员来说都是相当深入的。它代表着一种思考控制机器人以及您所构建的任何其他设备的新方式。

该项目将与我们有关构建激光炮塔的指南完美配合,使您可以完全控制它。您可以像我们的Simple Arduino Alarm教程中那样设置压电式蜂鸣器,并使用控制器来更改蜂鸣器的音高或灯光的颜色。

或者,您可以构建一个大型机器人并采用在地球上。只要您的USB线足够长!
       责任编辑:wv

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

全部0条评论

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

×
20
完善资料,
赚取积分