web-dev-qa-db-fra.com

PHP retour de données du port série d'Arduino

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}";
                }
        }
    }
?>
14
sisko

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

12
Lukasz Kujawa

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

3
user1068963

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();
?>
2
opc0de