Problème de réception IR

Bonjour,

Je me présente rapidement parce que je pense que ce ne sera pas mon seul post sur ce forum au vu de mes galères en Arduino, Florian, 19 ans, double licence Maths-Info, et débutant en Arduino :smiley:

Maintenant voici mon problème actuel : je suis sur un projet pour gérer une bande de led. J'ai déjà un bon programme avec différentes fonctions qui tiennent la route individuellement, c'est sûrement très optimisable mais bon je verrais ça plus tard. Je veux pouvoir commander tout ça avec une télécommande IR donc j'ai rajouté un bout de programme qui reçoit le signal de la télécommande puis je gère le tout avec un switch() case. PROBLEME : Le programme qui gère l'IR fonctionne seul, mais une fois intégré dans le projet... bah je reçoit bien des signaux mais différents à chaque fois pour une même touche...

Si quelqu'un a une idée du problème et encore mieux un début de solution ce serait génial !

Y a pas mal de code donc j'ai mis tout sur GitHub à l'adresse suivante : https://github.com/Neiirolf/GestionLeds/tree/master/gestionLeds

Merci encore :wink:

Description de votre matériel ? Si vous avez des WS2812 ou similaire leur timing met une telle pression sur les interruptions que la lecture de l’IR ne va pas bien fonctionner, vous raterez des bits sans doute

Faudrait passer sur de l’APA 102 par exemple ou avoir 2 arduinos

Remarque un lien non cliquable est nettement moins suivi qu'un lien cliquable sur ce forum....souvent consulté a partir d'un smartphone.
Il est dans l'intérêt du demandeur que les infos essentielles apparaissent d'emblée sur ce type de terminal où le copier-coller n'est pas très ergonomique.

J-M-L:
Description de votre matériel ? Si vous avez des WS2812 ou similaire leur timing met une telle pression sur les interruptions que la lecture de l’IR ne va pas bien fonctionner, vous raterez des bits sans doute

Faudrait passer sur de l’APA 102 par exemple ou avoir 2 arduinos

Ce sont en effet des WS2812 reliées à une Arduino UNO. Les leds types APA102 m'ont l'air bien plus chères donc je préférerais rester sur les WS2812. Pour ce qui est d'utiliser une deuxième Arduino c'est-à-dire que je recevrais mes signaux IR sur l'une et commanderai les leds avec l'autre ? Mais comment je fais communiquer les deux ensemble ? Par le port série ? Il ne va pas y a voir le même problème de "timming" ?

Vous parlez d'interruptions, j'ai lu quelques topics sur l'interruption, cela ne pourrait-il pas être une solution à mon problème d'interrompre le programme quand j'essaie de lire des signaux IR ?

al1fch:
Remarque un lien non cliquable est nettement moins suivi qu'un lien cliquable sur ce forum....souvent consulté a partir d'un smartphone.
Il est dans l'intérêt du demandeur que les infos essentielles apparaissent d'emblée sur ce type de terminal où le copier-coller n'est pas très ergonomique.

Voilà le lien est désormais cliquable je pensais qu'il serait reconnu automatiquement... J'aurais aimé mettre mon code directement sur le forum mais étant donné que je ne sais pas d'où vient le problème et la longueur du programme je ne préfère pas faire ça

Bonjour

Vous parlez d'interruptions, j'ai lu quelques topics sur l'interruption, cela ne pourrait-il pas être une solution à mon problème d'interrompre le programme quand j'essaie de lire des signaux IR ?

C'est déjà le cas avec la librairie IR utilisée

La dure cohabitation entre la librairie IRemote et les leds WS2811 est abordée sur son dépôt (cf FAQ)

Comme évoqué par J-M-L la gestion de la réception IR par interruption existante est perturbée par les librairies de gestion des leds

Si l'Arduino de gestion des leds sous-traitre celle des IR à un second Arduino la communication ne se produira que pour transmettre un code IR valide ça réduit très fortement l'interférence

La réception IR se fait par interruption, tout comme la gestion du timing des LEDs qui est assez contraignant. si vous ne respectez pas ce timing, alors le pilotage des LEDs devient aléatoire.

Le souci c'est que quand vous êtes dans une interruption, par exemple celle qui traite les LEDs (et plus vous en avez plus l'interruption est longue), vous ne pouvez pas être interrompu par une autre interruption, ce qui fait qu'aller lire les trames IR ne se fait pas

si vous avez 2 arduino, l'un est esclave et commande les LEDs, c'est celui qui a le plus de contrainte de timing. L'autre est maître et gère l'interaction avec l'utilisateur et l'IR. quand le maître reçoit une commande (IR ou autre), il écrit par exemple sur le port série un code (à vous de définir ce que c'est, mais ça pourrait être 1 octet indiquant une action (par exemple le code de votre switch/case) et il sera traité sur le port série quand la partie LED aura été terminée. comme le port série est matériel, ça va fonctionner.

Pas de bibliothèque, pas de problème?

kayel:
Pas de bibliothèque, pas de problème?

pas compris....

Rien à comprendre....

Je n'ai jamais joué avec des bandes de leds. Je me suis contenté de poser une question/faire une suggestion.

En suivant le lien de al1fch je suis tombé sur ça:

Il est d'accord avec vous et al1fch, la bibliothèque IR est trop lente, mais pas de beaucoup.

Alors, pas de bibliothèque, peut-être pas de problème.

Mon idée était de ne prendre que ce que l'on veut de la trame IR (pour 8 commandes possibles des leds, les 3 premiers bits de data) et de laisser tomber l'adresse qui ne sert à rien.

Et d'utiliser une télécommande de type "Sony", qui envoi la commande avant l'adresse.

Avec la plupart des autres protocoles IR il faut se farcir l'adresse avant la commande, alors que l'on en a rarement besoin.

kayel:
Il est d'accord avec vous et al1fch, la bibliothèque IR est trop lente, mais pas de beaucoup.
Alors, pas de bibliothèque, peut-être pas de problème.

Ou est ce que tu es allé chercher ça?

Le problème est pourtant bien expliqué par J-M-L: Pour respecter le timing strict des WS2812 on est obligé de masquer les interruptions. Donc on rate des interruptions de réception infrarouge qui peuvent se produire pendant ce temps là. Bibliothèque IR ou pas, ça ne change rien.

Quand à recevoir une partie seulement de la trame c'est inapplicable pour plusieurs raisons:

  • il faut avoir la trame entière pour vérifier qu'elle est bien valide et que ce ne sont pas des zigouigouis parasites.
  • On peut perdre des bits aussi bien sur la partie adresse que sur la parie commande.

kamill:
Ou est ce que tu es allé chercher ça?

Dans le lien juste au dessus.

kamill:
Le problème est pourtant bien expliqué par J-M-L: Pour respecter le timing strict des WS2812 on est obligé de masquer les interruptions. Donc on rate des interruptions de réception infrarouge qui peuvent se produire pendant ce temps là. Bibliothèque IR ou pas, ça ne change rien.

Ca dépend du MCU.

AVR

So, unless you use some special hardware to drive neopixels strips on an AVR chip, concurrent IR + neopixels is just not going to work.

Un AVR chip est trop lent pour faire marcher la bibliothèque IR et neopixels en mème temps. Mais avec un interrupt qui prend moins de temps?

TEENSY

Thanks to better FastLED hardware support, when I moved my code to a Teensy 3.1 32 bit ARM CPU, the CPU was fast enough that it had time to re-enable interrupts in the middle of updating neopixels. This in turns allowed the IR Remote interrupt handler to just barely run in between pixel updates, and capture IR codes. Success!

Avec un Teensy il y a juste assez de temps pour caser l'ISR pour la télécommande. Avec une ISR plus courte on serait plus à l'aise, non?

ESP8266

However in my tests, the IRremoteESP8266 library was maybe a little bit too slow and caused occasional visible neopixel glitching (this has been fixed in FastLED since I originally wrote this). This is where I found this interesting library: GitHub - JoDaNl/esp8266_ws2812_i2s: ESP8266 Library for driving WS2812 led-strip using the I2S output. Use within the Arduino IDE which manages to drive the neopixels without doing bit banging with interrupts disabled ((ab)-using the I2S hardware support). It's not a very fancy library in what it offers, but it works perfectly with interrupts enabled.

"Un petit peu trop lent" pour une ISR longue. Et pour une ISR raccourcie?

kamill:
Quand à recevoir une partie seulement de la trame c'est inapplicable pour plusieurs raisons:

  • il faut avoir la trame entière pour vérifier qu'elle est bien valide et que ce ne sont pas des zigouigouis parasites.
  • On peut perdre des bits aussi bien sur la partie adresse que sur la parie commande.

Une image vaut mille mots:

kayel:
Dans le lien juste au dessus.

Le lien dit la même chose que J-M-L

But since neopixel strips (aka WS2811/WS2812/WS2812B) is what I already had, I now had to deal with this precise timing issue. As you can guess, disabling interrupts causes issues with the IRRemote library because it has its on interrupt handler timer that also requires being run at a special timing, or it doesn't capture proper IR signals.

kayel:
Ca dépend du MCU.

Neiirolf a bien indiqué qu'il avait une uno.

kayel:
une image vaut mille mots:

Quel rapport? Tu veux sérieusement utiliser cette méthode en pilotant des leds WS2812??

kamill:
Le lien dit la même chose que J-M-L

Pas tout à fait.

kamill:
Neiirolf a bien indiqué qu'il avait une uno.

Et tout le monde lui a dit que ça ne suffit pas.

kamill:
Quel rapport? Tu veux sérieusement utiliser cette méthode en pilotant des leds WS2812??

C'est juste pour vous montrer que l'on peut avoir une transmission fiable sans tous les bits. Maintenant vous le savez.
Utilisé en forme de ISR, sérieusement, pourquoi pas?

Voici les temps de décodage pour tous les sept data bits. Evidemment, avec moins de bits, ça prendrait moins de temps. Si vous trouvez mieux...

J'arrète là. On pollue.