Имитация пульта на 433 МГц

kost82
Offline
Зарегистрирован: 30.11.2015

Добрый день!

Имеется устройство: пульт на 433МГц с тремя кнопками. Мне нужно имитировать нажатия этих кнопок при помощи передатчика, подключенного к ардуине. Сам пульт я разобрать не могу, т.к. боюсь его повредить (он довольно-таки плотно собран), поэтому не могу посмотреть какой там чип установлен.

Что было сделано: собрал простую схемку из Ардуино Про Мини и приемника mx-rm-5v (подал питание на приемник, а контакт DATA подключил к пину D2 ардуинки). Попробовал несколько разных библиотек типа rc-switch, заливал в ардуинку пробные скетчи из них - толку никакого, похоже протокол нестандартный, библиотеки его не распознают никак. При этом сигнал от приемника при нажатии кнопок поступает в ардуинку, проверил это простеньким осцилографом и выводом digitalRead(2) в плоттер последовательного порта. Причем коды с пульта всегда одинаковые (для каждой кнопки), то есть статические.

Прошу у опытных товарищей помощи: как не разбирая пульта наиболее простым способом повторить его сигналы? Может библиотеку какую-нибудь посоветуете или простую методу?

b707
Offline
Зарегистрирован: 26.05.2017

kost82 пишет:

как не разбирая пульта наиболее простым способом повторить его сигналы?

чем, интересно, вам поможет разборка пульта? Увидите, как электроны на антенну забегают? :)

Единственный способ - подобрать такую библиотеку. чтобы читала сигналы с пульта. Или написать ее самому. Тем более, если вы сигналы уже принимаете и можете выводить в сериал

kost82
Offline
Зарегистрирован: 30.11.2015

b707 пишет:

чем, интересно, вам поможет разборка пульта? Увидите, как электроны на антенну забегают? :)


Просто на форумах советуют разобрать пульт и посмотреть какой чип внутри, а по чипу искать протокол передачи сигналов

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А Вы бы сказали поподробнее задачу. Что за пульт? Какого характера сигналы? Если сигналы всегда одинаковые для каждой кнопки, то один разговор, если всегда разные, то свосем другой.

kost82
Offline
Зарегистрирован: 30.11.2015

Пульт от рулонных штор, фирма Mosel.
Коды всегда одинаковые (по крайней мере похожи). Выглядят примерно так: сначала серия коротких импульсов, затем один длинный и снова небольшая серия коротких. Похоже на передачу кода устройства (пульт привязывается к конкретному приводу), затем разделитель (длинный импульс) и после этого код кнопки (вверх, вниз или стоп). Скриншоты я ещё не научился делать на осциллографе, поэтому картинку выложить не могу.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, тогда собственно что мешает просто записать сигнал каждой кнопки и, при необходимости, дублировать его?

kost82
Offline
Зарегистрирован: 30.11.2015

Ну допустим, что записать последовательность импульсов и пауз между ними, а также их длительность я смогу, например буду это делать с использованием прерываний. Но как передать все это в эфир?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я бы, для начала, попробовал также точно дёргать за ногу data передатчика FS1000A. Один раз у меня такое прокатило. Я дёргал, он передавал, а незнакомый мне приёмник это скушал.

kost82
Offline
Зарегистрирован: 30.11.2015

Спасибо, попробую, возможно тоже прокатит.

kost82
Offline
Зарегистрирован: 30.11.2015

Отпишусь о результатах, может кому-нибудь пригодится:

1. Для считывания сигналов с пульта взял отсюда скетч:

#define SAMPLESIZE 500

static unsigned int timings[SAMPLESIZE];
static unsigned int pos = 0;
static unsigned long lastTime = 0;

static int receiverPin = 2;
static int interruptPin = 0;

void setup() {
  interruptPin = digitalPinToInterrupt(receiverPin);
  Serial.begin(9600); 
  attachInterrupt(interruptPin, handleInterrupt, CHANGE);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
}

void loop() {
    for (int i = 5; i>0; i--) {
      Serial.print(i);
      Serial.print("... ");
      delay(900);
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
    }
    Serial.println();
      
    detachInterrupt(interruptPin);
  
    int finalstate = digitalRead(receiverPin);
    
    char s = Serial.read();
    
    for (unsigned int i = pos + finalstate; i< SAMPLESIZE; i++) {
      Serial.print( timings[i] );
      Serial.print(",");
    }
 
    for (unsigned int i = 0; i < pos; i++) {
      Serial.print( timings[i] );
      Serial.print(",");
    }

    Serial.println("");
    Serial.println("Reset your Arduino to scan again...");

    while(true) {} 
  
}

void handleInterrupt() {
  const long time = micros();
  timings[pos] = time - lastTime;
  lastTime = time;
  if (++pos > SAMPLESIZE-1) {
    pos = 0;
  }
}

С его помощью получил набор цифр - длительность промежутков между высоким и низким уровнем сигнала.

2. Проанализировал полученный набор, нашел в нем повторяющиеся куски. Выяснил, что сначала подается сигнал о начале передачи. Он отличается по длительности от всех остальных: примерно 4775 мс подается высокий уровень сигнала, пауза примерно 1532 мс. После стартового сигнала идет серия коротких импульсов. Единица кодируется импульсом примерно 700мс и паузой 400 мс, ноль - импульс 350 мс и паузой 750 мс. (это все конечно условно, можно и наоборот их назвать). Последний импульс характерен длительностью примерно 700мс и паузой примерно 10064мс.

3. Модифицировал исходный скетч, чтобы получить код нажатой кнопки, состоящий из нулей и единиц. Как оказалось - каждый код передается по 4 раза. При нажатии кнопки "вверх" передается два разных кода (скорей всего это сделано для привязки пульта к приводу). В итоге получил двоичные коды каждой кнопки пульта.

4. Имея на руках коды кнопок - написал простенький скетч для дерганья ноги передатчика (на delayMicroseconds()) в соответствии со строкой из нолей и единиц (ну и добавив начальный и конечный импульсы). В итоге все заработало.

Очень хорошо в этом деле мне помог осцилограф. Без осцилографа или логического анализатора совершенно непонятно работает ли модуль, передает ли что-то в эфир... На модулях нет никакой индикации, нет ни светодиода ни чего-то еще.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. примерно как я говорил, и получилось? Ну, с Победой!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

kost82 пишет:

 Выяснил, что сначала подается сигнал о начале передачи. Он отличается по длительности от всех остальных: примерно 4775 мс подается высокий уровень сигнала, пауза примерно 1532 мс. После стартового сигнала идет серия коротких импульсов. Единица кодируется импульсом примерно 700мс и паузой 400 мс, ноль - импульс 350 мс и паузой 750 мс. (это все конечно условно, можно и наоборот их назвать). Последний импульс характерен длительностью примерно 700мс и паузой примерно 10064мс.

Это сколько надо на кнопку жать, если только стартовый инпульс почти 5 сек. длица? А последний импульс паузой в 10 с вапще фееричен

kost82
Offline
Зарегистрирован: 30.11.2015

ЕвгенийП пишет:

Т.е. примерно как я говорил, и получилось? Ну, с Победой!

Да, именно так, ничего там сложного с этим передатчиком. Благодарю.

kost82
Offline
Зарегистрирован: 30.11.2015

DetSimen пишет:

Это сколько надо на кнопку жать, если только стартовый инпульс почти 5 сек. длица? А последний импульс паузой в 10 с вапще фееричен

А, да, конечно в микросекундах все импульсы. Ошибочка вышла, спасибо за поправку.

appolinari
Offline
Зарегистрирован: 04.09.2019

kost82 пишет:

3. Модифицировал исходный скетч, чтобы получить код нажатой кнопки, состоящий из нулей и единиц. Как оказалось - каждый код передается по 4 раза. При нажатии кнопки "вверх" передается два разных кода (скорей всего это сделано для привязки пульта к приводу). В итоге получил двоичные коды каждой кнопки пульта.

Доброго дня!

Скетчем для получения кода кнопки поделитесь, пожалуйста. 

kost82
Offline
Зарегистрирован: 30.11.2015

Скетчем поделюсь, только это вряд ли поможет, т.к. протокол передачи у всех свой и длительности импульсов (стартовых, например) тоже разные. А код такой же как в посте №9, меняется только обработчик:

#define SAMPLESIZE 300

int timings[SAMPLESIZE];
static int pos = 0;
static unsigned long lastTime = 0;
static unsigned long currentPeriod = 0;
static unsigned long prevPeriod = 0;
static bool isStarted = false;
bool state = true;

static int receiverPin = 2;
static int interruptPin = 0;

void setup() {
  interruptPin = digitalPinToInterrupt(receiverPin);
  Serial.begin(9600);
  attachInterrupt(interruptPin, handleInterrupt, CHANGE);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
}

void loop() {
  for (int i = 5; i > 0; i--) {
    Serial.print(i);
    Serial.print("... ");
    delay(900);
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
  }
  Serial.println();

  detachInterrupt(interruptPin);

  for (unsigned int i = 0; i < pos; i++) {
    Serial.print( timings[i] );
    if (timings[i] > 1) {
      Serial.println(",");
    }
  }

  Serial.println("Reset your Arduino to scan again...");

  while (true) {}

}

void handleInterrupt() {
  const unsigned long time = micros();
  currentPeriod = time - lastTime;
  lastTime = time;
  if (currentPeriod > 300) {
    if (!isStarted && prevPeriod > 4500 && currentPeriod > 1500) {
      isStarted = true;
      timings[pos] = 5;
      if (pos < SAMPLESIZE && isStarted) pos++;
    }
    else if (isStarted && currentPeriod > 5000) {
      isStarted = false;
    }
    else if (isStarted && prevPeriod > 300 && prevPeriod < 800) {
      timings[pos] = (prevPeriod > currentPeriod) ? 1 : 0;
      if (pos < SAMPLESIZE && isStarted) pos++;
      currentPeriod = 0;
    }
  }
  prevPeriod = currentPeriod;
}

 

appolinari
Offline
Зарегистрирован: 04.09.2019

После работы данного скетча получаю длинную цепочку из нулей и единиц, которая начинается с 12ти нулей, после этого идёт 32 бита которые меняются от нажатия к нажатию, после них идут 33 бита постоянно повторяющиеся...

00000000000011100010010010101001110011010011111010100110011101101111111110111
00000000000010011010011000100010101100100010111010100110011101101111111110111
00000000000011001101110011001011101110001001111010100110011101101111111110111
00000000000000100000001110100010001011000110111010100110011101101111111110111
00000000000001110010011001111101011100000000111010100110011101101111111110111
00000000000010001100111001001000000110100100111010100110011101101111111110111
 

Пульт BFt :

kost82
Offline
Зарегистрирован: 30.11.2015

Скорей всего это пульт с динамическим кодом, вряд ли удастся заставить его работать просто повторив "посылку".

NikSan
Offline
Зарегистрирован: 14.02.2013

День добрый товарищи помогите пожалуйста разобраться, есть у меня несколько штор с али, на пультах АС123-01D 433,92Мгц, хотелось бы управлять ими с ардуинки, споткнулся уже на считывания сигнала :(

стандартные библиотеки ничего не перехватывают, вышеуказанный скетч ловит следующие данные:

12:46:41.756 -> 5... 4... 3... 2... 1... 

12:46:46.810 -> 48,304,56,236,56,156,48,88,60,104,72,60,48,72,56,84,52,56,64,40,80,40,60,60,72,48,80,36,76,48,72,52,84,28,96,32,80,28,140,28,124,16,312,20,10928,20,552,24,324,12,132,12,112,32,212,32,84,48,64,48,92,52,136,24,72,52,60,52,68,92,60,48,48,64,64,68,60,96,44,164,52,104,60,84,52,208,56,112,56,132,48,540,48,104,56,428,36,124,52,68,36,124,76,68,48,112,52,328,60,72,44,64,48,212,60,68,72,48,52,48,52,64,52,48,56,44,48,28,64,56,60,44,64,36,72,48,88,28,80,36,100,20,104,20,108,24,11576,16,312,24,88,40,68,32,212,8,112,56,344,28,92,40,100,24,84,32,120,16,68,60,52,72,64,68,44,72,52,76,52,128,56,72,52,136,40,132,52,88,36,104,60,364,48,100,40,188,52,100,48,236,48,308,68,72,36,488,52,80,52,108,56,256,44,368,48,96,56,56,52,56,52,64,60,44,48,36,60,40,68,44,64,40,64,40,84,28,56,44,72,36,92,36,88,24,392,12,10960,20,100,12,196,20,160,40,80,20,108,28,128,32,88,20,104,28,92,36,72,32,84,28,80,36,76,28,80,28,100,44,68,40,56,64,52,72,48,56,68,60,40,84,60,100,52,60,44,360,60,60,56,100,48,460,56,436,48,300,44,116,52,48,40,172,52,112,52,132,48,80,52,108,64,180,56,180,28,16,60,116,60,68,48,44,60,44,56,84,56,60,64,64,68,64,68,88,72,44,92,40,76,48,80,32,84,36,92,28,80,24,188,12,388,16,376,24,10408,16,248,20,96,28,88,16,196,12,176,24,84,20,62560,12,160,28,124,12,460,12,156,28,288,12,216,16,108,16,80,20,104,20,100,36,140,28,80,32,564,16,120,20,14896,8,556,8,428,32,72,36,120,20,76,44,56,36,120,52,72,32,84,40,68,48,80,44,92,28,76,48,96,32,80,40,60,52,60,80,60,84,76,28,76,40,56,28,60,48,64,44,76,28,60,40,76,24,56,88,48,80,64,96,60,52,76,44,80,44,64,48,68,28,80,64,64,48,92,36,92,36,84,44,112,20,80,28,276,12,96,20,228,24,13264,
12:46:48.448 -> Reset your Arduino to scan again...
12:47:05.999 -> 5... 4... 3... 2... 1... 
12:47:11.054 -> 88,44,84,28,76,32,60,72,60,52,64,44,56,40,56,76,44,72,52,100,52,60,56,64,48,124,56,128,48,80,48,116,68,228,52,168,48,144,20,32,48,208,56,96,48,376,48,92,56,56,52,72,52,80,56,88,48,132,44,52,56,76,52,52,48,92,52,60,56,60,44,56,60,80,52,80,64,88,76,36,68,56,64,44,68,32,60,40,84,32,88,20,72,16,84,20,112,28,104,12,96,20,496,20,10660,16,288,28,96,32,280,12,280,20,128,24,100,40,108,32,80,32,72,40,60,28,60,44,116,36,64,56,60,52,48,44,48,96,44,48,56,68,40,88,44,160,36,104,56,104,36,40,60,60,56,60,56,56,52,72,44,112,64,244,48,100,48,212,48,104,44,64,44,76,56,124,52,104,48,164,40,92,44,108,64,56,52,48,68,60,64,100,60,56,56,60,60,108,56,52,56,40,64,64,56,56,68,64,60,44,76,28,64,40,64,44,68,32,88,28,84,28,72,36,84,36,68,24,68,32,80,24,88,32,432,28,10992,20,284,20,160,24,84,32,84,32,104,20,72,28,136,24,112,20,100,32,96,28,92,36,84,28,88,68,64,60,68,48,72,48,64,48,44,84,48,108,52,72,64,56,64,56,44,56,60,68,48,64,64,72,56,52,44,188,48,128,48,196,52,72,52,52,60,68,40,220,44,100,52,76,56,68,52,108,56,80,48,84,52,92,52,120,56,72,48,92,56724,12,680,12,280,28,380,24,160,16,152,24,232,16,368,20,16828,24,180,20,116,16,92,20,208,16,184,16,120,32,76,24,80,36,136,16,68,40,92,20,76,40,108,28,124,28,92,20,104,28,60,40,120,24,164,24,60,32,100,28,72,32,92,28,92,32,96,28,68,36,244,32,136,12,120,12,120,20,72,40,108,24,88,16,88,28,92,24,112,20,128,16,144,28,120,24,152,24,13696,20,448,16,156,32,60,32,80,52,72,40,68,32,80,32,92,36,68,36,68,32,68,56,60,56,60,52,48,40,64,80,56,48,72,72,52,100,60,44,56,76,56,60,56,52,52,60,72,40,56,52,56,52,52,68,60,72,60,64,60,60,64,60,56,56,76,44,64,36,60,96,60,44,72,48,
12:47:12.692 -> Reset your Arduino to scan again...
12:47:42.209 -> 5... 4... 3... 2... 1... 
12:47:47.216 -> 60,56,56,72,52,88,56,68,52,80,60,188,56,416,52,96,48,376,44,884,44,160,44,132,64,212,56,140,48,504,52,196,56,92,64,76,44,88,44,64,52,124,52,108,80,52,72,48,60,72,68,44,76,32,80,24,84,28,92,28,120,40,104,20,192,32,124,28,120,20,10728,28,304,24,160,8,88,24,252,20,72,28,136,32,88,28,76,32,80,32,68,56,68,40,80,32,64,36,64,56,84,48,60,56,48,60,48,100,44,48,56,80,60,228,56,280,44,120,36,12,48,488,56,120,52,472,12,264,48,448,48,188,48,332,52,468,60,68,64,80,56,68,60,60,60,48,60,80,44,48,72,40,76,32,64,48,72,48,60,52,64,36,232,12,72,24,120,20,248,24,232,12,116,24,10824,28,96,36,160,32,136,32,200,12,232,32,104,32,84,36,108,24,188,36,76,48,80,36,56,52,64,76,56,224,68,88,76,128,48,96,52,76,52,180,48,356,48,88,44,124,52,900,52,60,56,340,36,492,44,104,48,84,48,132,48,180,64,224,60,84,60,108,56,100,68,64,64,56,56,92,76,52,68,32,96,56,52,44,72,48,96,28,292,28,504,20,10408,20,224,24,220,12,460,28,128,12,176,32,64,36,160,28,88,28,84,40,88,48,76,32,76,36,64,52,60,56,56,52,52,60,48,68,52,236,56,72,56,252,52,76,52,260,44,660,52,124,48,380,56,552,40,496,52,196,52,56,56,156,36,72,64,100,60,64,60,68,68,68,64,68,64,48,64,76,72,24,72,36,80,36,92,40,80,56,96,16,96,28,284,12,10484,12,63384,20,160,20,572,28,92,24,88,24,108,20,100,32,200,28,428,20,92,40,92,20,92,16,276,32,184,28,92,20,96,24,148,16,84,28,268,20,152,24,488,12,14912,16,144,36,116,24,64,36,80,36,72,48,96,36,68,28,52,44,56,40,76,28,72,44,72,52,68,48,76,36,68,44,52,40,88,36,64,60,72,40,64,44,60,52,76,56,64,40,72,60,56,80,56,68,64,44,60,60,60,48,64,44,80,44,56,40,56,56,68,44,72,44,80,36,64,64,72,32,84,28,92,28,88,20,140,28,84,32,284,24,148,16,232,28,628,8,
12:47:48.901 -> Reset your Arduino to scan again...

Насколько я понял передача начинается с длительности импульса больше 10000, есть так же выгрузка с анализатора  (4 раза нажата кнопка):

 
1 пакет
 
как это все перевести в логику и отправить обратно? объясните пожалуйста недалекому