Comunicazione USB con PHP

Ciao a tutti, sto cercando di interfacciare Arduino con PHP tramite USB usando la classe php_serial su OSX, l'idea sarebbe di poter inviare e ricevere stringhe di testo JSON. Il problema è che non mi è possibile comunicare con la scheda ( Arduino due ) a meno che il monitor seriale non sia aperto. Qualcuno sa qual'è la causa del problema e magari una possibile soluzione?

Grazie!

Troppe poche informazioni per capire il problema. :cold_sweat:

Aggiungo il codice della prova di comunicazione che ho fatto:

PHP:

$port = “/dev/tty.usbmodemfa121”;
$bound = “9600”;
$send = “1”;
$serial = new phpSerial();
$serial->deviceSet($port);
$serial->confBaudRate($bound);
$serial->deviceOpen();
$serial->sendMessage($send);
$serial->deviceClose();

Arduino:

int LED = 13;
int incomingByte = 0;

void setup() {
pinMode(LED, OUTPUT);
Serial.begin(1200);
digitalWrite(LED, LOW);
}

void loop() {
if ( Serial.available() ){
incomingByte = Serial.read();
Serial.println(incomingByte);
switch ( incomingByte ){
case 49:{
digitalWrite(LED, HIGH);
}break;
case 48:{
digitalWrite(LED, LOW);
}break;
}
}
}

Allego anche la classe se fosse utile, se ci fosse bisogno di altre informazioni scrivetemi quali e le posterò subito.

php_serial.class.php (17.7 KB)

La velocità a 1200 baud è la meno indicata perché è stata scelta per la procedura di reset e programmazione della scheda. Dovresti cambiarla. Puoi mettere un qualsiasi degli altri valori da 9600 a 115200, ma non 1200 ;)

Tra l'altro da una parte la apri a 9600 ma su Arduino a 1200: devono essere uguali.

Scusa, errore mio nel copia incolla, il codice caricato sulla scheda ha come bound 9600. Ho appena fatto una prova a bound 115200 ma la comunicazione avviene solo se il monitor seriale è aperto, altrimenti la pagina PHP rimane in caricamento senza fare nulla e senza andare in timeup.

Se il problema è sul PHP non so come aiutarti. Prova a fare una ricerca sul Forum, credo che questo argomento sia già stato discusso.

Non so però fino a che punto sia PHP perchè ho fatto una prova con un programma in C che ho trovato su internet e mi da lo stesso problema, può essere che dipenda dal sistema operativo la cosa?

Non conosco neanche OSX. :zipper_mouth_face:

Appena ho la possibilità provo a spostare tutto su linux e vedrò che succede, grazie comunque! :wink:

Ciao a tutti, sto cercando di interfacciare Arduino con PHP tramite USB usando la classe php_serial su OSX, l'idea sarebbe di poter inviare e ricevere stringhe di testo JSON. Il problema è che non mi è possibile comunicare con la scheda ( Arduino due ) a meno che il monitor seriale non sia aperto. Qualcuno sa qual'è la causa del problema e magari una possibile soluzione?

Arduino effettua un reset automatico ad ogni connessione che riceve sulla seriale emulata da USB. Ciò è utile in fase di caricamento degli sketch, perché ci evita di dover premere ogni volta il pulsante del reset a mano. Se, però, vuoi connettere Arduino ad un qualche altro computer utilizzando la porta USB, la comunicazione seriale non avverrà in modo corretto... Il monitor seriale mantiene aperta la connessione seriale: vale a dire che non hai reset e la comunicazione procede correttamente. Ecco perché tutto funziona con quello aperto.

Con Arduino Uno una soluzione molto semplice è quella di porre un condensatore da 10uF tra i pin gnd e reset. Questo evita il reset automatico. Con Arduino Due non ho mai provato... Se provi facci sapere :P

Dovrai chiaramente rimuovere il condensatore ogni volta che vuoi caricare uno sketch.

Kernak, l'Arduino DUE e la Leonardo, non si resettano aprendo semplicemente la seriale come avviene sulla UNO e sulla 2009, serve una procedura specifica (apertura e chiusura della seriale a 1200 baud e riapertura con velocità qualunque) Ormai ci sono diverse versioni di Arduino ognuno con le sue peculiarità. E' per questo che è buona norma indicare sempre il modello utilizzato, perché le soluzioni possono variare da modello a modello. Non si può più parlare in generale di Arduino.

Ooops... Chiedo venia... :blush:

Ma avevo specificato di che versione stavo parlando:

Con Arduino Uno una soluzione molto semplice è quella di porre un condensatore da 10uF tra i pin gnd e reset. Questo evita il reset automatico. Con Arduino Due non ho mai provato... Se provi facci sapere

Il "facci sapere" resta valido: sono curioso... :P

Ho trovato su internet una modifica hardware per la Due ( immagine allegata ) però non so fino a che punto sia efficace, invece tramite software non ce modo di impedire il reset?
Come fa il monitor seriale a mantenere la connessione?

Link articolo:

jumper.jpg