Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPでもRaspberry Piがしたい! @ PHPerKaigi 2019
Search
Satoshi Itatani
March 29, 2019
Programming
0
1.9k
PHPでもRaspberry Piがしたい! @ PHPerKaigi 2019
PHPでもRaspberry Piを使って電子回路と連携した開発がしたい!Webから回路を操作したい!という方のための(?)初心者向けセッションでした
Satoshi Itatani
March 29, 2019
Tweet
Share
More Decks by Satoshi Itatani
See All by Satoshi Itatani
Raspberry Pi 互換機を<s>つ</s>かってみた ~Tinker Board編~
shinonome
0
910
色の話
shinonome
0
140
SDカード今昔
shinonome
0
110
Other Decks in Programming
See All in Programming
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
Full stack testing :: basic to basic
up1
1
930
Mermaid x AST x 生成AI = コードとドキュメントの完全同期への道
shibuyamizuho
0
160
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
300
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
2
460
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
事業成長を爆速で進めてきたプロダクトエンジニアたちの成功談・失敗談
nealle
3
1.4k
Webエンジニア主体のモバイルチームの 生産性を高く保つためにやったこと
igreenwood
0
330
StarlingMonkeyを触ってみた話 - 2024冬
syumai
3
270
42 best practices for Symfony, a decade later
tucksaun
1
180
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
328
21k
Thoughts on Productivity
jonyablonski
67
4.4k
What's in a price? How to price your products and services
michaelherold
243
12k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
Designing for humans not robots
tammielis
250
25k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Speed Design
sergeychernyshev
25
670
Statistics for Hackers
jakevdp
796
220k
Unsuck your backbone
ammeep
669
57k
Docker and Python
trallard
41
3.1k
Designing for Performance
lara
604
68k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Transcript
None
Raspberry Pi とは • 英国ラズベリーパイ財団によって開発されているシングルボードコン ピュータ • ARMプロセッサを搭載し、USB電源で動作する • Model
A / B / Zero / Compute Module といったホームファクターがある • $5 ~ $35という低価格 • GPIO(General Purpose Input/Output)を搭載し、外部電子回路との連携が容易 • 初代は2012年発売 今年で7周年 • 全世界出荷台数は累計2000万台を突破
https://www.raspberrypi.org/blog/raspberry-jam-big-birthday-weekend-2019/
https://www.raspi.jp/2019/01/raspberry-jam-big-birthday-weekend-2019-in-tokyo/
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
GPIO(General Purpose Input/Output) 各GPIOは3.3V 16mA程度の電流を出力する(全GPIO合計50mA程度まで) OR 各GPIOに0Vまたは3.3Vにそれぞれ近い電圧を入力する 0V : Low信号(0)
/ 3.3V : High信号(1) としてデジタル信号を扱うことができる
受動素子 • 抵抗 • コンデンサ • コイル 供給された電力を 消費・蓄積・放出する •
電子管 • 真空管 • 半導体 • ダイオード • トランジスタ 供給された電力で 調整(増幅)・整流を行う 能動素子 電子部品
いろいろと試すにあたり あったほうがいいもの • ブレッドボード • ジャンパワイヤ • オスーオス • オスーメス
• 各種抵抗 • LED • スイッチ 合計1,500円くらい
Raspberry Piから電子部品を制御する • いわゆるLチカ • 任意のGPIO(例として21番) • 抵抗 • LED(+と-があるので注意)
• Ground の順番に部品をつなぐ
オームの法則 V(電圧)=I(電流・A)×R(抵抗・Ω) • 今回使っている赤色LEDスペック • 準電圧 2.0V • 消費電流 13mA
• GPIOの出力は3.3V • 抵抗 = (3.3V-2.0V)÷0.013A = 100Ω 16mAを超えてはいけない
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
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’); ?>
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
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(); ?>
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>
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> 残念ながら動きません
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
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” を追加する
デモ
参考文献、リソース等 • 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/
ところで誰? • 東雲翡陽(しののめひよう) • Twitter @H_Shinonome • Facebook hiyou.shinonome •
本名 板谷郷司 • 現在はインフラエンジニア • PHP開発歴 • PHP3 ~ PHP5.0 • PHPカンファレンス2019 実行委員長 ©Hideki Sakamoto
None
12/01(日)大田区産業プラザPiOで開催します