Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Peguino Uno ESP32 Brick
#1
Peguino Uno ESP32 Brick



Der Peguino Uno ESP32 Brick ist das Herzstück eines jeden Peguino Projekts. Er beinhaltet ein Leistungsstarkes ESP32 Development Board (Typ 1). Dieses Board kann via USB-Kabel mit dem PC verbunden werden um eigene Programme darauf zu installieren und / oder daten auf den PC zu übertragen. Da dieses Board auch WLan und Bluetooth beinhaltet kann mit einem entsprechenden Hilfsprogramm ein Update der eigenen Programme ebenfalls via Wlan durchgeführt werden in dem per Webbrowser von einem PC auf das Board zugegriffen werden kann.



[Image: Peguino_Uno_Brick_01b.png]

Pinout:

[Image: Peguino_ESP32_Dev_1_01.png]

Technische Daten:

[Image: ESP32Dev1_Specs_01.png]



Zwei 40/80 MHz low-power 32-bit Mikroprozessoren.
Der interne Speiher beinhaltet:
    • 448 KB ROM-Speicher für den Boot-Vorgang und Kernfunktionen.
    • 520 KB "On-Chip" SRAM für eigene Daten und Programme.
    • 8 KB SRAM im RTC, auch genannt RTC FAST Memory - welcher ebenfalls zum speichern von Daten genutzt werden kann.
    • 8 KB SRAM in RTC, auch genannt RTC SLOW Memory - welcher ebenfalls zum speichern von Daten genutzt werden kann.
    • 1 Kbit "eFuse": Diese 256 Bits werden vom System genutzt ( für die MAC Addresse und Chip Konfiguration). Weitere 768 Bits sind für Anwendungen reserviert.
    • Insgesamt bis zu 4MB Ram
Eine Wlan- (WIFI) und eine Bluetooth- Funktion sind bereits integriert:
WIFI: WiFi: 802.11 b/g/n/d/e/i/k/r (802.11n bis zu 150 Mbps),
Bluetooth v4.2 BR/EDR und BLE Spezifikation
Wi-Fi mode Station/softAP/SoftAP+station/P2P
Security WPA/WPA2/WPA2-Enterprise/WPS
Encryption AES/RSA/ECC/SHA
IPv4, IPv6, SSL, TCP/UDP/HTTP/FTP/MQTT
Schnittstellen: SD-Card, UART, SPI, SDIO, I2C, LED PWM, Motor  PWM, I2S , IR, GPIO, Kapazitiver berührungssensor, ADC, DAC, Hall Sensor, Temperatur Sensor

W-Lan (WIFI) -Betrieb Besonderheit:
Der Port “Analog Input 2” kann bei W-Lan Betrieb nicht gleichzeitig genutzt werden.

Tipps zur Fehlerbehebung:
Bei Problemen mit dem Übertragen von Programmen mit der Arduino IDE im Zweifelsfall die Stecker an den Ports vorübergehend abstecken und danach wieder anstecken.
In bestimmten Konfigurationen kann die Fehlermeldung Failed to connect to ESP32: Timed out waiting for packet header" während beim Versuch ein Programm mit der Arduino IDE zu Übertragen. In diesem Fall sollte der "BOOT" Schaltknopf auf dem ESP32-Board gedrückt und gehalten werden. Sobald die Übertragung startet kann der Schalter losgelassen werden.
Mehr über die Arduino IDE unter: https://www.peguino.com/chat/thread-7.html und: https://www.peguino.com/chat/thread-9.html

Beispiel:
Dieses (Programm-) Skript startet einen Webserver mit der Möglichkeit via Wlan eine Programm auf das Board zu übertragen. Dazu muss auf dem PC mit einem Webbrowser auf das Board zugegriffen werden.


Anmerkungen:
In dem Skript muss der Netzwerkname, der Nutzername und das des Passwort des eigenen Accesspoints zur Herstellung der Verbindung angepasst werden!
Anschließend im Webbrowser des PCs folgende URL eintippen: http://peguino01.connect
Der Peguino antwortet nun mit einem Eingabeformular. Der Benutzername und das Passwort hier sind in beiden Fällen jeweils "admin" (ohne Anführungsstriche eingeben). Aufgepasst: Dies ist keine besonders "Hackersichere" Lösung...

Wissenswert: Dieses Script sollte in ein eigenes Projekt integriert werden um die Funktionalität der Wlan-Aktualisierung beizubehalten.

Code:
/*
Peguino Uno Brick ESP32 V1 Wifi upload
(C) 2018 by Peguino LTD
 
Version 1


Peguino Uno ESP 32 Development Board Pinout
          ┌─╥─┐
3.3     1 │     │ 30  5V
GND     2 │     │ 29  GND
GPIO15  3 │     │ 28  GPIO13
GPIO2   4 │     │ 27  GPIO12
GPIO4   5 │     │ 26  GPIO14
GPIO16  6 │     │ 25  GPIO27
GPIO17  7 │     │ 24  GPIO26
GPIO5   8 │     │ 23  GPIO25
GPIO18  9 │     │ 22  GPIO33
GPIO19 10 │     │ 21  GPIO32
GPIO21 11 │     │ 20  GPIO35
GPIO3  12 │     │ 19  GPIO34
GPIO1  13 │     │ 18  GPIO39
GPIO22 14 │     │ 17  GPIO36
GPIO23 15 │     │ 16  Chip enable
          └───┘
Visit https://www.peguino.com          
*/

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>

const char* host = "Peguino01";
const char* ssid = "Deine_Netzwerk_SSID_hier_eingeben"; // Hier Network SSID einfügen
const char* password = "Dein_Wlan-Passwort_einfügen"; // Hier das WIFI Passwort einfügen
const char* hostName = "Peguino01"; // Mit dem Webbrowser diese Adresse aufrufen http://peguino01.connect

WebServer server(80);


/* This is the Peguino Uno Login page */

const char* loginIndex =
"<!DOCTYPE html><html lang='en'><head><meta charset='UTF-8'><title>Peguino Uno Brick Login</title><style>.form {position: relative; z-index: 1; background: #eee; max-width: 300px; margin: 0 auto 100px; padding: 30px; border-radius: 4px; text-align: center;}"
".form input {outline: 0; background: #ddd; width: 100%; border: 0; margin: 0 0 15px; padding: 15px; border-radius: 4px; box-sizing: border-box; font-size: 14px; }"
"#button { outline: 0; background: #EF3B3A; width: 100%; border: 0; padding: 15px; border-radius: 4px; color: #FFFFFF; font-size: 14px; transition: all 0.3 ease; cursor: pointer; }"
".container { position: relative; max-width: 300px; margin: 0 auto; } .container .info { margin: 50px auto; text-align: center; }"
"body { font-family: sans-serif; } </style> </head> <body>"
"<div class='container'> <div class='info'> <h2>Connect your<br/> Peguino Uno Brick</h2> </div> <div class='form'>"
"<div><img src=' data:image/png;base64,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' /></div>"
"<form class='login-form'> <input type='text' size=25 name='userid' placeholder='username'> <input type='Password' size=25 name='pwd' placeholder='password'> <input id='button' type='submit' onclick='check(this.form)' value='Login'> </form> </div> </body> </html>"
"<script>"
   "function check(form)"
   "{"
   "if(form.userid.value=='admin' && form.pwd.value=='admin')"
   "{"
   "window.open('/serverIndex')"
   "}"
   "else"
   "{"
   " alert('Error Password or Username')/*displays error message*/"
   "}"
   "}"
"</script>";

/*  This is the Index Page after Login  */

const char* serverIndex =
"<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
  "<input type='file' name='update'>"
       "<input type='submit' value='Update'>"
   "</form>"
"<div id='prg'>progress: 0%</div>"
"<script>"
 "$('form').submit(function(e){"
 "e.preventDefault();"
 "var form = $('#upload_form')[0];"
 "var data = new FormData(form);"
 " $.ajax({"
 "url: '/update',"
 "type: 'POST',"
 "data: data,"
 "contentType: false,"
 "processData:false,"
 "xhr: function() {"
 "var xhr = new window.XMLHttpRequest();"
 "xhr.upload.addEventListener('progress', function(evt) {"
 "if (evt.lengthComputable) {"
 "var per = evt.loaded / evt.total;"
 "$('#prg').html('progress: ' + Math.round(per*100) + '%');"
 "}"
 "}, false);"
 "return xhr;"
 "},"
 "success:function(d, s) {"
 "console.log('success!')"
"},"
"error: function (a, b, c) {"
"}"
"});"
"});"
"</script>";


/* and here the program code  */


void setup(void) {
 Serial.begin(115200);

 // Connect to WiFi network
 WiFi.mode(WIFI_STA);
 WiFi.softAP(hostName);
 WiFi.begin(ssid, password);
 WiFi.setHostname(hostName);
 Serial.println("");

 // Wait for connection
 Serial.println("Try to connect...");
 while (WiFi.status() != WL_CONNECTED) {
   delay(400);
   Serial.print(".");
 }
 Serial.println("");
 Serial.print("Connected to ");
 Serial.println(ssid);
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());

 /*use mdns for host name resolution*/
 if (!MDNS.begin(host)) { //http://esp32.local
   Serial.println("Error setting up MDNS responder!");
   while (1) {
     delay(1000);
   }
 }
 Serial.println("mDNS responder started");
 /*return index page which is stored in serverIndex */
 server.on("/", HTTP_GET, []() {
   server.sendHeader("Connection", "close");
   server.send(200, "text/html", loginIndex);
 });
 server.on("/serverIndex", HTTP_GET, []() {
   server.sendHeader("Connection", "close");
   server.send(200, "text/html", serverIndex);
 });
 /*handling uploading firmware file */
 server.on("/update", HTTP_POST, []() {
   server.sendHeader("Connection", "close");
   server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
   ESP.restart();
 }, []() {
   HTTPUpload& upload = server.upload();
   if (upload.status == UPLOAD_FILE_START) {
     Serial.printf("Update: %s\n", upload.filename.c_str());
     if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
       Update.printError(Serial);
     }
   } else if (upload.status == UPLOAD_FILE_WRITE) {
     /* flashing firmware to ESP*/
     if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
       Update.printError(Serial);
     }
   } else if (upload.status == UPLOAD_FILE_END) {
     if (Update.end(true)) { //true to set the size to the current progress
       Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
     } else {
       Update.printError(Serial);
     }
   }
 });
 server.begin();
}

void loop(void) {
 server.handleClient();
 delay(1);
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)