PHPUG CGN: Controlling Arduino With PHP

Post on 14-Jun-2015

512 views 0 download

Transcript of PHPUG CGN: Controlling Arduino With PHP

ARDUINO WITH PHPCONNECTIONS TO THE PHYSICAL WORLD

Created by / Thomas Weinert @ThomasWeinert

ARDUINOArduino is an open-source electronicsprototyping platform based on flexible, easy-to-use hardware and software. It's intended forartists, designers, hobbyists and anyoneinterested in creating interactive objects orenvironments.

ARDUINO UNO

ARDUINO MEGA

SHIELDSHTTP://SHIELDLIST.ORG/

NETWORK

PROTOTYPE

MOTOR

ARDUINO NANO

NANO ON BREADBOARD

NANO ON BASE

BREADBOARD

BREADBOARD HALFSIZE

BREADBOARD SCHEMA

BREADBOARD IN USE

BREADBOARD IN USE

FRITZINGhttp://fritzing.org

11

55

10

10

15

15

20

20

25

25

30

30

AA

BB

CC

DD

EE

FF

GG

HH

II

JJ

ARDUINO IDE

FIRMATA

FIRMATA PROTOCOLMidi BasedPin StatusPin ManipulationExtended Commands

FIRMATA TEST

FIRMATA TEST PHP

PHP - SERIAL PORTS+ Just streams- Console commands for configuration

WINDOWS- fread() blocks until it gets data.

SERPROXY

CARICA CHIP$led = new Carica\Chip\Led($board->pins[13]);$led->strobe()->on();

CARICA CHIP$led = new Carica\Chip\Led($board->pins[13]);$led->pulse()->on();

CARICA CHIP$led = new Carica\Chip\Led($board->pins[13]);$led->brightness(0.5)->pulse()->on();

CARICA FIRMATA$board ->activate() ->done( function () use ($board) { $led = new Carica\Chip\Led($board->pins[13]); $led->strobe()->on(); } );

Carica\Io\Event\Loop\Factory::run();

BASIC BLINK$board->pinMode(13, 0x01);while (TRUE) { $board->digitalWrite(13, 0xFF); sleep(1); $board->digitalWrite(13, 0x00); sleep(1);}

BASIC BLINK OOP$board->pins[13]->mode = Carica\Firmata\Pin::MODE_OUTPUT;while (TRUE) { $board->pins[13]->digital = !$board->pins[13]->digital; sleep(1);}

BLINK NONBLOCKING$loop = Io\Event\Loop\Factory::get();$board ->activate() ->done( function () use ($board, $loop) { $pin = $board->pins[13]; $pin->mode = Firmata\Pin::MODE_OUTPUT; $loop->setInterval( function () use ($pin) { $pin->digital = !$pin->digital; }, 1000 ); } );$loop->run();

CARICA IOEvent LoopEvent EmitterPromises

EVENT LOOP

JAVASCRIPT EXAMPLEvar e = document.getElementById('output');var counter = 0;var interval = window.setInterval( function() { e.textContent = e.textContent + counter.toString() + ', '; counter++; }, 1000);

PHP EXAMPLE$loop = Carica\Io\Event\Loop\Factory::get();$loop->setInterval( function () { static $i = 0; echo $i++; }, 1000);$loop->run();

PROMISESThey describe an object that acts as a proxy for aresult that is initially unknown, usually becausethe computation of its value is yet incomplete.

JAVASCRIPT EXAMPLEjQuery .get('hello-world.xml') .done( function (xml) { alert('loaded.'); } ));

PHP EXAMPLE$mysqlOne = new Carica\Io\Deferred\MySQL(new mysqli('localhost'));$mysqlTwo = new Carica\Io\Deferred\MySQL(new mysqli('localhost'));$time = microtime(TRUE);$debug = function($result) use ($time) { var_dump(iterator_to_array($result)); var_dump(microtime(TRUE) - $time);};$queries = Carica\Io\Deferred::When( $mysqlOne("SELECT 'Query 1', SLEEP(5)") ->done($debug), $mysqlTwo("SELECT 'Query 2', SLEEP(1)") ->done($debug));Carica\Io\Event\Loop\Factory::run($queries);

EVENT EMITTER$stream = new Stream\File('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(); });

INTERACTION

HTTPSERVERuse Carica\Io\Network\Http;

$route = new Http\Route();$route->match( '/hello/{name}', function (Http\Request $request, $parameters) { $response = $request->createResponse( new Http\Response\Content\String( "Hello ".$parameters['name']."!\n" ) ); return $response; });

FILES$route->match('/hello', new Http\Route\File(__DIR__.'/files/hello.html'));$route->startsWith('/files', new Http\Route\Directory(__DIR__));

$server = new Carica\Io\Network\Http\Server($route);$server->listen(8080);

INTERACTIVE LED

HTML FILE<!DOCTYPE html><html> <head> <title>Led Switch</title> </head> <body> <form action="./switch/on" target="iframe"> <button type="submit">On</button> </form> <form action="./switch/off" target="iframe"> <button type="submit">Off</button> </form> <iframe style="width: 200px; height: 40px; border: none;" src="about:blank" name="iframe" </body></html>

PHP SERVERuse Carica\Io\Network\Http;

$board ->activate() ->done( function () use ($board) { $led = new Carica\Chip\Led($board->pins[20]);

$route = new Http\Route(); $route->match( '/switch/{state}', function (Http\Request $request, array $parameters) use ($led) { if ($parameters['state'] == 'on') { $led->on(); $message = 'ON'; } else { $led->off(); $message = 'OFF'; } $response = $request->createResponse(); $response->content = new Http\Response\Content\String( $message, 'text/plain; charset=utf-8' ); return $response; } ); $route->match('/', new \Carica\Io\Network\Http\Route\File(__DIR__.'/index.html'));

$server = new Carica\Io\Network\Http\Server($route);

COLOR CIRCLE

SERVERfunction () use ($board) { $led = new Carica\Chip\Rgb\Led( $board->pins[3], $board->pins[5], $board->pins[6] ); $route = new Carica\Io\Network\Http\Route(); $route->match( '/rgb', function (Http\Request $request) use ($led) { $color = isset($request->query['color']) ? $request->query['color'] : '#000'; $led->color($color)->on(); $response = $request->createResponse(); $response->content = new Http\Response\Content\String( 'Color: '.$color ); return $response; } ); $route->startsWith('/files', new Http\Route\Directory(__DIR__)); $route->match('/', new Http\Route\File(__DIR__.'/index.html'));

$server = new Carica\Io\Network\Http\Server($route); $server->listen(8080);}

REACTPHP{ "require": { "react/react": "0.4.*" }}

RATCHET{ "require": { "cboden/ratchet": "0.3.*" }}

SENSOR PHALANX

1:07

SHIFTOUT()

SHIFTOUT()$loop->setInterval( function () use ($board, $latchPin, $clockPin, $dataPin) { static $number = 0; $latchPin->digital = FALSE; $board->shiftOut($dataPin->pin, $clockPin->pin, $number); $latchPin->digital = TRUE; if (++$number > 255) { $number = 0; } }, 1000);

SHIFTOUT()

0:15

7 SEGMENT DISPLAYS

7 SEGMENT DISPLAYS$loop->setInterval( function () use ( $board, $latchPin, $clockPin, $dataPin, $numbers, $segments ) { static $number = 0; $digits = str_pad($number, $segments, 0, STR_PAD_LEFT); $bytes = []; for ($i = strlen($digits) - 1; $i >= 0; $i--) { $bytes[] = 0xFF ̂ (int)$numbers[$digits[$i]]; } $latchPin->digital = FALSE; $board->shiftOut( $dataPin->pin, $clockPin->pin, $bytes ); $latchPin->digital = TRUE; if (++$number > (pow(10, $segments) - 1)) { $number = 0; } }, 100);

7SEG DISPLAYS

0:05

FIRST PROJECT

COMPOSER CREATEcomposer create-project carica/chip-skeleton led --stability=dev

COMPOSER CREATE

CONFIGURE BOOTSTRAP/** * serial - serial connection * tcp - tcp connection (network shield or serproxy) */define('CARICA_FIRMATA_MODE', 'serial');

define('CARICA_FIRMATA_SERIAL_DEVICE', '/dev/tty0');define('CARICA_FIRMATA_SERIAL_BAUD', 57600);

define('CARICA_FIRMATA_TCP_SERVER', '127.0.0.1');define('CARICA_FIRMATA_TCP_PORT', 5339);

SKELETON$board = include(__DIR__.'/bootstrap.php');

use Carica\Chip as Chip;

$board ->activate() ->done( function () use ($board) { // Start here! } );

Carica\Io\Event\Loop\Factory::run();

LED OBJECT$board = include(__DIR__.'/bootstrap.php');

use Carica\Chip as Chip;

$board ->activate() ->done( function () use ($board) { $led = new Chip\Led($board->pins[13]); $led->strobe(2000)->on(); } );

Carica\Io\Event\Loop\Factory::run();

THANKS