Имитация пульта на 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 с вапще фееричен

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