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

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+

ok ça c’est fait, et dedans j’ai collé le _P129 , tel que proposé par @seb821 dans ce fil.
Capture
Le dossier « _P129 » est celui créé quand j’ai compilé le ino de seb821.

Ok c’est fait (plus tôt que prévu :wink:), par contre les données du LIDAR, je suis censé les voir dans ce serial monitor? parce que là le monitor est vide

ok je l’ai ouvert, je l’ai téléversé (uploadé), mais j’ai une erreur

C:\Users\#####\AppData\Local\Arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506/bin/xtensa-lx106-elf-ar: core\core.a: No such file or directory

j’ai lu ailleurs qu’au lieu de mettre la carte LOLIN(WEMOS) D1 R2&mini, il faut mettre la carte générique ESP 8266, ça peut venir de ça?

merci

1 « J'aime »

Juste pour être sûr : toutes les dernières manips que j’ai cité, c’est sous Arduino IDE et indépendamment de ESP Easy. Le code que j’ai mis est un sketch indépendant qu’il faut compiler et uploader sur la D1 mini avec Arduino IDE.

Pour le dossier, oui en effet il faut que le fichier .ino soit dans un dossier du même nom, sinon Arduino IDE ne marche pas.

Oui. Tu peux ajouter dans la fonction setup une ligne

Serial.println("Hello World");

Cela doit apparaître. Mais commence vraiment par le plus simple pour te familiariser, le sketch Blink.

Je ne sais pas trop là. Tu peux essayer Generic ESP8266, ça doit marcher aussi. Ou sinon Tools > Board > Boards Manager > Taper « esp » et pour esp8266 essayer d’installer une autre version.

Bref, il faut arriver à se faire la main sur des sketchs très simples, compiler, uploader, et lire sur le port série. Il y doit y avoir des tutoriels aussi sur le web qui sont plus parlants.

Salut,

Peut-être un peu plus simple, je viens de voir qu’il y avait une librairie tfmini. Le principe des librairies, c’est du code écrit pour un capteur par exemple qui peut être utilisé juste en appelant une simple fonction. Cela simplifie souvent les choses.

Du coup, cela donnerait :

  • Récupérer le fichier BasicReading.ino et le mettre dans un dossier BasicReading
  • Récupérer les deux fichiers de la librairie ici (.cpp et .h) et les mettre dans le même dossier
  • Ouvrir le fichier .ino avec Arduino IDE
  • Changer SoftwareSerial mySerial(10, 11); par SoftwareSerial mySerial(D1, D2); (ou SoftwareSerial mySerial(5,4); pour pouvoir compiler avec Generic ESP8266 - voir l’équivalence des pins )
  • Compiler et updloader

Il faudra connecter le TX du TFMini sur D1 et le RX sur D2. Et les données devraient apparaître dans le serial monitor. Et si ça fonctionne, on pourra voir pour ESP Easy (ce sera nettement plus simple de faire un plugin avec le librairie .

Note : apparemment, en regardant dans les issues le code ne fonctionne pas directement. Mais un utilisateur (speedymk1) fournit un code qui doit fonctionner sur NodeMCU (et donc sur D1 mini) : TFMini not compatible with ESP8266 / NodeMCU 12E