際際滷

際際滷Share a Scribd company logo
Arduino を PHP で崙囮する
@oasynnoum
PHPカンファレンスv廉2014
徭失B初
¢ @oasynnoum
¢ PHP が挫きです
¢ 麗を咾せるものに版かれます
¢ シリアルポ`トを崙囮するモジュ`ル
C http://sandbox.n-3.so/Gorilla/
¢ USB崙囮するモジュ`ル(libusbラッパ`)
C http://oasynnoum.hatenablog.com/entry/2013/03/22/013251
¢ CD,DVDドライブを(? ? ?)? ?ウイ`ン? するモジュ`ル
C https://github.com/oasynnoum/php-eject
C http://eject.kokuda.org/
¢ 垢恬の欄はお賀し和さい
まとめ
firmata プロトコルをg廾した PHP ライブラリ、
PHPMakeFirmataを聞えば
ArduinoとWebをB亊させたアプリが
gにPHPで恬れる
Arduino を PHP で崙囮する
ご賠ありがとうございました
m(_ _)m
K
おしたいこと
¢ firmataとは
これの肝に峰べる PHPMakeFirmata API の功久を尖盾して
もらう朕議で firmata プロトコルを富しかくh苧
C PHPのカンファレンスです坪否としては音m俳かもしれ
ません。PHPvSなさすぎて
¢ PHPMakeFirmata について
C 秘圭隈
C API
C デモ
firmata プロトコル古勣
¢ firmata はPCのようなホストマシンから Arduino の
ようなデバイスを崙囮するためのプロトコル
¢ firmata はシリアル宥佚の貧のアプリケ`ションプ
ロトコル
firmata プロトコル古勣
¢ ホストからデバイスにリクエストを竃し、
デバイスはそれに鬉嘛し、駅勣に鬉犬
レスポンスを卦す
C 駅ずしも仝リクエストレスポンス々ではない
¢ デバイスが僅A議にピンの彜Bを宥岑したり
¢ ホストから匯圭議にピンの彜Bを篁させたり
¢ 宥佚デ`タの侘塀は MIDI メッセ`ジ侘塀
¢ 弼?なデバイス箸g廾がある
C https://github.com/firmata
firmata プロトコル古勣
¢ 恷寄0xFのデジタルポ`トをサポ`ト
C 匯つのポ`トは8のデジタルピンを隔つ
C つまり恷寄128のデジタルピンをサポ`ト
¢ 恷寄0xFのアナログ秘薦ピンをサポ`ト
firmata プロトコル古勣
¢ 喘余(メリット)
C もっとお返Xプロトタイピング(スクリプティング)
¢ ホスト箸妊廛蹈哀薀爐ければ冱Zは採でもいい
¢ あるデバイスが firmata をg廾しているとわかれば、その
デバイス喘のプログラマ(ライタ`)?IDE吉がoくてもいい
C ホストとデバイスがf{嘛するようなアプリ_k
C 栽によってはホストから坿が工oされる
¢ デメリット
C ホストとデバイスはケ`ブルで、る駅勣がある
¢ firmata over XBeeとかアイディアはあるらしい???
C ホストがoいと採も竃栖ない
¢ gにデバイスだけを咾せばいいようなアプリの栽、
ホストの麻Y坿を勣箔するためojが謹い
StandardFirmata 古勣
¢ Firmata のデ`タ侘塀は寄j委に
C シンプルな耕協Lのコマンド
C 辛粡Lデ`タを坪淫するコマンド(SysEx)
¢ #define START_SYSEX 0xF0
¢ #define END_SYSEX 0xF7
に蛍けられる
¢ ホストからの俊Arにデバイスの彜Bがリセットされ
る
StandardFirmata 古勣
¢ リセットr、デバイスから蒙協のメッセ`ジが僕られる
¢ デバイス兜豚晒g廾箭
https://github.com/firmata/arduino/blob/45c67d3c18351d23eb979bc2
ff32537dac180560/Firmata.cpp#L66
void FirmataClass::begin(long speed)
{
Serial.begin(speed);
FirmataSerial = &Serial;
blinkVersion();
printVersion();
printFirmwareVersion();
}
ファ`ムウェア秤鵑糧ゝ
¢ REPORT_FIRMWARE
C #define REPORT_FIRMWARE 0x79
C pack('C3',
START_SYSEX,
REPORT_FIRMWARE,
END_SYSEX);
¢ ファ`ムウェア兆(StandardFirmata.ino)と、
バ`ジョン桑催がレスポンスとして卦ってくる
¢ ただし、この秤鵑惑以したリセットrの蒙協のデ`タに
根まれるため、このクエリをk佩する中は蓮
ピンのC嬬を{べる
¢ デバイスに贋壓するピン匯つ匯つについて、
それが隔つC嬬を卦す
¢ つまり、ピンのt方とピンそれぞれのC嬬がこのコ
マンドでわかる
¢ CAPABILITY_QUERY
C #define CAPABILITY_QUERY 0x6B
C pack('C3',
START_SYSEX,
CAPABILITY_QUERY,
END_SYSEX);
ピンのC嬬を{べる
¢ 協xされている Capability は肝の宥り
C digital input
C digital output
C analog read
C PWM
C servo
C I2C
¢ このコマンドはGUIアプリケ`ションの兜豚晒rに嗤喘
C ピンの方、C嬬に鬉犬織灰鵐肇踪`ルを塘崔する
デジタル竃薦
¢ 3バイトのコマンド
¢ 枠^バイトは DIGITAL_MESSAGE|ポ`ト桑催
C 和了4bitはポ`ト桑催
C #define DIGITAL_MESSAGE 0x90
C $n桑朕のピンがあるポ`ト桑催は floor($n/8)
¢ ピン桑催を8で護り、極方を俳り里
¢ つまりピンは8阿縫哀覃`プ晒される
¢ 6桑朕のピンはポ`ト0に、13ピンはポ`ト1にある
¢ 2バイト朕、3バイト朕はポ`ト嶄のピン彜Bを幣す
デジタル竃薦
¢ 1バイト朕箭0x90|1
C ポ`ト1にするデジタル竃薦
¢ 2バイト朕箭01011011
C 恷貧了ビットは 0 耕協
C 恷和了ビットからにポ`ト嶄のピン桑催 0 ~ 6 の彜Bを幣す
¢ 3バイト朕箭00000001
C 恷貧了ビットから2ビット朕まで 0 耕協
C 恷和了ビットはポ`ト嶄のピン桑催 7 の彜Bを幣す
¢ ポ`ト 0 にし甜方ピンをHIGHにするコマンド
¢ pack('C3', 0x90|0, 0b00101010, 0b00000001);
デジタル秘薦
¢ ポ`トの彜BをOし、篁があれば宥岑する
C iみ竃さないとバッファにどんどんデ`タが聡まっていく
C 秘薦を鞭け函るアプリの栽、
この尖喇でポ`リングが駅勣になる
¢ REPORT_DIGITAL
C #define REPORT_DIGITAL 0xD0
デジタル秘薦
¢ 2バイトのコマンドでO、またはOをやめるポ`トを峺協
¢ 1バイト朕は REPORT_DIGITAL|ポ`ト桑催
C 和了8bitはポ`ト桑催
C 蒙協のピンの彜Bだけ縮えてくれればいいよというUにはいかない
C 5ピンはポ`ト0に奉するので、5ピンの彜Bが圀しい栽、そのポ`トの麿
のピンの彜B篁の宥岑も鞭け函ることになる
¢ 2バイト朕は寔。0もしくは1
C 1で彜B宥岑おいします
C 0で彜B宥岑、もうYです
¢ pack('C2', REPORT_DIGITAL|0, 1);
C ポ`ト0に奉するピンの彜Bを宥岑
デジタル秘薦
¢ 峺協したポ`ト嶄のピンに彜B篁があった栽
3バイトのデ`タを鞭け函る
¢ デ`タの侘塀はデジタル竃薦のコマンドと揖じ
アナログ秘薦
¢ デバイスがアナログピンの彜BをOし、篁があれば
宥岑する
¢ O勣のコマンドの侘塀は
デジタル秘薦のそれとほぼ揖じ
¢ #define REPORT_ANALOG 0xC0
¢ pack('C2', REPORT_ANALOG|1, 1);
アナログピン1の彜BをOさせる
¢ デジタル秘薦揖、iみ竃さないとバッファにデ`タが
們eされていく
アナログ秘薦
¢ 峺協したアナログピンに彜B篁があった栽
3バイトのデ`タを鞭け函る
¢ 1バイト朕はO勣のコマンドと揖じ
C REPORT_ANALOG|ピン桑催
¢ 2バイト朕はピンの彜B()の和了7bit
¢ 3バイト朕はピンの彜B()の貧了7bit
¢ $pinState = (($first << 7) | $second) & 0xFF
その麿麼勣コマンド
¢ PWM(アナログ竃薦)
C g了rgあたりのピンがHIGHとなるrgを{屁し、
デジタル(屈オ)なピンにアナログ(謹オ)な尅玲をさ
せる
¢ Servo
C 蒙eな栽の PWM コマンド
¢ I2C
C 麿のデバイス、マイコン吉とシリアル宥佚を佩う
PHPMakeFirmataについて
¢ Firmataのホストg廾
¢ 枠に峰べたプロトコルのをL盈
C PHPMakeFirmataDevice が鵑離妊丱ぅ垢魃蹶F
¢ コンストラクタは Capability チェックなど、まず駅勣となりそうなやりとりをデ
バイスと佩う
C digitalWrite(), analogWrite(), ピンをOする碧Mみ
などをフレ`ムワ`クとして戻工する
¢ PHP による firmata のホストg廾は麿に
https://github.com/ThomasWeinert/carica-firmataがある
C I宀の API の`いはピンOのAPIにおいて interface を喘いるの
か callable を喘いるのか殻業
C callable 謹喘するのが腕いな繁は PHPMakeFirmata を聞うといい
と房う
PHPMakeFirmataについて
¢ WebSocket のC嬬(噫なお弊)
C Ratchet とのB亊により WebSocket サ`バ`のC嬬
も戻工
C フレ`ムワ`クユ`ザ`がピンOのポ`リングと
Ratchet が戻工するイベントl咾 API をMみ栽わせ
て屁栽來を函りつつ WebSocket アプリを恬るのは謹
蛍めんどくさいだろうと房ったので
C しかし、 Ratchet の API は富し{べただけなので、
訊らく書のところあまりいいg廾ではない
PHPMakeFirmataについて
¢ ホストg廾のキモは parser だと房う
C バッファはデジタルピン、アナログピンの彜B宥岑など
弼?なデ`タが詞じる
¢ 箭えば REPORT_FIRMWARE のクエリを誘げた
岷瘁に鞭け函るバッファ枠^のデ`タは駅ずしも
START_SYSEX,
REPORT_FIRMWARE,
END_SYSEX
ではない
C 咾ない和返くそなパ`サ`を採業もいては里討
C 書のところパ`サ`は咾が、卆隼和返くそ
秘
¢ Composer でgに firmata プロジェクト恬れる
しかし、卆贋の PHPMakeSerialPort はモジュ`ル
なのでこれを枠に返咾妊ぅ鵐好肌`ルする駅勣がある
C ちなみに、枠に貧げた carica-firmata もシリアル宥佚何蛍に
PHPMakeSerialPort がインスト`ルされていれば聞うように
なっています
¢ PHPMakeFirmata のインスト`ルについては
http://sandbox.n-3.so/Gorilla/download/
を歌孚してください
¢ ArduinoにStandardFirmataをきzむ駅勣があります
http://qiita.com/oasynnoum@github/items/91aed30
9bd9de8af8d0a
を歌孚してください
LEDを泣腓気擦茲(Lチカ)
¢ 勣s
C Device のインスタンスを恬って、 digitalWrite() をコ`ル
C http://qiita.com/oasynnoum@github/items/91aed309bd9de8af8d0a
<?php
require dirname(__FILE__) . '/vendor/autoload.php';
/* initialize the device */
$device = new PHPMakeFirmataDevice('/dev/ttyACM0');
/* for Windows */
// $device = new PHPMakeFirmataDevice('COM3');
$pin = 13;
for ($i = 0; $i < 3; ++$i) {
$device->digitalWrite($pin, PHPMakeFirmata::HIGH); // light
sleep(1);
$device->digitalWrite($pin, PHPMakeFirmata::LOW); // unlight
sleep(1);
}
デジタル秘薦をiむ
¢ コ`ドは富しLいので福きました
C http://qiita.com/oasynnoum@github/items/cd9f90cfec8c0
18a47c6
を歌孚してください
¢ $dev->setPinMode(13, PHPMakeFirmata::INPUT);
¢ Oしたいピンを reportDigitalPin() で峺協する
C 念峰のとおり、プロトコル徭悶はポ`トg了でO?宥岑を佩
うがフレ`ムワ`クがそこをL盈しピンg了でのO?宥岑を
佩う
¢ PinObserver をg廾し、そのインスタンスを Device に
addDigitalPinObserver() で局す
C ピン篁宥岑を notify() で鞭け函る
デジタル秘薦をiむ
¢ デバイスから僕られる宥岑を函誼するため、
なるべく玉いrgg侯でバッファを_Jする駅勣がある
(ポ`リング)
C このポ`リングの並をデバイスル`プと柵んでます
C デバイスル`プに秘るには Device の
run() メソッドをコ`ルします
¢ 哈方については瘁峰
¢ デバイスル`プに秘るとI尖はそこでブロックされる
C run() 柵び竃しの瘁にAくコ`ドブロックがg佩されるのはデ
バイスル`プがK阻したあと
C このままだとフレ`ムワ`クユ`ザ`は採も竃栖ない
デジタル秘薦をiむ
¢ LoopDelegate
C デバイスル`プ參週採も竃栖なくなることを指閲するため喘
吭されたインタ`フェ`ス
C このインスタンスを run() の哈方に局す
C LoopDelegate の tick() メソッドはそのル`プのg侯ごとに
コ`ルされます
C getInterval() メソッドはル`プのg侯を協xします
¢ デバイスル`プがg佩される恷兜にだけ Device 坪何でコ`ルさ
れます
¢ デバイスル`プを峭めるには Device の stop() をコ`
ルします
C 灸侏議には tick() 坪から stop() とか
アナログ秘薦をiむ
¢ デジタル秘薦とほぼ揖じです
¢ ただし、 PinObserver のインスタンスは
addAnalogPinObserver() メソッドで Device に局
します
¢ $dev->setPinMode(13, PHPMakeFirmata::ANALOG);
PWM(アナログ竃薦)
¢ $dev->setPinMode(13, PHPMakeFirmata::PWM);
¢ Device の analogWrite() をコ`ルします
¢ 及匯哈方はピン、及屈哈方は
¢ 及屈哈方の、里箸蟲辰觜譴 0~貧
¢ 貧泙魯妊丱ぅ后▲團鵑砲茲螫なる
¢ Capability により協xされている
C $capability = $dev->getPin(13)->getCapability();
$pwmResolution = $capability->getResolutionPWM();
デモ1
¢ firmata-websocket-taste
C https://github.com/PHPMake/firmata-websocket-taste
C Taste は test のタイポ。
中易いと房ったのでそのままにしています。
¢ firmata.org が戻工しているテストGUIアプリがUbuntuで咾な
かったため恬った
¢ バグっぽいです
¢ Onsenui で恬った
C http://onsenui.io/
¢ Onsenui は殆這らしい。
このデモがバグっぽいのはg廾宀のせい
¢ ピンモ`ドを笋┐蕕譴襪茲Δ砲繁爾辰謄札哀瓮鵐肇灰鵐肇踪`ルをつ
けましたが、書のところg廾していません
デモ2
¢ firmata-space-travel
C https://github.com/PHPMake/firmata-space-travel
¢ Arduino でしょぼい嚴帑巻崙囮コンソ`ル
¢ phoria.js でなんちゃって湊狼
C http://www.kevs3d.co.uk/dev/phoria/
C phoria.js はくない。いのはg廾宀の欄
PHPMakeFirmata のn}
¢ firmata のメリットはそのままにデメリットをpじたい
C デメリット
¢ ホストとデバイスはケ`ブルで、る駅勣がある
¢ ホストがoいと採も竃栖ない
C 噸宥に Wiring 聞えば燭箸いΔ里oし
¢ 鯵はぺちぱ`だ
¢ Wiring(Arduinoの_k冱Zというかフレ`ムワ`ク)
¢ ドキュメントがoい
C 賦しU殻業の Janglish でかれた phpdoc オンリ`
歌深Y創
¢ firmata.org
C http://firmata.org/wiki/Main_Page
¢ firmata/arduino
C https://github.com/firmata/arduino
¢ Arduino Uno/Leonardo で兵める徨垢恬
C http://www.amazon.co.jp/dp/4877832963

More Related Content

Arduino を PHP で崙囮する