Comandare arduino in php

seppe:
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 "

Prova

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

Guglio:
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"

upp!!

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

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.

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

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

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

Buon divertimento :smiley:

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

albyy911:

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

$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)

// 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":

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 :grin:

Bhe, almeno, il bridge mi funziona :stuck_out_tongue:
E poi cosa monto banchi di ram da fare se poi non li uso!?

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

in linux dovrebbe essere sufficiente che fai un exec con dentro

echo "parola" > /dev/ttyACM0

dando all'user apache i permessi di agire sulla seriale

almeno dovrebbe essere così

a dire il vero non credo sia la mancata esecuzione del comando ma il comando stesso
ho provato ad eseguirlo da shell e viene eseguito ma arduino continua a resettarsi
su internet però ci sono vari articoli in cui si dice che questa soluzione funziona o in alternativa bisogna usare una classe php ad hoc
php-serial-class
qualche idea?? usare php é davvero arduo

arduino si resetta perchè è predisposto per fare così quando inizia una comunicazione seriale, vai qualche pagina indietro e cerca i thread dell'autoreset :wink:

freedomotic:
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

prova il comando in un terminale, che output ti dà? in oltre ogni nuova connessione seriale resetta il micro, ma puoi rimediare disabilitando l'autoreset.

lesto:
ma puoi rimediare disabilitando l'autoreset.

via hardware

eseguito via shell non fornisce nessun output nel senso che esegue il comando tanto é vero che confrollando i parametri con
stty -a -F /dev/ttyACM0 risulta tra le varie cose "-hupcl" che dovrebbe corrispondere alla disabilitazione del DTR

mi ricordo che la cosa andava bene con arduino 2009 (che purtroppo non ho sotto mano adesso), forse potrebbe essere un problema legato al fatto che le seriali sono diverse in 2009 e arduino uno?
infatti collegando la 2009 in linux compare il device /dev/ttyUSB0, in arduino uno diventa /dev/ttyACM0

Il chip FTDI della 2009 è un convertitore USB/seriale mentre l'Atmega8U2 della UNO è un micro programmato per emulare questa cosa via software per cui cambiano le modalità come vengono viste dall'SO.

ti ringrazio molto per la precisazione!
a questo punto credo che tutti i vari tutorial in rete relativi a php_serial_class, a proxy come serproxy o ser2net non funzionino più con arduino uno visto che di fatto non esiste più una porta seriale ma una usb vera e propria, mi sbaglio??

Non proprio. L'Arduino non è un host USB ma il firmware dell'Atmega8U2 spedisce un vendor:product USB valido per cui l'Arduino UNO viene identificato dall'SO come USB anche se poi viene gestita come porta seriale (difatti su Win viene visto come una porta COM).