Final Result

Here is a short video demonstrating the outcome of the project:

Transmission distance with HS1000A transmitter without any antenna was at least ~6 yards.

RF Package Sniffing

I used RTL-SDR Blog V3 R820T2 RTL2832U 1PPM TCXO SMA Software Defined Radio for reverse engineering the transmission protocol.

Here is the spectrum of original remote as seen from SDR# program:

Transmission was recorded as regular.wav file, and re-opened in Audacity.

Here is the package view after some filtering and adjustment as seen in Audacity. This package is produced by pressing 'Left' button. Packages are transmitted permanently while the button is pressed, interval between packages is 18 ms:

('Left' button package. At the right the beginning (preamble) of next package is visible.)

Each package consists of 10ms preamble, 4 ms break and 53 ms of payload part. The total length of a package (including interval between packages is ~85 ms

Payload of the package above I interpreted as '11112252541112112' ( see description in sketch)

When writing Arduino sketch I had to adjust timing compared to measured in Audacity, until original and emulated packages look visually identical:

Original remote package (top) and emulated by Arduino (bottom)

Finalizing project

Finally decided to give this project a 'ready-to-use' look and assembled it into a nice case. The case came from power bank PBQR-WQ-26 I got for few dollars on sale:

Also used Arduino beetle - the smallest available arduino-like board from DFRobot:

This tiny board is fully compatible with Arduino Leonardo and does not need any code change.

Mounted in a case:

Case closed:

Schematics - FS1000A RD transmitter connection:

Arduino code:

/************************************************************
* WHEN: 23-SEP-2019
* WHAT: Receiving characters from Processing 
* DETAILS:  simple RF transmitter on pin 11
/************************************************************/
#define DATAOUT 11 //RF transmitter

/*here is sniffed packages produced by remote:

package starts with 9 ms HIGH (preambula?)
next - 4 ms pause
next comes data represented by combinations of 1 ms HIGH 
and 2 types of LOW: 1 ms and 2 ms.
for simplicity I did not decode it into bits and I am not using any libraries.
so I interpret:
single HIGH (1 ms) as '1'
single HIGH(1 ms), single LOW (1ms), single HIGH (1 ms) is '2'
single HIGH(1 ms), single LOW (1ms), single HIGH (1 ms), single LOW, single HIGH = '3'
and same way '4' and '5'
these 'numbers' (1,2..5) are separated by double LOW (2 ms)
While remote button is pressed same package is repeated with 18 ms breaks between packages.
so the data for 'Left' button is:
11112252541112112
right:
11112252442121121
down:
11112252343211211
up:
11112252413111313*/
char s_received;

 void setup()
 {
   pinMode(DATAOUT, OUTPUT);     
   Serial.begin(115200);
   while (!Serial); 
 }

 void loop(){
if (Serial.available()) 
   { 
    s_received = Serial.read(); 
    if (s_received=='L') {
      send_left();
      delay(18);
    }
    else if (s_received=='R') {
      send_right();
      delay(18); 
    }      
    else if (s_received=='U')  {
      send_up();
      delay(18); 
    }      
    else if (s_received=='D')  {
      send_down();        
      delay(18); 
    } 
   }
  }  
     
void send_data(byte n){
    for (int i=1; i<n; i++)
    {
      digitalWrite(DATAOUT, HIGH);   
      delayMicroseconds(550);
      digitalWrite(DATAOUT, LOW);
      delayMicroseconds(550);      
    }  
    digitalWrite(DATAOUT, HIGH);   
    delayMicroseconds(550);
    digitalWrite(DATAOUT, LOW);
    delayMicroseconds(1630);
 }

 void send_header(){
     digitalWrite(DATAOUT, HIGH);   //header
     //digitalWrite(LED_BUILTIN, HIGH);
     delayMicroseconds(8900);
     
     digitalWrite(DATAOUT,LOW);
     //digitalWrite(LED_BUILTIN, LOW);
     delayMicroseconds(4450);
 }

void send_left(){
     send_header();
     send_data(1);
     send_data(1);
     send_data(1);
     send_data(1);
     send_data(2);
     send_data(2);       
     send_data(5);
     send_data(2);
     send_data(5);          
     send_data(4);
     send_data(1);     
     send_data(1);     
     send_data(1);     
     send_data(2);
     send_data(1);          
     send_data(1);     
 send_data(...
Read more »