Tutorial: Cactus Rev 2 ESP8266 flashen

Aktualisiert am:

ESP8266 Firmware flashen

Wenn ihr genauso Pech hattet, wie ich, dann antwortet euer ESP8266 gar nicht, selten oder antwortet mit komischen Zeichen. Ich habe alle Szenarien durch und schluss endlich habe ich heraus gefunden, dass auf manchen ESP8266-Chips eine korrupte Firmware installiert ist.

Damit ihr den ESP8266 Chip zum sprechen bekommt, müssen wir sicherstellen, dass die darauf installierte Firmware korrekt arbeitet. Da wir das nicht mit hunderprozentiger Sicherheit sagen können, flashen wir den Chip einfach erneut.

In diesem Guide arbeiten wir zunächst mit dieser Firmware. In einem anderen Beitrag werde ich euch zeigen, wie man eine eigene Firmware, beispielsweise mit einem Websockt, auf den ESP-Chip flashen kann.

In diesem Tutorial nutze ich übrigens den Cactus Rev 2 der mit dem NodeMcu Lua ESP8266-12 Dev Board vergleichbar ist.

Programmer auf Atmega32u4 laden

Um den ESP8266 zu flashen müssen wir den Programmer auf den Atmega32u4 laden, damit wir den ESP-Chip direkt über unser Atmega flashen können. Danach können wir mit dem esptool.py oder dem NodeMCU-Flasher einfach den port und das Binary auswählen, um den ESP8266 zu flashen.

  1. Ladet euch die esp8266Programmer.ino herunter und öffnet diese mit der Arduino IDE.
  2. Wählt unter Werkzeuge > Board “LilyPad Arduino USB” aus.
  3. Wählt unter Werkzeuge > Port den Cactus Rev 2 aus.
  4. Ladet den Sketch auf den Atmega hoch.
Arduino IDE - Unter Werkzeuge müsst ihr das Board LilyPad Arduino USB und den rihctigen Port auswählen.
Arduino IDE – Unter Werkzeuge müsst ihr das Board LilyPad Arduino USB und den rihctigen Port auswählen.

ESP8266 unter Windows flashen

Dieses Tool gibt es für Windows mit einer anschaulichen UI, oder für Mac und Linux als CommandLineTool. Ich habe sowohl mit dem esptool.py als auch mit dem NodeMCU-Flasher jeweils einen ESP-Chip erfolgreich flashen können. In diesem Beispiel verwenden wir die nodemcu_integer_0.9.5_20150318.bin Firmware. Eine Liste der verfügbaren und gängigen Firmwares findet ihr auf der Wiki-Seite vom ESP8266.

Beim Flashen müsst ihr folgende Dinge beachten:

  • Baudrate
  • Flash-Size
  • Flash Speed
  • SPI Mode
Beim Flashen vom ESP8266 mit NodeMCU-Flasher solltet ihr die abgebildeten Einstellungen übernehmen.
Beim Flashen vom ESP8266 mit NodeMCU-Flasher solltet ihr die abgebildeten Einstellungen übernehmen.
Nun wählt ihr den COM Port aus und flasht den ESP8266.
Nun wählt ihr den COM Port aus und flasht den ESP8266.

ESP8266 unter Mac / Linux flashen

Zum Flashen des ESP8266 benötigen wir unter Mac bzw. Linux das CommandLineTool esptool. Eine Liste der verfügbaren und gängigen Firmwares findet ihr auf der Wiki-Seite vom ESP8266. In diesem Beispiel verwenden wir die nodemcu_integer_0.9.5_20150318.bin Firmware.

Um zu testen, ob ihr euch mit dem ESP8266 überhaupt verbinden könnt, führt einfach den folgenden Befehl aus und ihr erhaltet die MAC-Adresse vom Chip selbst.

./esptool.py -p /dev/<port> read_mac
In der Konsole wird die MAC Adresse vom ESP-Chip ausgegeben.
In der Konsole wird die MAC Adresse vom ESP-Chip ausgegeben.

Achtung! Ich habe viele viele Anläufe benötigt, um die richtige Taktik zu finden und durch einen dummen Zufall habe ich heraus gefunden, dass man unter Mac die USB-Verbindung vom Cactus Rev 2 vor dem Flashen trennen muss und direkt nach dem erneuten VErbinden das esptool.py starten muss (~ 3 Sekunden maximal).

Zum Flashen vom ESP8266 müsst ihr nun folgenden Befehl ausführen:

./esptool.py --port /dev/<device> write_flash 0x00000 <path to binary>
esptool.py beginnt nun den ESP8266 zu flashen.
esptool.py beginnt nun den ESP8266 zu flashen.

WLAN-Verbindung aufbauen und eine URL aufrufen

Der folgende Scatch zeigt auf einfache Art und Weise, wie man den Cactus Rev 2 mit einem vorhandenen WLAN-Netzwerk verbindet und eine URL aufruft. Dieses Beispiel findet ihr auch auf github.com, dort könnt ihr euch alle meine Beispiel-Dateien herunterladen.

In den Zeilen:

  • 10. und 11. müsst ihr die WLAN-Zugangsdaten anpassen.
  • 83. müsst ihr den Host zu eurem Server eintragen.
  • 110. müsst ihr den Host zu eurem Server und die Datei die aufgerufen werden soll eintragen.

[sam_zone id=”2″ codes=”true”]

int wifiConnected = 0;
int status;
String GET;

#define DEBUG 0 // Please set DEBUG = 0 when USB not connected

#define _baudrate 9600
#define wifi_pin 13

#define SSID ""
#define PASS ""
#define IP "derpade.de"

void setup()
{
 pinMode (13, OUTPUT);
 digitalWrite (13, HIGH);
 delay(1000);

 Serial.begin( _baudrate );
 Serial1.begin( _baudrate );

 if(DEBUG)
 {
    while(!Serial);
 }

 Serial1.println("AT+RST");
 delay(3000);
 Serial1.println("AT+CWMODE=1");
 delay(300);
 Serial1.println("AT+RST");
 delay(500);

}


void loop() {

 digitalWrite (13, HIGH);

 sendDebug("AT+CIFSR");
 delay(300);
 if (Serial1.find("192.168."))
 {
    Serial.println("IP Test: OK");
 }
 else
 {
    Serial.println("IP Test: Failed");
    wifiConnected=0;
 }

 if(!wifiConnected)
 {
    Serial1.println("AT");
    delay(1000);
    if(Serial1.find("OK"))
    {
       Serial.println("Module Test: OK");
       connectWifi();
       if (wifiConnected)
       {
          String cmd = "AT+CIPMUX=1";

          sendDebug( cmd );

          if( Serial1.find( "Error") )
          {
            Serial.print( "RECEIVED: Error" );
            return;
          }
        }
    }
        else Serial.println("Module Test: failed");
 }

 if(!wifiConnected) {
 delay(500);
 return;
 }
 status=0;

 String cmd = "AT+CIPSTART=4,\"TCP\",\"derpade.de\",80";

 sendDebug(cmd);
 int serverConnection = 0;

 for(int i = 0; i < 30; i++)
 {
    Serial.print(".");
    if(Serial1.find("OK"))
    {
        serverConnection = 1;
        break;
    }

    delay(1000);
 }

 if(serverConnection)
 {
     Serial.println("Got a connection!"); //debug message
 }
 else
 {
     Serial.println("Error: No connection.");
     sendDebug( "AT+CIPCLOSE=4" );
     return;
 }

 cmd = "GET /test.php HTTP/1.1\r\nHost: derpade.de\r\nConnection: close\r\n\r\n";
 Serial1.print( "AT+CIPSEND=4,");
 Serial1.print( cmd.length());
 Serial1.println("\r\n");


 //display command in serial monitor
 Serial.print("AT+CIPSEND=4,");
 Serial.println( cmd.length() );

 Serial.println("Waiting for prompt");
 int prompt = 0;
 for(int i = 0; i < 30; i++)
 {
    Serial.print(".");
    if(Serial1.find(">"))
    {
        prompt = 1;
        break;
    }

  delay(50);
 }

  if(prompt)
  {
    // The line is useless
    //Serial1.print(">");
    Serial1.print(cmd);
    Serial1.println("\r\n");
    Serial.print(cmd);
    sendDebug( "AT+CIPCLOSE=4" );
  }
  else
  {
    Serial.println("No '>' prompt!");
    sendDebug( "AT+CIPCLOSE=4" );
    return;
  }

  if( Serial1.find("OK") )
  {
    Serial.println( "RECEIVED: OK" );
  }
  else
  {
    Serial.println( "RECEIVED: Error");
  }
}


void sendDebug(String cmd)
{
 Serial.print("SEND: ");
 Serial.println(cmd);
 Serial1.println(cmd);
}

boolean connectWifi()
{
 String cmd="AT+CWJAP=\"";
 cmd+=SSID;
 cmd+="\",\"";
 cmd+=PASS;
 cmd+="\"";
 Serial.println(cmd);
 Serial1.println(cmd);

 for(int i = 0; i < 30; i++) {
 Serial.print(".");
 if(Serial1.find("OK"))
 {
    wifiConnected = 1;

    break;
 }

 delay(50);
 }

 Serial.println(
 wifiConnected ?
 "OK, Connected to WiFi." :
 "Can not connect to the WiFi."
 );

 return wifiConnected;
}

Auf dem Server solltet ihr ein Test-Skript habe, welches beweist, dass der Cactus Rev 2 wirklich die angegeben URL aufgerufen hat. Ich verwende hierfür das folgende Skript.

<?php

file_put_content("test.txt", var_export($_SERVER, true));

if (file_exists("test.txt")) echo file_get_content("test.txt");

?>

Alle Tutorials zum Cactus Rev 2

  1. Tutorial: Arduino NTC 100K Thermistor schnell anschließen
  2. Tutorial: Arduino Cactus Soil Moisture und Wasserpumpe ansteuern
  3. Tutorial: Arduino Cactus Ultraschallsensor
  4. Tutorial: Arduino Cactus Rev 2 Soil Moisture Sensor
  5. Tutorial: Cactus Rev 2 Atmega32u4 ESP8266 Websocket
  6. Tutorial: Sketch/Firmware auf ESP8266 über ein Atmega32u4 hochladen
  7. Tutorial: Cactus Rev 2 ESP8266 flashen
  8. Tutorial: Cactus Rev 2 Atmega32u4 ESP8266-03 - Getting Started

Schreibe einen Kommentar

Notify me of followup comments via e-mail. You can also subscribe without commenting.