PHP port série de données de retour d'Arduino
Je me demande si il existe un moyen pour accomplir la lecture de mon port série via PHP qui fonctionne 🙂
Dans l'exercice de mon Arduino compétences, j'ai développé une simple LED on/OFF de l'esquisse. Il fonctionne en entrant sur ou hors dans la série du moniteur.
Étape suivante, j'ai mis en place une page web pour agir comme une interface graphique à cliquer sur un lien et d'effectuer sur et hors de la fonction ci-dessus. Cette web GUI fonctionne via PHP.
Je suis l'aide de la PHP SÉRIE classe d'interagir avec le port série de mon Arduino.
Le problème est que j'ai besoin de trouver un moyen d'obtenir de la rétroaction à partir du port série. À l'aide de l'IDE Arduino moniteur de série, je peux voir mes messages imprimés en réponse à chacune de mes entrée série et j'ai besoin de récupérer les mêmes commentaires dans mon code PHP.
Le PHP de Série de la classe offre une readPort() fonction, mais je ne retourne 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}";
}
}
}
?>
OriginalL'auteur sisko | 2012-10-28
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous fonctionner sur linux.
De la première configuration de votre port série:
Ensuite, vous pouvez utiliser une bonne vieille mode fread/fwrite
Il y a une seule chose que vous devez retenir. Arduino va redémarrer à chaque connexion. Si vous ne savez pas qu'Il va vous confondre. Par exemple, si vous vous connectez (fopen) et d'envoyer instantanément des données Arduino va manquer car c'est le démarrage qui prend une seconde ou deux). Expérience avec le sommeil pour quelques temps. Si vous souhaitez désactiver le redémarrage de l'utilisation de condensateur 10uF de GRD à la TVD.
Bonne chance
ps. vous pouvez résoudre les problèmes avec "écran"
Post sur la configuration de PHP avec Arduino http://systemsarchitect.net/connecting-php-with-arduino-via-serial-port-on-linux/ et un de plus ici http://systemsarchitect.net/arduino-and-php-serial-communication-with-a-protocol/.
Pourriez-vous collez votre code pour Arduino et PHP? Ot est difficile à dire sans elle.
Salut Lukasz, j'ai mis à jour ma question avec la dernière PHP/HTML code et de mes sketch Arduino. Le PHP inclut les PHP_Serial classe téléchargeable à partir du lien dans ma question.
Je vois que vous seulement prêt Arduino sortie sur le début de votre script. Il n'y a rien dans $read variable? De code Arduino je peux comprendre que vous avez à envoyer 2 octets d'abord pour obtenir une sortie. Je ne sais pas la bibliothèque que vous utilisez. Vous pouvez utiliser simple, fopen (), read() et wrtie().
Salut Lukasz, votre aide a été très précieuse et très appréciée. Je suis le marquage de votre réponse correcte, mais je vais apprécier de plus d'aide avec encore plus de complications, je suis en train de vivre. Votre stratégie d'ouverture et lecture du port fonctionne, mais seulement par intermittence, j'.e : il fonctionne parfois, mais la plupart du temps, je n'ai pas de sortie. Quand je fais une sortie, c'est tout dans le port série plutôt que de la plus récente. Pouvez-vous offrir plus de conseils sur ce, s'il vous plaît? De PLUS, pouvez-vous expliquer ce qu'est le "stty ..." code de commande? Il ne semble pas aider ma situation.
OriginalL'auteur Lukasz Kujawa
/dev/ttyUSB0 en cours d'exécution avec l'utilisateur root, si vous utilisez apache essayer chown /dev/ttyUSB0 à apache ou l'utilisateur est connecté.
et puis essayez à nouveau, ou d'essayer de déconnexion de ubuntu et de connexion en tant qu'utilisateur root.
OriginalL'auteur
Vous êtes probablement en train de lire quand est-ce pas de données sur le port série. Vous avez besoin de mettre en œuvre JavaScript code pour appeler PHP code qui permet de lire à intervalles réguliers.
Quand vous avez ces données, vous devriez traiter.
readPort()
a bien fonctionné pour moi. Si le débit en bauds, parité, etc. est ajusté correctement, alors vous ne devriez avoir aucun problème de lecture du port série.Voici un exemple d'utilisation de la bibliothèque pour Arduino. Il a travaillé pour moi il y a quelques temps:
j'ai édité ma réponse avec un exemple d'utilisation de cette bibliothèque.Espérons qu'il vous sera utile
merci pour vos réponses et l'exemple de code. J'ai mis à jour mon code avec des extraits de votre mais je n'ai pas encore de commentaires. J'ai mis à jour ma question d'origine avec mon PHP/HTML script. Je devrais être à obtenir des commentaires en 3 endroits, mais rien n'est à venir à travers. Je tiens à souligner que mon port (/dev/ttyACM0) est réglé sur "chmod 777" et moi, je suis en appelant le numéro de Série.println dans mon sketch Arduino c'est pourquoi je m'attends à ce que certaines données pour être retourné en PHP. En effet, chaque fois que j'utilise mon interface web my Led de répondre avec succès et mon Arduino serial monitor imprime mon message(s)
quel système d'exploitation avez-vous des sorcières version d'apache / php utilisez-vous ?
Le système d'exploitation est Linux Ubuntu-12, PHP est la Version 5.3.10 et Apache Apache/2.2.22
OriginalL'auteur opc0de