- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 182

Thema: Diskussion zum RP6 M256 WIFI Modul

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Editier mal in der RP6M256_WIFIlib.c die Zeile 341
    #define WIFI_DEBUG

    also Kommentarzeichen wegmachen. Dann den Simple Webserver nochmal neu übersetzen.
    Was wird im SERIELLEN Terminal ausgegeben?

    Aussehen sollte es so:
    Code:
    Got request: *CLOS**OPEN*GET / HTTP/1.1
    GOT GET!
    
    Close connection... 
    ### WIFI Enter CMD mode
    ENTER CMD GPIO14!
    
    W{?}
    ?
    [OK:?]
    RAW_CMD{close
    }
    close
    Write Commad done!
    
    ### WIFI Leave CMD mode
     W_CMD{exit ; EXIT}
    RAW_CMD{exit}
    exitWrite Commad done!
     [RESP_OK:EXIT]
    done!
    MfG,
    SlyD

  2. #2
    Max Web
    Gast
    Oh - ich glaube ich habe den Fehler gefunden: Der HTTP-Header, den ich benutzt habe, hat ein "Connection:close" nachgeschickt - vermutlich gab das Probleme mit dem manuellen Trennen der Verbindung im Programm...

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Ja da die Kommandobefehle ja prüfen ob die Kommandos richtig übertragen werden kann sich das in die Quere kommen.
    Kommt da nicht das richtige zurück gibts Fehlermeldungen.

    Wie schon dabei steht, das ist der simpelst denkbare Webserver damit es ein schön übersichtliches Beispiel bleibt.
    Wenn man den ganzen Kram den ein normaler Webserver sonst noch so kann braucht, muss man schon etwas mehr Aufwand treiben.


    MfG,
    SlyD

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Das macht echt Spass mit dem Loader und seinen abgedockten Terminals zu spielen.

    Auf Basis des Webserverbeispiels eine LED-Ansteuerung mit dem Browser:

    Code:
    // LEDs mit dem Browser ansteuern                                                mic 22.7.2012
    
    #include "RP6M256Lib.h"
    
    char c, kommando=0;
    
    void send_html_page(void);
    
    int main(void)
    {
    	initRP6M256();
    	
    	writeString_P("\n\nsetLEDs() mit dem Browser                            22.7.2012 mic\n\r");
    
    	// Make sure WLAN Module Packet size / buffer size and flush timer is OK
    	enter_cmd_mode_WIFI();
    	issueCMD_WIFI("set comm size 1024","AOK");
    	issueCMD_WIFI("set comm time 10","AOK");
    	leave_cmd_mode_WIFI();
    	
    	while(true)
    	{
    		if(getBufferLength_WIFI()) // Daten vom Browser empfangen?
    		{
    			c=readChar_WIFI();
    			writeChar(c);  // ja, dann Daten zum seriellen Terminal senden
    			
    			if(c == '?') { kommando=1; setLEDs(0); } // und ab dem ? interpretieren
    
    			if(kommando) switch(c)
    				{
    					case 'a': setLED1(1); break;
    					case 'b': setLED2(1); break;
    					case 'c': setLED3(1); break;
    					case 'd': setLED4(1); break;
    				}
    
    			if(c == 13) // Datenende
    			{
    				if(kommando) kommando=0; else setLEDs(0); // LEDs aus, wenn kein ? gefunden
    				send_html_page();
    			}
    		}
    	}
    	return 0;
    }
    
    void send_html_page(void)
    {
    	// Send HTTP Header:
    	writeString_P_WIFI("HTTP/1.0 200 OK\r\n");
    	writeString_P_WIFI("Content-Type: text/html\r\n");
    	writeString_P_WIFI("\r\n");
    
    // Send HTML Content:
    writeString_P_WIFI("<html><head><title>RP6-WIFI: Leds ansteuern</title></head><body>\n");
    
    writeString_P_WIFI("setLeds():\n");
    writeString_P_WIFI("<form action=\"http://169.254.77.3:2000\" method=\"get\">\n");
    
    writeString_P_WIFI("<input type=\"radio\" name=\"SL4\" value=\"d\">&nbsp;\n");
    writeString_P_WIFI("<input type=\"radio\" name=\"SL3\" value=\"c\">&nbsp;\n");
    writeString_P_WIFI("<input type=\"radio\" name=\"SL2\" value=\"b\">&nbsp;\n");
    writeString_P_WIFI("<input type=\"radio\" name=\"SL1\" value=\"a\">\n");
    writeString_P_WIFI("<br>\n");
    
    writeString_P_WIFI("<input type=\"submit\" value=\"Setzen\">\n");
    writeString_P_WIFI("<input type=\"reset\" name=\"Name\" value=\"reset\">\n");
    writeString_P_WIFI("</form>\n");
    
    writeString_P_WIFI("</body>\n");
    writeString_P_WIFI("</html>\n");
    
    	// Wait a bit and then close connection:
    	mSleep(50);  // Depending on the content you may have to wait longer.
    
    	enter_cmd_mode_WIFI(); // ??? Wie funktioniert das?
    	writeCommand_WIFI("close\r");
    	leave_cmd_mode_WIFI();
    }
    Die URL im Form-Tag muss man natürlich anpassen.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    29.08.2008
    Beiträge
    73
    Hey leute,

    ich werf mal so zwischen durch ein, dass ichs auch endlich am Laufen habe
    Die Einarbeitung ist doch etwas tricky, wenn man keinen RP6 hat, aber es ist eigentlich alles super erklärt nur schadet es nicht das RP6 Handbuch auch zu kennen.
    ich hatte zuerst auch Probleme mit der WLAN-Verbindung, aber es lag an meinem Router. Hab das Modul jetzt wo anders getestet, da geht es sofort ohne Probleme. Super Arbeit von Arrex. Jetzt auf ans weiter testen.

    Gruß
    Elchi

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Jo, Ichthyosaurier nun auch endlich ein vernünftiges WLAN-Terminal in labview, welches ich nun gerade versuche, zu verwenden und einzubauen.
    Mal sehen...

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Beim Kompilieren des SD-Card-Beispiel habe ich einige Hürden zu überwinden. Gegen " 'for' loop initial declaration used outside C99 mode" hilft ein "-std=c99" in den Flags des Kompilers im Makefile. Das war noch einfach. Aber das verstehe ich nicht:

    Code:
    avr-gcc -std=c99 -mmcu=atmega2560 -Os -mno-interrupts -funsigned-char -funsigned-bitfields -Wall -Wstrict-prototypes -ggdb -c -DF_CPU=16000000UL -Wa,-acdhlmns=RP6M256Lib.lst RP6M256Lib.c -o RP6M256Lib.o
    RP6M256Lib.c:547: warning: declaration does not declare anything
    RP6M256Lib.c: In function 'delayCycles':
    RP6M256Lib.c:650: error: 'asm' undeclared (first use in this function)
    RP6M256Lib.c:650: error: (Each undeclared identifier is reported only once
    RP6M256Lib.c:650: error: for each function it appears in.)
    RP6M256Lib.c:650: error: expected ';' before 'volatile'
    make: *** [RP6M256Lib.o] Error 1
    Beides bezieht sich auf die Datei RP6M256Lib.c:

    Code:
    /*****************************************************************************/
    // Delays, Stopwatches and Beeper:
    
    
    // ---------------------
    // Internal status bits
    volatile union {
    	uint8_t byte;
    	struct {
    		unsigned beep:1;
    		unsigned unused:7;
    	}; <-- Zeile 547
    } controlStatus;
    Code:
    /**
     * Delay a number of instruction cycles. 
     * No exact delay function! And interrupts can still occur and 
     * add a lot of extra cycles.
     * This function only guarantees to delay for a MINIMAL number
     * of cycles! 
     *
     * Example:
     * 	delayCycles(1000); // Delays for *about* 1000 instruction cycles
     */
    void delayCycles(volatile uint16_t dly)
    {
    	//volatile uint16_t delay2 = dly;
    	//while(delay2--) nop();	
    	while(dly--) nop(); <-- Zeile 650
    }
    Das #define für nop() findet sich in RP6M256.h in Zeile 276:
    Code:
    // Assembly and system macros:
    #define nop(); {asm volatile("nop\n\t");} <-- Zeile 276
    #define bl_reset(); cli();bl_start();
    (Zeilenangaben jeweils aus der Library der Testmodule)

    Irgendwelche Ideen?

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Hi Radbruch,

    funzt dein Programm bei dir immer? Bei mir klappt es bis zur ersten Eingabe, ab der zweiten ist die Verbindung weg?!!?

    Grüße

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Habe da einen kleinen Fehler im Beispiel 12 entdeckt:
    Wenn man cmd aktiviert hat, aber einen Bumper betätigt, wird zunächst kein Escape-Behave aktiviert. Dieser folgt dann aber prompt, wenn man den Command-Modus wieder deaktiviert...
    Ist glaube ich nicht so gewollt, oder?
    Grüße

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Bei mir klappt es bis zur ersten Eingabe, ab der zweiten ist die Verbindung weg?
    Das Beispiel für die SD-Card erwartet keine Parameter. Hast du die Text-Datei aus dem Beispielordner in das Root-Verzeichniss der SD-Card kopiert? SD-Card ist mit FAT32 formatiert?

    Jetzt fehlt eigentlich nur noch die GUI und vielleicht ein etwas effizienteres Protokoll
    Ein WIFI-Board braucht doch keine GUI, eine Browserschnittstelle ist viel knuffiger:

    Code:
    // LEDs setzen und Daten der Browseranforderung anzeigen                        mic 28.7.2012
    
    // https://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul?p=555651&viewfull=1#post555651
    
    #include "RP6M256Lib.h"
    
    uint8_t c, header_html_request[20][100], hhr_zeile=0, hhr_zeile_max=0, hhr_pos=0, hhr_params;
    uint8_t leds_mask=0;
    
    void leds_setzen(void);
    void send_html_page(void);
    
    int main(void)
    {
    	initRP6M256();
    
    	writeString_P("\n\rBrowserdaten anzeigen                               mic 28.7.2012\n\r");
    
    	// Make sure WLAN Module Packet size / buffer size and flush timer is OK
    	enter_cmd_mode_WIFI();
    	issueCMD_WIFI("set comm size 1024","AOK");
    	issueCMD_WIFI("set comm time 10","AOK");
    	leave_cmd_mode_WIFI();
    
    	while(true)
    	{
    		if(getBufferLength_WIFI()) // Daten vom Browser empfangen?
    		{
    			c=readChar_WIFI(); // Zeichen einlesen...
    			if(hhr_pos<98) header_html_request[hhr_zeile][hhr_pos++]=c; // ...und speichern
    			if(c==13) // Zeilenende?
    			{
    				header_html_request[hhr_zeile][hhr_pos++]=0; // String Endekennung anfügen
    				hhr_zeile++; // nächste Zeile einlesen
    				hhr_pos=0; // Zeile startet bei Position null
    				stopStopwatch1();
    				setStopwatch1(0);
    				startStopwatch1(); // Timeout starten
    			}
    		}
    
    		if(getStopwatch1() > 50) // Timeout beim Empfang bedeutet Headerende
    		{
    			header_html_request[hhr_zeile][hhr_pos++]=0; // String Endekennung anfügen
    			hhr_zeile_max=hhr_zeile+1; // Anzahl der Zeilen speichern...
    			leds_setzen();
    			send_html_page(); // ... und antworten
    			hhr_zeile=0; // vorbereiten für nächsten Request-Header
    			hhr_pos=0;
    			hhr_zeile_max=0;
    			stopStopwatch1(); // ab jetzt kein Timeout mehr überprüfen
    			setStopwatch1(0);
    		}
    	}
    	return 0;
    }
    
    void leds_setzen(void)
    {
    	hhr_pos=0;
    	do
    		c=header_html_request[0][hhr_pos++];
    	while(c && (c != 'G'));
    
    	if(c) // GET oder POST im Request gefunden?
    		hhr_params=0; // GET
    	else
    		hhr_params=hhr_zeile_max-1; // kein GET
    
    	hhr_pos=0;
    	leds_mask=0;
    	do
    	{
    		c=header_html_request[hhr_params][hhr_pos++];
    		if(c) switch(c)
    		{
    			case 'a': leds_mask |= 1; break;
    			case 'b': leds_mask |= 2; break;
    			case 'c': leds_mask |= 4; break;
    			case 'd': leds_mask |= 8; break;
    		}
    	}while(c);
    
    	setLEDs(leds_mask & 0Xf);
    }
    
    void send_html_page(void)
    {
    	// Erhalt der Anforderung quittieren:
    	writeString_P_WIFI("HTTP/1.1 200 OK\r\n");
    	writeString_P_WIFI("Content-type: text/html\r\n");
    	writeString_P_WIFI("\r\n");
    
    	stopStopwatch1();
    	setStopwatch1(0);
    	startStopwatch1();
    
    // Send HTML Content:
    writeString_P_WIFI("<html>\n<head>\n<title>RP6-WIFI: HTTP-Requestdaten anzeigen</title>\n</head>\n<body>\n");
    writeString_P_WIFI("<h1>RP6-WIFI: LED setzen mit GET und POST</h1>\n");
    writeString_P_WIFI("<form action=\"\" name\"get\" method=\"get\">\n");
    
    writeString_P_WIFI("gSL4<input type=\"checkbox\" ");
    if(leds_mask & 8) writeString_P_WIFI("checked ");
    writeString_P_WIFI("name=\"gSL4\" value=\"d\">&nbsp;&nbsp;\n");
    
    writeString_P_WIFI("gSL3<input type=\"checkbox\" ");
    if(leds_mask & 4) writeString_P_WIFI("checked ");
    writeString_P_WIFI("name=\"gSL3\" value=\"c\">&nbsp;&nbsp;\n");
    
    writeString_P_WIFI("gSL2<input type=\"checkbox\" ");
    if(leds_mask & 2) writeString_P_WIFI("checked ");
    writeString_P_WIFI("name=\"gSL2\" value=\"b\">&nbsp;&nbsp;\n");
    
    writeString_P_WIFI("gSL1<input type=\"checkbox\" ");
    if(leds_mask & 1) writeString_P_WIFI("checked ");
    writeString_P_WIFI("name=\"gSL1\" value=\"a\">&nbsp;\n");
    
    writeString_P_WIFI("<input type=\"submit\" value=\"GET\">\n");
    writeString_P_WIFI("</form>\n");
    
    writeString_P_WIFI("<form action=\"\" name\"post\" method=\"post\">\n");
    
    writeString_P_WIFI("pSL4<input type=\"checkbox\" ");
    if(leds_mask & 8) writeString_P_WIFI("checked ");
    writeString_P_WIFI("name=\"pSL4\" value=\"d\">&nbsp;&nbsp;\n");
    
    writeString_P_WIFI("pSL3<input type=\"checkbox\" ");
    if(leds_mask & 4) writeString_P_WIFI("checked ");
    writeString_P_WIFI("name=\"pSL3\" value=\"c\">&nbsp;&nbsp;\n");
    
    writeString_P_WIFI("pSL2<input type=\"checkbox\" ");
    if(leds_mask & 2) writeString_P_WIFI("checked ");
    writeString_P_WIFI("name=\"pSL2\" value=\"b\">&nbsp;&nbsp;\n");
    
    writeString_P_WIFI("pSL1<input type=\"checkbox\" ");
    if(leds_mask & 1) writeString_P_WIFI("checked ");
    writeString_P_WIFI("name=\"pSL1\" value=\"a\">&nbsp;\n");
    
    writeString_P_WIFI("<input type=\"submit\" value=\"POST\">\n");
    writeString_P_WIFI("</form>\n");
    
    	for(hhr_zeile=0; hhr_zeile < hhr_zeile_max; hhr_zeile++)
    	{
    		hhr_pos=0;
    		writeString_P_WIFI("Request Zeile ");
    		writeInteger_WIFI(hhr_zeile, 10);
    		writeString_P_WIFI(": ");
    		do
    		{
    			c=header_html_request[hhr_zeile][hhr_pos++];
    			if(c) writeChar_WIFI(c);
    		}while(c);
    		writeString_P_WIFI("\n<br>\n");
    	}
    
    	writeString_P_WIFI("\n<br>\nDie Parameter befinden sich in Zeile ");
    	writeInteger_WIFI(hhr_params, 10);
    	writeString_P_WIFI(":\n<br>\n");
    	hhr_pos=0;
    	do
    	{
    		c=header_html_request[hhr_params][hhr_pos++];
    		if(c) writeChar_WIFI(c);
    	}while(c);
    
    writeString_P_WIFI("<br>\nleds_mask ist ");
    writeInteger_WIFI(leds_mask, 2);
    writeString_P_WIFI("\n<br><br>\n<small>\n[Ladezeit der Seite: ");
    writeInteger_WIFI(getStopwatch1()+1, 10);
    writeString_P_WIFI("ms]\n<br><br>\nmic 29.7.2012\n</small>\n");
    writeString_P_WIFI("</body>\n");
    writeString_P_WIFI("</html>\n");
    
    	stopStopwatch1();
    	setStopwatch1(0);
    	// Wait a bit and then close connection:
    	mSleep(50);  // Depending on the content you may have to wait longer.
    
    	enter_cmd_mode_WIFI();
    	writeCommand_WIFI("close\r");
    	leave_cmd_mode_WIFI();
    }
    Zwar noch etwas holperig und viel "zu Fuss" programmiert, weil ich mit HTML nicht wirklich geübt bin, aber immerhin zeigt es den Ansatz. Leider funktioniert es nicht mit meinem 9er IE, aber mit dem FF klappts wie erwartet. Es ist natürlich noch nicht perfekt.

    Das hier stört mich noch sehr dabei, weil es massig Speicherplatz verschwendet:

    header_html_request[20][100]

    Aber der m256 hat ja reichlich davon. ;)

    Gruß

    mic
    Geändert von radbruch (29.07.2012 um 02:33 Uhr) Grund: optisches Update
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Ähnliche Themen

  1. [ERLEDIGT] Kostenlose RP6 M256 WIFI Module für Testanwender!
    Von SlyD im Forum Robby RP6
    Antworten: 10
    Letzter Beitrag: 02.07.2012, 15:24
  2. RP6v2 M256 WiFi !?
    Von Dirk im Forum Robby RP6
    Antworten: 20
    Letzter Beitrag: 11.05.2012, 19:27
  3. ARM für WiFi steuerung ?
    Von fat tony im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 5
    Letzter Beitrag: 03.01.2010, 13:57
  4. Wifi Roboter
    Von newName im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 4
    Letzter Beitrag: 16.01.2008, 13:51
  5. Formate zur Diskussion
    Von sonic im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 24
    Letzter Beitrag: 03.08.2004, 18:41

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress