Arduino e PHP: comunicazione seriale tramite USB

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:

php_serial_class.php

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.

2 Risposte a “Arduino e PHP: comunicazione seriale tramite USB”

  1. 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?

    1. 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

I commenti sono chiusi.