Go Down

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

superlol

in linux dovrebbe essere sufficiente che fai un exec con dentro
Code: [Select]
echo "parola" > /dev/ttyACM0
dando all'user apache i permessi di agire sulla seriale

almeno dovrebbe essere così
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

freedomotic

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
Freedomotic Domotica Open Source
http://freedomotic.com
We need your help. Please contact us for contributing

superlol

arduino si resetta perchè è predisposto per fare così quando inizia una comunicazione seriale, vai qualche pagina indietro e cerca i thread dell'autoreset  ;)
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

lesto


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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72


ma puoi rimediare disabilitando l'autoreset.

via hardware

freedomotic

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

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

leo72

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.

freedomotic

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??
Freedomotic Domotica Open Source
http://freedomotic.com
We need your help. Please contact us for contributing

leo72

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

freedomotic

ma allora secondo te perché non funziona con linux?
da windows riesco a disabilitare il dtr via software con
exec("mode com1: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off dtr=off rts=off"); in php e non ho problemi a comunicare via seriale senza usare né classi particolari né serial proxy
in linux non c'é verso di farla andare anche usando ser2net continua a resettarsi
Freedomotic Domotica Open Source
http://freedomotic.com
We need your help. Please contact us for contributing

leo72

Perché sono 2 SO diversi e probabilmente gestiscono la porta in maniera differente.

Guglio

@FreeDomotic, potresti spiegarmi bene come hai risolto in php su Windows x comnicare con l'arduino?
Grazie!
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Xfox

Ciao ragazzi, la discussione mi ha subito appassionato e stavo provando qualcosa usando easyphp per simulare un server sul mio pc winzoz!
Sono riuscito perfettamente a scrivere sulla porta com3 però ho un grande problema! Non riesco a leggere ciò che mi da in risposta l'arduino!
Utilizzando come negli esempi precedenti "fread($risorsa, fsize($risorsa))".
Qualche consiglio?
Xfox's Blog, Elettronica, informatica e tant'altro: http://www.xfox.it

freedomotic

ciao Guglio, allora ho risolto in questo modo usando una funzione per inviare dei caratteri ad arduino in php

<?php
// inizializzazione porta
exec("mode com1: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off dtr=off rts=off");

function sendToSerial($messaggio){
$fp =fopen("com1", "w");
fwrite($fp, $messaggio);
fclose($fp);
}
?>


poi  nel codice php che gestisce l'invio dei caratteri uso questo

if ($_GET['action'] == "d") {
        //invia il comando 
        sendToSerial("d");


ps: non uso easyphp ma server2go

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

Xfox

Sullo scrivere non ci sono problemi, è sul leggere che sto incontrando qualche difficoltà!

Ecco il codice da me realizzato

Code: [Select]
$VAR = $_GET['testo'];

  //$cmd_str = "MODE COM3 BAUD=9600 PARITY=N DATA=8 STOP=1 TO=ON OCTS=ON ODSR=OFF IDSR=OFF RTS=HS DTR=ON";
  //exec($cmd_str);

$porta_seriale = fopen("COM3", "w+");
fwrite($porta_seriale, $VAR);

sleep(2); //Per attendere la risposta dell'arduino

if($risposta = fread($porta_seriale, 30)){
echo "<br>True<br>";
echo $risposta;
}
else
{
echo "<br>False<br>";
echo $risposta;
}
fclose($porta_seriale);


Così facendo ogni tanto riesco a leggere ciò che mi risponde l'arduino, che presenta il seguente codice:

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 spento!");
    }
    else{
      Serial.print("comando NON riconosciuto: ");
      Serial.println(incomingByte);
    }
  }
}


Prima di poter comunicare con la porta com devo eseguire il comando (IO, dal prompt se no non funziona) "MODE COM3 BAUD=9600 PARITY=N DATA=8 STOP=1 TO=ON OCTS=ON ODSR=OFF IDSR=OFF RTS=HS DTR=ON" ed ogni tanto la porta com scompare, o dice che è utilizzata da qualche altra parte, quando in realtà nessun applicazione accede alla porta.
Xfox's Blog, Elettronica, informatica e tant'altro: http://www.xfox.it

Go Up