Table des matières:

Tomber dans Stm32 : Télécommande pour Home Media Center : 4 étapes (avec photos)
Tomber dans Stm32 : Télécommande pour Home Media Center : 4 étapes (avec photos)

Vidéo: Tomber dans Stm32 : Télécommande pour Home Media Center : 4 étapes (avec photos)

Vidéo: Tomber dans Stm32 : Télécommande pour Home Media Center : 4 étapes (avec photos)
Vidéo: 1er Workshop Cubesat Étudiant / 2.5 Session Atelier Logiciel de Vol 2024, Novembre
Anonim
Tomber dans Stm32: Télécommande pour Home Media Center
Tomber dans Stm32: Télécommande pour Home Media Center

Il s'agit d'un prototype complet de télécommande de centre multimédia domestique basé sur un microcontrôleur smt32, stm32f103c8t6 connu sous le nom de carte "bluepill". Supposons que vous utilisiez un PC pour home media center. C'est une solution très flexible, qui vous permet de placer une énorme bibliothèque de vidéos sur le disque dur interne, ou vous pouvez lire des vidéos à partir du réseau, par exemple youtube ou autre, vous n'avez aucun problème avec les codecs ou la lecture de vidéos, car c'est très facile de mettre à jour le lecteur logiciel à tout moment. Le principal inconvénient de cette solution est que vous devez utiliser la souris et le clavier pour contrôler votre lecture. La télécommande IR est très pratique pour cela.

Dans cet article, je vais montrer comment créer sa propre télécommande à l'aide de la carte à puce bluepill.

Étape 1: L'idée

L'idée
L'idée
L'idée
L'idée

L'idée principale est très simple: la carte bluepill a un port USB intégré et peut servir de clavier USB HID. Si nous attachons le récepteur IR à la carte, il pourrait traduire la commande de votre télécommande IR en « pression de touche » du clavier virtuel. Aucun pilote supplémentaire n'est requis !

Il existe de nombreux protocoles IR dans le monde qui nous entoure. Chaque téléviseur du fournisseur de VCS a son propre protocole IR. Mais tous ces protocoles ont quelque chose en commun: ils utilisent la modulation d'impulsions pour coder le signal. Habituellement, il y a un préambule: une longue impulsion avant le premier bit du paquet. Ensuite, le contrôle IR transmet le paquet entier avec 0 et 1 et finalise la transmission avec une impulsion longue de finition. Pour décoder le bit, nous devons mesurer la longueur d'impulsion et la longueur du pic. Habituellement, la longueur de crête de la logique 0 et de la logique 1 est la même, la différence se situe dans la longueur d'impulsion complète.

Les microcontrôleurs stm32 ont une fonction intégrée pour capturer le signal PWM. Presque chaque minuterie du microcontrôleur peut être placée dans la « capture de signal PWM plus » lorsque les variables de canal de la minuterie enregistrent la longueur totale de l'impulsion et sa longueur de crête. Ici, je dois souligner le petit détail: lorsque le récepteur IR capte le signal, la tension sur sa broche de travail devient 0 et à l'état de repos, la tension dans la broche de travail est de 5 ou 3,3 volts selon la tension d'alimentation du récepteur IR. C'est-à-dire que le récepteur "inverse" le signal.

Avec le mode de capture PWM, le microcontrôleur stm32 peut être facilement transformé en un traducteur à distance IR de la télécommande IR aux codes du clavier. Ensuite, vous pouvez démarrer votre logiciel de visualisation préféré, par exemple Kodi de VLC pour lire votre film préféré sur le media center.

Étape 2: Création du contrôleur

Création du contrôleur
Création du contrôleur
Création du contrôleur
Création du contrôleur
Création du contrôleur
Création du contrôleur
Création du contrôleur
Création du contrôleur

Pour programmer le microcontrôleur stm32, je voudrais recommander le logiciel gratuit de STM: system workbench (aka ac6) et l'outil de configuration de carte cubeMX. Pour télécharger le logiciel dans le microcontrôleur, le clone de puce de l'adaptateur ST-Link V2 peut être utilisé. Les fichiers de projet du plan de travail système attachés à cette étape, le fichier F1-IR_remote.zip.

L'outil de configuration de carte simplifie le processus de configuration matérielle initiale de notre microcontrôleur.

Si vous utilisez l'outil System Workbench, vous pouvez simplement utiliser le projet téléchargé. Mais si vous souhaitez étudier le projet plus en détail, vous pouvez créer la configuration de la carte dans le cubeMX:

  • Créez un nouveau projet et sélectionnez la carte stm32f103c8
  • Sélectionnez 'Crystal/Ceramic Resonator' pour l'élément 'High Speed Clock (HSE)' dans le menu RCC.
  • Sélectionnez 'Serial Wire' pour l'élément 'Debug' dans le menu SYS.
  • Configurez le timer #2 (menu TIM2) en mode capture PWM comme indiqué sur l'image:

    • Mode Esclave -> Mode Réinitialisation
    • Source de déclenchement -> TI1FP1
    • Source de l'horloge -> Horloge interne
    • Canal 1 -> Mode direct de capture d'entrée
  • Cochez la case 'Périphérique (FS) dans le menu USB
  • Sélectionnez l'élément de menu déroulant "Classe de périphérique d'interface humaine (HID)" dans l'élément "Classe d'IP FS" du menu USB_DEVICE
  • Dans le panneau de configuration de l'horloge, assurez-vous de fournir 72 MHz au temporisateur #2 car nous avons besoin d'un compte de temporisateur à chaque 1 mks.
  • Dans le panneau de configuration, configurez le périphérique USB comme indiqué sur l'image
  • Dans le panneau de configuration, configurez la minuterie n°2 comme suit:

    • Precaller - 71 (de 0 à 71) - 1 micro seconde tick !
    • Mode compteur - Haut
    • Période du compteur - 39999 (nous devrions pouvoir mesurer l'impulsion longue)
    • Canal de capture d'entrée 1 - Front descendant (rappelez-vous que le signal du récepteur IR est inversé)

En mode de capture PWM, la minuterie n°2 fonctionnerait comme suit:

Lorsque le front descendant était détecté, le compteur de minuterie serait enregistré dans le registre du canal 1 et le compteur de minuterie serait réinitialisé à 0. Ensuite, la minuterie continuerait à compter vers le haut. Ainsi, nous pouvons facilement mesurer la durée d'impulsion en microsecondes.

Par défaut, la classe STM32 USB HID simule la souris USB. Vous trouverez ici les instructions pour transformer le contrôleur en clavier.

Étape 3: Personnalisation du contrôleur

Le projet fonctionne avec la télécommande Panasonic et le centre multimédia Kodi. Pour adapter le projet à votre propre contrôleur, vous devez ajouter le tableau de codes pour votre télécommande comme je l'ai fait pour la télécommande Panasonic (panasonicCode) à l'en-tête Inc/code.h. Comme vous pouvez le voir, chaque commande a un ID unique (dans l'énumération IRcommmand). Il y a 24 commandes (0-23) reconnues par le projet. Les commandes sont triées par pertinence.

typedef enum {IR_play = 0, IR_stop, IR_pause, IR_forward, IR_rewind, IR_last_channel, IR_OSD, IR_prevous_menu, IR_left, IR_right, IR_up, IR_down, IR_enter, IR_chapter_next, IR_chapter_previous, IR_info, IR_subtitle, IR_nxt_subtitle, IR_pos_subtitle, IR_teletext, IR_zoom, IR_mark_watched, IR_playlist, IR_power, IR_unknown } IRcommand;

const uint16_t kbrd_kodi = {HID_KEY_P, HID_KEY_X, HID_KEY_SPACE, HID_KEY_F, HID_KEY_R, HID_KEY_0, HID_KEY_M, HID_KEY_BACKSPACE, HID_KEY_LEFT, HID_KEY_RIGHT, HID_KEY_UP, HID_KEY_DOWN, HID_KEY_ENTER, HID_KEY_DOT, HID_KEY_COMMA, HID_KEY_S, HID_KEY_I, HID_KEY_T, HID_KEY_L, (uint16_t (HID_LEFT_CTRL) << 8)| HID_KEY_T, HID_KEY_V, HID_KEY_Z, HID_KEY_W, HID_KEY_C };

const uint32_t panasonicCode = {0xd00505d, 0xd00000d, 0xd00606d, 0xd00525f, 0xd00929f, 0x100eced, 0xd00101d, 0x1002b2a, 0x1007273, 0x100f2f3, 0x1005253, 0x100d2d3, 0x1009293, 0x1002c2d, 0x100acad, 0x1009c9d, 0x1008e8f, 0x1004e4f, 0x100cecf, 0x1000e0f, 0x180c041, 0x1801091, 0x180a021, 0xd00bcb1 };

Ensuite, vous devez ajouter votre propre télécommande dans la méthode init() dans le IR.cpp avec la fonction addRemote(). Les arguments de la fonction sont:

  • Nombre de bits dans le paquet
  • La longueur de l'en-tête du paquet
  • Longueur de bits « zéro »
  • "Un" bit de longueur
  • Pointeur vers le tableau de code
  • Nombre d'éléments du tableau

void IRcmd::init(void) { addRemote(48, 5252, 902, 1755, panasonicCode, sizeof(panasonicCode)/sizeof(uint32_t));

}

Le fichier contient également une autre table pour convertir les commandes en codes clavier. Le tableau kbdr_kodi contient les codes clés du centre multimédia Kodi. Vous pouvez ajouter un autre tableau pour votre propre programme de centre multimédia, par exemple, vlc player. Si vous ajoutiez une autre table d'application Media Center, vous créeriez un autre objet KBD et l'initialiseriez dans le fichier main.cpp.

Étape 4: Outils pour simplifier la confection

Outils pour simplifier la couture
Outils pour simplifier la couture
Outils pour simplifier la couture
Outils pour simplifier la couture

Il y a deux autres projets dans le référentiel

  • Investigation IR - permettant de mesurer les paramètres de synchronisation des signaux de votre télécommande.
  • IR_capture - permettant de capturer les codes HEX de votre télécommande.

Il suffit de charger le projet d'enquête IR et de connecter le port USB de la carte bluepill à votre ordinateur. Ensuite, lancez n'importe quel programme de terminal sur le périphérique de port série virtuel, correspondant à la carte stm32. Pendant que vous appuyez sur les boutons de votre télécommande, le programme mesure les impulsions reçues et imprime les temps moyens pour différentes impulsions. Il devrait simplifier la détection de la longueur d'impulsion pour l'en-tête du paquet, les bits zéro et un.

Dans le projet d'investigation IR, la minuterie n° 2 fonctionne en mode de capture PWM avec deux canaux: le canal 1 capture la longueur d'impulsion entière et le canal 2 capture la longueur de crête. Lorsque le front descendant du signal est détecté, la valeur du temporisateur est enregistrée dans le registre du canal 1 et le temporisateur est réinitialisé à 0. Lorsque le front montant du signal est détecté, le compteur du temporisateur est enregistré dans le registre du canal 2.

Pour capturer les codes des boutons de votre propre télécommande, le projet IR_capture peut être utilisé. Dans le fichier main.c, vous devez ajouter la définition distante comme celle-ci:

IRcode panasonic = {.hdr = 5252,.bits = 48,.zero = 902,.one = 1755,.dev = 60 };

  • .hdr - la longueur de l'en-tête en mks
  • .bits - le nombre de bits dans le paquet
  • .zero - la longueur du bit zéro
  • .one - la longueur un le bit
  • .dev - l'écart (la différence de temps qui peut être acceptée). Habituellement, c'est 1/10 de la plus petite longueur.

Ajoutez ensuite votre télécommande à la liste des télécommandes prises en charge:

const IRcode* remote[2] = {&panasonic, &pioneer};

Conseillé: