Pages: 1 [2] 3 4   Go Down
Author Topic: Comandare arduino in php  (Read 3245 times)
0 Members and 1 Guest are viewing this topic.
Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

almeno dovrebbe essere così
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

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

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
Logged

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

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 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

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

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma puoi rimediare disabilitando l'autoreset.
via hardware
Logged


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

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

 
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


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

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

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


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

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
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


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

@FreeDomotic, potresti spiegarmi bene come hai risolto in php su Windows x comnicare con l'arduino?
Grazie!
Logged

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

Milazzo (ME)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 395
Chi cerca trova. .
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Xfox's Blog, Elettronica, informatica e tant'altro: http://www.xfox.it

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

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

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

Milazzo (ME)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 395
Chi cerca trova. .
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ecco il codice da me realizzato

Code:
$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:
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.
Logged

Xfox's Blog, Elettronica, informatica e tant'altro: http://www.xfox.it

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