MineCraft 连接真实世界:PHP + MineCraft + Arduino 控制 LED

在本系列的第一部分中,我们学习了一些 Minecraft,以及我们可以在其中制作的电路。我们也做了一个电路——当我们的大厦门打开,提醒我们。

然后,我们将这个虚拟警报挂钩到一个监听的 PHP 脚本,所以我们可以知道在 PHP 脚本的上下文中,何时打开了这个门。

在这一部分,我们将建立一个小型的 Arduino 报警电路。 我们将学习如何触发警报,使用官方的 IDE 和编程语言,然后使用一些名为 Firmata 的东西。

我们会把报警电路连接到 Minecraft 电路上,这样我们就可以听到 Minecraft 大厦真正的报警。

您可以在 https://github.com/sitepoint-editors/tutorial-php-arduino-and-minecraft/tree/connect-arduino 中找到本教程的代码

Arduino 编程中的碰撞课程

Arduino 是许多类型的爱好者电路控制器之一。有几个不同的设计,比如更大的 Uno 或更小的 Micro。

其中最常见的是它们具有用于连接到不同组件(例如按钮,传感器和LED)的端口/引脚并理解常用的编程语言。 编程语言是 C 和 C++,这是学习 Arduino 最难的事情。

您可以将 Arduino 板看作更小,更简单的计算机,能够抽象出电路的基本知识,并为其提供编程接口。

你需要得到一个 Arduino(或稍后讨论的替代品)和警报蜂鸣器或 LED 。

蜂鸣器和/或 LED 有两个引脚:一个用于接地(有时标为“gnd”或“ - ”),另一个需要到 Arduino 端口/引脚:

接下来,我们需要下载官方的IDE。 转到 https://www.arduino.cc/en/Main/Software 并下载适合您的操作系统的版本,安装并打开它。

Arduino 主要的编程语言是 C 和 C++。函数看起来类似于 PHP 7 函数,其中返回类型取代了函数关键字。所以我们看到一些方法应该返回 void(意味着它们不应该返回任何东西)。

setup 函数在 Arduino 启动时调用。顾名思义,我们可以用它来做板子的初始设置。 你在 Arduino 的每个引脚/端口旁边看到这些数字? 这些可以用于输入或输出(数字和模拟)。实际上,通常在使用之前定义每个引脚的功能是个好主意。

许多 Arduino 板上的引脚 13 已经连接到板上的 LED。 我们可以使用下面的代码开关这个:

void setup() {
    pinMode(13, OUTPUT);
}

void loop() {
    digitalWrite(13, HIGH);
}

在我们将这个代码上传到 Arduino 之前,我们需要找到它的位置。打开终端窗口并尝试以下命令:

ls /dev | grep usbmodem

该命令列出了 /dev 中的所有内容(在 OSX 和大多数 Linux 系统上,我们可以找到插入到我们系统中的 USB 设备的设备名称)。然后它将获取这个列表,并通过grep 命令对其进行管理,以过滤掉除单词 usbmodem 的所有项目。

注意:记下返回的内容。如果你没有看到任何东西,你的 Arduino 可能有问题,或者可能没有正确插入。

返回到 Arduino IDE,从 “Tool” -> “Port” 菜单中选择匹配的 Arduino 端口。尽管可以在没有终端命令的情况下猜出它,但知道实际的设备名称是很好的,因为我们以后需要确切的名字。

一旦你设置了正确的端口,并选择了适用的 Arduino 类型(从 “Tool” -> “Board” 菜单),你应该能够将示例上传到电路板上。

Arduino IDE 采用 C 或 C++ 代码,并将其编译为电路板可以理解的字节码。编写、编译和上传代码到 Arduino 的这个过程,对于我们 PHP 的人来说可能会令人沮丧。 我们会尽快使用一个更简单的方法。

您可以通过 “File” -> “Example” 菜单找到很多 Arduino 示例程序。当掌握 C 语法和电路板功能时,我发现这些非常宝贵!

实际上,检查 Arduino 是否正常工作,并正确连接的更简单的方法是上传 “Blink” 示例:

如果您正确连接蜂鸣器或 LED,甚至可以更改脚本以将适用端口设置为高/低(HIGH/Low)。 但是,这是一个缓慢而令人沮丧的过程,必须学习 C,并不断地将代码重新上传到 Arduino。

有时弄清楚不同组件的工作原理是非常棘手的。

熟悉的 PHP

让我们尝试一些不同的东西,在Arduino的领域里,有一种我们可以沟通的通用语言。这是一个名为 Firmata 的协议,它使我们能够使用任何语言,使我们的技术更通用。

转到 “Examples” → “Firmata” → “StandardFirmata” 的例子,并将其上传到您的 Arduino。现在可以通过标准的串行接口进行通信。

如果你还没有从 最后的文章 下载代码,现在是时候这样做了。我们要在这基础上做一些东西。。。

我们需要为我们已有的添加一个新库:

composer require carica/firmata

这个库充当我们刚刚上传到 Arduino 的标准 Firmata 代码的客户端。在 index.php 中,我们可以添加下面的代码来连接到 Arduino:

use Carica\Io;
use Carica\Firmata;

$board = new Firmata\Board(
    Io\Stream\Serial\Factory::create(
        "/dev/cu.usbmodem14141", 57600
    )
);

在尝试运行此代码之前,您一定需要关闭 Arduino IDE。它会打开连接到 Arduino,阻止我们的 PHP 脚本的后续连接。 如果您无法连接到 Arduino,只需断开 Arduino 并重新连接到同一个 USB 端口即可。 这将打破任何可能阻碍事物的开放连接。

您需要使用从终端命令(或在 IDE “Tools” -> “Port” 菜单中找到)获得的设备名称替换 cu.usbmodem14141

让我们添加一个事件监听器,当 PHP 脚本最终连接到 Arduino 时:

$board
    ->activate()
    ->done(
        function() use ($board, $loop, $watcher) {
            $pin = $board->pins[9];
            $pin->mode = Firmata\Pin::MODE_PWM;

            print "connected to Arduino";
        }
    );

$loop->run();

在 PHP 脚本最终连接到板子后,我们可以附加一个回调函数来运行。我们必须设置 Arduino 引脚/端口的模式,就像我们在 Arduino IDE 中的 C 代码一样。 这次我们将引脚 9 设置为 PWM(脉宽调制)模式。

大多数 Arduino 引脚可以设置为高电平或低电平。设备在设置为高时将打开(LED 将点亮),设置为 LOW 将关闭。PWM 是增量模式,其中 0 到 255 之间的值为连接的设备提供粒状(granular)电荷。从技术上来说,PWM 更像是在 HIGH/LOW 之间快速切换,在 x/255 的时候它会被设置为HIGH,但可观察的效果是相同的。

注意我们已经把 $watcher$loop 引入了 ?$ loop 是一个事件循环的实例,这在PHP应用程序中并不常见。如果您不熟悉事件循环是什么,或者它们是如何工作的,请查看我们刚刚介绍的

我们可以使用一个类似于 JavaScript 的 setInterval 函数的概念,通过附加一个回调来处理我们在这里的事件循环:

print "connecting.";

$board
    ->activate()
    ->done(
        function() use ($board, $loop, $watcher) {
            print "connected.";

            $pin = $board->pins[9];
            $pin->mode = Firmata\Pin::MODE_PWM;

            $loop->setInterval(
                function() use ($pin, $watcher) {
                    // this is called about every second
                },
                1000
            );
        }
    );

因此,我们可以使用事件循环计时器,而不是使用无限循环来检查日志文件的更改。 当与脚本的其余部分结合使用时,我们可以将引脚 9 设置为 0 到 255 之间的值:

$loop->setInterval(
    function() use ($pin, $watcher) {
        print "check.";

        $watcher->findChanges();
        $changes = $watcher->getUpdatedResources();

        if (count($changes) > 0) {
            $first = $changes[0];

            $lines = file($first);

            for ($i = count($lines) - 1; $i > -1; $i--) {
                if (stristr($lines[$i], "CHAT")) {
                    if (stristr($lines[$i], "closed")) {
                        print "open.";

                        $pin->analog = 0; // 0/255
                    }

                    if (stristr($lines[$i], "open")) {
                        print "closed.";

                        $pin->analog = 0.5; // 127/255
                    }

                    break;
                }
            }
        }
    },
    1000
);

我们使用的是和上次大致相同的代码。但是这次,我们不是 openclonsed 终端,而是设置引脚 9 的模拟值。模拟与我们之前做的 PWM 设置有关。如果我们想要使用更简单的高或低值,我们可以将引脚模式设置为数字:

$pin->mode = Pin::MODE_OUTPUT;

…并设置引脚的数字值:

if (stristr($lines[$i], "closed")) {
    $pin->digital = 0;
}

if (stristr($lines[$i], "open")) {
    $pin->digital = 1;
}

视频演示地址:https://www.youtube.com/watch?v=aqFWijIcpII

使用 Gorilla

通过这个工作,我发现 Arduino/Firmata/OSX 链接有时不稳定。Carica Firmata 库使用几种不同的方法(取决于扩展的可用性),默认情况下是本地套接字流。不幸的是,我使用的 Arduino 的版本,在新的连接建立之后会自动重置,而 Firmata 在与 Arduino 进行通信之前需要很短的时间。

本地套接字流实现(在Carica Firmata中)与开发板通信太快,它会中断引导周期。 麻烦随之而来。

我可以通过安装由 Carica Firmata 支持的 Gorilla 扩展来避免这种情况。你可以在 Github 上找到如何做到这一点的说明。建立和启用 Gorilla 扩展,你不应该遭受我一样的稳定性问题...

尽管有许多不同的微控制器可以用于这个项目,但我专注于 Arduino,因为这就是我所拥有的。 如果你还有别的东西(与 Firmata 兼容),那么这个部分的代码应该适合你。你将不得不弄清楚:如何连接蜂鸣器或 LED 到你的微控制器,但...

我们已经在 Minecraft 中成功实现了半个电路,另一半在 Arduino 上。 另外,我们发现了一种通过 PHP 连接它们的方法。想想这其中的可能性!

原文链接:https://www.sitepoint.com/php-arduino-and-minecraft-connecting-an-arduino-to-php/

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.