Go Down

Topic: Arduino e PHP (Read 1 time) previous topic - next topic

Oct 30, 2012, 07:01 pm Last Edit: Oct 31, 2012, 03:13 pm by constructor84 Reason: 1
Ciao ragazzi, dopo un paio di giorni di prove non riesco a trovare la soluzione al problema... Quindi siete la mia unica speranza! :-D
Sto provando a far comunicare Arduino con PHP e ho un problemino che non capisco... In pratica, devo accendere un banalissimo led RGB, ho creato lo sketch ed è perfettamente funzionante testandolo dal "Monitor seriale" dell'IDE. Quindi se premo "r" accende il led RGB impostandolo sul rosso, se premo "g" diventa verde ecc ecc... Adesso, ho creato una semplice pagine in PHP dove con l'aiuto di "php_serial.class" passo la variabile, premetto che inserendo un echo riesco a passare tranquillamente le variabili dal form, quindi attraverso $serial->sendMessage($led); passa la variabile, nonchè il carattere "r", "g" ecc... La cosa strana è che riesco ad accendere il led col rosso e bianco ma non riesco a far accendere il led con gli altri colori. Secondo me è un problema di carattere... forse arduino converte il carattere?

codice php...

Code: [Select]
<?php
include "php_serial.class.php";
$serial = new phpSerial;
$serial->deviceSet("COM2");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");
$serial->deviceOpen();

if(isset(
$_POST['ledRGB'])){
$led=$_POST['ledA'];
$serial->sendMessage($led);
}

$serial->deviceClose();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<head>
<title>Led RGB</title>
</head>
<body>
<form name='led' method="POST">
<fieldset><legend>Led RGB</legend><br/>
  <input type="radio" name="ledA" value="r"/>Led Rosso<br/>
        <input type="radio" name="ledA" value="g"/>Led Verde<br/>
        <input type="radio" name="ledA" value="b"/>Led Blue<br/>
        <input type="radio" name="ledA" value="w"/>Led Bianco<br/>
  <input type="radio" name="ledA" value="s"/>Spegni tutto<br/><br/>
    <input type='submit' name='ledRGB' value="Aziona" ><br/>
</fieldset>
</form>
</body>
</html>


sketch arduino (ho creato una libreria per il led RGB)...

Code: [Select]
#include <LEDRGB.h>
LEDRGB ledRed;
LEDRGB ledBlue;
LEDRGB ledGreen;
LEDRGB onLed;
int rit = 600;
char val;

void setup(){
  ledRed.init(11);
  ledBlue.init(9);
  ledGreen.init(10);
  onLed.offAll();
  Serial.begin(9600);
  }

void loop(){
  if(Serial.available()){
    val = Serial.read();
    switch(val){
      case 'r':
        onLed.onRed();
        break;
      case 'b':
        onLed.onBlue();
        break;
      case 'g':
        onLed.onGreen();
        break;
      case 'w':
        onLed.onWhite();
        break;
      case 's':
        onLed.offAll();
        break;
      default:
        onLed.error(rit);
      }
    }
  }


perchè riesco ad accendere solo il led con il colore rosso e bianco???

Grazie in anticipo...

PaoloP

#1
Oct 31, 2012, 12:35 pm Last Edit: Oct 31, 2012, 04:32 pm by PaoloP Reason: 1
Puoi racchiudere il codice dentro il tag code (tasto # sopra le faccine)?
Rendi il topic più leggibile.
Per rieditare il tuo messaggio premi modify (a destra in alto, sopra il tuo messaggio).

Grazie.

EDIT:
Secondo me il problema è la libreria, ma se non la pubblichi non possiamo aiutarti.
Tu istanzi 4 classi di tipo LEDRGB (ipotizzo sia una classe), poi con un metodo della 4° istanza "OnLed" vuoi fare accendere i led che sono inizializzati con le altre.
Non è più semplice crearti una classe che ha come metodo ad esempio: Led.init(9,10,11); ?
Per il resto non so come funzioni la tua libreria. Sto tirando ad indovinare.

Grazie per la dritta e l'aiuto PaoloP, la librearia l'ho creata al volo e adesso la posto. Soltanto che non capisco come mai funziona attraverso il monitor seriale dell'ide mentre tramite php mi funziona solo l'accensione del led rosso e bianco...

codice LEDRGB.h

Code: [Select]

#ifndef LEDRGB_H
#define LEDRGB_H

#include "Arduino.h"

class LEDRGB{
      private:
              byte pinGlobal;
              const int static _ledRed = 11;
              const int static _ledBlue = 9;
              const int static _ledGreen = 10;
     
      public:
             void init(byte pinLed);
             void onRed(void);
             void onBlue(void);
             void onGreen(void);
             void onWhite(void);
             void offAll(void);
             void error(int rit);
      };
#endif


codice LEDRGB.cpp

Code: [Select]

#include "LEDRGB.h"

void LEDRGB::init(byte pinLed){
     pinGlobal = pinLed;
     pinMode(pinGlobal, OUTPUT);
     }

void LEDRGB::onRed(void){
     digitalWrite(_ledRed, 0);
     digitalWrite(_ledBlue, 255);
     digitalWrite(_ledGreen, 255);
     Serial.println("Luce Rossa accesa");
     }

void LEDRGB::onBlue(void){
     digitalWrite(_ledRed, 255);
     digitalWrite(_ledBlue, 0);
     digitalWrite(_ledGreen, 255);
     Serial.println("Luce Blue accesa");
     }

void LEDRGB::onGreen(void){
     digitalWrite(_ledRed, 255);
     digitalWrite(_ledBlue, 255);
     digitalWrite(_ledGreen, 0);
     Serial.println("Luce Verde accesa");
     }

void LEDRGB::onWhite(void){
     digitalWrite(_ledRed, 0);
     digitalWrite(_ledBlue, 0);
     digitalWrite(_ledGreen, 0);
     Serial.println("Luce Bianca accesa");
     }

void LEDRGB::offAll(void){
     digitalWrite(_ledRed, 255);
     digitalWrite(_ledBlue, 255);
     digitalWrite(_ledGreen, 255);
     Serial.println("Nessuna luce accesa");
     }

void LEDRGB::error(int rit){
     Serial.println("Carattere non valido");
     for(int i=5; i>0; i--){
             digitalWrite(_ledRed, 0);
             digitalWrite(_ledBlue, 255);
             digitalWrite(_ledGreen, 255);
             delay(rit);
             digitalWrite(_ledRed, 255);
             digitalWrite(_ledBlue, 255);
             digitalWrite(_ledGreen, 255);
             delay(rit);
             }
     }


non l'ho ottimizzata la libreria, era giusto per fare delle prove, anzi visto che sto... non è corretto inserire i pin nell'header, devo passare le variabili dallo sketch arduino e richiamarle all'interno di ogni funzione... a parte questo dovrebbe stare bene giusto?

PaoloP

Ti conviene strutturare le classe in questo modo
Code: [Select]
class LEDRGB{
      private:
              byte _ledRed;
              byte _ledBlue;
              byte _ledGreen;
....     

e
Code: [Select]
void LEDRGB::init(byte pinRed,byte pinGreen,byte pinBlu){
  _ledRed = pinRed;
  _ledGreen = pinGreen;
  _ledBlu = pinBlu;
  pinMode(_ledRed, OUTPUT);
  pinMode(_ledGreen, OUTPUT);
  pinMode(_ledBlu, OUTPUT);
     }


in questo modo istanzi una sola classe a cui poi assegni i vari pin.

Nel tuo sketch dovresti mettere
Code: [Select]
LEDRGB onLed;

void setup(){
  onLed.init(9,10,11);
  onLed.offAll();


Per quanto riguarda i caratteri, dopo il serial.read fai una serial.print(val); in modo da vedere cosa riceve.

Grazie per il codice, ho sistemato ed è più corretto e ottimizzato. Cmq non funziona, il problema rimane. Inserendo il serial.print(val); allo sketch e lanciandolo dal monitor seriale dell'IDE ottengo che funziona e ricevere correttamente i caratteri. Ma da PHP niente. Non posso vedere il risultato tenendo PHP e il monitor seriale perchè vanno in conflitto, come faccio a vedere il valore che ricevo dal php proprio sull'arduino? Bho.

lsinfo

ciao
lavori in windows o linux?
Leo55


lsinfo

Ciao
la php_serial.class apre la porta con il comando "mode", che e' esclusivo: anche l'ide di arduino lo vuole fare..quindi o usi il monitor dell'ide o il php.La seconda cosa e' pero' impossibile in windows in quanto con la php_serial la porta e' write-only;quindi , non puo monitorare da php.
Ci sono incappato anche io e , anche se uso solitamente linux dove questa libreria funziona benissimo, mi sono scritto la mia estensione che  premette la'interfacciamento seriale/php.
Devo ancora compilarla per le varie release di php;attualmente ho compilato solo per la 5.3.0.
Se vuoi e' scaricabile dal mio sito e , se sei in grado, te la puoi ricompilare con la tua release php.
Usi wamp?

Leo55

si, uso wamp. Ok, lsinfo, grazie. Se mi dici dove scaricare l'estensione ci provo. Ma per il problema del passaggio di variabile? Cioè com'è possibile che se passi il carattere "g" da php non viene riconosciuto da Arduino? Se faccio partire il programma dall'IDE con il monitor seriale non ho problemi, se metto il carattere "g", lui lo riconosce e accende il led, sto provando anche altre soluzioni, ma niente.

lsinfo

Ciao
devo guardare meglio la classe .lo faccio dopo cena
Fai questa prova, maccheronica!
nella parte php sostituisci  le lettere con numeri , nella parte arduino fai proprio una cosa elementare,tirando via la classe.
1) lettura seriale del byte
2) lo switch sulla base di quanto ricevuto.

l'ndirizzo e' http://leoser.altervista.org/arduino.html.  Controlla di avere php 5.3.0 sul tuo wamp prima di installarla.

ciao


Leo55

lsinfo ho scaricato e appena ho più tempo gli do un occhiata... grazie. Ma per il passaggio da php ad arduino nessuno può aiutarmi?
Ho provato tutti i casting sia su php che su arduino, sostituendo sia lettere che numeri, anche senza libreria... niente... non capisco... :-(

lsinfo

ciao
io non vedo errori.
sul php fai un echo di $_POST['ledRGB'] prima della if (isset      (giusto per vedere cosa arriva dal form).
l'ultima potrebbe essere il led ciocco.

Fammi sapere
Leo55

Ho inserito gli echo e mi restituisci il valore giusto (cioè quello del form, che poi invia)... per quanto rigurda il led RGB funziona, è testato.
La questione è, che tipo devo usare per inviare la variabile da PHP verso Arduino? e cosa riceve Arduino?  credo sia questo il problema... una questione di ascii forse... Posso inviare in char da php la lettera "r" e arduino cosa riceve se metto la variabile in Arduino su int, 114 o "r"? Cmq ho provato tutte le possibili combinazioni ma non funziona... bho... Gli unici esempi che ho trovato in rete fino ad ora sono con if(Serial.available > 0) accendi led altrimenti spegni... la cosa più semplice direi...

lsinfo

accidenti, non saprei cosa dirti.
a essere puristi il costrutto switch() richiede una variabile intera...ma il char va bene lo stesso (e' un piccolo int) , il problema non e' li
con
int val;
switch(val){
      case 114:
oppure
char val;
switch(val){
      case 'r':
penso che per arduino non dovrebbe cambiare niente...chiedo conferma a che e' piu' "fresco" di me in programmazione c.
Mi sa che il problema sta nella classe php e windows che, come ti avevo detto, ho mollato praticamente subito per la mancanza della possibilita' di read della porta e per il fatto che la porta viene continamente chiusa e riaperta (a causa del mode e forse c'entra anche arduino ma non ho indagato oltre):da qui ho deciso di scrivermi la mia estensione , che funziona bene.
Non e' un caso che tutti gli esempi che hai trovato in rete con php sono elementari !




Leo55

PaoloP

Attenzione che se la porta si chiude e si riapre l'Arduino viene resettato quindi ci vuole tempo perché "torni in linea" e i caratteri inviati in quel lasso di tempo sono persi.
Per vedere se accade ciò metti una piccola funzione nel setup che fa lampeggiare il pin 13 (quello integrato in arduino) così ti accorgi subito del reset.

Go Up