-----------------------------------------------------------------------------------------------------------
Prima di tutto, bisogna aggiungere l'utente sotto il quale gira il demone http predefinito (Apache), al gruppo dialout; diversamente, dalla pagina web non sarà possibile accedere ad Arduino.
Infatti solo gli utenti di questo gruppo hanno il diritto di accedere alle periferiche.
Nel caso di Ubuntu l'utente di Apache è www-data , quindi da shell si lancierà:
$ sudo usermod -a -G dialout www-data
Una volta modificato, riavviare Apache:
$ sudo /etc/init.d/apache2 restart
Le modifiche così apportate saranno applicate definitivamente.
-----------------------------------------------------------------------------------------------------------
Agli inizi avevo provato con phpSerial (una libreria in PHP per la gestione della seriale), ma ho avuto molti malfunzionamenti spesso subdoli che mi hanno portato a sostituirla in favore di Device::Serial Port (http://search.cpan.org/dist/Device-SerialPort/) una libreria Perl per la gestione della seriale davvero efficiente e facile da impiegare.
La cosa senz'altro più interessante di questa libreria è che consente di disabilitare la linea DTR e quindi di prevenire l'autoreset di Arduino 10000 ogni qualvolta si invia un dato sulla seriale.
Per installare Device::Serial Port da Ubuntu/Debian:
$ sudo apt-get install libdevice-serialport-perl
Essendo gli altri script in PHP si è usata una funzione wrapper PHP ( fetchTemp() ) che fa semplicemente il lavoro di richiamare da sistema lo script fetcher.pl e riporlo in una variabile a disposizione degli altri script in PHP.
Ecco i due script:
FETCHER.PL
#!/usr/bin/perl -w
#########################################################################################################
#
# Motivazione: preleva e stampa a video il valore di temperatura acquisito da Arduino.
#
# Autore : Francesco Parisi (fparisi at tiscali dot it) , (fparisi at gmail dot com)
#
# Richiede : Device::SerialPort <http://search.cpan.org/~cook/Device-SerialPort-1.04/SerialPort.pm>
#
# Su Ubuntu: $ sudo apt-get install libdevice-serialport-perl
#
#########################################################################################################
use strict;
use Device::SerialPort;
my $portName = "/dev/ttyUSB0"; # identificativo seriale/USB usata
my $bps = "9600"; # velocità in bps
my $car = 's'; # carattere convenuto per la richiesta dati
# Costruttore (apre la porta e impegna le risorse hw)
my $port = Device::SerialPort->new( $portName )
|| die "Impossibile aprire $portName !\n";
# Configurazione trasmissione
$port->databits(8) || die "Impostazione databits fallita";
$port->baudrate($bps) || die "Impostazione baudrate fallita";
$port->parity("none") || die "Impostazione parity fallita";
$port->stopbits(1) || die "Impostazione stopbits fallita";
$port->dtr_active(0) || die "Impostazione dtr fallita"; # disabilita linea DTR (previene autoreset di Arduino)
sleep(1); # attendi 1s
# Invia carattere convenuto per la richiesta della temperatura
$port->lookclear; # svuota buffer
$port->write($car); # invia carattere convenuto
# Legge dato da seriale (in pooling)
my $gotit = ""; # dato letto
until ("" ne $gotit) {
$gotit = $port->lookfor; # poll until data ready
die "Aborted without match\n" unless (defined $gotit);
}
# Distruttore (chiude la porta e rilascia le risorse hw)
$port->close || warn "Chiusura porta non riuscita!\n";
# Stampa il dato letto
printf "%.1f\n", $gotit;
Lo script wrapper in PHP, FETCHER.PHP:
<?
/*************************************************************************************************
*
* Motivazione: funzione "wrapper" per lo script Perl di fetch della temperatura da Arduino
*
* Autore : Francesco Parisi (fparisi at tiscali dot it) , (fparisi at gmail dot com)
*
*
*************************************************************************************************/
function fetchTemp()
{
$perlCmd = '/usr/bin/perl'; // il comando Perl completo del suo path
$path = '/home/frank/public_html/'; // path allo script Perl (completo di '/' finale)
$script = 'fetcher.pl'; // nome script Perl
$temperature = exec ( $perlCmd . ' ' . $path.$script );
return $temperature;
}
?>
Codice evidenziato generato con Generator: GNU source-highlight 3.1
by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite
Nessun commento:
Posta un commento