In questo articolo vediamo come far interagire Arduino e PHP tramite USB su Ubuntu.
La prima cosa che dobbiamo fare è scaricare la seguente classe PHP per poter comunicare tramite seriale con Arduino:
Fatto questo dobbiamo dare i permessi ad Apache per poter dialogare tramite USB con Arduino, altrimenti Linux ci blocca, quindi apriamo semplicemente il terminale e digitiamo il seguente comando:
sudo adduser www-data dialout
desso vediamo come accendere e spegnere il LED collegato al pin 13 su Arduino.
<?php require_once "php_serial.class.php"; $serial = new phpSerial(); $serial->deviceSet( "/dev/ttyUSB0" ); $serial->confBaudRate(9600); //Baud rate: 9600 $serial->confParity( "none" ); //Parity (this is the "N" in "8-N-1") $serial->confCharacterLength( 8 ); //Character length (this is the "8" in "8-N-1") $serial->confStopBits( 1 ); //Stop bits (this is the "1" in "8-N-1") $serial->confFlowControl( "none" ); if ( ! $serial->deviceOpen() ) { exit ( "Connessione ad Arduino fallita!" ); } if ( isset($_REQUEST) ) { $command = $_REQUEST; $serial->sendMessage( $command ); } else { $serial->sendMessage( 'x' ); } $lettura_dati = $serial->readPort(); $serial->deviceClose(); ?> <!DOCTYPE HTML> <html> <head> <title>Arduino: Controllo LED</title> <meta charset="utf-8" /> </head> <body style="text-align:center;"> <span style="font-size:1.5em;"> ARDUINO - COMUNICAZIONE CON PHP TRAMITE SERIALE-USB </span> <div> <?php if ($lettura_dati == "s") print "<a href=\"index.php?command=l\" style=\"border:0px;\"> <button style=\"width:150px; height:150px; font-size:1.5em;\">Accendi LED</button> </a>"; if ($lettura_dati == "a") print "<a href=\"index.php?command=l\" style=\"border:0px;\"> <button style=\"width:150px; height:150px; font-size:1.5em;\">Spegni LED</button> </a>"; ?> </div> </body> </html>
vediamo di capire quello che abbiamo fatto:
la riga: $serial->deviceSet( “/dev/ttyUSB0” );
– serve per indicare su quale porta è connesso Arduino, nel mio caso è “/dev/ttyUSB0”
la riga: $serial->confBaudRate( 9600 );
– serve per impostare la velocità di trasmissione sulla seriale, è la stessa cosa di quando impostiamo Serial.begin( 9600 ) su Arduino.
la riga: $serial->confParity( “none” );
– serve per impostare il bit di parità
la riga: $serial->confCharacterLength( 8 );
– serve ad indicare la lunghezza del carattere
la riga: $serial->confStopBits( 1 );
– serve ad indicare la fine del carattere
la riga: $serial->confFlowControl( “none” );
– serve ad impostare un flusso di controllo XON/XOFF
la riga: $serial->deviceOpen();
– serve per connetterci ad Arduino, in caso di problemi restituisce un FALSE così possiamo anche controllare se la connessione è avvenuta con successo o meno
la riga: $serial->sendMessage( ‘x’ );
– serve per inviare un comando ad Arduino
la riga: $lettura_dati = $serial->readPort();
– serve per leggere i comandi che riceviamo da Arduino
la riga: $serial->deviceClose();
– serve per chiudere la connessione che abbiamo stabilito in precedenza.
successivamente facciamo un controllo sui dati ricevuti da Arduino salvati nella variabile $lettura_dati, quindi se riceviamo ‘s’ vuol dire che il LED è spento e stampiamo un bottone con su scritto “Accendi LED” se invece riceviamo ‘a’ vuol dire che il LED è accesso e di conseguenza stampiamo un bottone con su scritto “Spegni LED”.
Questo è invece lo sketch da caricare su Arduino:
#define led 13 // led connesso al pin n°13 char rx = 0; // variabile per contenere il carattere ricevuto void setup() { // imposto la UART per lavorare a 9600 Serial.begin( 9600 ); // imposto il pin sul quale è collegato il led come uscit, che in questo caso è quello integrato su Arduino pinMode( led, OUTPUT ); // svuoto il buffer di ricezione seriale Serial.flush(); Serial.println( " - COMUNICAZIONE CON PHP TRAMITE SERIALE_USB" ); } void loop() { if(Serial.available() > 0) { // leggo il carattere ricevuto e lo memorizzo in rx rx = Serial.read(); // svuoto il buffer di ricezione seriale Serial.flush(); // ho ricevuto la l che sta per LED if ( rx == 'l' ) { // il led era acceso? if (digitalRead( led ) == HIGH) { // lo spengo digitalWrite( led, LOW ); Serial.print( 's' ); } //il led era spento else { digital.write( led, HIGH ); // lo accendo Serial.print( 'a' ); } } // non ho ricevuto la L if (rx == 'x') { // il led è acceso? if (digitalRead( led ) == HIGH) { Serial.print( 'a' ); } // il led é spento else { Serial.print( 's' ); } } } }
Adesso dovreste esser in grado di comunicare con Arduino tramite PHP.
Ciao e alla prossima.
Ciao volevo chiederti per “parlare” con più arduino cosa dovrei fare? Potrei inviare una stringa composta da 3 caratteri iniziali che identificano l’arduino interessato, e poi da codice interpretare il tutto? Come hai fatto tu la comunicazione, in pratica è un broadcast o no? O sto sbagliando tutto?
Ciao Enrico,
in realtà dipende dal progetto, niente è sbagliato e niente è giusto 🙂
Se tu farai solo poche chiamate in un periodo abbastanza grande allora solo per sperimentare può andare benissimo.
Saluti
Antonino