承接 ikarus/raspberry-pinout 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

ikarus/raspberry-pinout

Composer 安装命令:

composer require ikarus/raspberry-pinout

包简介

README 文档

README

This package ships with all information about the pinout of Raspberry Pi Devices.
It helps you to assign and prepare pins and also clean them up.

Installation

$ composer require ikarus/raspberry-pinout

Usage

There is a singleton class named RaspberryPiDevice which holds all information about the pinout and its device.

<?php
use Ikarus\Raspberry\RaspberryPiDevice;

$dev = RaspberryPiDevice::getDevice();
echo $dev->getModelName();

Once the device is created you can define custom pinouts:

<?php
use Ikarus\Raspberry\Pinout\Revision_1\AbstractBoardPinout;
use Ikarus\Raspberry\Pinout\Revision_2\AbstractBCMPinout;
use Ikarus\Raspberry\Pinout\Revision_3\AbstractWpiPinout;
// Take the abstract pinout class you need (device specific like rev 1-3) and you want to declare the pinout (bcm, wpi or board).

class MyPinout extends AbstractWpiPinout {
    const MOTOR_A = 0;
    const MOTOR_B = 1;
    const CONTACT_A = 2;
    const CONTACT_B = 3;
    
    const ASPIRATION = 4;
    
    protected $inputPins = [
        self::CONTACT_A => self::INPUT_RESISTOR_UP,
        self::CONTACT_B => self::INPUT_RESISTOR_DOWN
    ];
    
    protected $outputPins = [
        self::MOTOR_A => false,
        self::MOTOR_B => false,
        self::ASPIRATION => true    // Use PWM
    ];
    
    protected $activeLowPins = [
        self::CONTACT_A     // Inverts its value => if the pin is high, the value is 0.
    ];
}

Now you are able to work with the pi:

<?php
require "vendor/autoload.php";
use Ikarus\Raspberry\RaspberryPiDevice;
$dev = RaspberryPiDevice::getDevice();

$dev->requirePinout( new MyPinout() );

// Drive forward
$dev->getOutputPin( MyPinout::MOTOR_A )->setValue(1);
while ( $dev->getInputPin( MyPinout::CONTACT_A )->getValue() )
    usleep(10000);

// Motor stop
$dev->getOutputPin( MyPinout::MOTOR_A )->setValue(0);
sleep(2);

// Drive backwards
$dev->getOutputPin( MyPinout::MOTOR_B )->setValue(1);
while ( $dev->getInputPin( MyPinout::CONTACT_B )->getValue() == 0 )
    usleep(10000);

// Motor stop
$dev->getOutputPin( MyPinout::MOTOR_B )->setValue(0);

// Releases all pins and brings them into a secure state (mode = input, value = 0 and resistor = none).
$dev->cleanup();

Or use the built-in safe loop method:

<?php
$dev->loop(1/1000, function() {
    // Safe loop call
});

Safe means that Ikarus ensures that the method $dev->cleanup() gets called in any case.
It registers interruption handlers, so ^C in command line will also cleanup.

Edges

Ikarus implements an edge detection mechanism.
So to improve the example above you can watch an edge instead of polling the pin:

<?php
use Ikarus\Raspberry\Edge\Edge;

// Change
/** @var \Ikarus\Raspberry\RaspberryPiDevice $dev */
while ( $dev->getInputPin( MyPinout::CONTACT_A )->getValue() )
    usleep(10000);
// Into
$edge = new Edge($dev->getInputPin( MyPinout::CONTACT_A ), Edge::EDGE_FALLING);

// Watch for 2.5 seconds for a falling edge
// This method blocks until the requested edge (raising|falling|both) did occur or time is up.
if($dev->watchEdge(2.5, $edge)) {
    echo "OK, Motor stopp\n";
} else {
    echo "Failed! Action took too long!\n";
}
$dev->getOutputPin( MyPinout::MOTOR_A )->setValue(0);

// You can also check the $edge like
switch ($edge->getValue()) {
    case Edge::VALUE_DID_FALL: echo "did fall"; break;
    case Edge::VALUE_DID_RISE: echo "did rise"; break;
    default:
        echo "Nothing happen";
}

Watching edges uses much less cpu performance than polling the pin.

Please note that the pin state might bounce.
So getting the pin's value from $edge->getValue() holds the real triggering edge value.

统计信息

  • 总下载量: 90
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 3
  • 依赖项目数: 4
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: BSD-3-Clause
  • 更新时间: 2021-01-20

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固