Configurare RN-XV con WirelessProtoShield.

Ho ancora bisogno di voi !! :slight_smile:

In breve
Non riesco a far funzionare il modulo wi-fy "rn-xv roving networks".

Costa sto utilizzando

Hardware

Software
IDE ver: Arduino 1.0.2
Libreria: WiFlyHQ.h (questa: GitHub - harlequin-tech/WiFlyHQ: WiFly RN-XV Arduino Library)
Sketch: WiFlyHQ/examples/httpserver at master · harlequin-tech/WiFlyHQ · GitHub

Topic di riferimento da cui sono partito : http://arduino.cc/forum/index.php/topic,99362.0.html

L'errore
Sul monitor seriale continuo ad avere questo risultato:

Starting
Free memory: 1297
setPrompt failed
Failed to enter command mode
Failed to start wifly
Terminal ready

Ora, per completezza, tramite Fing (senza entrare nei dettagli, scansiona la LAN) vedo che esiste un device "WiFly-EZX Roving Networks", quindi è visibile, con IP: 192.168.0.10, e quindi la configurazione del modulo WiFi è stata fatta correttamente (ma questo modulo l'avevo abbandonato un po di tempo fa, quindi potrei aver configurato tutto tramite telnet prima di utilizzare questo sketch) e la porta disponibile è la 2000 con cui infatti riesco a collegarmi in telenet ed apportare le modifiche che voglio, compreso verificare le attuali impostazioni del modulo, che riporto qui sotto (oscurando ovviamente SSID e PSW).

Questa la "comunicazione" in telnet:

*HELLO*$$
CMD


<2.23> get everything
get everything

WiFly Ver 2.23, 04-26-2011 on RN-171
Beacon=100
Probe=5
OPEN=*OPEN*
CLOSE=*CLOS*
REMOTE=*HELLO*
FlushSize=64
MatchChar=0
FlushTimer=10
IdleTimer=0
CmdChar=$
IF=UP
DHCP=ON
IP=192.168.0.10:2000
NM=255.255.255.0
GW=192.168.0.1
HOST=0.0.0.0:2000
PROTO=TCP,
MTU=1524
FLAGS=0x7
BACKUP=0.0.0.0
DNS=192.168.0.1
Name=server1
Backup=backup2
FTP=208.109.78.34:21
File=wifly-EZX.img
User=roving
Pass=Pass123
Dir=public
Timeout=40
FTP_mode=0x0
SSID=[MIO_SSID]
Chan=0
ExtAnt=0
Join=1
Auth=OPEN
Mask=0x1fff
Rate=12, 24 Mb
Linkmon=0
Passphrase=[MIA_PSW]
TxPower=0
SleepTmr=0
WakeTmr=0
Trigger=0x1
Autoconn=0
IoFunc=0x0
IoMask=0x21f0
IoValu=0x0
PrintLvl=0x1
TimeEna=0
TIMEADR=129.6.15.28:123
Zone=7
[b]Baudrate=9600[/b]
Flow=0x0
Mode=0x0
JoinTmr=1000
Replace=0x24
DeviceId=WiFly-EZX
Password=
Format=0x0
Signal=0
Average=5
BCAST=255.255.255.255:55555
Interval=0x7
Sensor=0x0
SensePwr=0x0
<2.23>

La parte di codice che interessa di più è questa, perchè credo che contenga gli elementi fondamentali su cui immagino di sbagliare (la comunicazione seriale e quindi il baud rate):

#include <WiFlyHQ.h>

#include <SoftwareSerial.h>
SoftwareSerial wifiSerial(8,9);

//#include <AltSoftSerial.h>
//AltSoftSerial wifiSerial(8,9);

WiFly wifly;

/* Change these to match your WiFi network */
const char mySSID[] = "[MIO_SSID]";
const char myPassword[] = "[MIA_PSW]";

void sendIndex();
void sendGreeting(char *name);
void send404();

char buf[80];

void setup()
{
    Serial.begin(115200);
    Serial.println(F("Starting"));
    Serial.print(F("Free memory: "));
    Serial.println(wifly.getFreeMemory(),DEC);

    wifiSerial.begin(9600);
    if (!wifly.begin(&wifiSerial, &Serial)) {
        Serial.println(F("Failed to start wifly"));
	wifly.terminal();
    }

Le domande sono due in realtà, una per capire, l'altra per risolvere.

Il "Wireless Proto Shield" replica i pin del modulo wireless ? o meglio, il TX e RX del modulo wireless (che dovrebbero essere i pin 2 e 3) vengono replicati sulle uscite dello shield ? oppure devo collegarmi sulla mille fori per prendere le due uscite ? (ci sono dei fori sullo shield in corrispondenza dei 20 pin del modulo wireless)

E soprattutto !! Come risolvo il problema che non riesco a far comunicare arduino con il modulo wireless ? Ho letto il topic postato più su, e molte altre discussioni, ma non sono riuscito a risolvere e (sbagliando! perchè potevo fare danni) ho provato tutte le combinazioni possibili di aggancio tra "seriale di debug" e i pin 8 e 9, quelli del "SoftwareSerial".

Probabilmente mi manca qualche conoscenza per fare queste cose, per questo ho riportato veramente tutto !!! Grazie in anticipo :slight_smile:

Ciao, io per la mia tesi ho utilizzato lo stesso modulo ma con un arduino rv3 e una wireless shield sd..se ti puo interessare ti posto il codice..ho avuto anche io molti problemi a configurarlo..perchè pare che copi nella sua memoria delle variabili e poi va in overflow e impazzisce..quindi devi dosare parecchio l'uso delle variabili nello sketch

/********************************************************************************************************  
   Mirko Mancin - Tesi triennale a.a. 2011/12

   SCHEDA PER IL MONITORAGGIO AMBIENTALE CON 3 SENSORI E INVIO DEI DATI AD UN SERVER CON UN MODULO WIFI
  
 - Sensore Temperatura e Umidità DHT22 D2
 - Sensore Luce A1
 - Sensore Gas (CO2) A2 
 - Modulo RN-XV per comunicazione WiFi 

*********************************************************************************************************/

//DEFINIZIONE LIBRERIE
#include <WiFlyHQ.h>
#include <SoftwareSerial.h>

//DEFINIZIONE MACRO PER IL RESET DELLA SCHEDA
#include <avr/io.h>
#include <avr/wdt.h>
#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}

//DOPO UN ORA SI RESETTERA' LA SCHEDA, ONDE EVITARE PROBLEMI CON LA COMUNICAZIONE WIFI
#define Reset_After_1hour 3600000    

//WIFI SETTINGS
WiFly wifly;

const char mySSID[] = "***";
const char myPassword[] = "***";

char serverName[] = "***";//URL del server a cui connettersi
#define serverPort 80 //porta di connessione
char* macStr;

SoftwareSerial wifi(8,9);

//PROCEDURA DI SCRITTURA IN MEMORIA PROGRAMMA
void print_P(const prog_char *str);
void println_P(const prog_char *str);

char jsonMsgBody[128];

void setup(){
  Serial.begin(9600);
  Serial.println(" --- SCHEDA DI MONITORAGGIO AMBIENTALE --- ");
  delay(1000);
  Serial.println("Programma Avviato, Setup Terminato!");  
}


void loop(){
        
    configWIFI();

    int valore = <quello che voglio inviare>
    sprintf(jsonMsgBody,"%d",valore);
    
    InvioWIFIHttp(jsonMsgBody);            
    
    Reset_AVR();                             
}

//PROCEDURA DI CONFIGURAZIONE E CONNESSIONE ALLA RETE WIFI
//SE CI SONO PROBLEMI CON IL WIFI RESETTO LA SCHEDA E RIPROVO AL PROSSIMO RIAVVIO
int configWIFI(){
    println_P(PSTR("Starting"));
    print_P(PSTR("Free memory: "));
    Serial.println(wifly.getFreeMemory(),DEC);

    wifi.begin(9600);    //DEFINISCO IL BAUDRATE DI COMUNICAZIONE WIFI
    if (!wifly.begin(&wifi, &Serial)) {
        println_P(PSTR("Failed to start wifly"));
	Reset_AVR();
    }

    char buf[32];
    /* Join wifi network if not already associated */
    if (!wifly.isAssociated()) {
	/* Setup the WiFly to connect to a wifi network */
	println_P(PSTR("Joining network"));
	wifly.setSSID(mySSID);
	//wifly.setPassphrase(myPassword);
        wifly.setKey(myPassword);
	wifly.enableDHCP();

	if (wifly.join()) {
	    println_P(PSTR("Joined wifi network"));
	} else {
	    println_P(PSTR("Failed to join wifi network"));
	    Reset_AVR();
	}
    } else {
        println_P(PSTR("Already joined network"));
    }

    print_P(PSTR("MAC: "));
    macStr = (char *)(wifly.getMAC(buf, sizeof(buf)));
    Serial.println(macStr);
    print_P(PSTR("IP: "));
    Serial.println(wifly.getIP(buf, sizeof(buf)));
    print_P(PSTR("Netmask: "));
    Serial.println(wifly.getNetmask(buf, sizeof(buf)));
    print_P(PSTR("Gateway: "));
    Serial.println(wifly.getGateway(buf, sizeof(buf)));
    print_P(PSTR("SSID: "));
    Serial.println(wifly.getSSID(buf, sizeof(buf)));

    wifly.setDeviceID("Wifly-WebClient");
    print_P(PSTR("DeviceID: "));
    Serial.println(wifly.getDeviceID(buf, sizeof(buf)));

    if (wifly.isConnected()) {
        println_P(PSTR("Old connection active. Closing"));
	wifly.close();
    }
    
    if (wifly.open(serverName, serverPort)) {
        print_P(PSTR("Connected to "));
	Serial.println(serverName);

	Serial.println("WIFI ALREADY");
    } else {
        println_P(PSTR("Failed to connect"));
        Reset_AVR();
    }   
}

//STAMPO UNA STRINGA DA MEMORIA PROGRAMMA
void print_P(const prog_char *str)
{
    char ch;
    while ((ch=pgm_read_byte(str++)) != 0) {
	Serial.write(ch);
    }
}

void println_P(const prog_char *str)
{
    print_P(str);
    Serial.println();
}

//PROCEDURA D'INVIO CHE MANDA I DATI AL SERVER CON UNA STRINGA JSON, 
//OGNI VOLTA ATTENDO LA RISPOSTA DAL SERVER E LEGGO IL VALORE DI RITORNO PER 
//SAPERE QUANDO DEVO CAMPIONARE I PROSSIMI DATI
void InvioWIFIHttp(char* jsonStringBody){
  Serial.println("CREO RICHIESTA");
  
  wifly.print("POST /index.php HTTP/1.0\r\n");
  wifly.print("Content-Length: 512");
  wifly.print("\r\n\r\n");
  wifly.print(jsonStringHead);
  
  Serial.println("RISPOSTA DEL SERVER");
  //ATTENDO LA RISPOSTA DAL SERVER
  while(wifly.available()==0){}
  
     if(wifly.available() > 0) {
       char buf[200] = "buffer";
       
       wifly.gets(buf, sizeof(buf));
       Serial.println(buf);               
    }   
}

spero ti sia utile..per altri dubbi chiedi..se vuoi un piccolo tutorial di quello che ho fatto guarda la lezione 3 che ho fatto per un corso nelle scuole http://www.mancio90.it/index.php?option=com_content&view=article&id=26&Itemid=168#.UVhStRzBquI

Innanzitutto grazie mille per la risposta, e in particolare per lo sketch e il link in cui ci sono tante cose utili !! Hai fatto un gran bel lavoro, si è guadagnato un posto tra i miei preferiti :slight_smile:

Purtroppo però ho lo stesso problema :

 --- SCHEDA DI MONITORAGGIO AMBIENTALE --- 
Programma Avviato, Setup Terminato!
Starting
Free memory: 797
setPrompt failed
Failed to enter command mode

Il problema è sicuramente nell'invio dei comandi al modulo wi-fi da parte di Arduino. In un altro topic avevo trovato l'immagine di un ragazzo che aveva collegato i pin 0 e 1 (RX e TX) dello shield con i pin 8 e 9 dello shield (che dovrebbero essere i pin RX e TX del modulo wi-fi) ... ma non so se è corretto. A dire il vero, se creo questo "ponte" il monitor seriale non visualizza niente ! L'errore che ho riportato sopra ce l'ho se non collego niente... e probabilmente è normale.

Se questo "ponte" fosse giusto, il problema sarebbe altrove, per ora il mio cervello si è fossilizzato su questa incertezza !!

anche io l'ho fatto

SoftwareSerial wifi(8,9);

solo che devo "togliere" i pin 0 e 1 della shield da arduino...cioè..quando incastri la shield su arduino..invece che incastrare tutti i pin, i pin 0 e 1 li pieghi un po in modo che non si incastrino con arduino..cosi puoi continuare ad usare il monitor seriale e la comunicazione con il modulo la fai con i pin 8 e 9

Ma fantastico !!! Funziona davvero :smiley:

Confesso che non mi fa impazzire l'idea di piegare i piedini, però effettivamente funziona !!

Il risultato adesso è questo:

Starting
Free memory: 1297
Already joined network
MAC: 00:06:66:80:36:17
IP: 192.168.0.10
Set port to 80, rebooting to make it work
Ready

E riesco ad accedere al webserver sull'indirizzo ip... son felicissimo !!

Ma non c'è un modo per ovviare alla piegatura dei piedini ? Comunque va bene anche così ! l'importante adesso era raggiungere il risultato.

Grazie mille ancora per l'aiuto !!!

si puoi ma devi lavorare con la seriale hardware..togliendoti cosi a possibiità di un "debug" ..cosi è la soluzione migliore credo