tgeindre/php-gpio

GPIO相关工具和PHP库

v1.0.0 2016-06-14 19:21 UTC

This package is auto-updated.

Last update: 2024-09-09 20:29:58 UTC


README

一个简单的库,用于使用PHP读取/写入Raspberry PI GPIO。

ronanguilloux/php-gpio 分支,并通过 Atoum 测试。

安装

此库可以使用 Composer 安装

$ composer require tgeindre/php-gpio

读取/写入Raspberry Pi GPIO

要读取/写入Raspberry Pi GPIO,请使用 PhpGpio\Gpio 类。此类的实例化需要一个数组,其中包含您将使用的引脚号。

您可以根据您的使用情况和Rasberry Pi版本定义一个特定的引脚号列表,或者您可以使用 PhpGpio\Utils\Pi 类自动查找所有可用的引脚。

<?php
namespace myproject;

$pi = new PhpGpio\Utils\Pi;
$pi->getAvailablePins(); // int array

访问GPIO需要root权限,所以请确保您的代码在足够的权限下运行。记住:您永远不应该以root用户运行您的web服务器。

以下是Gpio类使用的简单示例

<?php
namespace MyProject;

use PhpGpio\GpioInterface;
use PhpGpio\Gpio;

// Both pins are available on all raspi versions
define('PIN_IN', 4);
define('PIN_OUT', 7);

$gpio = new Gpio([PIN_IN, PIN_OUT]);

// First, setup pins with correct directions
$gpio
     ->setup(PIN_IN, GpioInterface::DIRECTION_IN) // Makes it readable
     ->setup(PIN_OUT, GpioInterface::DIRECTION_OUT) // Writeable
;

// read PIN_IN value and display it
$value = $gpio->read(PIN_IN);
var_dump($value); // string

// write 1 on PIN_OUT
$gpio->write(PIN_OUT, GpioInterface::IO_VALUE_ON);
sleep(1);

// After 1 second, write 0 on PIN_OUT
$gpio->write(PIN_OUT, GpioInterface::IO_VALUE_OFF);

// Then free all pins
// (use the unexport() method to free pins one by one)
$gpio->unexportAll();

如果您需要Raspberry Pi版本上所有可用的引脚的完整列表,请查看此页面

演示

以下是使用Raspberry Pi 3和一些LED的简单演示(点击图片查看视频)

Demo video

源代码

传感器

目前,此库仅支持4或8通道的MCP模拟数字转换器(ADC)

MCP3002, MCP3004 & MCP3008

mcp3004

由于Rapsberry Pi仅支持数字输入,需要一个ADC,如MCP,来读取模拟数据。

MCP3002, MCP3004和MCP3008工作方式相同,但为每个版本提供了专用类

  • PhpGpio\Sensor\Mcp\Mcp3002
  • PhpGpio\Sensor\Mcp\Mcp3004
  • PhpGpio\Sensor\Mcp\Mcp3008

它使用一个SPI接口,至少需要4个引脚

  • MISO - 主输入从输出,
  • MOSI - 主输出从输入,
  • CLK - 时钟,
  • CS - 通道选择(使用相同SPI接口的每个组件都有一根专用引脚)。

提供的类使用软件通信系统,因此您可以使用任何引脚。

以下是这3个版本的MCP ADC的连接图

mcp

布线

  • VDD(电源)接3.3V,
  • VREF接3.3v,
  • AGND接地(GND),
  • CLK接时钟引脚,
  • DOUT(数字输出)接MISO引脚,
  • DIN(数字输入)接MOSI引脚,
  • CS(通道选择)接CS引脚,
  • DGND接地(GND)。

现在您可以开始读取数据了

namespace MyProject;

use PhpGpio\Gpio;
use PhpGpio\Sensor\Mcp\Mcp3008;

// Defining pins mapping according to your setup
$pinsMapping = [
    'MISO' => 17,
    'MOSI' => 8,
    'CLK' => 23,
    'CS' => 24,
];

// Setup a Gpio class
$gpio = new Gpio(array_values($pins));

// Then we can instanciate the MCP class
$mcp = new Mcp3008(
    $gpio
    $mapping['CLK'],
    $mapping['MOSI'],
    $mapping['MISO'],
    $mapping['CS']
);

// Now let's read some data on the first channel
while (true) {
    echo $mcp->read(['channel' => 0]), "\n";
    // every second
    sleep(1);
}