Pages: [1] 2 3 4   Go Down
Author Topic: Comandare arduino in php  (Read 3240 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 236
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
$accendi = chr(97);
$spegni = chr(98);
$fp =fopen("COM3", "w");
fwrite($fp, $spegni);
fclose($fp);
mentre nell'arduino ho inserito questo:
Code:
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:
// 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?
Logged

Fidenza, Parma
Offline Offline
God Member
*****
Karma: 8
Posts: 783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
« Last Edit: June 26, 2011, 06:59:53 am by Guglio » Logged

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Offline Offline
Full Member
***
Karma: 0
Posts: 236
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-razz quindi posso provare qualsiasi soluzione.

Se tu riesci a muovere qualcosa fammi sapere.

Ciao!
Logged

Taranto
Offline Offline
Full Member
***
Karma: 0
Posts: 117
"Testing can only prove the presence of bugs, not their absence." -- Edsger Dijkstra
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

seppe
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 236
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 "
Logged

Fidenza, Parma
Offline Offline
God Member
*****
Karma: 8
Posts: 783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova

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

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Offline Offline
Full Member
***
Karma: 0
Posts: 236
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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"
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 236
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

upp!!
Logged

Taranto
Offline Offline
Full Member
***
Karma: 0
Posts: 117
"Testing can only prove the presence of bugs, not their absence." -- Edsger Dijkstra
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Fidenza, Parma
Offline Offline
God Member
*****
Karma: 8
Posts: 783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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..
Logged

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Italy
Offline Offline
Sr. Member
****
Karma: 0
Posts: 329
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin
Logged

Fidenza, Parma
Offline Offline
God Member
*****
Karma: 8
Posts: 783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: June 26, 2011, 07:23:54 am by Guglio » Logged

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
// 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:
$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:
// 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:
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
« Last Edit: June 26, 2011, 11:51:51 am by lesto » Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Fidenza, Parma
Offline Offline
God Member
*****
Karma: 8
Posts: 783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bhe, almeno, il bridge mi funziona smiley-razz
E poi cosa monto banchi di ram da fare se poi non li uso!?
Logged

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Offline Offline
Jr. Member
**
Karma: 0
Posts: 87
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Freedomotic Domotica Open Source
http://freedomotic.com
We need your help. Please contact us for contributing

Pages: [1] 2 3 4   Go Up
Jump to: