Je me demande s'il existe un moyen d'accomplir la lecture de mon port série via PHP - cela fonctionne :-)
En pratiquant mes compétences Arduino, j'ai développé un simple croquis LED ON/OFF. Cela fonctionne en entrant on ou off dans le moniteur série.
L'étape suivante, j'ai mis en place une page Web pour agir comme une interface graphique pour cliquer sur un lien et exécuter la fonction marche/arrêt ci-dessus. Cette interface graphique basée sur le Web fonctionne via PHP. J'utilise la classe PHP SERIAL pour interagir avec le port série que mon Arduino utilise.
Le problème est que je dois trouver un moyen d'obtenir des commentaires du port série. En utilisant l'Arduino IDE moniteur série, je peux voir mes messages imprimés en réponse à chacune de mes entrées série et j'ai besoin de récupérer les mêmes commentaires dans mon PHP code.
La classe PHP Serial propose une fonction readPort () mais je ne renvoie pas mes données.
MISE À JOUR [2]:
ARDUINO:
const int greenPin = 2;
const int bluePin = 3;
const int redPin = 4;
int currentPin = 0; //current pin to be faded
int brightness = 0; //current brightness level
void setup(){
Serial.begin(9600);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(redPin, OUTPUT);
}
void loop(){
//if there's any serial data in the buffer, read a byte
if( Serial.available() > 0 ){
int inByte = Serial.read();
//respond only to the values 'r', 'g', 'b', or '0' through '9'
if(inByte == 'r')
currentPin = redPin;
if(inByte == 'g')
currentPin = greenPin;
if(inByte == 'b')
currentPin = bluePin;
if(inByte >= '0' && inByte <= '9'){
//map the incoming byte value to the range of the analogRead() command
brightness = map(inByte, '0', '9', 0, 255);
//set the current pin to the current brightness:
analogWrite(currentPin, brightness);
}
Serial.print("Current Pin : ");
Serial.println(currentPin);
Serial.print("Brightness : ");
Serial.println(brightness);
}//close serial check
}
PHP/HTML:
<?php
require("php_serial.class.php");
// include("php_serial.class.php");
// Let's start the class
$serial = new phpSerial();
// First we must specify the device. This works on both Linux and Windows (if
// your Linux serial device is /dev/ttyS0 for COM1, etc.)
$serial->deviceSet("/dev/ttyACM0");
// Set for 9600-8-N-1 (no flow control)
$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");
// Then we need to open it
$serial->deviceOpen();
// Read data
$read = $serial->readPort();
print "<pre>";
print_r($read);
print "</pre>";
// Print out the data
echo $read;
// print exec("echo 'r9g9b9' > /dev/ttyACM0");
print "RESPONSE(1): {$read}<br><br>";
// If you want to change the configuration, the device must be closed.
$serial->deviceClose();
?>
<?php
if( isset($_REQUEST['LED']) )
response();
?>
<form action='index.php' method='POST'>
<select id='led' name='LED'>
<option id='nil'>-</option>
<option id='red'>RED</option>
<option id='green'>GREEN</option>
<option id='blue'>BLUE</option>
<option id='all'>ALL</option>
</select>
<input type='submit' value='SET'>
</form>
<?php
print "Hi, Earthlings!";
function response(){
$CMDString = "";
$execute = false;
if( isset($_REQUEST['LED']) ){
switch ($_REQUEST['LED']) {
case 'RED':
$CMDString = 'r9';
$execute = true;
exec("echo 'r9g0b0' > /dev/ttyACM0");
print "<br>FOUND: {$_REQUEST['LED']}";
break;
case 'GREEN':
$CMDString = 'g9';
$execute = true;
print "<br>FOUND: {$_REQUEST['LED']}";
break;
case 'BLUE':
$CMDString = 'b9';
$execute = true;
print "<br>FOUND: {$_REQUEST['LED']}";
break;
case 'ALL':
$CMDString = 'r9g9b9';
$execute = true;
print "<br>FOUND: {$_REQUEST['LED']}";
break;
default:
print exec("echo 'r0g0b0' > /dev/ttyACM0");
$execute = false;
break;
}
if($execute){
print exec("echo '{$CMDString}' > /dev/ttyACM0");
print "<br><br>executing: {$CMDString}";
}
}
}
?>
Je suppose que vous travaillez sur Linux.
Configurez d'abord votre port série:
stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
Ensuite, vous pouvez utiliser une bonne fread/fwrite à l'ancienne
$fp =fopen("/dev/ttyACM0", "w+");
if( !$fp) {
echo "Error";die();
}
fwrite($fp, $_SERVER['argv'][1] . 0x00);
echo fread($fp, 10);
fclose($fp);
Il n'y a qu'une seule chose dont vous devez vous souvenir. Arduino redémarrera à chaque connexion . Si vous ne savez pas que cela vous rendra confus. Par exemple, si vous vous connectez (ouvrez) et envoyez instantanément des données, Arduino le manquera car il démarre (ce qui prend une ou deux secondes). Expérimentez avec le sommeil pour lui donner un peu de temps. Si vous souhaitez désactiver le redémarrage, utilisez un condensateur 10uF de GRD à RST.
Bonne chance
ps. vous pouvez dépanner avec "écran"
screen /dev/ttyACM0 9600
Message sur la configuration PHP avec Arduino http://systemsarchitect.net/connecting-php-with-arduino-via-serial-port-on-linux/ et un plus ici http://systemsarchitect.net/arduino-and-php-serial-communication-with-a-protocol/ .
/ dev/ttyUSB0 s'exécutant avec l'utilisateur root, si vous utilisez Apache, essayez chown/dev/ttyUSB0 sur Apache ou l'utilisateur est connecté.
$ Sudo chown Apache2:Apache2 /dev/ttyACM0
OR
$ Sudo chown yourusername:yourusername /dev/ttyACM0
puis réessayez, ou essayez de vous déconnecter d'ubuntu et connectez-vous en tant qu'utilisateur root.
Vous essayez probablement de lire quand il n'y a pas de données sur le port série. Vous devez implémenter JavaScript code pour appeler PHP code qui peut lire à intervalles réguliers.
Lorsque vous avez des données, vous devez les traiter.
readPort()
a bien fonctionné pour moi. Si le débit en bauds, la parité, etc. est correctement réglé, vous ne devriez pas avoir de problème de lecture du port série.
Voici un exemple d'utilisation de la bibliothèque pour Arduino. Cela a fonctionné pour moi il y a quelque temps:
<?php
include "php_serial.class.php";
// Let's start the class
$serial = new phpSerial();
// First we must specify the device. This works on both Linux and Windows (if
// your Linux serial device is /dev/ttyS0 for COM1, etc.)
$serial->deviceSet("/dev/ttyUSB0");
// Set for 9600-8-N-1 (no flow control)
$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");
// Then we need to open it
$serial->deviceOpen();
// Read data
$read = $serial->readPort();
// Print out the data
echo $read;
// If you want to change the configuration, the device must be closed.
$serial->deviceClose();
?>