首页 > 解决方案 > 通过 USB 从 Mac 网络服务器对 Arduino 进行问题控制

问题描述

我想要实现的是通过串行接口控制 Arduino。它只在一定程度上起作用。

我正在使用 Arduino Uno R3 和带有 Mojave (10.14.6)、Apache 版本 2.4.34 和 PHP 版本 7.1.23 的 Mac。

我从这个简单的项目开始:

https://www.instructables.com/id/Control-LED-Using-Serial-Monitor/

它工作正常。我可以通过在我的 Mac 上的 Arduino 应用程序的串行输入中键入 1 和 2 来关闭和打开 LED。现在我想在同一台 Mac 上设置的网络服务器上做同样的事情。我尝试了两种不同的方法来做到这一点。通过此处找到的 PhpSerial 库访问串行接口:

https://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html ,

或通过在命令行中回显信号(1 或 2)。两者都不起作用。在 PHP 文件中,我放置了以下代码:

<?php      
      include 'PhpSerial.php';
      $serial = new PhpSerial;
      $serial->deviceSet("/dev/cu.usbmodem14101");
      $serial->confBaudRate(9600);
      $serial->confParity("none");
      $serial->confCharacterLength(8);
      $serial->confStopBits(1);
      $serial->confFlowControl("none");

      if(isset($_GET["submit"])){
        $serial->deviceOpen();
        if($_GET["led"] == "ON")
          $serial->sendMessage(1);
        if($_GET["led"] == "OFF")
          $serial->sendMessage(2);
      }
?>

它导致 LED 随机闪烁,我将其解释为 Arduino 或正在设置的串行,但是当我尝试通过<form>PHP 文件中的元素这样做时,LED 没有打开或关闭。会不会是串口设置错了?现在我想通过在 PHP 中运行 shell 命令来解决问题。通过运行

screen /dev/cu.usbmodem14101

在终端(手动,而不是通过 PHP)中,我能够通过串行接口访问 Arduino,并成功地打开和关闭 LED,就像我在 Mac 上的 Arduino-app 的串行接口中所做的那样。但是,我无法找出如何使用 PHP 中的 screen 命令。所以我想我可以像这样通过串行接口向 Arduino 回显命令

echo 1 > /dev/cu.usbmodem14101

这会产生与 PhpSerial 相同的结果。LED 会随机闪烁,但是当我向串口发送一个和两个时它不会打开或关闭。由于我无法让它在终端中工作,我还没有尝试在 PHP 中运行命令。

我错过了什么?

编辑:

我已经取得了一些进展。通过使用cat打开和关闭 LED 的命令并将其放在单独的文件中,我可以将命令连接到串行端口。我有一个on.txt仅包含数字 1 的文件,以及另一个off.txt包含数字 2 的文件。通过运行命令

cat on.txt > /dev/cu.usbmodem14101

cat off.txt > /dev/cu.usbmodem14101

我能够打开和关闭 LED。我也可以将文本文件放在网页项目的根文件夹中,然后从 php 运行命令

<?php
if(isset($_GET["submit"])){
  if($_GET["led"] == "ON")
    exec("cat on.txt > /dev/cu.usbmodem14101");
  if($_GET["led"] == "OFF")
    exec("cat off.txt > /dev/cu.usbmodem14101");
}
?>

  <h1>Turn LED on or off</h1>
  <p>LED turned <?php echo $_GET["led"]; ?></p>
  <form action="led.php" method="GET">
    <input type="radio" name="led" value="ON" <?php if($_GET["led"]=="ON") echo "checked"; ?> > On <br />
    <input type="radio" name="led" value="OFF" <?php if($_GET["led"]=="OFF") echo "checked"; ?> > Off <br />
    <input type="submit" name="submit" value="Execute">
  </form>

现在我完成了我尝试做的事情,但是我可以运行其他命令来将 1 和 2 直接定向到串行端口,而不是使用文本文件吗?

标签: phpshellarduinoserial-port

解决方案


经过更多测试后发现,通过串口与 Arduino 的连接仅在串口被监控时才有效。当我使用cat编辑中提到的解决方案时,我使用命令在单独的终端窗口中监视串行

cat /dev/cu.usbmodem14101

我在最初的测试中没有这样做

echo 1 > /dev/cu.usbmodem14101

我使用的 sceen 命令是监控串行,以及我找到的另一个解决方案并且有效

sudo cu -s 9600 -l /dev/cu.usbmodem14101

所以在我看来,结论是我必须cat /dev/cu.usbmodem14101在单独的终端窗口中运行命令。然后我可以以任何首选的方式输出到串行端口,从另一个终端窗口,通过 PhpSerial 库或简单地exec("echo 1 > /dev/cu.usbmodem14101");在 PHP 中。我现在使用的代码如下:

<?php
if(isset($_GET["submit"])){
  if($_GET["led"] == "ON")
    exec("echo 1 > /dev/cu.usbmodem14101");
  if($_GET["led"] == "OFF")
    exec("echo 2 > /dev/cu.usbmodem14101");
}
?>

推荐阅读