Thanks to visit codestin.com
Credit goes to www.slideshare.net

FrOSCon 2013
Controlling Arduino With PHP
About Me
● Thomas Weinert
– @ThomasWeinert
● papaya Software GmbH
– papaya CMS
● PHP, Javascript, XSLT
● XML Fanatic (JSON is BAD)
Arduino
Arduino Mega
Arduino Nano
Arduino Nano Breadboard
Arduino Nano Breakout
Arduino IDE
Firmata
● MIDI Based
● Serial Port
– Forks for TCP
● http://firmata.org
Non-Blocking I/O
● Event Loop
● Event Emitter
● Promises
Event Loop
Listeners
Loop
External
Process
External
Process
File
Event Loop
● Timeouts
● Intervals
● Stream Listeners
● Implementations
– StreamSelect
– LibEvent
– MySQLi
Browser Example
var e = document.getElementById('output');
var counter = 0;
var interval = window.setInterval(
function() {
e.textContent =
e.textContent +
counter.toString() +
', ';
counter++;
},
1000
);
Event Emitter
Object
Event
Callback
Callback
Event
Callback
Event Event
● Attach
● on(), once()
● Trigger
● emit()
Event Emitter Example
$stream = new StreamFile('c:/tmp/sample.txt');
$stream->events()->on(
'read-data',
function($data) {
echo $data;
}
);
$stream->events()->on(
'error',
function($error) use ($loop) {
echo $error;
$loop->stop();
}
);
Promises
● Asynchronous Condition
● Attach Callbacks
– done()
– fail()
– always()
● Change Status
– reject()
– resolve()
jQuery Example
jQuery(
function () {
jQuery
.get('hello-world.xml')
.done(
function (xml) {
$('#output').text(
$('data', xml).text()
);
}
);
}
);
Carica Projects
● Carica I/O
– https://bitbucket.org/ThomasWeinert/carica-io
● Carica Firmata
– https://bitbucket.org/ThomasWeinert/carica-firmata
● Carica Chip
– https://bitbucket.org/ThomasWeinert/carica-chip
Carica I/O
● Event Loop
– CaricaIoEventLoop
● Event Emitter
– CaricaIoEventEmitter
● Promises
– CaricaIoDeferred
– CaricaIoDeferredPromise
Timers
$loop = LoopFactory::get();
$i = 0;
$loop->setInterval(
function () use (&$i) {
echo $i++;
},
1000
);
$loop->setTimeout(
function () use ($loop) {
$loop->stop();
},
10000
);
$loop->run();
Asynchronous MySQL
$mysqlOne = new IoDeferredMySQL(
new mysqli('localhost')
);
$mysqlTwo = new IoDeferredMySQL(
new mysqli('localhost')
);
$time = microtime(TRUE);
$debug = function($result) use ($time) {
var_dump(iterator_to_array($result));
var_dump(microtime(TRUE) - $time);
};
$queries = IoDeferred::When(
$mysqlOne("SELECT 'Query 1', SLEEP(5)")
->done($debug),
$mysqlTwo("SELECT 'Query 2', SLEEP(1)")
->done($debug)
);
IoEventLoopFactory::run($queries);
Asynchronous MySQL
HTTP Server
Why?
HTTP Server
● PHP Daemons
– Single process for all pequests
– Share variables
Carica HTTP Server
<?php
include(__DIR__.'/../../src/Carica/Io/Loader.php');
CaricaIoLoader::register();
use CaricaIoNetworkHttp;
$route = new CaricaIoNetworkHttpRoute();
$route->startsWith(
'/files', new HttpRouteFile(__DIR__)
);
$server = new CaricaIoNetworkHttpServer($route);
$server->listen(8080);
CaricaIoEventLoopFactory::run();
Carica Firmata
Carica Firmata Board
<?php
$board = new FirmataBoard(
new IoStreamSerial(
CARICA_FIRMATA_SERIAL_DEVICE,
CARICA_FIRMATA_SERIAL_BAUD
)
);
$board
->activate()
->done(
function () use ($board) { ... }
);
CaricaIoEventLoopFactory::run();
Carica Firmata Pins
function () use ($board) {
$buttonPin = 2;
$ledPin = 13;
$board->pins[$buttonPin]->mode = FirmataPIN_STATE_INPUT;
$board->pins[$ledPin]->mode = FirmataPIN_STATE_OUTPUT;
$board->digitalRead(
$buttonPin,
function($value) use ($board, $ledPin) {
$board->pins[$ledPin]->digital =
$value == FirmataDIGITAL_HIGH;
}
);
}
Example: Blink
function () use ($board, $loop) {
$led = 9;
$board->pinMode($led, FirmataPIN_STATE_OUTPUT);
$loop->setInterval(
function () use ($board, $led) {
static $ledOn = TRUE;
echo 'LED: '.($ledOn ? 'on' : 'off')."n";
$board->digitalWrite(
$led,
$ledOn
? FirmataDIGITAL_HIGH : FirmataDIGITAL_LOW
);
$ledOn = !$ledOn;
},
1000
);
}
RGB Wheel
Carica Chip
● Hardware Abstraction
● Device Objects
LED
function () use ($board) {
$led = new CaricaChipLed($board, 9);
$led->blink();
}
RGB LED
function () use ($board) {
$colors = array('#F00', '#0F0', '#00F');
$led = new CaricaChipLedRgb($board, 10, 11, 9);
$led->setColor('#000');
$index = 0;
$next = function() use ($led, $colors, &$index, &$next) {
if (isset($colors[$index])) {
$color = $colors[$index];
$led->fadeTo($color)->done($next);
}
if (++$index >= count($colors)) {
$index = 0;
}
};
$next();
}
Servo
function () use ($board, $loop) {
$positions = array(
0, 45, 90, 180
);
$servo = new CaricaChipServo($board, 7, -180);
$index = 0;
$loop->setInterval(
$next = function () use ($servo, $positions, &$index) {
if (isset($positions[$index])) {
$position = $positions[$index];
$servo->moveTo($position);
echo $position, " Grad , ", $servo->getPosition(), " Gradn";
}
if (++$index >= count($positions)) {
$index = 0;
}
},
2000
);
$next();
}
Analog Sensor
function () use ($board) {
$sensor = new CaricaChipSensorAnalog($board, 14);
$sensor->onChange(
function ($sensor) {
echo $sensor, "n";
}
);
}
Thank You
● Questions?
● Twitter: @ThomasWeinert
● Blog: http://a-basketful-of-papayas.net

Controlling Arduino With PHP

  • 1.
  • 2.
    About Me ● ThomasWeinert – @ThomasWeinert ● papaya Software GmbH – papaya CMS ● PHP, Javascript, XSLT ● XML Fanatic (JSON is BAD)
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
    Firmata ● MIDI Based ●Serial Port – Forks for TCP ● http://firmata.org
  • 10.
    Non-Blocking I/O ● EventLoop ● Event Emitter ● Promises
  • 11.
  • 12.
    Event Loop ● Timeouts ●Intervals ● Stream Listeners ● Implementations – StreamSelect – LibEvent – MySQLi
  • 13.
    Browser Example var e= document.getElementById('output'); var counter = 0; var interval = window.setInterval( function() { e.textContent = e.textContent + counter.toString() + ', '; counter++; }, 1000 );
  • 14.
  • 15.
    Event Emitter Example $stream= new StreamFile('c:/tmp/sample.txt'); $stream->events()->on( 'read-data', function($data) { echo $data; } ); $stream->events()->on( 'error', function($error) use ($loop) { echo $error; $loop->stop(); } );
  • 16.
    Promises ● Asynchronous Condition ●Attach Callbacks – done() – fail() – always() ● Change Status – reject() – resolve()
  • 17.
    jQuery Example jQuery( function (){ jQuery .get('hello-world.xml') .done( function (xml) { $('#output').text( $('data', xml).text() ); } ); } );
  • 18.
    Carica Projects ● CaricaI/O – https://bitbucket.org/ThomasWeinert/carica-io ● Carica Firmata – https://bitbucket.org/ThomasWeinert/carica-firmata ● Carica Chip – https://bitbucket.org/ThomasWeinert/carica-chip
  • 19.
    Carica I/O ● EventLoop – CaricaIoEventLoop ● Event Emitter – CaricaIoEventEmitter ● Promises – CaricaIoDeferred – CaricaIoDeferredPromise
  • 20.
    Timers $loop = LoopFactory::get(); $i= 0; $loop->setInterval( function () use (&$i) { echo $i++; }, 1000 ); $loop->setTimeout( function () use ($loop) { $loop->stop(); }, 10000 ); $loop->run();
  • 21.
    Asynchronous MySQL $mysqlOne =new IoDeferredMySQL( new mysqli('localhost') ); $mysqlTwo = new IoDeferredMySQL( new mysqli('localhost') ); $time = microtime(TRUE); $debug = function($result) use ($time) { var_dump(iterator_to_array($result)); var_dump(microtime(TRUE) - $time); }; $queries = IoDeferred::When( $mysqlOne("SELECT 'Query 1', SLEEP(5)") ->done($debug), $mysqlTwo("SELECT 'Query 2', SLEEP(1)") ->done($debug) ); IoEventLoopFactory::run($queries);
  • 22.
  • 23.
  • 24.
    HTTP Server ● PHPDaemons – Single process for all pequests – Share variables
  • 25.
    Carica HTTP Server <?php include(__DIR__.'/../../src/Carica/Io/Loader.php'); CaricaIoLoader::register(); useCaricaIoNetworkHttp; $route = new CaricaIoNetworkHttpRoute(); $route->startsWith( '/files', new HttpRouteFile(__DIR__) ); $server = new CaricaIoNetworkHttpServer($route); $server->listen(8080); CaricaIoEventLoopFactory::run();
  • 26.
  • 27.
    Carica Firmata Board <?php $board= new FirmataBoard( new IoStreamSerial( CARICA_FIRMATA_SERIAL_DEVICE, CARICA_FIRMATA_SERIAL_BAUD ) ); $board ->activate() ->done( function () use ($board) { ... } ); CaricaIoEventLoopFactory::run();
  • 28.
    Carica Firmata Pins function() use ($board) { $buttonPin = 2; $ledPin = 13; $board->pins[$buttonPin]->mode = FirmataPIN_STATE_INPUT; $board->pins[$ledPin]->mode = FirmataPIN_STATE_OUTPUT; $board->digitalRead( $buttonPin, function($value) use ($board, $ledPin) { $board->pins[$ledPin]->digital = $value == FirmataDIGITAL_HIGH; } ); }
  • 29.
    Example: Blink function ()use ($board, $loop) { $led = 9; $board->pinMode($led, FirmataPIN_STATE_OUTPUT); $loop->setInterval( function () use ($board, $led) { static $ledOn = TRUE; echo 'LED: '.($ledOn ? 'on' : 'off')."n"; $board->digitalWrite( $led, $ledOn ? FirmataDIGITAL_HIGH : FirmataDIGITAL_LOW ); $ledOn = !$ledOn; }, 1000 ); }
  • 30.
  • 31.
    Carica Chip ● HardwareAbstraction ● Device Objects
  • 32.
    LED function () use($board) { $led = new CaricaChipLed($board, 9); $led->blink(); }
  • 33.
    RGB LED function ()use ($board) { $colors = array('#F00', '#0F0', '#00F'); $led = new CaricaChipLedRgb($board, 10, 11, 9); $led->setColor('#000'); $index = 0; $next = function() use ($led, $colors, &$index, &$next) { if (isset($colors[$index])) { $color = $colors[$index]; $led->fadeTo($color)->done($next); } if (++$index >= count($colors)) { $index = 0; } }; $next(); }
  • 34.
    Servo function () use($board, $loop) { $positions = array( 0, 45, 90, 180 ); $servo = new CaricaChipServo($board, 7, -180); $index = 0; $loop->setInterval( $next = function () use ($servo, $positions, &$index) { if (isset($positions[$index])) { $position = $positions[$index]; $servo->moveTo($position); echo $position, " Grad , ", $servo->getPosition(), " Gradn"; } if (++$index >= count($positions)) { $index = 0; } }, 2000 ); $next(); }
  • 35.
    Analog Sensor function ()use ($board) { $sensor = new CaricaChipSensorAnalog($board, 14); $sensor->onChange( function ($sensor) { echo $sensor, "n"; } ); }
  • 36.
    Thank You ● Questions? ●Twitter: @ThomasWeinert ● Blog: http://a-basketful-of-papayas.net