Go Down

Topic: Comandare arduino in php (Read 4330 times) previous topic - next topic

albyy911

Sono riuscito ad inviare dati al mio arduino tramite la porta usb usando del semplice php.
il codice php che ho utilizzato è il seguente:
Code: [Select]

$accendi = chr(97);
$spegni = chr(98);
$fp =fopen("COM3", "w");
fwrite($fp, $spegni);
fclose($fp);

mentre nell'arduino ho inserito questo:
Code: [Select]

int Led=13;
int incomingByte; 

void setup()
{
pinMode(Led, OUTPUT);
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0) {
  incomingByte = Serial.read();
if (incomingByte == 'a') {
digitalWrite(Led, HIGH);
                            }
                          } 
  if (incomingByte == 'b') {
   digitalWrite(Led, LOW);
  }
}


Ora però voglio leggere i dati che mi arrivano dai sensori sempre in php cosi da poterli memorizzare in un database.
Ho provato questo codice:
Code: [Select]

// get contents of a file into a string
$filename = "COM3";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo $handle;


ma il risultato è che il campo leght di fread  deve essere maggiore di 0.... com'è possibile?
Come posso fare per risolvere questo problema qui?

Guglio

#1
Jun 24, 2011, 09:35 pm Last Edit: Jun 26, 2011, 01:59 pm by Guglio Reason: 1
Che tempismo!! Ci stavo guardando proprio oggi!
Mi sembra ci sia una lib ben fatta su phpclasses.
Ora sono via, domenica ci butto un occhio!
Che SO usi?
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

albyy911


Che tempismo!! Ci stavo guardando proprio oggi!
Dunque io di solito uso un programma da ponte mi sembra si chiami Tcp2Com ma volevo appunto provare senza usando fopen..
Mi sembra ci sia una lib ben fatta su phpclasses.
Ora sono via, domenica ci butto un occhio!
Che SO usi?


La libreria che dici l'ho provata su windows e mi sembra che non funzioni...
Però su linux dovrebbe andare a bomba.

Comunque io sto su windows ma mi sto organizzando una postazione ubuntu :P quindi posso provare qualsiasi soluzione.

Se tu riesci a muovere qualcosa fammi sapere.

Ciao!

seppe

prova a fare l'echo del file prima di chiuderlo... dovrebbe funzionare...

seppe

albyy911


prova a fare l'echo del file prima di chiuderlo... dovrebbe funzionare...

seppe

ho provato ma di preciso mi scrive questo:

"Warning: fread() [function.fread]: Length parameter must be greater than 0 in C:\Program Files (x86)\EasyPHP-5.3.6.0\www\arduino_lettura.php on line 6
Resource id #3 "

Guglio

Prova

<?php
$filename = "COM3";
$fp = fopen($filename, "r");
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
fclose($fp);
?>
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

albyy911


Prova

<?php
$filename = "COM3";
$fp = fopen($filename, "r");
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
fclose($fp);
?>

mi da questo errore:
"Warning: fgets() expects parameter 1 to be resource, boolean given in C:\Program Files (x86)\EasyPHP-5.3.6.0\www\arduino_lettura.php on line 5

Warning: feof() expects parameter 1 to be resource, boolean given in C:\Program Files (x86)\EasyPHP-5.3.6.0\www\arduino_lettura.php on line 4"


seppe

prova ad aprire il file con l'opzione "r+" invece di "r"...

ho dato un'occhiata in giro per te, ma il codice che hai sembra corretto...

facci sapere...

seppe

Guglio

A me non funziona assolutamente, sto provando con questo codice:

<?php
$fp =fopen("COM4", "w");
fwrite($fp, "abc");
fclose($fp);
?>

E sull'arduino questo:
Mostra tutto quello che riceve in seriale su un LCD.
Code: [Select]

#include <ShiftLCD.h>
ShiftLCD lcd(2, 4, 3);

void setup(){
  lcd.begin(16, 2);
  Serial.begin(9600);
  Serial.println("OK");
}
int num = 0;
int line = 0;
void loop()
{
  if (Serial.available()) {
    delay(20);
    while (Serial.available() > 0) {
      int inByte = Serial.read();
      if (num>15 or inByte=='^'){
        line = 1;
        num = 0;//Reset della colonna
      }
      lcd.setCursor(num, line);

      if (inByte!='^'){
        lcd.write(inByte);
        num = num+1;
      }
      if (inByte=='&'){
        lcd.clear();
        num = 0;
        line = 0;
      }
    }
  }
}


Cerco quindi un programa che faccia da ponte fra la COM e il protocollo TCP.
Prima ne usavo uno che si poteva scaricare dalla sezione download di Arduino.cc ma da quando ho formattato non l'ho più trovato..
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

dr4gone

Guglio, qui il link a una discussione dove avevi messo tu stesso il link al bridge com-TCP  :smiley-mr-green:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1290900620/all

Buon divertimento :D

Guglio

#11
Jun 26, 2011, 02:01 pm Last Edit: Jun 26, 2011, 02:23 pm by Guglio Reason: 1
Questa è bella, non mi funziona.
Ho il firewall disattivo quindi le porte non sono bloccate.
Dal registro degli errori di windows non mi viene segnalato nulla
ma come provo con telnet a connettermi mi restituisce un errore...
Eccheppalle...


Io ho risolto con questo:
http://www.arduino.cc/playground/uploads/Interfacing/SerialNet.pde.txt
Modificando il boolean new_line_to... in modo che vada a capo

Ora mi connetto da php tramite fsockopen e in questo modo l'arduino non si resetta nemmeno
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

lesto

#12
Jun 26, 2011, 06:49 pm Last Edit: Jun 26, 2011, 06:51 pm by lesto Reason: 1

Code: [Select]

// get contents of a file into a string
$filename = "COM3";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo $handle;


ma il risultato è che il campo leght di fread  deve essere maggiore di 0.... com'è possibile?
Come posso fare per risolvere questo problema qui?

AH, prima mi spieghi perchè stampi il puntatore a file e non il contenuto di ciò che hai letto (stampi $handle e non $contents)

Poi secondo me il filesize(); in questo caso si comporta come Serial.available(); sull'arduino. Quindi basta aggiungere un while:
Code: [Select]

$filename = "COM3";
$handle = fopen($filename, "r");

while(filesize($filename)<=0){
  ;//wait for some input
}

$contents = fread($handle, filesize($filename));
fclose($handle);
echo $handle;

ora piccolo problema... se ho ben capito tu apri il flusso in scrittura, mando il comando, chiudo il flusso, lo riuapri in lettura e leggi... ovvio che se nel frattempo l'arduino ti ha già risposto il messaggio viene perso. Quindi, se usi il codice arduino del primo post (e identate sto codice, in arduino sketch -> autoformat, non ci vuole nulla!) che però fa una serial.println("Qualcosa"); ogni volta che riceve un comando 8e sistemando un pò la logica, vedi sotto)...
il codice php diventa (apro il file in "rw" ovvero sia lettura che scrittura)

Code: [Select]

// lesto rulez :-D
$accendi = 'a';
$spegni = 'b';

//apertura del flusso
$filename = "COM3";
$handle = fopen($filename, "rw");

fwrite($handle, $spegni);
echo "Richiesta di spegnimento inviata, ";
while(filesize($filename)<=0){
  ;//wait for some input
}
$contents = fread($handle, filesize($filename));
echo "risposta arduino: ";
echo $contents;

fwrite($handle, $accendi);
echo "Richiesta di accensione inviata, ";
while(filesize($filename)<=0){
  ;//wait for some input
}
$contents = fread($handle, filesize($filename));
echo "risposta arduino: ";
echo $contents;

fclose($handle);



vabè per completezza metto pure quello arduino, che ha qualche "stranezza" logica (il comando di spegnimento NON era nell'if della serial avaiable, equindi si attivava ogni loop se il comando era 'b', niente di grave ma cpu sprecata), aggiunto un errore se il comando non è riconosciuto, aumentata la leggibilità con "else if":

Code: [Select]
int Led=13;
int incomingByte;  

void setup()
{
 pinMode(Led, OUTPUT);
 Serial.begin(9600);
}

void loop()
{
 if (Serial.available() > 0) {
   incomingByte = Serial.read();

   if (incomingByte == 'a') {
     digitalWrite(Led, HIGH);
     Serial.println("LED acceso!");
   }
   else if (incomingByte == 'b') {
     digitalWrite(Led, LOW);
     Serial.println("LED acceso!");
   }
   else{
     Serial.print("comando NON riconosciuto: ");
     Serial.println(incomingByte);
   }
 }
}



Non ho php o ethernet shield per testare, ma secondo me così funziona. senza perdere la testa con complicazioni in più (bridge tcp-com?!?!?! che bruttura!)

ps. okokok oggi sono polemico   :smiley-mr-green:
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Guglio

Bhe, almeno, il bridge mi funziona :P
E poi cosa monto banchi di ram da fare se poi non li uso!?
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

salve qualcuno di voi é riuscito a far funzionare la comunicazione arduino-php in linux?
ho avuto problemi con l'autoreset ma in windows il problema é stato risolto via sofware aggiungendo questa riga di codice
exec("mode com1: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off dtr=off rts=off");

su google ho letto che il comando corrispondente dovrebbe essere

exec("stty -F /dev/ttyACM0 -hupcl")

la porta associata ad arduino uno é /dev/ttyACM0

purtroppo il codice non sembra funzionare

avete qualche suggerimento??? grazie
Freedomotic Open IoT Framework
http://www.freedomotic.com
We need your help. Please contact us for contributing

Go Up