arduino + alice gate e porta usb

ciao a tutti ho bisogno di una mano . Sono riuscito a collegate arduino alla porta usb del router alice gate voip con Openwrt installando i pacchetti che convertono l'usb in seriale.
Ecco i comandi da eseguire nella shell

opkg update
opkg install kmod-usb-ohci
opkg install kmod-usb-acm
opkg install kmod-usb-serial
opkg install kmod-usb-serial-ftdi

ovviamente per comunicare abbiamo bisogno di una connessione che si ottiene digitando
cat /dev/ttyUSB0

attenzione ttyUSB0 è la porta del router alice, magari sulla fonera o sulla vodafone station la porta si chiama in un altro modo.

Il problema è che il comando cat /dev/ttyUSB0 si deve dare ogni volta che riavviamo il router, ma per ovviare a questo problema
creo un file senza estensione "controllo" e diamo i permessi 777 questo file va inserito nella directory /etc/init.d
il codice del file è

#!/bin/sh /etc/rc.common
# backup dmesg
#
START=99

 {
	/root/controllo.sh

}

poi create un file controllo.sh e inseritelo nella cartella root , anche qui date i permessi 777
e dentro ci inserite

#!/bin/sh
cat /dev/ttyUSB0

infine digitate nella shell
/etc/init.d/controllo enable
/etc/init.d/controllo start

tutto questo serve per avvirare lo script della connessione a ogni riavvio del router.

Adesso sempre dalla shell date il comando
echo H > /dev/ttyUSB0 "nel mio caso la lettere H mi fa accendere il led "

Fin qui tutto tranquillo adesso vorrei una grande mano da voi!!! ho creato
uno script sh con questo codice

#!/bin/sh
echo H > /dev/ttyUSB0

vorrei che quando premo sul pulsante che mi richiama questo script sh, la pagina ritornasse indietro alla pagina dei pulsanti, oppure al quando premo sul pulsante
mandasse in esecuzione lo script senza cambiare di pagina.
non so se mi sono spiegato bene!!

attualmente sul pulsante di invio c'è questo codice html

<input name="button2" type=button onClick="parent.location='/cgi-bin/led_on.sh'" value='ON' >

riflettendoci un pò potrei mettere alla fine di questo script sh

#!/bin/sh
echo H > /dev/ttyUSB0

un redirect per farlo tornare indietro alla pagina dei comandi però non so propio come fare.

Quel router con il firmware usrobotics è spettacolare (almeno per me visto che me ne intendo poco).
Sulla usb ho messo una pendrive e la uso come nas , basta mettere i file là dentro per averli disponibili su tutti i pc collegati al router, anche tramite wifi.
Sulla pendrive c'è anche un piccolo webserver (ora esce solo una pagina html che dice "ciao io sono il webserver del tuo router", devo approfondire il discorso) :slight_smile:

Fossi in te io ripenserei la cosa in php senza scomodare la shell :wink:

Esempio (un po' stupido.. :P):

<?php
  if(count($_POST)) { //se un bottone viene premuto
    $fp =fopen("/dev/ttyUSB0", "w");  //apro il file del dispositivo seriale in scrittura
    fwrite($fp, $_POST['dir']); //scrivo il valore corrispondente al bottone premuto (H o L)
    fclose($fp); //chiudo il file
  }
?>


<html> 
  <head> 
    <title>Prova conrollo Arduino da PHP</title> 
  </head> 
  <body> 
    <h1>Premi un bottone</h1> 
    <form name="input" action="prova.php" method="post">
      <input type="submit" name='dir' value="H" />
      <input type="submit" name='dir' value="L" />
    </form>
  </body> 
</html>

Salvi come prova.php e vai :wink:

x iscrizione

funziona sei un grande!!!
Ho dovuto installare i pacchetti
lighttpd "per avere un'altro server che è molto + leggero di quello di serie a openwrt"
lighttpd-mod-cgi "che attiva i file php"
php4 "è l'unico supportato dal router"
php4-cgi "per i file php"

adesso provo a integrarlo nella mia pagina dei comandi.

Per avere anche lo stato dei led dentro la pagina dei comandi?????

kernak:
Fossi in te io ripenserei la cosa in php senza scomodare la shell :wink:

Esempio (un po' stupido.. :P):

<?php

if(count($_POST)) { //se un bottone viene premuto
    $fp =fopen("/dev/ttyUSB0", "w");  //apro il file del dispositivo seriale in scrittura
    fwrite($fp, $_POST['dir']); //scrivo il valore corrispondente al bottone premuto (H o L)
    fclose($fp); //chiudo il file
  }
?>

      Prova conrollo Arduino da PHP        

Premi un bottone

                      > ``` > > > > Salvi come *prova.php* e vai ;)

se volessi fare dei pulsanti personalizzati? invece di H o L volessi mettere on e off??

Per avere anche lo stato dei led dentro la pagina dei comandi?????

Invii lo stato sulla seriale da Arduino e leggi la seriale da php.

Es.
Invio 'a' da Arduino per "Led acceso", 's' per "Led spento"

<?php
  if(count($_POST)) { //se un bottone viene premuto

    /* scrittura sulla seriale */
    $fp =fopen("/dev/ttyUSB0", "w");  //apro il file del dispositivo seriale in scrittura
    fwrite($fp, $_POST['dir']); //scrivo il valore corrispondente al bottone premuto (H o L)
    fclose($fp); //chiudo il file
  
 
    /*lettura dalla seriale*/
    $fp =fopen("/dev/ttyUSB0", "r"); //apro il file in lettura
    $char = fread($fp, 1); //leggo 1 byte (1 carattere)
    fclose($fp);

    ( trim($char) == 'a' ) ? $stampa='Il led &egrave; acceso' : $stampa='Il led &egrave; spento';
  }
?>

<html> 
  <head> 
    <title>Prova conrollo Arduino da PHP</title> 
  </head> 
  <body> 
    <h1>Premi un bottone</h1> 
    <form name="input" action="prova.php" method="post">
      <input type="submit" name='dir' value="H" />
      <input type="submit" name='dir' value="L" />
    </form>
    <p><?php echo $stampa ?></p>
  </body> 
</html>

se volessi fare dei pulsanti personalizzati? invece di H o L volessi mettere on e off??

Mantenendo le stesso listato html, cambi semplicemente il "value" dei tag input: H -> On, L -> Off
Se ad arduino vuoi continuare ad inviare H e L devi cambiare il codice php ad es così:

<?php
  if(count($_POST)) { //se un bottone viene premuto

    /* scrittura sulla seriale */
    ( $_POST['dir'] == 'On' ) ? $command = 'H' : $command = 'L';
    $fp =fopen("/dev/ttyUSB0", "w");  //apro il file del dispositivo seriale in scrittura
    fwrite($fp, $command); //scrivo il valore corrispondente al bottone premuto (H o L)
    fclose($fp); //chiudo il file
  
 
    /*lettura dalla seriale*/
    //resta uguale 
  }
?>

Ora faccio una domanda io :stuck_out_tongue:

Sinceramente non ho capito questo:

ovviamente per comunicare abbiamo bisogno di una connessione che si ottiene digitando
cat /dev/ttyUSB0

Se lo fai per mantenere aperta la connessione da seriale in modo che arduino non si resetti ad ogni connessione, ti basta prendere un condensatore da 10uF e metterlo tra reset e gnd di arduino (per arduino uno!).
Questo evita il reset automatico e non ti serve lo script controllo.sh

kernak:
Ora faccio una domanda io :stuck_out_tongue:

Sinceramente non ho capito questo:

ovviamente per comunicare abbiamo bisogno di una connessione che si ottiene digitando
cat /dev/ttyUSB0

Se lo fai per mantenere aperta la connessione da seriale in modo che arduino non si resetti ad ogni connessione, ti basta prendere un condensatore da 10uF e metterlo tra reset e gnd di arduino (per arduino uno!).
Questo evita il reset automatico e non ti serve lo script controllo.sh

Guarda è un mese che sto impazzendo ma questo
Trucchetto nn lo sapevo. :slight_smile: . Adesso sono col cellulare appena torno a casa ci provo e ti faccio sapere. Grazie per la disponibilità

kernak:

Per avere anche lo stato dei led dentro la pagina dei comandi?????

Invii lo stato sulla seriale da Arduino e leggi la seriale da php.

Es.
Invio 'a' da Arduino per "Led acceso", 's' per "Led spento"

<?php

if(count($_POST)) { //se un bottone viene premuto

/* scrittura sulla seriale */
    $fp =fopen("/dev/ttyUSB0", "w");  //apro il file del dispositivo seriale in scrittura
    fwrite($fp, $_POST['dir']); //scrivo il valore corrispondente al bottone premuto (H o L)
    fclose($fp); //chiudo il file

/lettura dalla seriale/
    $fp =fopen("/dev/ttyUSB0", "r"); //apro il file in lettura
    $char = fread($fp, 1); //leggo 1 byte (1 carattere)
    fclose($fp);

( trim($char) == 'a' ) ? $stampa='Il led è acceso' : $stampa='Il led è spento';
  }
?>

      Prova conrollo Arduino da PHP        

Premi un bottone

                       

<?php echo $stampa ?>

  > ``` > > > > > > > > se volessi fare dei pulsanti personalizzati? invece di H o L volessi mettere on e off?? > > > > Mantenendo le stesso listato html, cambi semplicemente il "value" dei tag input: H -> On, L -> Off > Se ad arduino vuoi continuare ad inviare H e L devi cambiare il codice php ad es così: > > > ``` > <?php   if(count($_POST)) { //se un bottone viene premuto

/* scrittura sulla seriale */
    ( $_POST['dir'] == 'On' ) ? $command = 'H' : $command = 'L';
    $fp =fopen("/dev/ttyUSB0", "w");  //apro il file del dispositivo seriale in scrittura
    fwrite($fp, $command); //scrivo il valore corrispondente al bottone premuto (H o L)
    fclose($fp); //chiudo il file

/lettura dalla seriale/
    //resta uguale
  }
?>

Allora per quanto riguarda i pulsanti funziona , ma per leggere dalla porta seriale ho problemi. Ti posto lo sketch del mio arduino

const int ledPin = 13;
int incomingByte;     

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  
  if (Serial.available() > 0) {
    
    incomingByte = Serial.read();
    
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
      Serial.print("a\n");
    } 
    
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
      Serial.print("s\n");
    }
  }
}

Imposti la velocità della seriale di arduino a 9600 baud.
Verifica che anche quella del router sia la stessa:

# stty /dev/ttyUSB0 9600

Se non dovesse funzionare, prova anche a variare la velocità, ad es passa ai 115200 baud.

Esiste anche una classe php che ti permette di settare tutti i parametri della seriale direttamente dallo script: mi pare si chiami php_serial.class; se ti interessa, in rete dovresti trovarla facilmente.

kernak:
Imposti la velocità della seriale di arduino a 9600 baud.
Verifica che anche quella del router sia la stessa:

# stty /dev/ttyUSB0 9600

Se non dovesse funzionare, prova anche a variare la velocità, ad es passa ai 115200 baud.

Esiste anche una classe php che ti permette di settare tutti i parametri della seriale direttamente dallo script: mi pare si chiami php_serial.class; se ti interessa, in rete dovresti trovarla facilmente.

gia provata php_serial.class ma non funziona mi crea sempre un errore.

ho provato così ma niente

/*lettura dalla seriale*/
    $fp =fopen("/dev/ttyUSB0" 9600, "r"); //apro il file in lettura
    $char = fread($fp, 1); //leggo 1 byte (1 carattere)
    fclose($fp);

    ( trim($char) == 'a' ) ? $stampa='Il led &egrave; acceso' : $stampa='Il led &egrave; spento';
  }

No.

Questo

# stty /dev/ttyUSB0 9600

è un comando che devi dare dalla shell del router.
Non c'entra niente con php.

Dai un'occhiata alla pagina di man di stty per sapere cosa fa

kernak:
No.

Questo

# stty /dev/ttyUSB0 9600

è un comando che devi dare dalla shell del router.
Non c'entra niente con php.

Dai un'occhiata alla pagina di man di stty per sapere cosa fa

niente ho provato sia con # stty /dev/ttyUSB0 9600 che con # stty /dev/ttyUSB0 115200

mmm...

prova a scrivere un qualche sketch di prova su arduino, che invii qualcosa sulla seriale;
poi fa un cat /dev/ttyUSB0 da shell e vedi cosa ti arriva.

ho provato a mandare questo

//the pin on which you connect the anode (+) of the LED
byte ledPin =  13;
//our on/off switch
byte state = LOW;
 
//this function runs only once (after reset)
void setup(){
  //open the serial port and set data rate to 9600 bps
  Serial.begin(9600); 
  //set the pin we use to OUTPUT so we can power-up the LED
  pinMode(ledPin, OUTPUT); 
  //send our status
  Serial.println("Program started.");
  Serial.print("The LED connected to GND and PIN ");
  Serial.print(ledPin, DEC);
  Serial.println(" will start to blink!");
}
 
//this function runs continuosly (after setup)
void loop(){
  //toggle our switch (if off make it on and vice-versa)
  if (state == LOW){
    state = HIGH;
  } else {
    state = LOW;
  }
  //toggle the LED based on our switch above
  digitalWrite(ledPin, state);
  //send the LED status
  Serial.print("The LED is : ");
  if (state == LOW){
    Serial.println("OFF");
  } else {
    Serial.println("ON");
  }
  //sleep for 3000 ms = 3 seconds
  delay(3000);
}

sulla seriale del pc legge tranquillamente, invece nella schell se do il comando cat /dev/ttyUSB0 non succede niente

non è che per caso hai ancora attivo quello script controllo.sh, che svuota il buffer seriale?

kernak:
non è che per caso hai ancora attivo quello script controllo.sh, che svuota il buffer seriale?

si . lo disattivo e provo.

arrivaaaaa

root@OpenWrt:~# cat /dev/ttyUSB0
Program started.

The LED connected to GND and PIN 13 will start to blink!

The LED is : ON

The LED is : OFF

The LED is : ON

The LED is : OFF

The LED is : ON

The LED is : OFF

The LED is : ON

^Z[1]+  Stopped                    cat /dev/ttyUSB0
root@OpenWrt:~#

quindi anche senza mandandarlo in esecuzione automatica funziona lo stesso?