• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
mostek wifi z esp32 zamiast przewodu uart-usb
#1
Brick 
Cześć wszystkim. 
Moje obecne połączenie wygląda tak: urządzenie z prostym dosem -> przewód uart-usb -> laptop(tera term) na COM10 z prędkością przesyłu danych 115200.
Moje pytanie - czy da się zamienić przewód uart-usb na esp32 przesyłające dane w obie strony przez wifi/bt?
Miałam kilka prób, lecz za każdym razem dane wyświetlały się jedynie w monitorze portu szeregowego arduino ide, nie przechodząc między urządzeniami.

Połączenia: rx-17 tx-16 gnd-gnd vcc-3v3. 
Poniżej wklejam mój kod.


Kod:
#include <WiFi.h>
#include <HardwareSerial.h>

const char *ssid = "ESP32_Hotspot";
const char *password = "password";

WiFiServer server(23);
HardwareSerial SerialPort(2);

void setup() {
  Serial.begin(115200); // monitor szeregowy
  SerialPort.begin(115200, SERIAL_8N1, 16, 17);

  WiFi.softAP(ssid, password);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("Adres IP punktu dostępowego: ");
  Serial.println(IP);

  server.begin();
}

void loop() {
 
  WiFiClient client = server.available();
 
  if (client) {
   
    while (client.connected()) {
      if (client.available()) {
        String dataFromClient = client.readStringUntil('\n');
        SerialPort.print(dataFromClient);
        Serial.println(dataFromClient);
      }
     
      if (SerialPort.available()) {
        String dataFromUART = SerialPort.readStringUntil('\n');
        client.print(dataFromUART);
        Serial.println(dataFromUART);
      }
    }
   
    client.stop();
  }
}

Z góry dziękuję za każdą odpowiedź Smile
 
Odpowiedź
#2
Jest gotowy wsad do ESP z mostem UART przez WIFI. W Win można zainstalować manager wirtualnych portów COM, darmowy Tibbo. Działa to na tańszym ESP8266, może być np. fajny moduł WEMOS MINI.
Natomiast taką samą funkcjonalność uzyskałem z przykładem Telnet, przykład WIFITelnetToSerial wszystko co przyleci z UART wysyłasz na Telnet. Tak samo z  TCP, czy UDP.  Zobacz jak tam wyglądają te funkcje, nie kojarzę żadnego readUntlil \n, jak to ma być przeźroczyste to cokolwiek przyleci przesyłasz dalej, nie widzę sensu tego analizować.
W ESP32 też jest ten przykład telet.
Z UDP robiłem coś takiego, na bazie tego:
Kod:
/*
WiFiEsp example: WiFi UDP Send and Receive String

This sketch wait an UDP packet on localPort using a WiFi shield.
When a packet is received an 'ACK' packet is sent to the client on port remotePort.

For more details see: http://yaab-arduino.blogspot.com/p/wifiesp-example-client.html
*/


#include <ESP8266WiFi.h>
#include <WiFiUDP.h>


const char* ssid     = "nnn";
const char* password = "nnn";
int status = WL_IDLE_STATUS;       // the Wifi radio's status

unsigned int localPort = 2390;  // local port to listen on

char packetBuffer[255];          // buffer to hold incoming packet
char ReplyBuffer[] = "ACK";      // a string to send back

WiFiUDP Udp;

void setup() {
  // initialize serial for debugging
  Serial.begin(115200);

  // initialize ESP module
WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }



   
 
  Serial.println("Connected to wifi");
  printWifiStatus();

  Serial.println("\nStarting connection to server...");
  // if you get a connection, report back via serial:
  Udp.begin(localPort);
 
  Serial.print("Listening on port ");
  Serial.println(localPort);
}

void loop() {

  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) {
      packetBuffer[len] = 0;
    }
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
}


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}
Odwróciłem to tak, by wysyłało mi do Putty co przyleci na UART, faktycznie składałem to w linie, ale na bazie przykładu z serialEvent:
Kod:
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

#define buffsize 32
#define reczneIP 1
// wifi connection variables
const char* ssid     = "nnn";
const char* password = "nnn";
boolean wifiConnected = false;
char serial_input[buffsize];       // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete
//byte index = 0;
// UDP variables
unsigned int localPort = 8888;
WiFiUDP UDP;
boolean udpConnected = false;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back

#if (reczneIP)
  IPAddress ip(192, 168, 1, 37);
  IPAddress gateway(192, 168, 1, 3);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, 1, 3);
#endif
void setup() {
// Initialise Serial connection
Serial.begin(115200);

// Initialise wifi connection
wifiConnected = connectWifi();

// only proceed if wifi connection successful
if(wifiConnected){
udpConnected = connectUDP();
if (udpConnected){
// initialise pins
//pinMode(5,OUTPUT);
}
}
}

void loop() {
  serialEvent();//w esp nie ma serialevent, ktos cos wie?
// check if the WiFi and UDP connections were successful
if(wifiConnected){
if(udpConnected){

// if there’s data available, read a packet
int packetSize = UDP.parsePacket();
if(packetSize)
{
//Serial.println("");
//Serial.print("Received packet of size ");
//Serial.println(packetSize);
//Serial.print("From ");
//IPAddress remote = UDP.remoteIP();
//for (int i =0; i < 4; i++)
//{
//Serial.print(remote[i], DEC);
//if (i < 3)
//{
//Serial.print(".");
//}
//}
//Serial.print(", port ");
//Serial.println(UDP.remotePort());

// read the packet into packetBufffer
UDP.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
//Serial.println("Contents:");
//int value = packetBuffer[0]*256 + packetBuffer[1];
//Serial.println(value);
Serial.println(packetBuffer);
// send a reply, to the IP address and port that sent us the packet we received
delay(50);
serialEvent();//w esp nie ma serialevent, ktos cos wie?
if(stringComplete)
{
  UDP.beginPacket(UDP.remoteIP(), UDP.remotePort());
  char *odpowiedz=serial_input;
  UDP.write(odpowiedz);
  stringComplete=false;
  UDP.endPacket();
  Serial.println("Wyslano i wyzerowano");
} else

{
  UDP.beginPacket(UDP.remoteIP(), UDP.remotePort());
  UDP.write(ReplyBuffer);
  Serial.println("czy on to napierdala czaly czas?");
  UDP.endPacket();
}


// turn LED on or off depending on value recieved
//digitalWrite(5,value);
}
delay(1);


}
//if(stringComplete)
//{
//  UDP.beginPacket(UDP.remoteIP(), UDP.remotePort());
//  char *odpowiedz=serial_input;
//  UDP.write(odpowiedz);
//  stringComplete=false;
//  UDP.endPacket();
//  Serial.println("Wyslano i wyzerowano");
//}


}

}

// connect to UDP – returns true if successful or false if not
boolean connectUDP(){
boolean state = false;

Serial.println("");
Serial.println("Connecting to UDP");

if(UDP.begin(localPort) == 1){
Serial.println("Connection successful");
state = true;
}
else{
Serial.println("Connection failed");
}

return state;
}
// connect to wifi – returns true if successful or false if not
boolean connectWifi(){
boolean state = true;
int i = 0;
#if (reczneIP)
WiFi.config(ip, dns, gateway, subnet);  //only when IP static
#endif
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");

// Wait for connection
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (i > 10){
state = false;
break;
}
i++;
}
if (state){
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
else {
Serial.println("");
Serial.println("Connection failed.");
}
return state;
}

void serialEvent() {
while (Serial.available()>0) {

char aChar = Serial.read();
static byte index=0;
    if(aChar == '\n')
    {
      // wykryto znak konca linii \n, koniec odbioru
      serial_input[index] = 0;
      index = 0;
      stringComplete = true;
    }
    else
    {
       serial_input[index] = aChar;
       if(index<(buffsize-1)) index++; //jesli napis bedzie dluzszy niz bufor to nadmiar leci w kosz
       serial_input[index] = '\0'; // Na koncu napisu wstawiamy 0   
    }
}
}
Do ESP32 trzeba to sobie przepisać, jak  w przykładzie z Telnet. Nie interesowało mnie co przyleci z UDP, bo tylko monitorowałem co robi ESP, ale jest to dalej, tylko zakomentowane. 
Prawdę mówiąc to próbowałem skompilować dla ESP32 i wyszła lipa, rzuca się o składnie i konwersję zmiennych, wrzuciłem w Google pytanie o gotowca i też wysypuje błędy, mam najnowszy core, trochę w nim pomieszali i wiele rzeczy nie jest już tak proste jak kiedyś, a tu jest sprzed 5 lat: https://github.com/ajaybnl/UDP-SERIAL-FOR-ESP32-ESP8266- więc pewnie z core 1.x by działał.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Kolega opisał WiFi, jeśli chodzi o BT to istnieją niedrogie konwertery UART-BT , można użyć pary by mieć serial-serial, albo z laptopa, telefonu, tabletu czy innego komputera wyposażonego w BT można też podłączyć od razu po BT.
Oczywiście zasięg malutki w porównaniu z WiFi.
 
Odpowiedź
#4
Esp bez anteny zewnętrznej też nie powala zasięgiem.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
A to urządzenie z prostym dosem to co to w ogóle jest? Bo jak to jest jakiś RS232 to nie możesz tego podłączyć do ESP.
ESP można podłączyć do komputera tylko przez konwertery, albo USB-UART, albo RS232-UART, a jak tam jest jakiś prosty DOS, to może nie ma USB? Opisz to dokładniej.
Połączenie z HC-05 jest bardzo proste i działa do 10m, wystarczy skonfigurować moduły komendami AT, trzeba uważać by nie być za sprytnym i nie kupować jakiś "lepszych" modułów typu HC06 czy HM10, ale też nie jest to wprost do połączenia z jakimś DOS, to jest do połączenia dwóch UART 3.3-5V.
Z zasięgiem ESP to zależy, mam jakiś moduł ESP32 C3 super mini i on nie łapie zasięgu dalej niż metr, po kombinacjach i modyfikacji mocy z 6m, niemal identyczny z inną antenką ceramiczną działa od strzału na 10m, a Wemos MINI bez problemu wysyła dane z kurnika do routera  przez ścianę i 10m. No a potem to te dane lecą już kilkadziesiąt metrów dalej po wewnętrznym LAN i dalej w świat, więc można mieć takie połączenie UART w obrębie zasięgu Internetu. Jest też ESP NOW, który spokojnie sięga na kilkadziesiąt m między ESP.

Edit.
No a zanim tu coś dokładni opiszesz, to zrobiłem test, bo mam innego laptopa z W10 i nie mam wielu programów, do ESP8266 wrzuciłem wprost przykład UDP z core ESP, mam jakiś 3.1.2, ściągnąłem Tibbo, wrzuciłem jakiś wirtualny port COM 31 na parametry ustawione w szkicu Arduino UDP, odpaliłem Putty, wskazałem COM31 i 115200,standardowe ustawienia, połączył, i wszystko leci w obie strony. Akurat putty wysyła każdą literkę od razu po wpisaniu, ale można w drugą stronę ustawić COM15 w Putty i wysyłać linie do UDP na COM31:
   
   
   
A jeśli masz ten ESP8266 to możesz też wgrać gotowego ESPLINK do wirtualnych portów.


Załączone pliki Miniatury
   
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
Napiszę w nowym poście, by nie robić taśmociągu. Po pierwszych testach dodałem odczyt uart, utworzyłem na drugim lapku w Tibbo port com po udp do 192.168.1.121:8888 i usunąłem wszystkie komentarze, wydruki informacyjne, teraz przylatuje w obie strony tylko to co wklepane w okno terminala Arduino. Putty wysyła od razu każdy znak, z terminala Arduino wygląda to lepiej:
   
Kod:
/*
  UDPSendReceive.pde:
  This sketch receives UDP message strings, prints them to the serial port
  and sends an "acknowledge" string back to the sender

  A Processing sketch is included at the end of file that can be used to send
  and received messages for testing with a computer.

  created 21 Aug 2010
  by Michael Margolis

  This code is in the public domain.

  adapted from Ethernet library examples
*/


#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#ifndef STASSID
#define STASSID "n"
#define STAPSK "n"
#endif

unsigned int localPort = 8888;  // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1];  // buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged\r\n";        // a string to send back
#define buffsize 255
char serial_input[buffsize];  // buffer to hold outcoming packet,
bool stringComplete = false;  // whether the string is complete
boolean udpConnected = false;

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  Serial.printf("UDP server on port %d\n", localPort);
  Udp.begin(localPort);
}



void loop() {
   serialEvent();
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
  //  Serial.printf("Received packet of size %d from %s:%d\n    (to %s:%d, free heap = %d B)\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort(), Udp.destinationIP().toString().c_str(), Udp.localPort(), ESP.getFreeHeap());

    // read the packet into packetBufffer
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
//    Serial.println("Contents:");
    Serial.println(packetBuffer);
     udpConnected=1;
    // send a reply, to the IP address and port that sent us the packet we received
//    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
//    Udp.write(ReplyBuffer);
//    Udp.endPacket();
}
if(udpConnected){
if(stringComplete)
{
  Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
  char *odpowiedz=serial_input;
  Udp.write(odpowiedz);
  Udp.endPacket();
  stringComplete=false;
//  Serial.println("Wyslano i wyzerowano");
}


}

}




void serialEvent() {
while (Serial.available()>0) {

char aChar = Serial.read();
static byte index=0;
    if(aChar == '\n')
    {
      // wykryto znak konca linii \n, koniec odbioru
      serial_input[index] = 0;
      index = 0;
      stringComplete = true;
    }
    else
    {
       serial_input[index] = aChar;
       if(index<(buffsize-1)) index++; //jesli napis bedzie dluzszy niz bufor to nadmiar leci w kosz
       serial_input[index] = '\0'; // Na koncu napisu wstawiamy 0  
    }
}
}
Kod jest tak napisany, że klient musi coś wysłać, by server w ESP mógł zacząć co wysyłać, odpowiedzieć.
Ten kod już łatwo zmodyfikować też pod ESP32, wpadłem o co się pluł, w ESP32 używają do tekst print zamiast write, tu jest nie do pomyślenia by tą samą metodą wysłać zmienną 8 bitową, no i biblioteka do podmiany na WiFi.h, wgrałem na ESP32 C3 super mini i działa.  No i dla ESP32 jest jeszcze biblioteka asyncUDp, przykład z klient/server, tu można wydłubać to samo.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
Kod:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#define STASSID "hotspot"
#define STAPSK "haslo"

unsigned int localPort = 8888;

char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1];
#define buffsize 255
char serial_input[buffsize];
bool stringComplete = false;
boolean udpConnected = false;

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    //Serial.print('.');
    delay(500);
  }
  //Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  //Serial.printf("UDP server on port %d\n", localPort);
  Udp.begin(localPort);
}

void loop() {
  serialEvent();
  int packetSize = Udp.parsePacket();

  if (packetSize) {
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
    Serial.println(packetBuffer);
    udpConnected = true;
  }

  if (udpConnected) {
    if (stringComplete) {
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      char *odpowiedz = serial_input;
      Udp.write(odpowiedz);
      Udp.endPacket();
      stringComplete = false;
    }
  }
}

void serialEvent() {
  while (Serial.available() > 0) {
    char aChar = Serial.read();
    static byte index = 0;
    if (aChar == '\n') {
      serial_input[index] = 0;
      index = 0;
      stringComplete = true;
    } else {
      serial_input[index] = aChar;
      if (index < (buffsize - 1)) index++;
      serial_input[index] = '\0';
    }
  }
}
Wrzuciłam twój kod, śmigał na konfiguracji: laptop(putty) z fibbo(com) ->wifi-> esp8266 podłączone do pc w arduino ide

Dziś podłączyłam: laptop(putty) z fibbo(com) ->wifi-> esp8266 podłączone przez uart do płyty głównej(urządzenie) ,esp dodatkowo przez usbc przewodem zasilającym do prądu. esp8266 łączy się z hotspotem jak wcześniej, ale w tibbo monitorze wyskakują takie komunikaty:
Kod:
05/17/24 08:43:26 - COM10 (INFO): Established UDP connection with 192.168.222.62:8888
05/17/24 08:43:36 - COM10 (ERROR): "On-the-Fly" command for 192.168.222.62 - set baud rate to 115200 bps...timed out
05/17/24 08:43:36 - COM10 (WARNING): "On-the-Fly" settings disabled (until connection established or port opened next time)
05/17/24 08:49:19 - COM10 (INFO): UDP connection with 192.168.222.62:8888 closed (timed out)
połączenia esp: gnd-gnd 3v3-vcc tx-rx rx-tx
 
Odpowiedź
#8
Dalej nie ma informacji co tam łączysz konkretnie, czy są zgodne napięcia, ESP pracuje na 3.3V, UART może być też na 5V, a RS232 to już w ogóle +-15V.
Może jest tam jakiś konflikt sprzętowy, może ESP się resetuje i dlatego traci połączenie. Możesz dodać miganie ledem na jakimś pinie gdy łączy się z wifi co 100ms, a potem w trakcie loop co 1s, oczywiście bez delay. Możesz też dodać sprawdzanie czy jest połączony z wifi, jak nie to ponowić próbę łączenia. No i tak na koniec to bym dodał jakiś WIFI manager, by nie ustawiać na sztywno w kodzie SSID, jak ESP znajduje znaną sieć to się do niej loguje, jak nie to stawia AP, można się do niego podłączyć i przeskanować okolicę, wybrać AP, podać hasło. Dla testów możesz też połączyć dwa ESP ze sobą, zrobić im dwa porty COM w Tibbo i pogadać między nimi, jednak jak podłączasz do laptopa to leci przez USB, konwerter UART.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
(17-05-2024, 12:55)kaczakat napisał(a): Dalej nie ma informacji co tam łączysz konkretnie, czy są zgodne napięcia, ESP pracuje na 3.3V, UART może być też na 5V, a RS232 to już w ogóle +-15V.
Może jest tam jakiś konflikt sprzętowy, może ESP się resetuje i dlatego traci połączenie. Możesz dodać miganie ledem na jakimś pinie gdy łączy się z wifi co 100ms, a potem w trakcie loop co 1s, oczywiście bez delay. Możesz też dodać sprawdzanie czy jest połączony z wifi, jak nie to ponowić próbę łączenia. No i tak na koniec to bym dodał jakiś WIFI manager, by nie ustawiać na sztywno w kodzie SSID, jak ESP znajduje znaną sieć to się do niej loguje, jak nie to stawia AP, można się do niego podłączyć i przeskanować okolicę, wybrać AP, podać hasło. Dla testów możesz też połączyć dwa ESP ze sobą, zrobić im dwa porty COM w Tibbo i pogadać między nimi, jednak jak podłączasz do laptopa to leci  przez USB, konwerter UART.
Wybacz, jest to płyta główna od maszyny przemysłowej. wychodzą z niej piny(6), do których był podłączony ten przewód (https://www.tme.eu/Document/d35506873b14...CABLES.pdf) - 11 strona. Po zmierzeniu pinów tylko na rx i tx było 3.3v a reszta 0. esp cały czas jest połączone. zrobiłam test - zamiast pinów od esp do płyty dałam z przejsciowką przewód uart-usb i połączenie było:
Kod:
05/17/24 12:58:46 - COM10 (INFO): VSP opened, transport=UDP(TDI), routing=client, remote=192.168.222.62:8888, connect=on data, OTF=disabled
05/17/24 12:59:05 - COM10 (INFO): Established UDP connection with 192.168.222.62:8888
ale nadal nie przesyłało lub nie odpowiada.
 
Odpowiedź
#10
Może GND nie podłączone? No coś powoduje, że ESP przestaje działać i tracisz połączenie z Tibbo, nie wygląda to na problem z programem, skoro podłączony do innego urządzenia działa OK.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości