[RESOLU] Création d'un sketch ARDUINO pour intégrer un LIDAR TFmini sur un ESP 8266

Bonjour à tous,

J’utilise des ESP8266 (Wemos D1 mini ) avec succès avec des capteurs de distance HC-SR04.

J’ai besoin de mesurer une distance plus grande (8m), j’ai choisi le TFmini. Problème : pas prévu en natif par ESP Easy.

D’après mes recherches :
j’ai trouvé le fichier \ESPEasy_mega-20181023\Source\src_P013_HCSR04.ino

j’ai donc créé, dans ce dossier, le fichier _P129_LIDAR.ino, et j’y ai collé le code suivant :

//#######################################################################################################
//#################################### Plugin 129: TFmini LIDAR #########################################
//#######################################################################################################

#define PLUGIN_129
#define PLUGIN_ID_129        129
#define PLUGIN_NAME_129       "TFmini"
#define PLUGIN_VALUENAME1_129 "Distance"
#define PLUGIN_VALUENAME2_129 "Strength"
boolean Plugin_129(byte function, struct EventStruct *event, String& string)
{
  boolean success = false;

  switch (function)
  {

    case PLUGIN_DEVICE_ADD:
      {
        Device[++deviceCount].Number = PLUGIN_ID_129;
        Device[deviceCount].Type = DEVICE_TYPE_TFMINI;
        Device[deviceCount].VType = SENSOR_TYPE_SINGLE;
        Device[deviceCount].Ports = 0;
        Device[deviceCount].PullUpOption = false;
        Device[deviceCount].InverseLogicOption = false;
        Device[deviceCount].FormulaOption = false;
        Device[deviceCount].DecimalsOnly = true;
        Device[deviceCount].ValueCount = 2;
        Device[deviceCount].SendDataOption = true;
        Device[deviceCount].TimerOption = true;
        Device[deviceCount].GlobalSyncOption = true;
        break;
      }

    case PLUGIN_GET_DEVICENAME:
      {
        string = F(PLUGIN_NAME_129);
        break;
      }

    case PLUGIN_GET_DEVICEVALUENAMES:
      {
        strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_129));
        strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[1], PSTR(PLUGIN_VALUENAME2_129));
        break;
      }

    case PLUGIN_WEBFORM_LOAD:
      {
      }

    case PLUGIN_WEBFORM_SAVE:
      {
        String plugin1 = WebServer.arg("plugin_129_sensortype");
        Settings.TaskDevicePluginConfig[event->TaskIndex][0] = plugin1.toInt();
        success = true;
        break;
      }
     case PLUGIN_INIT:    
      {
    Serial.begin(115200); // HW Serial for TFmini
    delay (100); // Give a little time for things to start

    
  // Set to Standard Output mode
    Serial.write(0x42);
    Serial.write(0x57);
    Serial.write(0x02);
    Serial.write(0x00);
    Serial.write(0x00);
    Serial.write(0x00);
    Serial.write(0x01);
    Serial.write(0x06);

  
        break;
      }     
 case PLUGIN_TEN_PER_SECOND:
      {    
     while(Serial.available()>=9) // When at least 9 bytes of data available (expected number of bytes for 1 signal), then read
    {
      if((0x59 == Serial.read()) && (0x59 == Serial.read())) // byte 1 and byte 2
      {
        unsigned int t1 = Serial.read(); // byte 3 = Dist_L
        unsigned int t2 = Serial.read(); // byte 4 = Dist_H
        
        t2 <<= 8;
        t2 += t1;
        UserVar[event->BaseVarIndex] = t2;
        String log = F("Dist: ");
        log += t1;
        addLog(LOG_LEVEL_INFO,log); 
    
    
        t1 = Serial.read(); // byte 5 = Strength_L
        t2 = Serial.read(); // byte 6 = Strength_H

        t2 <<= 8;
        t2 += t1;
        UserVar[event->BaseVarIndex + 1] = t2;
        for(int i=0; i<3; i++)Serial.read(); // byte 7, 8, 9 are ignored
      }
  }
    
       
  }
  return success;
}

(trouvé ici : Benewake TF-Mini (new device) - Let's Control It)

Et là je suis coincé, je ne sais pas comment compiler ce plugin avec les autres (j’ai essayé de re flasher la D1, mais je n’y trouve pas le device « LIDAR »), et aussi, le code trouvé sur letscontrolit ne semble pas cohérent avec celui proposé par le fabricant, qui propose cette doc :

Alors à ceux qui sont arrivés jusqu’ici :

  • merci
  • comment exporter le plugin sur la D1 (quoi que d’après le forum de letscontrolit, c’est pas au point, et la correction n’est pas publiée)
  • ne vaut il pas mieux partir sur le pdf du fabricant, mais alors là je suis hors jeu malheureusement…

Un grand merci à celui qui est disposé à me donner qqes pistes!

Salut @Seb54

Sur le principe voici ce que je ferais.
partir d’une D1
avec un exemple lidar qui fonctionne
ajouter une connexion WiFi client
Faire un push de la valeur récupérée sur un virtuel jeedom
(oublier les plugins jeedom)

1 « J'aime »

Pas simple de compiler un nouveau plugin (ESPEasy) avec IDEArduino ! J’ai passé plusieurs heures dernièrement, j’y suis arrivée, mais faute de matériels, j’ai pas testé le résultat et c’était un plugin qui théoriquement fonctionne.
Il semblerait que c’est beaucoup plus simple de passer par PlatformIO (que je n’ai pas réussi à maîtriser).

Moi j’ai dit sans plugin …

@olive, Oui, j’ai bien compris ta réponse, sans plugin et sans ESPEasy.
mais tu ne répond pas à la demande ! l’avantage d’ESPEasy c’est que 100% du programme est opérationnel et quand on a pas les compétences (comme moi) dans ce domaine c’est tout de même un sacré avantage.
Alors tu vas nous dire que si tu es capable de faire un plugin, tu devrais pouvoir développer « Sans Pluging » sur ESP, ok , c’est pas faux , mais c’est sympa aussi de développer et d’améliorer …pour les autres.

Oui c’est plus simple avec PlatformIO parce qu’il y a déjà les bonnes librairies et tout. J’utilise platformio depuis Visual Studio Code maintenant (y’a plein de tutos pour l’installation), que je trouve moins lourd qu’Atom.

Normalement, il suffit de télécharger la dernière release d’ESP Easy, décompresser et ajouter le nouveau fichier ino du plugin dans « src », puis d’ouvrir le dossier « source » et compiler la carte qu’on veut en cliquant PlatfomIO: Run task…

Sauf qu’en ce moment ça compile pas à cause d’une histoire de git qui ne passe pas au niveau des packages du core. Il faut modifier une ligne, j’ai en parlé sur ce sujet.

Bref, on y arrive mais c’est pas évident évident il faut l’avouer.

Quand j’ai testé à une époque plein de capteurs de distance, je commençais avec un code simple d’une libraire ou sur internet (voire le fabricant) que je compilais sous Arduino IDE et j’affichais juste le résultat sur le port série. Cela me permettait au moins de tester le fonctionnement du capteur, et si j’en étais satisfait je regardais pour le convertir en plugin.

Bon courage

merci @olive pour ta réponse rapide. Tu me vois venir, je ne sais pas comment pusher une valeur en virtuel, si tu as un exemple peux tu m’envoyer une capture d’écran stp

merci @rol-rider pour ta réponse rapide, peux tu me préciser stp comment tu as remonté le plugin dans la D1?

Ca va venir je viens de commencer un Tutoriel tu aura la réponse bientot ici:

merci @seb821 pour ta réponse rapide, je vais essayer la méthode de @olive dès que son tuto sera dispo, et la tienne dès que je récupère mon PC (ma femme télétravaille dessus pendant le confinement :grin: )

Mais selon toi, vaut il mieux partir sur le code du fabricant ou celui trouvé sur lestcontrolit?

Pas évident à dire.

Avec un plugin déjà existant, quand on a de la chance hop ça marche direct et on n’a pas besoin d’y passer du temps. Mais quand il faut débugger je ne trouve pas ça pratique.

Pour les codes fabricant, c’est souvent plus simple à lire je trouve et du coup un peu plus simple pour se lancer.

C’est pour mettre sur quel modèle de carte esp ?

A la limite vu que j’ai tout d’installé en ce moment, je peux essayer de coller le plugin et de générer le fichier bin. Si ça compile direct ça ne devrait pas me prendre trop de temps.

C’est pour une carte Wemos D1 mini ESP 8266.
Pour mon information, si tu veux bien, je voudrais en 2 mots connaître le lien entre *.ino / *.bin / arduino / sketch (en gros je voudrais savoir comment compiler si je devais le faire moi même, je ne trouve rien de très abordable pour les moldu sur internet)

merci!!!

ino c’est le source arduino c’est du texte
bin c’est un fichier compiler c’est le code brut que tu va téléversé dans ton microcontroleur ‹ binaire › pas lisible au commun des mortels

ok je vais regarder comment transformer ino en bin, et comment téléverser. J’ai téléchargé IDE Iduino j’imagine que la clé est là dedans, merci

j’ai essayé de compiler ton fichier ! ça compile pas.
mais ton fichier ne figure pas dans les PluginPlayground…c’est pas bon signe.

merci @rol-rider et @olive pour votre aide. J’ai ouvert un croquis dans arduino, j’ai bien pris soin de déclarer la carte « generic ESP8266 module ». J’ai collé le code trouvé dans le forum letscontrolit. Je fais une vérif et patatra, j’ai plus de lignes d’erreur que de code… :sob: :sob:

Arduino : 1.8.12 (Windows 10), Carte : "Generic ESP8266 Module, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), dtr (aka nodemcu), 26 MHz, 40MHz, DOUT (compatible), 1MB (FS:64KB OTA:~470KB), 2, nonos-sdk 2.2.1+100 (190703), v2 Lower Memory, Disabled, None, Only Sketch, 115200"

E:\Mes Documents\Arduino\_P129_LIDAR\_P129_LIDAR.ino: In function 'boolean Plugin_129(byte, EventStruct*, String&)':

_P129_LIDAR:17:10: error: 'PLUGIN_DEVICE_ADD' was not declared in this scope

     case PLUGIN_DEVICE_ADD:

          ^

_P129_LIDAR:19:9: error: 'Device' was not declared in this scope

         Device[++deviceCount].Number = PLUGIN_ID_129;

         ^

_P129_LIDAR:19:18: error: 'deviceCount' was not declared in this scope

         Device[++deviceCount].Number = PLUGIN_ID_129;

                  ^

_P129_LIDAR:20:36: error: 'DEVICE_TYPE_TFMINI' was not declared in this scope

         Device[deviceCount].Type = DEVICE_TYPE_TFMINI;

                                    ^

_P129_LIDAR:21:37: error: 'SENSOR_TYPE_SINGLE' was not declared in this scope

         Device[deviceCount].VType = SENSOR_TYPE_SINGLE;

                                     ^

_P129_LIDAR:34:10: error: 'PLUGIN_GET_DEVICENAME' was not declared in this scope

     case PLUGIN_GET_DEVICENAME:

          ^

_P129_LIDAR:40:10: error: 'PLUGIN_GET_DEVICEVALUENAMES' was not declared in this scope

     case PLUGIN_GET_DEVICEVALUENAMES:

          ^

In file included from C:\Users\sylva_000\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3/tools/sdk/libc/xtensa-lx106-elf/include/string.h:163:0,

                 from C:\Users\sylva_000\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266/Arduino.h:33,

                 from sketch\_P129_LIDAR.ino.cpp:1:

_P129_LIDAR:42:18: error: 'ExtraTaskSettings' was not declared in this scope

         strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_129));

                  ^

C:\Users\sylva_000\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3/tools/sdk/libc/xtensa-lx106-elf/include/sys/string.h:33:49: note: in definition of macro 'strcpy_P'

 #define strcpy_P(dest, src)          strncpy_P((dest), (src), SIZE_IRRELEVANT)

                                                 ^

_P129_LIDAR:47:10: error: 'PLUGIN_WEBFORM_LOAD' was not declared in this scope

     case PLUGIN_WEBFORM_LOAD:

          ^

_P129_LIDAR:51:10: error: 'PLUGIN_WEBFORM_SAVE' was not declared in this scope

     case PLUGIN_WEBFORM_SAVE:

          ^

_P129_LIDAR:53:26: error: 'WebServer' was not declared in this scope

         String plugin1 = WebServer.arg("plugin_129_sensortype");

                          ^

_P129_LIDAR:54:9: error: 'Settings' was not declared in this scope

         Settings.TaskDevicePluginConfig[event->TaskIndex][0] = plugin1.toInt();

         ^

_P129_LIDAR:54:46: error: invalid use of incomplete type 'struct EventStruct'

         Settings.TaskDevicePluginConfig[event->TaskIndex][0] = plugin1.toInt();

                                              ^

_P129_LIDAR:10:42: error: forward declaration of 'struct EventStruct'

 boolean Plugin_129(byte function, struct EventStruct *event, String& string)

                                          ^

_P129_LIDAR:58:11: error: 'PLUGIN_INIT' was not declared in this scope

      case PLUGIN_INIT:    

           ^

_P129_LIDAR:77:7: error: 'PLUGIN_TEN_PER_SECOND' was not declared in this scope

  case PLUGIN_TEN_PER_SECOND:

       ^

_P129_LIDAR:88:9: error: 'UserVar' was not declared in this scope

         UserVar[event->BaseVarIndex] = t2;

         ^

_P129_LIDAR:88:22: error: invalid use of incomplete type 'struct EventStruct'

         UserVar[event->BaseVarIndex] = t2;

                      ^

_P129_LIDAR:10:42: error: forward declaration of 'struct EventStruct'

 boolean Plugin_129(byte function, struct EventStruct *event, String& string)

                                          ^

_P129_LIDAR:91:16: error: 'LOG_LEVEL_INFO' was not declared in this scope

         addLog(LOG_LEVEL_INFO,log); 

                ^

_P129_LIDAR:91:34: error: 'addLog' was not declared in this scope

         addLog(LOG_LEVEL_INFO,log); 

                                  ^

_P129_LIDAR:99:22: error: invalid use of incomplete type 'struct EventStruct'

         UserVar[event->BaseVarIndex + 1] = t2;

                      ^

_P129_LIDAR:10:42: error: forward declaration of 'struct EventStruct'

 boolean Plugin_129(byte function, struct EventStruct *event, String& string)

                                          ^

_P129_LIDAR:107:1: error: expected '}' at end of input

 }

 ^

exit status 1
'PLUGIN_DEVICE_ADD' was not declared in this scope

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Pourtant dans le forum il arrive à faire fonctionner ce foutu LIDAR. Votre avis svp : j’ai loupé un truc évident pour vous ou je suis carrément à côté de la plaque?

Quelle conseil me donneriez vous svp pour continuer? Je me sens si près du but

merci!!

près du but ! pas sur ! s’il suffisait d’un copier/coller ça serait le pied !

il faut d’abord récupérer les sources espasy https://github.com/letscontrolit/ESPEasy/releases
dézipper et dans le dossier source tu as un dossier src tu le copies et le colle dans le carnet de sketch (ou de croquis) qu’a du te créer l’IDEArduino (tu le renommes en ESPasy) si tu l’ouvre tu devrais voir des dossier _P0XX
c’est ici qu’il faut mettre ton _P129

mais, malheureusement…ç’est pas tout j’essaierai de te donner la suite

Oui, il faut que ce soit intégré à ESP Easy. Je suis en train de regarder, et comme je le craignais malheureusement le code est un peu ancien et pas super à la base je pense. J’ai bien galéré déjà à avoir quelque chose qui compile.

Le mieux à ce stade, c’est de partir du pdf du fabricant et d’en faire un sketch qui marche en sortant la valeur sur le port série du PC. Ce sera déjà un bon début.

Dans Arduino IDE :

File > Preferences > Additionnal Boards Manager URLs > Ajouter http://arduino.esp8266.com/stable/package_esp8266com_index.json
Tools > Board > LOLIN(WEMOS) D1 R2&mini

Pour le code, ce devrait être ça (code adapté du PDF) :

/* This program is a parsing routine of TF02 product standard output protocol on Arduino.
The format of data package is 0x59 0x59 Dist_L Dist_H Strength_L Strength_H Sequence_L Sequence_H
CheckSum_L
Refer to the product specification for detailed description.
For Arduino board with one serial port, use software to virtualize serial port’s functions: such as UNO board.
*/
#include "SoftwareSerial.h" // soft serial port header file
SoftwareSerial Serial_tfmini(D1,D2); // define the soft serial port as Serial_tfmini, pin2 as RX, and pin3 as TX
/*For Arduino board with multiple serial ports such as DUE board, comment out the above two codes, and directly use
Serial_tfmini port*/
int dist;// LiDAR actually measured distance value
int strength;// LiDAR signal strength
int check;// check numerical value storage
int i;
int uart[9];// store data measured by LiDAR
const int HEADER=0x59;// data package frame header
void setup()
{
 Serial.begin(115200);//set the Baud rate of Arduino and computer serial port
 Serial_tfmini.begin(115200);//set the Baud rate of LiDAR and Arduino serial port
}
void loop()
{
 if (Serial_tfmini.available())//check whether the serial port has data input
 {
 if(Serial_tfmini.read()==HEADER)// determine data package frame header 0x59
 {
 uart[0]=HEADER;
 if(Serial_tfmini.read()==HEADER)//determine data package frame header 0x59
 {
 uart[1]=HEADER;
 for(i=2;i<9;i++)// store data to array
 {
 uart[i]=Serial_tfmini.read();
 }
 check=uart[0]+uart[1]+uart[2]+uart[3]+uart[4]+uart[5]+uart[6]+uart[7];
 if(uart[8]==(check&0xff))// check the received data as per protocols
 {
 dist=uart[2]+uart[3]*256;// calculate distance value
 strength=uart[4]+uart[5]*256;// calculate signal strength value
 Serial.print("dist = ");
 Serial.print(dist);// output LiDAR tests distance value 
 Serial.print('\t');
 Serial.print("strength = ");
 Serial.print(strength);// output signal strength value
 Serial.print('\n');
 }
 }
 }
 }
}

Il faudra connecter le capteur sur D1 et D2, mais je ne suis pas sûr pour le RX/TX, essaie les deux.

Ensuite :

Tools > Port > Choisir celui qui correspond à la D1 mini

Sketch > Upload

Et cliquer sur la loupe en haut à droite (Serial Monitor), régler 115 200 bauds en bas à droite si ce n’est pas déjà le cas.

Je te conseille de te familiariser avec Arduino IDE, par example en allant chercher le sketch Files > Examples > 01.Basics > Blink et voir que la pin LED change bien d’état, puis par exemple remplacer LED_BUILTIN par D1 et mesurer au voltmètre.

Bon courage. Je jette un coup d’oeil pour ESP Easy mais ça semble pas évident.

:rofl: :rofl: touché ! je crois que je me suis largement enflammé

que grâce te soit rendue! je teste ça dès que possible. J’ai encore moins de temps en confinement qu’en temps normal (télé travail, télé prof, télé garderie…) en tout cas ça à l’air encourageant!
oui j’essaierai de me familiariser avec arduino, surtout que si esp easy ne donne rien, il faudra que je comprenn comment récupérer les données sur un virtuel

a+