RobotDYN - Arduino MEGA 2560 s vestavěným WiFi - ESP8266

12.02.2022 Arduino #arduino #mega #esp

Tento článek popisuje, jak používat Mega 2560 R3 s vestavěným ESP8266 a vytvořit tak webový server. Provedeme flashování integrovaného ESP8266 firmwarem AT. Pak už půjde pouze o naprogramování ATmega2560.


Rychlé vlastnosti

  • Plná integrace na jedné desce: Mega R3 ATmega2560 a WiFi ESP8266 s pamětí 32Mb.
  • Všechny moduly mohou pracovat společně nebo každý samostatně. A každý má své vlastní piny.
  • Pohodlné řešení pro vývoj nových projektů vyžadujících Arduino a WiFi.
  • Přes USB lze aktualizovat programy a firmware pro ATmega2560 a ESP8266.
  • K tomu je na desce USB-sériový převodník CH340G.
  • Deska má DIP-switch pro připojení jednotlivých modulů.

deska

Srovnání desek Arduino UNO, MEGA, RobotDYN

Níže uvedená tabulka ukazuje srovnání podobných platforem. Arduino Mega s integrovaným ESP (Arduino Mega RobotDyn) a tradičního Arduino Mega (Arduino Mega 2560) a Arduino UNO.

Deska Procesor Operační/vstupní napětí Rychlost CPU Anologové In/Out Digitální IO/PWM EEPROM SRAM Flash [kB] USB UART
UNO ATMega328P 5V / 7-12V 16 MHz 6/0 14/6 1kb 2kb 32kb Klasické 1
MEGA ATMega2560 5V / 7-12V 16 MHz 16/0 56/15 4kb 8kb 256kb Klasické 4
RobotDYN ATMega2560
ESP8266
5V / 7-12V
3.3V
16 MHz
80 MHz
16/0
1/0
54/15 4kb 8kb
64kb
32Mb
8Mb
CH340G 4
1/WiFi

 

Vidíme, že jsou si podobné, ale Arduino Mega 2560 je klasické USB. V RobotDyn je k dispozici mini-USB. Je kompaktnější, ale výkon je u obou stejný. Záměrem výrobce RobotDyn bylo zachovat architekturu ATmegy a přidání možností bezdrátového spojení prostřednictvím WiFi.

Z výše uvedené tabulky je vidět, že u desky RobotDYN má ATmega 32 MB paměti, a ESP má dalších 8MB. To je oproti klasické desce Arduino ATMega, značný nárůst, protože ta má pouze 256 kb paměti. Napájení u RobotDyn je 7 až 12 voltů a ESP8266 je již napájen ze stejného napájecího konektoru desky. Tím se opět nemusí řešit dvojí napájení, protože ESP je standardně napájené 3.3V a vše zajišťuje jedna deska.

Procesory jsou stejné, 16MHz, a velkou výhodou těchto modelů je vysoký počet vstupů a výstupů.

Část Arduino má Pigtail konektor pro anténu. Pokud se k tomuto zařízení připojí anténa, zvýší se dosah, a to rovnou z 90 metrů na 240 metrů. K tomuto závěru vedl provedený test.

Tato deska má také přepínač, který umožňuje ESP přepínat spojení mezi TX0 a TX3, přičemž ATmega má čtyři seriály.

tx-rx 

Druhým přepínačem je DIP přepínač, který je klíčový pro přepínání mezi jednotlivými režimy, jak je uvedeno dále v tabulce.

dip-switch

  

Konfigurace DIP přepínačů, které lze na desce použít.

1 2 3 4 5 6 7 8
CH340 připojit k ESP8266 (nahrát program) OFF OFF OFF OFF ON ON ON NOUSE
CH340 připojit k ESP8266 (připojit) OFF OFF OFF OFF ON ON OFF NOUSE
CH340 připojit k ATmega2560 (nahrát program) OFF OFF ON ON OFF OFF OFF NOUSE
CH340 připojit k Mega2560 COM3 připojit k ESP8266 ON ON ON ON OFF OFF OFF NOUSE
Mega2560+ESP8266 ON ON OFF OFF OFF OFF OFF NOUSE
Všechny moduly pracují samostatně OFF OFF OFF OFF OFF OFF OFF NOUSE

 

Jak je uvedeno výše, deska obsahuje dva čipy a proto vyžaduje nahrání dvou různých programů na každý z čipů. Pokud budeme chtít vytvořit webserver, který bude poskytovat například informace o měření z teplotních čidel, lze využít možnosti nahrání programů pouze na jediný čip a to na ATmega560. Způsobem, jakým je toho dosaženo je flashování čipu ESP8266 s firmwarem AT. Tím může ESP komunikovat s ATmega2560 pomocí konfigurace přepínače DIP - Mega2560+ESP8266, která poskytuje přístup přes komunikaci Serial3.

Flash firmware AT pro desku ESP8266

Chceme-li aktualizovat firmware AT, je nutné mít nainstalovaný esptool. Esptool, espefuse a espsecure jsou kompletní sadou nástrojů pro práci s čipy Espressif. Mohou dělat řadu věcí, například:

  • Číst, zapisovat, mazat a ověřovat binární data uložená ve flash paměti.
  • Čtení funkcí čipu a dalších souvisejících dat, jako je MAC adresa nebo ID flash čipu.
  • Číst a zapisovat jednorázově programovatelné elektronické pojistky - efuse.
  • Připravuje binární spustitelné obrazy k flashování.
  • Analyzujte, sestavujte a spojujte binární obrazy.

Je nutné si stáhnout Firmware AT verze 1.7.4.0. https://github.com/espressif/ESP8266_NONOS_SDK/releases/tag/version_3.0.4. Stažený balíček se musí rozbalit do složky, na kterou povede cesta v příkazu pro flashování. 

Spuštěním následujícího příkazu by se mělo zobrazit připojená zařízení, aby bylo možné určit, na které zařízení by měl být esptool zaměřen.

ls /dev/tty.*
# /dev/tty.Bluetooth-Incoming-Port	/dev/tty.URT2
# /dev/tty.usbserial-1450	        /dev/tty.URT1

Získá seznam zařízení připojených k počítači.

Aby bylo možné pracovat s ESP8266, musí být DIP přepínače na následujících pozicích.

1 2 3 4 5 6 7 8
CH340 připojit k ESP8266 (nahrát program) OFF OFF OFF OFF ON ON ON NOUSE

Pokud je deska připojena k napájení, musí se odpojit a při opětovném připojení k napájení stisknout tlačítko režimu. Tento postup způsobí, že ESP8266 přejde do režimu blikání.

mode-btn

Pokud je pro toto zařízení otevřený sériový monitor, musí se zavřít, aby s ním esptool mohl otevřít spojení.

Do příkazového řádku zadejte následující příkaz:

esptool.py write_flash --flash_mode dio  --flash_size 2MB-c1 0x0 bin/boot_v1.7.bin 0x01000 bin/at/1024+1024/user1.2048.new.5.bin 0x1fb000 bin/blank.bin 0x1fc000 bin/esp_init_data_default_v08.bin 0xfe000 bin/blank.bin 0x1fe000 bin/blank.bin

Nesmí se zapomenout na odpovídající cesty k jednotlivým souborům pro flashování. Pokud je například umístěn esptool v jiném adresáři než firmware pro flashování, může příkaz s plnými cestami vypadat následovně:

esptool.py write_flash --flash_mode dio  --flash_size 2MB-c1 0x0 /Volumes/DataHD/Tmp/ESP/esptool/firmware/bin/boot_v1.7.bin 0x01000 /Volumes/DataHD/Tmp/ESP/esptool/firmware/bin/at/1024+1024/user1.2048.new.5.bin 0x1fb000 /Volumes/DataHD/Tmp/ESP/esptool/firmware/bin/blank.bin 0x1fc000 /Volumes/DataHD/Tmp/ESP/esptool/firmware/bin/esp_init_data_default_v08.bin 0xfe000 /Volumes/DataHD/Tmp/ESP/esptool/firmware/bin/blank.bin 0x1fe000 /Volumes/DataHD/Tmp/ESP/esptool/firmware/bin/blank.bin

Flash AT firmware do integrovaného ESP8266v

Po spuštění výše uvedeného příkazu, by se měl v terminálu objevit text - Hard resetting via RTS pin.... Jakmile se zobrazí, odpojíme desku a nastavíme DIP přepínače do následující konfigurace:

1 2 3 4 5 6 7 8
CH340 připojit k ESP8266 (připojit) OFF OFF OFF OFF ON ON OFF NOUSE

Po otevření relace sériového monitoru se zařízením by měl být po spuštění následujících příkazů vidět výstup:

  1. AT (testuje spuštění)
  2. AT+GMR (kontroluje informace o verzi)

screen-shot-2020-08-09-at-1-54-16-pm

Další příkazy, na které může AT reagovat, lze nalézt na https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf.

Vytvoření webového serveru

Nyní, když ESP8266 pracuje s AT příkazy, se musí pouze naprogramovat mega2560. Pokud chceme naprogramovat mega2560, musí se nastavit následující konfigurace přepínačů DIP:

1 2 3 4 5 6 7 8
CH340 připojit k ATmega2560 (nahrát program) OFF OFF ON ON OFF OFF OFF NOUSE

Pro snazší komunikaci s AT příkazy je dobré si nainstalovat do IDE pro programování knihovnu WiFiEspAT.

Pokud je knihovna nainstalována, provedeme nahrání následujícího programu přes Arduino IDE. Změníme NAME_OF_SSID PASSWORD_OF_SSID což jsou proměnné, které obsahují název a heslo pro přístup k síti, ke které jsme připojeni. Jedná se o testovací kód, abychom zjistili, zda server opravdu funguje.

#include <WiFiEspAT.h>

WiFiServer server(80);

void setup() {

  Serial.begin(115200);
  while (!Serial);

  Serial3.begin(115200);
  WiFi.init(Serial3);

  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  WiFi.begin(NAME_OF_SSID, PASSWORD_OF_SSID);
  Serial.println("Waiting for connection to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print('.');
  }
  Serial.println();

  server.begin();

  IPAddress ip = WiFi.localIP();
  Serial.println();
  Serial.println("Connected to WiFi network.");
  Serial.print("To access the server, enter "http://");
  Serial.print(ip);
  Serial.println("/" in web browser.");
}

void loop() {

  WiFiClient client = server.available();
  if (client) {
    IPAddress ip = client.remoteIP();
    Serial.print("new client ");
    Serial.println(ip);

    while (client.connected()) {
      if (client.available()) {
        String line = client.readStringUntil('n');
        line.trim();
        Serial.println(line);

        // if you've gotten to the end of the HTTP header (the line is blank),
        // the http request has ended, so you can send a reply
        if (line.length() == 0) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of analog input pins
          for (int analogChannel = 0; analogChannel < 4; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          client.flush();
          break;
        }
      }
    }

    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

Jakmile je kód úspěšně nahrán do mega2560, nastavíme DIP přepínače do následujících poloh.

1 2 3 4 5 6 7 8
CH340 připojit k Mega2560 COM3 připojit k ESP8266 ON ON ON ON OFF OFF OFF NOUSE

Nakonec se musí nastavit přepínač RX a TX na RXD3 a TXD3.

finish-pins 

Jak je vidět, spínače 3 a 4 kolíky jsou v zapnuté poloze, je to potřeba k udržení sériového výstupu procházejícího do USB, aby sériový monitor získal vytištěné hodnoty.

seial-m-ip

V sériovém monitoru je uvedena IP adresa zařízení. Pokud tuto IP adresu zadáme do webového prohlížeče, měl by se zobrazit následující výstup.

webpage-ip

Hodnoty na stránce se mění v závislosti na hodnotě přečtené z analogového vstupu, jehož kanál nabývá hodnotu od 1 do 4. Vzhledem k tomu, že na vstupu není připojen žádný reální senzor, jsou hodnoty pouze informativní, protože stránka se každých 5 sekund obnoví a opět se načtou hodnoty nové. Důležité je, zda se mění, protože tím se ověří, že server opravdu pracuje.

Čtení dat ze senzoru

Pro podrobnější příklad, jak zkombinovat všechny části překládané desky, můžeme načíst data senzoru a odeslat je na webovou stránku. Pro následující příklad je použit senzor gy-21p. Jedná se o kombinaci teploměru, tlakoměru a výškoměru.

Zapojení obvodu

mega_2560-gy_21p 

Kód

#define NAME_OF_SSID "x"
#define PASSWORD_OF_SSID  "x"

#include <Adafruit_BMP280.h>
#include <WiFiEspAT.h>

Adafruit_BMP280 bme;

WiFiServer server(80);

void setup() {

  Serial.begin(115200);
  while (!Serial);

  if (!bme.begin(0x76)) // depending on the chip you have the i2c address is either 0x77 or 0x77
  {
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }

  Serial3.begin(115200);
  WiFi.init(Serial3);

  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  WiFi.begin(NAME_OF_SSID, PASSWORD_OF_SSID);
  Serial.println("Waiting for connection to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print('.');
  }
  Serial.println();

  server.begin();

  IPAddress ip = WiFi.localIP();
  Serial.println();
  Serial.println("Connected to WiFi network.");
  Serial.print("To access the server, enter "http://");
  Serial.print(ip);
  Serial.println("/" in web browser.");
}

void loop() {
  float temp = (bme.readTemperature() * 1.8) + 32;
  float pressure = bme.readPressure();
  float altitude = bme.readAltitude(1010);

  WiFiClient client = server.available();

  if (client) {
    IPAddress ip = client.remoteIP();
    Serial.print("new client ");
    Serial.println(ip);

    while (client.connected()) {
      if (client.available()) {
        String line = client.readStringUntil('n');
        line.trim();
        Serial.println(line);

        // if you've gotten to the end of the HTTP header (the line is blank),
        // the http request has ended, so you can send a reply
        if (line.length() == 0) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");

          client.print ("<h4>Tempature: ");
          client.print (temp);client.print("F");
          client.print("</h4>");

          client.print ("<h4>Pressure: ");
          client.print (pressure);
          client.print("</h4>");

          client.print ("<h4>Altitude: ");
          client.print (altitude);
          client.print("</h4>");

          client.println("</html>");
          client.flush();
          break;
        }
      }
    }

    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

Jakmile se nahraje kód do desky, na výstupu sériového monitoru by se měla zobrazit IP adresa, která se opět použije pro zobrazení stránky, tentokrát s hodnotami ze senzoru.