nodeMCU et signal de sortie d'un récepteur rc

Bonjour,

C’est la lecture de https://github.com/acolab/CPPM_ESP8266_Arduino qui m’amène ici

Je découvre l’ESP8266 et je le trouve super mais mes compétences ne sont pas suffisantes pour ce que je veux en faire.J’y arrive avec un arduino nano

je veux récupérer le signal d’une voie sur un récepteur rc, le traiter et adapter ce traitement rapidement au démarrage sur le terrain avec un smartphone et une appli android grâce au wifi

MAIS je ne sais pas comment récupérer le signal d’une voie RC

Comme j’ai pas mal de choses à faire faire par l’ESP il me faut un signal traité en interruption

Quelqu’un peut m’aider ?

Bonjour,

j’avais fais ce code qui est pas ‘optimal’ mais fonctionnel pour décoder une trame de plusieurs pulses.

Pour détecter une seule impulsion, il faut procéder un petit peut différemment.

Possible que mon code arrive à mesurer une impulsion seule (en fait une sur deux), en lisant ppmValue[0] (donc en lisant channel = 0 au lieu de 1 à 17 ligne 69), mais j’ai un doute car on ne mesure que les front montant avec la routine pulseDetect()

En gros, dans mon code, ppmRead() donne la main pendant 40ms aux interruptions qui appellent la routine pulseDetect() qui va enregistrer l’espace entre 2 front montant.

Comme l’espace entre les pulse est en principe le même, on obtient le reflet de la large de chaque pulse.

Pour mesurer une voie de servo, il faut plutôt faire une interruption en front montant, puis au choix

  • stocker micros() et avoir une autre interruption sur front descendant pour faire la différence entre le micros() précédent et l’actuel
  • stocker micros() , se laisser un delay() et attendre le front descendant pour avoir la valeur et sortir de la fonction.

Aucune idée de savoir si une des deux stratégie est plus pertinente que l’autre.

Je n’ai pas toujours l’occasion de passer comme je le voudrais, mais tu peux toujours mettre ton code ici pour qu’on voit si quelque chose cloche, et puis expliquer un poil plus ce que tu désire faire ‘sur le terrain’ (alimenter la bougie via une voie radio est bien plus exploitable… un nano + un mosfet suffisent très largement dans ce cas)

Toujours en recherche de solution je suis finalement retombé sur ton fil, pour m’apercevoir que j’avais pas vu ta réponse.
Pour te renseigner :

  • mon récepteur de radiocommande ne me donne pas la trame complète, je n’ai que des prises pour servos classiques.
  • J’ai actuellement un arduino micro qui fait le travail : récup du signal de la voie, récup d’un potar, acquisition de la tension de l’accu puis traitement pour actionner en mixant les deux infos un pont en H en pwm avec si on le souhaite un réglage des différents paramètres avec un poussoir et affichage sur un oled en SPI.
    Je voudrais profiter du serveur web en wifi de l’ESp8266 pour afficher sur smartphone android et donc virer l’écran oled
    Je pense que la puce ESP est capable de tout cela en bien mieux qu’un atmel mais comme je ne sais qu’assembler des briques de bouts de programme.Il me faut trouver comment décoder la sortie de la voie par gestion d’interruption… C’est bien trop fort pour moi.
    Je viens de télécharger https://github.com/acolab/CPPM_ESP8266_Arduino/blob/master/NodeMCU_cppm.ino
    Ca compile :heart: mais je me proposais de faire le tp demain avec un récepteur… Et le code est très compact, sans librairie difficile à dénicher…
    En te lisant ci-dessus un doute vient m’habiter…:sob:
    Sur mon Atmel je me suis servi des librairies de Philippe Loussouarn : http://p.loussouarn.free.fr/arduino/arduino.html

Comme je l’ai fais pour décoder une trame CCPM complète, les librairies que tu indiquent utilise les interruptions.

Dans https://github.com/RC-Navy/DigisparkArduinoIntegration/blob/master/libraries/DigisparkSoftRcPulseIn/SoftRcPulseIn.cpp on distingue une structure très similaire à celle que j’ai mis en place :

>   for ( RcPulseIn = first; RcPulseIn != 0; RcPulseIn = RcPulseIn->next )
>   {
>     if(TinyPinChange_GetPortEvent(RcPulseIn->_VirtualPortIdx)&RcPulseIn->_PinMask)
>     {
> 	  if(digitalRead(RcPulseIn->_Pin))
> 	  {
> 		  /* High level, rising edge: start chrono */
> 		  RcPulseIn->_Start_us = micros();
> 	  }
> 	  else
> 	  {
> 		  /* Low level, falling edge: stop chrono */
> 		  RcPulseIn->_Width_us = micros() - RcPulseIn->_Start_us;
> 		  RcPulseIn->_Available = 1;
> #ifdef SOFT_RC_PULSE_IN_TIMEOUT_SUPPORT
> 		  RcPulseIn->_LastTimeStampMs = (uint8_t)(millis() & 0x000000FF);
> #endif
> 	  }
>     }
>   }
> }

sauf que c’est en ‘pur C’

Si tu regardes sur http://www.esp8266.com/wiki/doku.php?id=esp8266_gpio_pin_allocations#interrupts , il est indiqué que les toutes les I/O peuvent être utilisé en interruption, sauf la pin 16

Du coup, tu devrait pouvoir faire un ‘attachInterrupt’ pour plusieurs pin pour qu’ils appellent chacun la routine de détection de temps

Il est peut-être même envisageable de faire une interruption sur flanc montant, récuperer le millis(), et une autre sur flanc descendant pour connaître la durée de l’interruption.

A savoir qu’historiquement, l’impulsion d’une voie ne commence que bien après la fin de la précédente, en gros ça fait
voie 1 : impulsion montante + durée + impulsion descendante
pause
voie 2 : impulsion montante + durée + impulsion descendante
pause
voie 3 : impulsion montante + durée + impulsion descendante
ect ect ect tant qu’il y a des voies
"méga pause" de synchronisation
voie 1 : impulsion montante + durée + impulsion descendante
pause
voie 2 : impulsion montante + durée + impulsion descendante
et ainsi de suite.

Bonne bidouille :wink:

C’est bien au delà de mes compétences… Je travaille à partir des exemples de librairies pour bien comprendre comment elles fonctionnent et ensuite les adapter
Du genre Je demande combien est la taille du créneau sans entrer dans le détail, à savoir comment il est obtenu.

A un moment, il faudra y passer :smiley:

C’est presque déjà un exemple que j’ai publié sur https://github.com/acolab/CPPM_ESP8266_Arduino/blob/master/NodeMCU_cppm.ino

Il faut adapter le code bien sur, mais ce n’est pas une librairie, c’est ‘en dur’ dans le code.

Adapter une librairie tel que celle de ‘Navy’ pour l’ESP8266 doit bien sur être possible, mais c’est des compétences un poil supérieures à ce que j’ai pondu :wink:

C’est peut-être même déjà fait, en fouillant le web avec les mots clé “RC-Navy” esp8266 par exemple.

Librairie ou procédure, c’est dans le sens entrer dans la partie gestion de l’interruption qui me soucie.
Je vais voir avec Philippe s’il ne peut (avec ton accord) adapter ton code et en faire une librairie.

Cela posé je me fais peut-être du souci pour rien, je vais mettre en pratique ton code, voir ce que cela donne et essayer de faire comme tu l’indiques.

En te relisant je comprends que tu penses que j’ai besoin de récupérer la largeur du créneau de toutes les voies…
Non, je n’ai besoin que d’une voie
Donc si je ne me trompe pas j’ai à lancer ton code sans chercher à remplir un tableau puisque je n’aurais qu’une valeur à récupérer