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.8k
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
780
色の話
shinonome
0
130
SDカード今昔
shinonome
0
100
Other Decks in Programming
See All in Programming
孤独のCTOグルメという やや奇抜な企画をやった目的と効果
shoheimitani
3
1k
Ruby製社内ツールのGo移行
bgpat
2
260
20240301_cocone_EMゆるミートアップvol6_LT資料
cocone
0
310
The Future of C++ Interoperability: Insights from Porting a Game to Swift
teamhimeh
0
260
Honoとhtmx
yusukebe
6
1.2k
htmx is fun!
codehex
2
190
TDDと今まで
kanayannet
0
140
ここ1~2年くらいで 使えるようになった(主要ブラウザーの最新版 がすべて対応した ) ウェブの新機能について ランダムに喋る!
myzkyy
9
6.4k
生成 AI の中身を覗いてみよう〜基礎から医療現場での応用まで〜
soh9834
2
760
どうしてこうなった命名集 ~🔥編~ / OOC 2024 LT
pictiny
4
2.7k
Deno に Web 標準 API を実装する / Implementing Web Standard API to Deno
petamoriken
0
350
incrementalモデルの理解を深める
ikkimiyazaki
2
630
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
6
950
Automating Front-end Workflow
addyosmani
1353
200k
KATA
mclloyd
14
11k
GraphQLとの向き合い方2022年版
quramy
28
12k
What's in a price? How to price your products and services
michaelherold
236
11k
It's Worth the Effort
3n
180
27k
Code Review Best Practice
trishagee
54
15k
Fantastic passwords and where to find them - at NoRuKo
philnash
35
2.4k
Principles of Awesome APIs and How to Build Them.
keavy
119
16k
What's new in Ruby 2.0
geeforr
335
31k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
67
38k
Building a Modern Day E-commerce SEO Strategy
aleyda
15
6.3k
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で開催します