433 МГц модули и их применение

Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 09 июн 2022, 08:10

Наверное как-то так надо попробовать:
IMG_20220609_120845.jpg

Oleg
Сообщения: 386
Зарегистрирован: 22 окт 2019, 16:06
Позывной: R2AVB
Город: Москва
Имя: Олег
Благодарил (а): 53 раза
Поблагодарили: 117 раз

433 МГц модули и их применение

Сообщение Oleg » 10 июн 2022, 18:39

Если я не ошибаюсь, то в этом приемнике используется специализированная микросхема Synoxo SYN470R.
Спецификации и описание - в приложенном файле.

Для борьбы с ложными импульсами на выходе приемника при отсутствии сигнала с передатчика производитель рекомендует несколько способов (страница 16, раздел 14.5).
Один из вариантов - подобрать такой режим работы шумоподавителя, при котором компаратор не срабатывает от шумов. Режим задается подачей смещения от 20 до 30 мВ на вывод CTH. Причем указано, что можно подключить вывод CTH через резистор в несколько мегаом (примерно от 6.8 МОм до 10 МОм) на Vdd или Vss, в зависимости от требуемой полярности смещения.
Подробности - в приложенном документе.

Synoxo-SYN470R.pdf
(1.27 МБ) 134 скачивания
Олег
R2AVB


Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 13 июн 2022, 17:10

Нет, не надо инвертирующего транзистора.
Написал простенький код, отсылающий 0010 1101

Код: Выделить всё

void setup(){
    Serial.begin(75,SERIAL_8N1);
}

void loop(){
    Serial.write(45);
    delay(1000);
}
01.png
(5.92 КБ) 0 скачиваний
Так это выглядит на пине TX
02.png
А вот так - на выходе приёмника
03.png
Правда, иногда сбивается на такое
04.png

Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 13 июн 2022, 17:26

Далее.
Надо научиться распознавать этот сигнал.
Пишу такой код - если приняли 45, то зажечь на 0,1 сек светодиод.
Посылки отправляются раз в секунду, поэтому можно распознать

Код: Выделить всё

void setup(){
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  Serial.begin(75,SERIAL_8N1);
}

void loop(){
  if (Serial.available() > 0) {
    if (Serial.read()==45) {
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
    }
  }
}
Принимает :)
Но надёжный приём только в пределах полуметра. Со штатными спиральными антеннами.
Попробую разнести подальше.

Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 13 июн 2022, 17:32

Походил с приёмником по квартире.
Очень удобно смотреть на плате:
- если есть активность на пине Rx, то мигает светодиод Rx.
- если байт принят, то мигает светодиод L.
В движении цепляются какие-то наводки и Rx начинает гореть чаще.
Остановившись можно найти такое положение, где приём будет уверенный.

Можно тупо умощнить передатчик и улучшить антенны.
Или попытаться как-то фильтровать поток данных на приёме.

Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 15 июн 2022, 14:18

А попробуем что-нибудь посложнее :)
Например, передать заголовок, потом три байта, и под конец - завершающую комбинацию?
Пускай заголовок будет из двух байт.
Первый байт вообще не будем проверять - он, скорее всего пройдёт с ошибкой. И выглядеть он будет как-то так: 0000 1110 = 0x0E
Второй байт пускай будет 0010 0010 = 0х22
Итого, на передаче:

Код: Выделить всё

void setup(){
    Serial.begin(1200,SERIAL_8N1);
    //скорости 110, 150, 300, 600, 1200, 2400, 4800, 9600
}

void loop(){
    Serial.write(0x0E);
    Serial.write(0x22);
    Serial.write(28);
    Serial.write(45);
    Serial.write(36);
    Serial.write(0x0A); //LF
    Serial.write(0x0D); //CR
    delay(1000);
}

Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 15 июн 2022, 14:45

А на приёме попробуем вот так:

Код: Выделить всё

volatile int Data[20];     // макссив принятых данных
volatile int DataCntr = 1; // счётчик массива

void setup(){
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
    Serial.begin(1200,SERIAL_8N1);
    //скорости 110, 150, 300, 600, 1200, 2400, 4800, 9600
}

void loop(){
  if (Serial.available() > 0) {
  Data[DataCntr] = Serial.read();
  Parse();
  }
}

void Parse(){
  // если счётчик переполнился
  if (DataCntr >= 20) {
    DataCntr = 1;
    goto endofparse;
  }  
  // если счётчик>=6, второй байт=0x22 и последние считанные байты 0x0A+0x0D, то завершить цикл приёма
  if (DataCntr >= 6 && Data[DataCntr-5]==0x22 && Data[DataCntr-1]==0x0A && Data[DataCntr]==0x0D) {
    // если содержимое посылки принято верно, то моргнуть светодиодом
    if (Data[DataCntr-4]==28 && Data[DataCntr-3]==45 && Data[DataCntr-2]==36) {
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
      DataCntr = 1;           // завершить цикл приёма
      goto endofparse;
    }
  }
  // если не произошло распознавания
  DataCntr = DataCntr+1;
endofparse:
  return;
}
То есть, по приёму каждого следующего байта будем набивать ими массив данных.
Как только увидим, что принялись последовательно два завершающих байта - проверяем ранее принятый пакет.
Если начало этого пакета соответствует протоколу - берём содержимое передачи, между стартовыми и стоповыми байтами.
А так как у меня пока не прикручен к приёмнику дисплей, то при совпадении переданных байтов (я пока их строго зафиксировал), моргнём светодиодом.

Таким образом, если светик моргнул - то вся цепочка из шести байт (из семи) была передана верно.
Посмотрим :)

Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 15 июн 2022, 15:21

2022-06-15.rar
(1.66 КБ) 68 скачиваний
Хотя нет. Не так.
Вдруг переполнение массива разделит пакет?
Лучше просто сдвигать данные по массиву, как по стеку, по типу FIFO.

Код: Выделить всё

volatile int Data[8];     // макссив принятых данных

void setup(){
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
    Serial.begin(1200,SERIAL_8N1);
    //скорости 110, 150, 300, 600, 1200, 2400, 4800, 9600
}

void loop(){
  if (Serial.available() > 0) {
  Data[8] = Serial.read();
  Parse();
  }
}

void Parse(){
// сдвинуть данные массива
  Data[1] = Data[2];
  Data[2] = Data[3];
  Data[3] = Data[4];
  Data[4] = Data[5];
  Data[5] = Data[6];
  Data[6] = Data[7];
  Data[7] = Data[8];
  // если второй байт=0x22 и последние считанные байты 0x0A+0x0D, то завершить цикл приёма
if (Data[2]==0x22 && Data[6]==0x0A && Data[7]==0x0D) {
  // если принятые данные пакета совпадают с переданными, то мигнуть
  if (Data[3]==28 && Data[4]==45 && Data[5]==36) {
      digitalWrite(13, HIGH);
      delay(100);
      digitalWrite(13, LOW);
      free(Data);     // обнулить массив
  }
}
}

Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 15 июн 2022, 20:23

Работает. Периодически :)
Отправляемый сигнал:
TX_01.png
Принимаемый такой же:
RX_02.png
Но иногда теряется начало передачи:
RX_021.png
P.S.
Кстати, контролер приёмника не программируется, если к пину RX подключен модуль приёмника.
Надо вытащить плату контроллера и прошивать отдельно от остальной схемы.

Аватара пользователя
ru0aog
Сообщения: 1000
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 132 раза
Поблагодарили: 145 раз

433 МГц модули и их применение

Сообщение ru0aog » 16 июн 2022, 18:15

Написал для передатчика вначале три посылки 0xFF для синхронизции.

Решил в качестве передатчика использовать не микросхемный модуль, работающий от +3,3В, а старый транзисторный FS1000A.
Запитал его от +5В и посмотрел, что покажет анализатор.
- совсем без антенны -40 dBm,
- со спиральной антенной -30 dBm,
- с проводком 22 см - 17 dBm.
А настроенная антенна была бы ещё лучше :)

На скорости 2400 бод связь есть по всей квартире, но попадаются места, где принимается две из трёх посылок. Что тоже неплохо.
На скорости 4800 связи вообще нет. Видимо приёмный модуль не тянет.

Ответить

Вернуться в «Микроконтроллеры и программирование»