ARDUINO WITH PHP CONNECTIONS TO THE PHYSICAL WORLD Createdby /ThomasWeinert @ThomasWeinert
ARDUINO Arduino is an open-source electronics prototyping platformbased on flexible, easy-to- use hardware and software. It's intended for artists, designers, hobbyists and anyone interested in creating interactive objects or environments.
ARDUINO UNO
ARDUINO MEGA
SHIELDS HTTP://SHIELDLIST.ORG/
NETWORK
PROTOTYPE
MOTOR
ARDUINO NANO
NANO ON BREADBOARD
NANO ON BASE
BREADBOARD
BREADBOARD HALFSIZE
BREADBOARD SCHEMA
BREADBOARD IN USE
BREADBOARD IN USE
FRITZING http://fritzing.org 11 55 1010 1515 2020 2525 3030 A A B B C C D D E E F F G G H H I I J J
ARDUINO IDE
FIRMATA
FIRMATA PROTOCOL MidiBased Pin Status Pin Manipulation Extended Commands
FIRMATA TEST
FIRMATA TEST PHP
PHP - SERIAL PORTS + Just streams - Consolecommands for configuration
WINDOWS - fread() blocks until it gets data.
SERPROXY
CARICA CHIP $led=newCaricaChipLed($board->pins[13]); $led->strobe()->on();
CARICA CHIP $led=newCaricaChipLed($board->pins[13]); $led->pulse()->on();
CARICA CHIP $led=newCaricaChipLed($board->pins[13]); $led->brightness(0.5)->pulse()->on();
CARICA FIRMATA $board ->activate() ->done( function()use($board){ $led=newCaricaChipLed($board->pins[13]); $led->strobe()->on(); } ); CaricaIoEventLoopFactory::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=CaricaFirmataPin::MODE_OUTPUT; while(TRUE){ $board->pins[13]->digital=!$board->pins[13]->digital; sleep(1); }
BLINK NONBLOCKING $loop=IoEventLoopFactory::get(); $board ->activate() ->done( function()use($board,$loop){ $pin=$board->pins[13]; $pin->mode=FirmataPin::MODE_OUTPUT; $loop->setInterval( function()use($pin){ $pin->digital=!$pin->digital; }, 1000 ); } ); $loop->run();
CARICA IO EventLoop EventEmitter Promises
EVENT LOOP
JAVASCRIPT EXAMPLE vare=document.getElementById('output'); varcounter=0; varinterval=window.setInterval( function(){ e.textContent=e.textContent+counter.toString()+','; counter++; }, 1000 );
PHP EXAMPLE $loop=CaricaIoEventLoopFactory::get(); $loop->setInterval( function(){ static$i=0; echo$i++; }, 1000 ); $loop->run();
PROMISES They describe an objectthatacts as aproxy for a resultthatis initially unknown, usually because the computation of its value is yetincomplete.
JAVASCRIPT EXAMPLE jQuery .get('hello-world.xml') .done( function(xml){ alert('loaded.'); } ) );
PHP EXAMPLE $mysqlOne=newCaricaIoDeferredMySQL(newmysqli('localhost')); $mysqlTwo=newCaricaIoDeferredMySQL(newmysqli('localhost')); $time=microtime(TRUE); $debug=function($result)use($time){ var_dump(iterator_to_array($result)); var_dump(microtime(TRUE)-$time); }; $queries=CaricaIoDeferred::When( $mysqlOne("SELECT'Query1',SLEEP(5)") ->done($debug), $mysqlTwo("SELECT'Query2',SLEEP(1)") ->done($debug) ); CaricaIoEventLoopFactory::run($queries);
EVENT EMITTER $stream=newStreamFile('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
HTTPSERVER useCaricaIoNetworkHttp; $route=newHttpRoute(); $route->match( '/hello/{name}', function(HttpRequest$request,$parameters){ $response=$request->createResponse( newHttpResponseContentString( "Hello".$parameters['name']."!n" ) ); return$response; } );
FILES $route->match('/hello',newHttpRouteFile(__DIR__.'/files/hello.html')); $route->startsWith('/files',newHttpRouteDirectory(__DIR__)); $server=newCaricaIoNetworkHttpServer($route); $server->listen(8080);
INTERACTIVE LED
HTML FILE <!DOCTYPEhtml> <html> <head> <title>LedSwitch</title> </head> <body> <formaction="./switch/on"target="iframe"> <buttontype="submit">On</button> </form> <formaction="./switch/off"target="iframe"> <buttontype="submit">Off</button> </form> <iframestyle="width:200px;height:40px;border:none;"src="about:blank"name="ifram </body> </html>
PHP SERVER useCaricaIoNetworkHttp; $board ->activate() ->done( function()use($board){ $led=newCaricaChipLed($board->pins[20]); $route=newHttpRoute(); $route->match( '/switch/{state}', function(HttpRequest$request,array$parameters)use($led){ if($parameters['state']=='on'){ $led->on(); $message='ON'; }else{ $led->off(); $message='OFF'; } $response=$request->createResponse(); $response->content=newHttpResponseContentString( $message,'text/plain;charset=utf-8' ); return$response; } ); $route->match('/',newCaricaIoNetworkHttpRouteFile(__DIR__.'/index.html')); $server=newCaricaIoNetworkHttpServer($route);
COLOR CIRCLE
SERVER function()use($board){ $led=newCaricaChipRgbLed( $board->pins[3],$board->pins[5],$board->pins[6] ); $route=newCaricaIoNetworkHttpRoute(); $route->match( '/rgb', function(HttpRequest$request)use($led){ $color=isset($request->query['color']) ?$request->query['color']:'#000'; $led->color($color)->on(); $response=$request->createResponse(); $response->content=newHttpResponseContentString( 'Color:'.$color ); return$response; } ); $route->startsWith('/files',newHttpRouteDirectory(__DIR__)); $route->match('/',newHttpRouteFile(__DIR__.'/index.html')); $server=newCaricaIoNetworkHttpServer($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 CREATE composercreate-projectcarica/chip-skeletonled--stability=dev
COMPOSER CREATE
CONFIGURE BOOTSTRAP /** *serial-serialconnection *tcp-tcpconnection(networkshieldorserproxy) */ 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'); useCaricaChipasChip; $board ->activate() ->done( function()use($board){ //Starthere! } ); CaricaIoEventLoopFactory::run();
LED OBJECT $board=include(__DIR__.'/bootstrap.php'); useCaricaChipasChip; $board ->activate() ->done( function()use($board){ $led=newChipLed($board->pins[13]); $led->strobe(2000)->on(); } ); CaricaIoEventLoopFactory::run();
THANKS

PHPUG CGN: Controlling Arduino With PHP