Étape 7: IR télécommandes
J’ai donc commencé par tutoriel IR de ladayada suivant :
http://www.Ladyada.net/learn/sensors/IR.html
C’était un moyen très rapide d’entrer dans l’IR et je suis varient reconnaissants pour cela, cependant, il a été conçu avec un arduino spacieux à l’esprit et je travaillais avec un ATtiny2313 qui n’ont nulle part près de suffisamment de RAM pour faire le travail.
À l’aide de son esquisse avec une petite télécommande que j’ai dû traîner, j’ai enregistré le bouton d’alimentation et obtenu ce :
int PowerSignal [] [2] = {}
ON, OFF (dans 10 de microsecondes)
{1138, 574},
{66, 76},
{66, 78},
{68, 70},
{70, 76},
{66, 76},
{68, 74},
{68, 78},
{68, 210},
{72, 216},
{68, 214},
{70, 216},
{78, 206},
{70, 214},
{70, 216},
{70, 216},
{68, 72},
{74, 72},
{68, 216},
{68, 76},
{66, 78},
{70, 214},
{68, 78},
{66, 72},
{70, 74},
{68, 216},
{74, 70},
{68, 214},
{72, 216},
{72, 68},
{74, 214},
{66, 216},
{70, 214},
{72, 5014},
{1134, 292},
{62, 5532},
{1142, 294},
{58, 0}} ;
38/hors paires, certains d'entre eux est trop grand pour un seul octet, donc si je devais le faire comme ça j’ai besoin 152 octets.
J’ai eu assez flash, bien qu’il faudrait une bonne quantité d’espace je pouvais épargner, mais si je devais enregistrer les signaux entrants comme ça je ferait sauter mon budget de RAM sans même tenir compte des autres choses que j’ai besoin de RAM pour.
Je pourrais avoir vérifié le code comme il est venu, mais puis calendrier devient un peu difficile.
J’ai pensé à elle pour un certain temps et j’ai remarqué un modèle dans mon code IR.
Les signaux étaient moins puis 1ms ou ils étaient plus élevés.
À l’aide de code du ladyada, il avait une tolérance de 20 %, ce qui signifierait un des faibles nombres correspondrait à l’autre.
Il n’y a essentiellement aucune différence entre un 680 et 780 microsecondes, avec la tolérance.
C’était un cas similaire pour la plus grande puis 1ms valeurs, il y a quelques exceptions, mais la plupart s’adapter à la règle.
Je me suis dit, que se passe-t-il si j’ai traiter comme bits unique, un 0 pour moins puis 1 ms et un 1 si il s’agissait d’une plus grande.
Emballé dans des comme ça j’ai venu à ceci :
11000000 = 0xC0
00000000 = 0 x 00
01010101 = 0 x 55
01010101 = 0 x 55
00000100 = 0 x 04
00010000 = 0 x 10
00010001 = 0 x 11
01000101 = 0 x 45
01011101 = 0x5D
1100
Après avoir ignoré le dernier nibble (la moitié d’un octet), j’ai été en mesure de stocker le signal entrant tout à la fois en seulement 9 octets, et le signal de comparer ne prendrait place 9 aussi bien !
Si je voulais plus de fonctionnalités je ne serait pas être à court de flash pour mémoriser les codes et étant si petit, qu'ils pourraient facilement ont été stockés en EEPROM si je devais.
Un avantage supplémentaire est que vérifier si le code correspondant a été aucune comparaison plus de simple octet puis 9.
Jetez un oeil sur le code ci-joint.
At le haut de qu'il y a un ensemble définit pour rendre le code plus facile à suivre et à entretenir.
Suivant qui est le modèle mentionné ci-dessus, stockée dans un tableau de char et à traiter en hexadécimal.
Tout le reste est essentiellement dans la fonction listenForIR qui s’appelle en permanence de la boucle principale.
Remarque, il s’agit de code de démo tout simple, dans un projet final, vous souhaiterez utiliser une interruption pour se réveiller lorsque l’IR détecte quelque chose.
J’ai une version du code qui fait cela.
Alors, comment fonctionne listenForIR ?
Permet de décomposer.
Nous commençons avec un certain temps boucle qui tente d’obtenir 9 octets de données de l’IR.
Nous allons commencer par le réglage de la minuterie pour un Prédiviseur 256.
À 1MHz, cela nous permet le temps maximum de 65ms sans débordement.
Récepteurs IR tenir leurs broches de données haute par défaut, aller en bas lorsque la réception d’un signal modulé.
Donc nous attendre, nous obtenons un minimum, et si l'on prend plus de temps puis 56ms attente nous sortir du pétrin.
Une fois, nous avons un faible, qu'il faut du temps, mais nous n’avez pas besoin à la fois plus longtemps qu’avant, et nous pourrions utiliser un niveau plus élevé de précision, donc nous avons changer le Prédiviseur à 8.
Si la dépression est maintenue pour plus puis 1 ms, puis nous sauter, sinon la boucle se termine tôt comme la broche va élevée.
Le bit de code suivant a une belle utilisation d’opérations de bits qui nous permet de garder le suivi des modifications rapidement et à moindre coût (pas cher en termes de cpu et l’utilisation de la mémoire) :
current_byte << = 1 ;
current_byte | = Etat ;
while(IR_LOW) ; dans le cas d’un peu plus long, puis le délai ci-dessus
Nous commençons en déplaçant tous les bits à gauche.
Nous avons ensuite ou dans la valeur de 1 ou 0, qui ajoute sa valeur à la LSB (moindre peu significatif).
Nous avons alors attendez, encas c’était une longue dépression qui nous avons sauté dehors sur plus tôt.
Ensuite, nous faisons la même chose pour la partie haute du code.
Dès que nous aurons tous les 8 bits (4 paires de basse et haute), nous stocker et recommencer.
En supposant que nous obtenons tous les 9 octets, nous sortir de la boucle et simplement comparer à notre code.
Si elles correspondent, nous activer/désactiver la LED.