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. Raspberry Pi とは • 英国ラズベリーパイ財団によって開発されているシングルボードコン ピュータ • ARMプロセッサを搭載し、USB電源で動作する • Model

    A / B / Zero / Compute Module といったホームファクターがある • $5 ~ $35という低価格 • GPIO(General Purpose Input/Output)を搭載し、外部電子回路との連携が容易 • 初代は2012年発売 今年で7周年 • 全世界出荷台数は累計2000万台を突破
  2. 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
  3. 受動素子 • 抵抗 • コンデンサ • コイル 供給された電力を 消費・蓄積・放出する •

    電子管 • 真空管 • 半導体 • ダイオード • トランジスタ 供給された電力で 調整(増幅)・整流を行う 能動素子 電子部品
  4. オームの法則 V(電圧)=I(電流・A)×R(抵抗・Ω) • 今回使っている赤色LEDスペック • 準電圧 2.0V • 消費電流 13mA

    • GPIOの出力は3.3V • 抵抗 = (3.3V-2.0V)÷0.013A = 100Ω 16mAを超えてはいけない
  5. 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
  6. PHPからGPIOを制御する • 先ほどのShellでのコマンドをPHPに置き換えてみる <?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’); ?>
  7. 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
  8. php-gpioを使ってみる • 公式インストールガイドに沿ってcomposerでインストール • PHP内でクラスを呼び出し <?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(); ?>
  9. php-gpioを使ってWEBから操作してみる <html> <head>(略)</head> <body> <h1> <?php 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"; } ?> </h1> <form method="POST" action=""> <input type="submit" value="Initialize_Pin" name="Initialize_Pin" id="submit_button"><br /> <input type="submit" value="LED_ON" name="LED_ON" id="submit_button"><br /> <input type="submit" value="LED_OFF" name="LED_OFF" id="submit_button"><br /> <input type="submit" value="Finalize_Pin" name="Finalize_Pin" id="submit_button"> </form> </body> </html>
  10. php-gpioを使ってWEBから操作してみる <html> <head>(略)</head> <body> <h1> <?php 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"; } ?> </h1> <form method="POST" action=""> <input type="submit" value="Initialize_Pin" name="Initialize_Pin" id="submit_button"><br /> <input type="submit" value="LED_ON" name="LED_ON" id="submit_button"><br /> <input type="submit" value="LED_OFF" name="LED_OFF" id="submit_button"><br /> <input type="submit" value="Finalize_Pin" name="Finalize_Pin" id="submit_button"> </form> </body> </html> 残念ながら動きません
  11. 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
  12. 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” を追加する
  13. 参考文献、リソース等 • 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/
  14. ところで誰? • 東雲翡陽(しののめひよう) • Twitter @H_Shinonome • Facebook hiyou.shinonome •

    本名 板谷郷司 • 現在はインフラエンジニア • PHP開発歴 • PHP3 ~ PHP5.0 • PHPカンファレンス2019 実行委員長 ©Hideki Sakamoto