Mengontrol Windows dengan remote control TV atau cara mengirimkan sinyal melalui port serial

Saya memutuskan bahwa saya ingin mengganti volume trek suara dan audio pada laptop di bawah Windows dari remote control inframerah. Arduino uno, sekumpulan kabel dengan papan tempat memotong roti, sensor inframerah, laptop, dan, sebenarnya, remote control inframerah.





Ada ide, ada besi, tapi teorinya timpang. Bagaimana saya bisa membuat komputer saya memahami sinyal infra merah dari remote control dan mengambil tindakan yang diperlukan? Saya memutuskan untuk menggunakan arduino untuk menerima sinyal kendali jarak jauh melalui sensor infra merah pada papan tempat memotong roti dan mengirim pesan ke laptop melalui USB. Ini membutuhkan setidaknya beberapa pengetahuan tentang bagaimana semuanya bekerja.





Diputuskan untuk menyelidiki.





Memperkenalkan Arduino ke remote control

Untuk menerima sinyal dari remote control inframerah, diperlukan penerima, yang akan kami sambungkan ke arduino melalui papan tempat memotong roti sesuai dengan skema berikut:





Pengodean sinyal NEC
Pengodean sinyal NEC

Agar arduino memahami protokol apa dan dengan perintah apa sinyal ditransmisikan, ada pustaka IRremote, yang dalam versi baru Arduino IDE dapat ditambahkan dari pustaka standar.





Perpustakaan itu sendiri





(/ ). 5 .





, , , IrReceiver.decodedIRData.decodedRawData. , . . , . , :





#include <IRremote.h>
int IR_RECEIVE_PIN = 2; //    2- 
long command;

void setup()
{
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); 
}

void loop() {
  if (IrReceiver.decode()) //    
  {
    command = IrReceiver.decodedIRData.decodedRawData; /*     
    																											   */
    switch(command) //       
    {
      case 0xEA15FF00:
        Serial.write("D"); delay(120);
      break;

      case 0xB946FF00:
        Serial.write("U"); delay(120);
      break;

      case 0xBF40FF00:
        Serial.write("P"); delay(120);
      break;

      case 0xBC43FF00:
        Serial.write("N"); delay(120);
      break;

      case 0xBB44FF00:
        Serial.write("R"); delay(120);
      break;
    }
    
    IrReceiver.resume(); //   
  }
}
      
      



, , USB.





Windows

Windows, .





- . ++ Visual Studio Windows.h





, , SendInput :





 INPUT Input = { 0 };
 Input.type = INPUT_KEYBOARD;
 Input.ki.wVk = VK_VOLUME_UP; /*      , 
 																   */
 SendInput(1, &Input, sizeof(Input));
 ZeroMemory(&Input, sizeof(Input));
      
      



: (VK_VOLUME_UP, VK_VOLUME_DOWN); (VK_MEDIA_PLAY_PAUSE); "" (VK_MEDIA_NEXT_TRACK, VK_MEDIA_PREV_TRACK)





.





Serial port ?

USB, (Serial port), Windows COM , IBM PC. , , . Windows.h





#include <Windows.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    HANDLE Port;
    BOOL Status;
    DCB dcbSerialParams = { 0 };
    COMMTIMEOUTS timeouts = { 0 };
    DWORD dwEventMask;
    char ReadData;
    DWORD NoBytesRead;
    bool Esc = FALSE;

    Port = CreateFile(L"\\\\.\\COM3", GENERIC_READ, 0, NULL,  //   
    OPEN_EXISTING, 0, NULL);

    if (Port == INVALID_HANDLE_VALUE)
    {
        printf("\nError to Get the COM state\n");
        CloseHandle(Port);
    }
    else
    {
   
        printf("\nopening serial port is succesful\n");

    }

    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);

    Status = GetCommState(Port, &dcbSerialParams); 			//    
    if (Status == FALSE)
    {
        printf("\n Error to Get the COM state \n");
        CloseHandle(Port);
    }

    dcbSerialParams.BaudRate = CBR_9600;									//   
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;

    Status = SetCommState(Port, &dcbSerialParams);   
  
    if (Status == FALSE)
    {
        printf("\n Error to Setting DCB Structure \n ");
        CloseHandle(Port);
    }

    timeouts.ReadIntervalTimeout = 10;						/*     
   																								  (    ) */
   timeouts.ReadTotalTimeoutConstant = 200;				
    timeouts.ReadTotalTimeoutMultiplier = 2;

    if (SetCommTimeouts(Port, &timeouts) == FALSE)
    {
        printf("\n Error to Setting Timeouts");
        CloseHandle(Port);
    }

        while (Esc == FALSE)
        {
          
            Status = SetCommMask(Port, EV_RXCHAR);

            if (Status == FALSE)
            {
                printf("\nError to in Setting CommMask\n");
                CloseHandle(Port);
            }

            Status = WaitCommEvent(Port, &dwEventMask, NULL); 		/*    
          																												(   ) */
            if (Status == FALSE)
            {
                printf("\nError! in Setting WaitCommEvent () \n");
                CloseHandle(Port);
            }


            Status = ReadFile(Port, &ReadData, 3, &NoBytesRead, NULL); //   


            printf("\nNumber of bytes received = % d\n\n", sizeof(ReadData) - 1);

            switch (ReadData)																/*    
            																									    */
            {
                case 'U':
                {
                    INPUT Input = { 0 };
                    Input.type = INPUT_KEYBOARD;
                    Input.ki.wVk = VK_VOLUME_UP;
                    SendInput(1, &Input, sizeof(Input));
                    ZeroMemory(&Input, sizeof(Input));
                }
                break;

                case 'D':
                {
                    INPUT Input = { 0 };
                    Input.type = INPUT_KEYBOARD;
                    Input.ki.wVk = VK_VOLUME_DOWN;
                    SendInput(1, &Input, sizeof(Input));
                    ZeroMemory(&Input, sizeof(Input));
                }
                break;

                case 'P':
                {
                    INPUT Input = { 0 };
                    Input.type = INPUT_KEYBOARD;
                    Input.ki.wVk = VK_MEDIA_PLAY_PAUSE;
                    SendInput(1, &Input, sizeof(Input));
                    ZeroMemory(&Input, sizeof(Input));
                }
                break;

                case 'N':
                {
                    INPUT Input = { 0 };
                    Input.type = INPUT_KEYBOARD;
                    Input.ki.wVk = VK_MEDIA_NEXT_TRACK;
                    SendInput(1, &Input, sizeof(Input));
                    ZeroMemory(&Input, sizeof(Input));
                }
                break;

                case 'R':
                {
                    INPUT Input = { 0 };
                    Input.type = INPUT_KEYBOARD;
                    Input.ki.wVk = VK_MEDIA_PREV_TRACK;
                    SendInput(1, &Input, sizeof(Input));
                    ZeroMemory(&Input, sizeof(Input));
                }
                break;

                default:
                    printf("\n Error\n");
                    break;
            }
          

            PurgeComm(Port, PURGE_RXCLEAR);    //     

        }


    CloseHandle(Port);  /*      ,
    										        */

}


      
      



.





https://www.xanthium.in/Serial-Port-Programming-using-Win32-API





http://citforum.ru/hardware/articles/comports/





, , . : - .





Kombinasi ini (kode virtual + jarak jauh) memiliki potensi untuk mengontrol berbagai bagian OS. Misalnya, Anda dapat menetapkan program ke tombol atau membuat sesuatu seperti pengontrol dari remote control. Tapi yang paling nyaman, menurut saya, adalah manajemen media.








All Articles