Capteur LIDAR TFmini & ESP32, phase 2 = wifi & affichage déporté

Bonsoir à tous,

Je me demandais si quelqu’un par ici à déjà réussi ce type d’association : Board ESP-WROOM-32 OLED et capteur LIDAR TFmini.

Je n’ai aucun problème à téléverser des programmes sur la boards, tester l’écran ou le wifi.
Mais impossible de récupérer un retour de valeur (monitoring série) avec les exemples fournis.

J’ai suivi le branchement préconisé sur le tuto sparkfun (http://tiny.cc/y5wvaz)
CAD Vert = TX / Blanc = RX / Noir = Masse / Rouge = 5V

J’ai l’impression que ça vient de SoftwareSerial, lorsque je teste ce type de code :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 1); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
mySerial.begin(4800);
mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
mySerial.write(Serial.read());
  }
}

Je n’ai absolument rien qui s’affiche dans le moniteur série, ça pourrait donc bloquer sur le - while (!Serial) - mais je ne sais pas du tout comment contrer ce genre de problème.

Softwareserial ne fonctionne pas avec un ESP32. Il existe une bibliothèque appelée espsoftwareserial qui la remplace.
Mais l'ESP32 à trois UART que tu peux utiliser. Voir ici pour un exemple.

D'autre part le while(!serial) , comme indiqué dans le commentaire du programme , n'a de sens que pour les microcontrolleurs contenant un port série USB (Leonardo....). ce n'est pas les cas des ESP32 actuels?
Enlever ce test et comme indiqué par lesept éviter softwareserial du profit du second port série matériel.

Une librairie softwareserial pour les ESP existe, je ne l'ai pas testée

merci bcp Lesept & al1fch,

je vais commencer par ça :slight_smile:

lesept:
l'ESP32 à trois UART que tu peux utiliser. Voir ici pour un exemple.

J'ai essayé de chargé le programme test fournit dans ce lien mais je ne vois rien sur le moniteur de série.

Voilà le code que j'ai chargé :

#define RXD2 3
#define TXD2 1
 
void setup() {
  // Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
  Serial.begin(115200);
  //Serial1.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Serial.println("Serial Txd is on pin: "+String(TX));
  Serial.println("Serial Rxd is on pin: "+String(RX));
}
 
void loop() { //Choose Serial1 or Serial2 as required
  while (Serial2.available()) {
    Serial.print(char(Serial2.read()));
  }
}

Pour les n° de TXD et RXD, j'ai suivi le schéma fournit sur le site de letmeknow (où j'ai acheté la board) :
TX = GPIO1 RX = GPIO3

Si je comprend bien la logique du code (ce qui est malheureusement peu probable... :'p), je devrais voir apparaitre sur le réglage 115200 du moniteur : "Serial Txd is on pin: 1", puis "Serial Rxd is on pin: 3", et enfin des détails sur ce que ça lit en serial2.

Mais ça reste muet. :-\

Chez moi, j'obtiens

14:03:02.380 -> Serial Txd is on pin: 1
14:03:02.380 -> Serial Rxd is on pin: 3

avec le sketch suivant:

/*
 * There are three serial ports on the ESP known as U0UXD, U1UXD and U2UXD.
 * 
 * U0UXD is used to communicate with the ESP32 for programming and during reset/boot.
 * U1UXD is unused and can be used for your projects. Some boards use this port for SPI Flash access though
 * U2UXD is unused and can be used for your projects.
 * 
*/

#define RXD2 16
#define TXD2 17

void setup() {
  // Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
  Serial.begin(115200);
  //Serial1.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Serial.println("Serial Txd is on pin: "+String(TX));
  Serial.println("Serial Rxd is on pin: "+String(RX));
}

void loop() { //Choose Serial1 or Serial2 as required
  while (Serial2.available()) {
    Serial.print(char(Serial2.read()));
  }
}

La seule différence, c'est les #define
Après, tu branches ton LIDAR sur les pin RXD2 et TXD2 et tu regardes ce qui s'affiche

lesept:
Chez moi, j'obtiens

14:03:02.380 -> Serial Txd is on pin: 1
14:03:02.380 -> Serial Rxd is on pin: 3

Pourtant moi j'obtiens rien (que j'utilise ton code tel que, ou que je change les define en 3 et 1).
Je check sur 115200 et 9600 (des fois que je me plante là dessus).

lesept:
Après, tu branches ton LIDAR sur les pin RXD2 et TXD2 et tu regardes ce qui s'affiche

Justement c'est là que j'ai un léger soucis....

En pleine euphorie dans mes préparatifs pour ce projet (je suis parti en bord de mer en famille, c'est un peu mon cahier de vacance geek :'p), j'ai soudé les 4 fils du LIDAR sur la board comme préconisé sur le tuto Sparfun. Donc je suis un peu bloqué sur où je fait passer mes infos (d'où mon identification de 3 et 1 puisque j'ai mon fil vert sur le GPIO1 donc RX0 sur le schéma et le fil blanc sur GPIO3, TX0 sur le schéma).

Sur la carte les GPIO1 et 3 sont déjà pris pour la connection avec la puce qui fait l'interface USB, ils ne sont donc pas disponibles pour le LIDAR, que ce soit par un des 3 UART ou par un SoftSerial spécifique ESP
Il faut déplacer la connection du LIDAR pour sortir d'un conflit matériel.

Et c’est probablement ce conflit qui fait que tu n’as rien qui s’affiche.

ah mince... oui ça doit être ce qui bloque !!

et y a des préférences ou je peux me mettre sur n'importe quel GPIO ?

presque sur n'importe quel GPIO, éviter ceux qui servent à la mémoire Flash SPI
Dans l'ESP32 les 3 Uart ne sont pas câblés en dur sur des GPIO, il ya une possibilité de multiplexage

j'avais essayé avec succès 16 et 17 comme lesept le montre plus haut ,[

  • ce lien](#001 ESP32 UART0,1,2 with arduino IDE) montre des exemples d'autres attributions de GPIOs aux UARTs ainsi que les valeurs définies par défaut dans la librairie HardwareSerial.

Bon je commence à avoir l'envie d'appeler un marabou... :confused:

J'ai connecté les fils blanc et vert sur 12 et 15 (je vous passe les techniques de brousse, à base de coupe-ongle et de pince croco pour sectionner les fils soudés et maintenir sur les nv emplacement... ::slight_smile: ), j'ai lancé le code préconisé dans le dernier lien pour tester les canaux série :

...là je teste juste le serial2

HardwareSerial Serial2(2);

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial2.begin(115200); 

}
void loop() {
Serial.println("This message sent to USB serial");
Serial2.println("This message sent to UART2 serial2");
delay(1000);
}

et BIM.... impossible de compiler :

/var/folders/dr/rdbw9cj95nj4x34tp2gty5z80000gn/T/arduino_cache_30932/core/core_d863bda9b0769751a65988783bb6962f.a(HardwareSerial.cpp.o):(.bss.Serial2+0x0): multiple definition of `Serial2'
sketch/test_UART_hardwareserial.ino.ino.cpp.o:(.bss.Serial2+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
Erreur de compilation pour la carte ESP32 Dev Module

:roll_eyes:

Serial, Serial1 et Serial2 sont des noms réservés et déjà définis dans les bibliothèques de l’ESP32. Donc pas touche !

Comme ça, ça compile :

#include <HardwareSerial.h>
HardwareSerial MySerial2(2);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  MySerial2.begin(115200);

}
void loop() {
  Serial.println("This message sent to USB serial");
  MySerial2.println("This message sent to UART2 serial2");
  delay(1000);
}

Si tu veux définir des pins :

MySerial2.begin(115200, SERIAL_8N1, 16, 17); // baud, config, rx, tx

Config :

config: sets data, parity, and stop bits. Valid values are:
SERIAL_5N1
SERIAL_6N1
SERIAL_7N1
SERIAL_8N1 (the default)
SERIAL_5N2
SERIAL_6N2
SERIAL_7N2
SERIAL_8N2
SERIAL_5E1: even parity
SERIAL_6E1
SERIAL_7E1
SERIAL_8E1
SERIAL_5E2
SERIAL_6E2
SERIAL_7E2
SERIAL_8E2
SERIAL_5O1: odd parity
SERIAL_6O1
SERIAL_7O1
SERIAL_8O1
SERIAL_5O2
SERIAL_6O2
SERIAL_7O2
SERIAL_8O2

Serial1, 2... étant déjà définis on peut se contenter de les appeler directement (ne pas créer de nouvelles insatnces de HardwareSerial genre MySerial.....)

    // Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
  Serial.begin(115200);
  Serial1.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);

void loop() { //Choose Serial1 or Serial2 as required
  while (Serial.available()) {
    Serial2.print(char(Serial.read()));
  }
}

à condition de préciser dans les begin() les débits, formats et vers quels GPIO on aiguille les E/S

lesept:
Serial, Serial1 et Serial2 sont des noms réservés et déjà définis dans les bibliothèques de l’ESP32. Donc pas touche !

Ah, effectivement c’est logique que ça plante.

AH AHHH il y a de la vie… pas encore une espèce connue mais ça avance :slight_smile:

J’ai donc loadé ça :

#include <HardwareSerial.h>

HardwareSerial MySerial2(2);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  MySerial2.begin(74880, SERIAL_8N1, 12, 15); //histoire de tester les 2 techniques d'un coup

}
void loop() {
  Serial.println("This message sent to USB serial");
  MySerial2.println("This message sent to UART2 serial2");
  delay(1000);
}

Ça charge bien !
Sur le 115200 j’ai bien des colonnes de “This message sent to USB serial”
En revanche sur le 74880 j’ai des lignes de caractères bizarres :

i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮

Qu'y a-t-il à l'autre bout du MySerial2 ? Est-il réglé sur 74880 baud ?

lesept:
Qu'y a-t-il à l'autre bout du MySerial2 ? Est-il réglé sur 74880 baud ?

euh, ben rien... et quand je branche le LIDAR ça me fait pareil.
Quand je règle MySerial2 sur 115200 ne print que la partie USB mais pas UART.

Je pensais que ça devrait au moins faire un print de "This message sent to UART2 serial2" sur le 74880 ou en alterance sur le 115200.

julienborne:
euh, ben rien…

Si, il y a forcément quelque chose branché sur les pins 12 et 15 qui te donne les caractères bizarres que tu affiches.

julienborne:
et quand je branche le LIDAR ça me fait pareil.
Quand je règle MySerial2 sur 115200 ne print que la partie USB mais pas UART.

Je ne comprends pas ce que tu veux faire : ton LIDAR envoie de données, il ne reçoit pas, si ?

Ben c’est bien là dessus que je ne comprend pas… même avec les fils blanc et verts débranchés (donc seulement mes fils rouge sur le 5V et noir sur GRD soudés) et un reboot / reload de ce code exactement :

#include <HardwareSerial.h>

HardwareSerial MySerial2(2);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  MySerial2.begin(74880, SERIAL_8N1, 12, 15);

}
void loop() {
  Serial.println("This message sent to USB serial");
  MySerial2.println("This message sent to UART2 serial2");
  delay(1000);
}

J’ai toujours ça sur le 74880 :

⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮

Comment est alimenté l'ensemble ESP32+Lidar ?
As(tu pris connaissance des infos sur la consommation du Lidar ?
https://learn.sparkfun.com/tutorials/tfmini---micro-lidar-module-hookup-guide?_ga=2.147530743.1347946967.1565287683-241458008.1512554078

Comment est alimenté l'ensemble ESP32+Lidar ?

J'ai toujours ça sur le 74880 :

Code: [Select]

⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮⸮UZU⸮ZԪ⸮j⸮i+U⸮⸮⸮⸮⸮⸮⸮

Visiblement ça ne sort pas à 74880 bauds !(valeur rencontrée sur les ESP8266 au démarrage)