Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPでもRaspberry Piがしたい! @ PHPerKaigi 2019

PHPでもRaspberry Piがしたい! @ PHPerKaigi 2019

PHPでもRaspberry Piを使って電子回路と連携した開発がしたい!Webから回路を操作したい!という方のための(?)初心者向けセッションでした

Satoshi Itatani

March 29, 2019
Tweet

More Decks by Satoshi Itatani

Other Decks in Programming

Transcript

  1. View Slide

  2. Raspberry Pi とは
    • 英国ラズベリーパイ財団によって開発されているシングルボードコン
    ピュータ
    • ARMプロセッサを搭載し、USB電源で動作する
    • Model A / B / Zero / Compute Module といったホームファクターがある
    • $5 ~ $35という低価格
    • GPIO(General Purpose Input/Output)を搭載し、外部電子回路との連携が容易
    • 初代は2012年発売 今年で7周年
    • 全世界出荷台数は累計2000万台を突破

    View Slide

  3. https://www.raspberrypi.org/blog/raspberry-jam-big-birthday-weekend-2019/

    View Slide

  4. https://www.raspi.jp/2019/01/raspberry-jam-big-birthday-weekend-2019-in-tokyo/

    View Slide

  5. GPIO(General Purpose Input/Output)
    • SoC(System on Chip)から直接配線さ
    れているピンヘッダ
    • Model Aが26pin / Model B & Zeroが
    40pin
    Purpose Pin No Purpose
    3.3V Power 1 2 5V Power
    GPIO 2 – I2C SDA 3 4 5V Power
    GPIO 3 – I2C SCL 5 6 Ground
    GPIO 4 7 8 GPIO 14 – UART TX
    Ground 9 10 GPIO 15 – UART RX
    GPIO 17 11 12 GPIO 18
    GPIO 27 13 14 Ground
    GPIO 22 15 16 GPIO 23
    3.3V Power 17 18 GPIO 24
    GPIO 10 – SPI0 MOSI 19 20 Ground
    GPIO 9 – SPI0 MISO 21 22 GPIO 25
    GPIO 11 – SPI0 SCLK 23 24 GPIO 8 – SPI0 CS0
    Ground 25 26 GPIO 7 – SPI0 CS1
    SDA0 I2C ID EEPROM 27 28 SLC0 I2C ID EEPROM
    GPIO 5 29 30 Ground
    GPIO 6 31 32 GPIO 12
    GPIO 13 33 34 Ground
    GPIO 19 – SPI1 MISO 35 36 GPIO 16 – SPI1 CS0
    GPIO 26 37 38 GPIO 20 – SPI1 MOSI
    Ground 39 40 GPIO 21 – SPI1 SCLK

    View Slide

  6. GPIO(General Purpose Input/Output)
    各GPIOは3.3V 16mA程度の電流を出力する(全GPIO合計50mA程度まで)
    OR
    各GPIOに0Vまたは3.3Vにそれぞれ近い電圧を入力する
    0V : Low信号(0) / 3.3V : High信号(1)
    としてデジタル信号を扱うことができる

    View Slide

  7. 受動素子
    • 抵抗
    • コンデンサ
    • コイル
    供給された電力を
    消費・蓄積・放出する
    • 電子管
    • 真空管
    • 半導体
    • ダイオード
    • トランジスタ
    供給された電力で
    調整(増幅)・整流を行う
    能動素子
    電子部品

    View Slide

  8. いろいろと試すにあたり
    あったほうがいいもの
    • ブレッドボード
    • ジャンパワイヤ
    • オスーオス
    • オスーメス
    • 各種抵抗
    • LED
    • スイッチ
    合計1,500円くらい

    View Slide

  9. Raspberry Piから電子部品を制御する
    • いわゆるLチカ
    • 任意のGPIO(例として21番)
    • 抵抗
    • LED(+と-があるので注意)
    • Ground
    の順番に部品をつなぐ

    View Slide

  10. オームの法則
    V(電圧)=I(電流・A)×R(抵抗・Ω)
    • 今回使っている赤色LEDスペック
    • 準電圧 2.0V
    • 消費電流 13mA
    • GPIOの出力は3.3V
    • 抵抗 = (3.3V-2.0V)÷0.013A = 100Ω
    16mAを超えてはいけない

    View Slide

  11. ShellからGPIOを制御する
    • microSDカードにRaspbian最新版をインストール
    • Raspberry Pi にログインして、ターミナル/SSHを使える状態にする
    • 下にあるコマンドを打っていく
    • GPIOは使った番号に変える
    • echo 0 / echo 1 で出力を変更できる
    $ #初期化
    $ echo 21 > /sys/class/gpio/export
    $ echo out > /sys/class/gpio/gpio21/direction
    $ #出力High
    $ echo 1 > /sys/class/gpio/gpio21/value
    $ #出力Low
    $ echo 0 > /sys/class/gpio/gpio21/value
    $ #終了処理
    $ echo 21 > /sys/class/gpio/unexport

    View Slide

  12. PHPからGPIOを制御する
    • 先ほどのShellでのコマンドをPHPに置き換えてみる
    // 初期化
    file_put_contents('/sys/class/gpio/export','21’);
    file_put_contents('/sys/class/gpio/gpio21/direction','out’);
    // 出力High
    file_put_contents('/sys/class/gpio/gpio21/value','1’);
    // 出力Low
    file_put_contents('/sys/class/gpio/gpio21/value','0’);
    // 終了処理
    file_put_contents('/sys/class/gpio/unexport','21’);
    ?>

    View Slide

  13. PHPからGPIOを制御するライブラリ
    • WiringPi gpioコマンド (exec)
    • execなので厳密にはライブラリではない
    • http://wiringpi.com/
    • WiringPi-PHP
    • 上記WiringPiのPHP用ラッパー
    • https://github.com/WiringPi/WiringPi-PHP
    • php-gpio
    • ファイルシステム書き込みベースのcomposerライブラリ
    • https://github.com/ronanguilloux/php-gpio

    View Slide

  14. php-gpioを使ってみる
    • 公式インストールガイドに沿ってcomposerでインストール
    • PHP内でクラスを呼び出し
    // ライブラリ読み込み
    require 'vendor/autoload.php’;
    // クラス呼び出しと初期化
    use PhpGpio¥Gpio;
    $gpio = new GPIO();
    $gpio->setup(21, "out");
    // 出力High
    $gpio->output(21, 1);
    // 出力Low
    $gpio->output(21, 0);
    // 終了処理
    $gpio->unexportAll();
    ?>

    View Slide

  15. php-gpioを使ってWEBから操作してみる

    (略)


    require 'vendor/autoload.php';
    use PhpGpio¥Gpio;
    $gpio = new GPIO();
    if (isset($_POST["Initialize_Pin"])) {
    echo "Initialize GPIO pin 21";
    $gpio->setup(21, "out");
    }
    else if(isset($_POST["LED_ON"])) {
    echo "LED ON";
    $gpio->output(21, 1);
    }
    else if(isset($_POST["LED_OFF"])) {
    echo "LED OFF";
    $gpio->output(21, 0);
    }
    else if(isset($_POST["Finalize_Pin"])) {
    echo "Finalize GPIO pin 21";
    $gpio->unexportAll();
    }
    else {
    echo "Press Initialize_Pin button first";
    }
    ?>












    View Slide

  16. php-gpioを使ってWEBから操作してみる

    (略)


    require 'vendor/autoload.php';
    use PhpGpio¥Gpio;
    $gpio = new GPIO();
    if (isset($_POST["Initialize_Pin"])) {
    echo "Initialize GPIO pin 21";
    $gpio->setup(21, "out");
    }
    else if(isset($_POST["LED_ON"])) {
    echo "LED ON";
    $gpio->output(21, 1);
    }
    else if(isset($_POST["LED_OFF"])) {
    echo "LED OFF";
    $gpio->output(21, 0);
    }
    else if(isset($_POST["Finalize_Pin"])) {
    echo "Finalize GPIO pin 21";
    $gpio->unexportAll();
    }
    else {
    echo "Press Initialize_Pin button first";
    }
    ?>












    残念ながら動きません

    View Slide

  17. php-gpioを使ってWEBから操作してみる
    [Thu Mar 14 00:39:00.764008 2019] [:error] [pid 935] [client
    ***.***.***.***] PHP Warning:
    file_put_contents(/sys/class/gpio/gpio21/direction): failed to
    open stream: Permission denied in
    /var/www/html/lib/src/PhpGpio/Gpio.php on line 103, referer:
    http://raspi3p-01.local/gpio-php-gpio.php

    View Slide

  18. Apacheの権限にGPIOの操作許可を与える
    $ sudo id www-data
    uid=33(www-data) gid=33(www-data) groups=33(www-data)
    $ sudo usermod –aG gpio www-data
    $ sudo id www-data
    uid=33(www-data) gid=33(www-data) groups=33(www-
    data),997(gpio)
    • GPIO操作が可能な ”gpio” グループにApache実行ユーザである ”www-data”
    を追加する

    View Slide

  19. デモ

    View Slide

  20. 参考文献、リソース等
    • Raspberry Pi Foundation
    • https://www.raspberrypi.org/
    • Documentation of GPIO
    • https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md
    • php-gpio
    • https://github.com/ronanguilloux/php-gpio/
    • Raspberry Piと電気のキホン
    • https://www.nic.ad.jp/ja/materials/iw/2018/proceedings/h1/
    • とりあえず動かすためのリソース
    • https://github.com/shinonome/phperkaigi2019/

    View Slide

  21. ところで誰?
    • 東雲翡陽(しののめひよう)
    • Twitter @H_Shinonome
    • Facebook hiyou.shinonome
    • 本名 板谷郷司
    • 現在はインフラエンジニア
    • PHP開発歴
    • PHP3 ~ PHP5.0
    • PHPカンファレンス2019 実行委員長 ©Hideki Sakamoto

    View Slide

  22. View Slide

  23. 12/01(日)大田区産業プラザPiOで開催します

    View Slide