Vallen in Stm32: afstandsbediening voor Home Media Center - Ajarnpa
Vallen in Stm32: afstandsbediening voor Home Media Center - Ajarnpa
Anonim
Vallen in Stm32: afstandsbediening voor Home Media Center
Vallen in Stm32: afstandsbediening voor Home Media Center

Dit is een compleet prototype voor een afstandsbediening voor thuismedia op basis van smt32 microcontroller, stm32f103c8t6 bekend als 'bluepill'-bord. Stel dat u een pc gebruikt voor een thuismediacentrum. Het is een zeer flexibele oplossing, waarmee je een enorme videobibliotheek op de interne harde schijf kunt plaatsen, of je kunt video afspelen vanaf het netwerk, bijvoorbeeld youtube of zo, je hebt helemaal geen problemen met codecs of het afspelen van video, omdat het erg eenvoudig om de softwarespeler op elk moment bij te werken. Het grootste nadeel van deze oplossing is dat je muis en toetsenbord moet gebruiken om het afspelen te regelen. De IR-afstandsbediening is hiervoor veel handiger.

In dit artikel laat ik zien hoe je een eigen afstandsbediening kunt maken met behulp van een chip bluepill board.

Stap 1: Het idee

Het idee
Het idee
Het idee
Het idee

Het hoofdidee is heel eenvoudig: het bluepill-bord heeft een ingebouwde USB-poort en kan fungeren als USB HID-toetsenbord. Als we een IR-ontvanger aan het bord bevestigen, kan het de opdracht van uw IR-afstandsbediening vertalen naar 'toetsdruk' van het virtuele toetsenbord. Er zijn geen extra stuurprogramma's nodig!

Er zijn veel IR-protocollen in de wereld om ons heen. Elke TV van VCS-leverancier heeft zijn eigen IR-protocol. Maar al deze protocollen hebben iets gemeen: ze gebruiken pulsmodulatie om het signaal te coderen. Meestal is er een preambule: een lange impuls voor het eerste bit in het pakket. Vervolgens verzendt IR-besturing het hele pakket met 0 en 1 en voltooit de verzending met een lange puls. Om het bit te decoderen, moeten we de lengtepuls en de lengte van de piek meten. Gewoonlijk is de pieklengte van logische 0 en logische 1 hetzelfde, het verschil zit in de volledige pulslengte.

De stm32-microcontrollers hebben een ingebouwde functie om het PWM-signaal op te vangen. Bijna elke timer van de microcontroller kan in de 'PWM signal capture more' worden gezet wanneer de kanaalvariabelen van de timer de totale lengte van de puls en zijn pieklengte opslaan. Hier moet ik het kleine detail benadrukken: wanneer de IR-ontvanger het signaal opvangt, wordt de spanning op de werkende pin 0 en in de rusttoestand is de spanning in de werkende pin 5 of 3,3 volt, afhankelijk van de voedingsspanning van de IR-ontvanger. Dat wil zeggen, de ontvanger 'inverteert' het signaal.

Met de PWM-opnamemodus kan de stm32-microcontroller eenvoudig worden omgezet in een IR-afstandsbedieningvertaler van IR-afstandsbediening naar de toetsenbordcodes. Vervolgens kunt u uw favoriete visualisatiesoftware starten, bijvoorbeeld Kodi of VLC om uw favoriete film op het mediacenter af te spelen.

Stap 2: De controller maken

De controller maken
De controller maken
De controller maken
De controller maken
De controller maken
De controller maken
De controller maken
De controller maken

Om de stm32-microcontroller te programmeren, zou ik de gratis software van STM willen aanbevelen: system workbench (ook bekend als ac6) en de boardconfiguratietool cubeMX. Voor het uploaden van de software naar de microcontroller kan de chipkloon van de ST-Link V2-adapter worden gebruikt. De projectbestanden van de systeemwerkbank die bij deze stap zijn gevoegd, het bestand F1-IR_remote.zip.

De bordconfiguratietool vereenvoudigt het proces van de initiële hardwareconfiguratie van onze microcontroller.

Als u de systeemwerkbanktool gebruikt, kunt u gewoon het gedownloade project gebruiken. Maar als u het project in meer detail wilt onderzoeken, kunt u de bordconfiguratie in de cubeMX maken:

  • Maak een nieuw project en selecteer bord stm32f103c8
  • Selecteer 'Crystal/Ceramic Resonator' voor het item 'High Speed Clock (HSE)' in het RCC-menu.
  • Selecteer 'Serial Wire' voor het item 'Debug' in het SYS-menu.
  • Configureer de timer #2 (TIM2-menu) in de PWM-opnamemodus zoals weergegeven op de afbeelding:

    • Slave-modus -> Reset-modus
    • Triggerbron -> TI1FP1
    • Klokbron -> Interne klok
    • Channel1 -> Input Capture directe modus
  • Zet selectievakje 'Apparaat (FS) in USB-menu
  • Selecteer 'Human Interface Device Class (HID)' pull-down menu-element in het 'Class of FS IP' item in USB_DEVICE menu
  • Zorg ervoor dat u in het klokconfiguratiepaneel 72 MHz levert aan timer #2, omdat we een timertelling nodig hebben bij elke 1 mks.
  • Configureer in het configuratiepaneel het USB-apparaat zoals weergegeven in de afbeelding
  • In het configuratiescherm configureert u timer #2 als volgt:

    • Prescaller - 71 (van 0 tot 71) - 1 microseconde tik!
    • Tellermodus - Omhoog
    • Tellerperiode - 39999 (we zouden de lange puls moeten kunnen meten)
    • Input capture channel1 - Falling Edge (onthoud dat het signaal van de IR-ontvanger omgekeerd is)

In de PWM-opnamemodus werkt de timer #2 als volgt:

Wanneer het dalende front werd gedetecteerd, zou de timerteller worden opgeslagen in het kanaal 1-register en zou de timerteller worden gereset met 0. Dan zou de timer doorgaan met optellen. Zo kunnen we de pulslengte gemakkelijk in microseconden meten.

Standaard simuleert de STM32 USB HID-klasse de USB-muis. Hier vindt u de instructie om van de controller een toetsenbord te maken.

Stap 3: De controller op maat maken

Het project werkt met de afstandsbediening van Panasonic en het Kodi-mediacentrum. Om het project voor uw eigen controller aan te passen, moet u de codearray voor uw afstandsbediening toevoegen, zoals ik deed voor panasonic-afstandsbediening (panasonicCode) aan de Inc/code.h-header. Zoals u kunt zien, heeft elke opdracht een unieke ID (in de IR-opdracht opsomming). Er zijn 24 opdrachten (0-23) herkend door het project. De opdrachten zijn gesorteerd op relevantie.

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 } IRcommando;

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 };

Dan moet u uw eigen afstandsbediening toevoegen in de init()-methode in de IR.cpp met de functie addRemote(). De functieargumenten zijn:

  • Aantal bits in het pakket
  • De lengte van de pakketkoptekst:
  • 'Nul' bitlengte
  • 'Een' bitlengte
  • Aanwijzer naar de codearray
  • Aantal elementen van de array

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

}

Het bestand bevat ook een andere tabel om commando's om te zetten in toetsenbordcodes. De kbdr_kodi-array bevat de sleutelcodes voor Kodi-mediacentrum. U kunt nog een array toevoegen voor uw eigen mediacenterprogramma, bijvoorbeeld vlc player. Als u nog een mediacenter-toepassingstabel zou toevoegen, zou u een ander object KBD maken en dit in de main.cpp initialiseren.

Stap 4: Tools om maatwerk te vereenvoudigen

Hulpmiddelen om maatwerk te vereenvoudigen
Hulpmiddelen om maatwerk te vereenvoudigen
Hulpmiddelen om maatwerk te vereenvoudigen
Hulpmiddelen om maatwerk te vereenvoudigen

Er zijn nog twee andere projecten in de repository

  • IR-onderzoek - waarmee u de timingparameters van de signalen van uw afstandsbediening kunt meten.
  • IR_capture - waarmee u de HEX-codes van uw afstandsbediening kunt vastleggen.

Laad gewoon het IR-onderzoeksproject en sluit de USB-poort van het bluepill-bord aan op uw computer. Start vervolgens een willekeurig terminalprogramma op het virtuele seriële poortapparaat, dat overeenkomt met het stm32-bord. Terwijl u op de knoppen op uw afstandsbediening drukt, zou het programma de ontvangen pulsen meten en de gemiddelde tijden voor verschillende pulsen afdrukken. Het zou eenvoudiger moeten zijn om de pulslengte voor de pakketkop, nul en één bit, te detecteren.

In het IR-onderzoeksproject werkt timer #2 in de PWM-opnamemodus met twee kanalen: kanaal één vangt de hele pulslengte op en kanaal2 legt de pieklengte vast. Wanneer de dalende signaalflank wordt gedetecteerd, wordt de timerwaarde opgeslagen in het register van kanaal één en wordt de timer gereset met 0. Wanneer de stijgende flank van het signaal wordt gedetecteerd, wordt de timerteller opgeslagen in het register van kanaal 2.

Om de knopcodes van uw eigen afstandsbediening vast te leggen, kan het IR_capture-project worden gebruikt. In het main.c-bestand moet u de externe definitie zoals deze toevoegen:

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

  • .hdr - de koplengte in mks
  • .bits - het aantal bits in het pakket
  • .zero - de lengte van het nulbit
  • .one - de lengte een de ene bit
  • .dev - de afwijking (het verschil in tijden dat kan worden geaccepteerd). Meestal is het 1/10 van de kleinste lengte.

Voeg vervolgens uw afstandsbediening toe aan de lijst met ondersteunde afstandsbedieningen:

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

Aanbevolen: