Мини приемник и передатчик на 433 МГц для Ардуино

Step 4: Decode Signals From Your Remote Controls

Open the rc-switch “ReceiveDemo_Advanced” example sketch. Upload it and open the serial monitor. Hold your remote near your receiver module and press a button. The Arduino should decode the signal and print the results in the serial monitor. This is what I got for my remote-controlled mains switch when I press the button to turn channel 5 on:

Decimal: 3932352 (24Bit)Binary: 001111000000000011000000Tri-State: 011000001000PulseLength: 232 microsecondsProtocol: 1Raw data: 7244,232,692,124,792,592,328,596,324,596,328,596,324,140,784,144,788,120,792,136,780,136,788,140,788,128,784,144,796,124,780,140,784,596,336,588,968,96,36,104,908,132,1412,68,248,64,28,484,56,

My mains switches can have up to 8 addresses with a separate on and off command for each. By pressing every button and decoding the signals I worked out the codes for all the addresses and commands:

Address Bits: 8
Channel 1 = 01110000
Channel 2 = 00110000
Channel 3 = 01010000
Channel 4 = 00010000
Channel 5 = 01100000
Channel 6 = 00100000
Channel 7 = 01000000
Channel 8 = 00000000Data Bits: 4Turn On  = 1000Turn Off = 0000

I suspect the address codewords will be the same for all devices of the same make & model – if anyone can confirm this please let me know.

Button 1:
Decimal: 8571080 (24Bit)
Binary: 100000101100100011001000
Tri-State: not applicable
PulseLength: 321 microseconds
Protocol: 1
Raw data: 9964,956,332,312,976,312,976,308,980,304,980,308,980,952,340,304,980,956,336,188,908,276,728,264,124,168,308,60,24,60,236,88,88,204,88,76,80,56,1020,284,440,56,24,40,100,84,12,36,56,Button    Address              DataButton 1: 10000010110010001100 1000Button 2: 10000010110010001100 0100Button 3: 10000010110010001100 0010Button 4: 10000010110010001100 0001

Передатчик

Для передатчика используем FS1000A, джойстик KY-023, attiny13a. Запитаем его от кроны через стабилизатор LM317 с понижением до 5В(он выступает как фильтр питающей линии).

В качестве библиотеки передачи данных по воздуху использовались исходники. Я только упростил исходный код, убрал лишний для других контроллеров, оставил только для attyny13/45.

С передатчиком проблем не возникло, скорость передачи выбрал достаточно низкую — MAN_1200 — это примерно 100 бит в секунду.

Микроконтроллер опрашивает через АЦП Rx и Ry ножки джойстка, т.к джойстик — это два потенциометра и определяет позицию потенциометра. А так же детектирует нажатие кнопки джойстика. Считанные данные 2 раза в секунду помещаются в такой массив:

Массив — это 4 слова:

  • 1 — число ключ для проверки приемником, что пришли правильные данные, а не мусор
  • 2 — координата X, считанная с джойстика
  • 3 — координата Y, считанная с джойстика
  • 4 — была ли нажата кнопка

Массив по манчестерскому протоколу передается на передатчик. Один кадр передачи — это преамбула и сами данные. Преамбула — это 15 бит: 14 нулей и единица. преамбула нужна, чтоб приемник настроился на прием кадра и искючился мусор и шум.

Низкая частота передачи и длинная преамбула гарантируют корректный прием данных.

Вся программа опроса датчиков и передачи уместилась в микросхеме attiny13a.

F_CPU=9600000

KiCad проект

Вот схема пульта:

Мини приемник и передатчик на 433 МГц для Ардуино

Приемник

А вот с приемником дела обстояли хуже.

Применик должен быть запитан 5Вольтовым напряжением. Т.к. сервоприводы тоже требуют 5 вольт, то я их объединил на одну шину питания, после стабилизатора L7805.

Входной источник питания — батарея крона 9В или адаптер 10В. При работе сервоприводов на шину питания возникала нагрузка до 300 милли ампер, в эти моменты просаживалось напряжение до 4.5 Вольт на выходе L7805, в сети питания были постояные помехи, даже добавление фильтрующей емкости не помогало.

Микросхема XY-MK-5V выдавала нестабильные результаты:

  1. входной сигнал был инвертирован, по отношению передаваемого
  2. появились задержки на спадающий фронт сигнала в 450 микросекнуд, что сильно снижало скорость передачи

вот пример такого сигнала.Синим цветом отображается сигнал, который модулировался на передатчике, фиолетовым — сигнал принимаемый на приемнике.
Мини приемник и передатчик на 433 МГц для Ардуино

Красным квадратом выделен один из участков с задержкой. На 60 мс сигнал на передатчике переходит от 1 к 0, на приемнике лишь на 61 мс происходит реакция — смена 0 в 1. Пришлось играться с исходным кодом ManchesterRF.c подбирая таймауты для определения 0 и 1, а так же подстроить под инвертированный сигнал.

Но потом пришла идея разделить питание микроконтроллера и сервоприводов и микросхемы XY-MK-5V. Сама микросхема XY-MK-5V была перенесена на питание от L7805CV, а микроконтроллер и серводвигатели перенесены на вывход LM317 и все заработало, пропала инферсия сигнала и задержки. Т.е приемник оказался очень чувствительным к помехам в сети питания.

Вот каким стал сигнал после разделения питания:
Мини приемник и передатчик на 433 МГц для Ардуино

Пропала задержка и на 4-й и 5-й дорожке можно видеть ШИМ сигнал для сервоприводов.

Исходный код для программы микроконтроллера attiny45 можно найти здесь, F_CPU=8000000

В программе используется алгоритм поиска в буфере магического числа , даже если это число не в начале буфера, а например в конце, в этом случае прочитается еще один кадр и данные объединятся(можно было не усложнять и сделать просто проверку первых байт на при возникновении события )

Ниже приведена схема из файлов для KiCad

Мини приемник и передатчик на 433 МГц для Ардуино

Работа модели:

Примеры

Рассмотрим тестовый пример, который отправляет строку Hello from #<счётчик>:

Отправка

#include <Gyver433.h>
Gyver433_TX<2> tx;  // указали пин

void setup() {
}

char data[] = "Hello from #xx"; // строка для отправки
byte count = 0;                 // счётчик для отправки

void loop() {
  // добавляем счётчик в строку
  data = (count / 10) + '0';
  data = (count % 10) + '0';
  if (++count >= 100) count = 0;
  tx.sendData(data);
  delay(100);
}

Приём

#include <Gyver433.h>
Gyver433_RX<2, 20> rx;  // указали пин и размер буфера

void setup() {
  Serial.begin(9600);  
  attachInterrupt(0, isr, CHANGE);  // прерывание пина радио по CHANGE
}

// спец. тикер вызывается в прерывании
void isr() {
  rx.tickISR();
}

void loop() {
  if (rx.gotData()) {                   // если успешно принято больше 0
    Serial.write(rx.buffer, rx.size);   // выводим
    Serial.println();
  }
}

Библиотека позволяет отправлять данные любого типа (массив, структура) любой длины, что охватывает все возможные сценарии работы с радио.

Скетчи для nRF24L01 и Arduino

Скетчи для nRF24L01 и Arduino

Пример: передача данных о положении координат джойстика Х и Y от одного модуля nRF24L01 к другому nRF24L01. Второй модуль получает данные положении джойстика и передает их на дальнейшее отображение.

Ниже два скетча. Загрузите первый на ваш первый Arduino, к которому подключен радиопередатчик nRF24L01 и джойстик (или можно использовать потенциометр). Второй скетч загрузите на Arduino с подключенным модулем nRf24L01.

/* YourDuinoStarter пример: nRF24L01 передаем данные о положении джойстика

— Что делает скетч: считывает аналоговые значения на контакте A0, A1 и передает их

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

с помощью радиопередатчика nRF24L01 приемнику.

— Подключение nRF24L01 модуля смотрите на:

1 — GND

2 — VCC 3.3V !!! НЕ 5V

3 — CE к Arduino пину 9

4 — CSN к Arduino пину 10

5 — SCK к Arduino пину 13

6 — MOSI к Arduino пину 11

7 — MISO к Arduino пину 12

8 — НЕ ИСПОЛЬЗУЕТСЯ

Аналоговый джойстик или два потенциометра 10 КОм:

GND к Arduino GND

VCC к Arduino +5V

X потенциометр к Arduino A0

Y потенциометр к Arduino A1 */

/*——(Импортируем необходимые библиотеки)——*/

#include <SPI.h>

#include <nRF24L01.h>

#include <RF24.h>

/*——(Объявляем константы и номера пинов)——*/

#define CE_PIN 9

#define CSN_PIN 10

#define JOYSTICK_X A0

#define JOYSTICK_Y A1 // ПРИМЕЧАНИЕ: «LL» в конце константы — это тип данных «LongLong»

const uint64_t pipe = 0xE8E8F0F0E1LL;

/*——(Объявляем объекты)——*/

RF24 radio(CE_PIN, CSN_PIN); // Создаем объект Radio

/*——(Объявляем переменные)——*/

int joystick; // массив из 2-х элементов, в котором хранятся с джойстика

int i = 0;

void setup() /****** SETUP: ОТРАБАТЫВАЕТ 1 РАЗ ******/

{

Serial.begin(9600);

radio.begin();

radio.openWritingPipe(pipe);

}//—(завершение setup )—

void loop() /****** LOOP: ОТРАБАТЫВАЕТ В БЕСКОНЕЧНОМ ЦИКЛЕ ******/

{

joystick = i++;

joystick = i++;

radio.write( joystick, sizeof(joystick) );

delay(3);

}//—(завершаем главный цикл)—

Если что-то не работает???

В первую очередь проверьте питание 3.3 В. Хотя среднее значение силы тока питания равно 15 мА, бывают резкие скачки. В результате бывает такое, что передатчик отлично работает день/минуту, а потом перестает. Поэтому в схеме подключения желательно использовать конденсаторы на 10 мкФ между контактами GND и 3.3 В.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Проблемы с питанием NRF24L01

У многих возникают проблемы при запуске модуля nRF24L01. В основном это связано с тем, что в модуле питания 3.3 В не предусмотрена необходимая сила тока. Решение проблемы следующее:

  • Подключите конденсатор на 3.3 или 10 мкФ (микрофарад) напрямую к модулю — от 3.3 В (+) к GND (-). Некоторые рекомендуют использовать 10 мкФ или больше.
  • Отдельный источник питания на 3.3 В.
  • Использовать совместимый с Arduino YourDuinoRobo1, на котором добавлен регулятор 3.3 В (в этом случае, возможно, стоит добавить конденсатор на 1 мкФ на радиомодуль).
  • Старайтесь максимально избегать дополнительных проводов при подключении модуля радиопередатчика.
  • Разработать отдельную плату, на которую устанавливается модуль nRF24L01 и добавляются конденсаторы на 1 и 10 мкФ неподалеку от контактов 3.3 В и GND.

Проблемы с питанием возникают при использовании таких микроконтроллеров как, например, Arduino Uno, Nano, Mega, в которых на пины подается всего 50 мА. На некоторых новых модификациях плат делают пины с силой тока до 350 мА. Ну или вы можете отдельно приобрести шилды для увеличения мощности.

Распиновка передатчика и приемника 433 МГц

Давайте посмотрим на распиновку модулей передатчика и приемника RF 433 МГц.

Мини приемник и передатчик на 433 МГц для Ардуино

DATA — принимает цифровые данные для передачи.

VCC — обеспечивает питание передатчика. Это может быть любое положительное постоянное напряжение от 3,5 до 12 В. Обратите внимание, что РЧ-выход пропорционален напряжению питания, т.е. чем выше напряжение, тем больше будет дальность.

GND — минус питания.

Антенна — это разъем для внешней антенны. Как обсуждалось ранее, вам понадобится припаять кусок  проволоки длинной 17,3 см к этому контакту для улучшения дальности.

Мини приемник и передатчик на 433 МГц для Ардуино

  • DATA — выводит полученные цифровые данные. Два центральных штифта внутренне связаны между собой, поэтому вы можете использовать любой из них для вывода данных.
  • VCC — обеспечивает питание приемника. В отличие от передатчика, напряжение питания для приемника должно быть 5 В.
  • GND — минус питания.
  • Антенна — это разъем для внешней антенны, который часто не обозначен. Это накладка в левом нижнем углу модуля, рядом с маленькой катушкой. Опять же, можно припаять кусок провода  длинной 17,3 см к этому контакту для улучшения дальности.

Радио приемник FS1000A/XD-FST 433Mhz

Характеристики FS1000A/XD-FST

Рабочее напряжение: DC 5VРабочий ток: 4 мАРежим модуляции: ООК (AM)Рабочая температура: -10 ° C ~ +70 ° CПолучать чувствительность:-110dBРабочая частота: 433MHzРазмер: 30 х 14 х 7 мм

Приемник работает на основе колебательного контура с усилителем. Подключается с помощью выводов PIN1 VCC, PIN2/3 DATA, PIN5 GND. Выход радио модуля логический по уровню, но сигнал принимает аналоговый. По тому задача декодирования послания лежит на плечах устройства (обычно Arduino) которое принимает сигнал.

Мини приемник и передатчик на 433 МГц для Ардуино

Схема подключения радио модулей 433 Mgz к Arduino представлена ниже. Выходы выходы приемника и передатчика подключаются к Digital портам Arduino, которые способны обрабатывать модулированный сигнал.

Мини приемник и передатчик на 433 МГц для Ардуино

Для существенного увеличения дальности приема можно к приемо-передающим устройствам подпаять антенну. Самый простой вариант — кусок провода длиной 17 см с сопротивлением 50 Ом. Такая длина будет резанировать на частоте 433 Mgz т.к. ее длина равна 1/4 волны.

Для кодирования.декодирования передаваемого сигнала на Arduino удобно применять библиотеку VirtualWire.hПриведу пару примеров использования библиотеки для передачи цифровых данных.

Передатчик:

#include "VirtualWire.h"

const int led_pin = 13; // Пин светодиода
const int transmit_pin = 12; // Пин подключения передатчика

void setup()
{
	vw_set_tx_pin(transmit_pin);
	vw_setup(2000); // Скорость передачи (Бит в секунду)
	pinMode(led_pin, OUTPUT);
}

void loop()
{
	const char *msg = "Hello, Arduinomania"; // Передаваемое сообщение
	digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи
	vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения
	vw_wait_tx(); // Ожидаем окончания отправки сообщения
	digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи
	delay(1000); // Пауза 1 секунда
}

Приемник:

#include "VirtualWire.h"

byte message; // Буфер для хранения принимаемых данных
byte messageLength = VW_MAX_MESSAGE_LEN; // Размер сообщения

const int led_pin = 13; // Пин светодиода
const int receiver_pin = 11; // Пин подключения приемника

void setup()
{
	Serial.begin(9600); // Скорость передачиданных
	Serial.println("Read 433mHz begin");
	vw_set_rx_pin(receiver_pin); // Пин подключения приемника

	vw_setup(2000); // Скорость передачи данных (бит в секунду)
	vw_rx_start(); // Активация применика
}
void loop()
{
	if (vw_get_message(message, &messageLength)) // Если есть данные..
	{
		digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале приема пакета
		for (int i = 0; i < messageLength; i++)
		{
			Serial.write(message); // выводим их в одной строке
		}
		Serial.println();
		digitalWrite(led_pin, LOW); // Гасим светодиод в конце
	}
}

ASK — Amplitude Shift Keying

Как обсуждалось выше, для отправки цифровых данных по радиоканалу, эти модули используют технику, называемую Amplitude Shift Keying или ASK (амплитудная модуляция). Это когда амплитуда (то есть уровень) несущей волны (в нашем случае это сигнал 433 МГц) изменяется в ответ на входящий сигнал данных.

Это очень похоже на аналоговую технику амплитудной модуляции, с которой вы, возможно, знакомы, если вы собирали AM-радио. Иногда это называется двоичной амплитудной манипуляцией, потому что нам необходимо только два уровня. Вы можете представить это как переключатель  ВКЛ / ВЫКЛ.

  • Для лог. 1 — несущая в полную силу
  • Для лог. 0 — несущая отключена

Мини приемник и передатчик на 433 МГц для Ардуино

Амплитудная модуляция имеет преимущество в том, что она очень проста в реализации. На ее основе довольно просто спроектировать схему декодера. Также для ASK требуется меньшая полоса пропускания, чем другим методам модуляции, таким как FSK (частотная модуляция). Это одна из причин того дешевизны модулей.

Популярные статьи  Водяной насос без питания

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

Лабораторный блок питания 30 В / 10 А

Подробнее

Использование

// ========= Gyver433_TX =========
void sendData(T &data);                 // отправить данные любого типа (CRC добавляется автоматически)
void write(uint8_t* buf, uint8_t size); // отправить массив байт указанного размера (CRC не добавляется)

// ========= Gyver433_RX =========
// приём в прерывании
void tickISR();             // тикер приёма для вызова в прерывании по CHANGE
uint8_t tickISRraw();       // ручной приём в прерывании по CHANGE. Вернёт 1 (начало приёма), 2 (принят байт), 3 (конец пакета)

// приём в loop
uint16_t tick();            // неблокирующий приём. Вернёт количество успешно принятых байт
uint16_t tickWait();        // блокирующий приём. Вернёт количество успешно принятых байт

bool readData(T &data);     // прочитает буфер в любой тип данных (в указанную переменную)
uint16_t getSize();         // получить размер принятых данных
uint16_t gotData();         // вернёт количество успешно принятых в tickISR() байт (см. пример isr_rx)
uint8_t getRSSI();          // получить качество приёма (процент успешных передач 0.. 100)

uint8_t buffer[];           // доступ к буферу приёма
uint8_t byteBuf;            // доступ к буферу принятого байта

// ============= CRC =============
// можно использовать встроенные функции для генерации байта CRC для ручной упаковки пакетов
uint8_t G433_crc8(uint8_t *buffer, uint8_t size);       // ручной CRC8
uint8_t G433_crc_xor(uint8_t *buffer, uint8_t size);    // ручной CRC XOR

// ====== ДЕФАЙНЫ-НАСТРОЙКИ ======
// вызывать перед подключением библиотеки
#define G433_FAST           //  короткая синхронизация для зелёных модулей
#define G433_MEDIUM         //  средняя синхронизация при отправке на SYN480R ЧАЩЕ 400мс (активно по умолчанию)
#define G433_SLOW           //  длинная синхронизация при отправке на SYN480R РЕЖЕ 400мс
#define G433_SPEED 1000     // [RX/TX] скорость, должна быть одинакова на RX и TX, 100-10000 бит/с, по умолч. 2000 бит/с 
#define G433_RSSI_COUNT 8   //  количество успешно принятых пакетов для расчёта RSSI (по умолч. 8)
#define G433_CUT_RSSI       //  убрать расчёт RSSI из кода (сэкономит чуть памяти)

Работа приёмника без прерываний

Для приёма данных достаточно вызывать в основном цикле метод , он сам опрашивает пин радио.

  • Если в программе есть блокирующие места и loop() выполняется с задержками — будет потеря данных
  • Для более надёжного приёма рекомендуется вызывать , она блокирует выполнение кода на время приёма.

Работа приёмника с прерываниями

Рекомендуется использовать приём в прерывании по CHANGE, для этого нужно вызывать в нём .
Тогда приём будет асинхронный и будет работать даже в загруженной программе.

Если стандартных пинов прерываний не хватает, можно задействовать PCINT. Вручную или с помощью библиотеки https://github.com/NicoHood/PinChangeInterrupt

Сравнительная таблица популярных устройств дистанционного управления на частоте 433 МГц

Артикул Функцио-
нальное
назначение
Питание Число
каналов
управления
Максимальная
мощность
одного
канала
управления
Дополни-
тельный
брелок-
передатчик
Дальность Режимы
работы
Особенности
MK333 Комплект
брелок-
передатчик+
приемник
~220 В 1 ~1000 Вт (7 А) MK336 40 м Только триггер • самый миниатюрный приемник;
• корпус для приемника в комплекте;
• до 20 дополнительных брелков.
MK336 Брелок-передатчик Бат.12 В 40 м • дополнительный брелок для MK333
MP324M Комплект
брелок-
передатчик+
приемник
=5 В
(приемник)
Бат.12 В
(передатчик)
4 Маломощный,
TTL-уровни
MP433/
передатчикMP325M/
передатчикMP324M/
передатчик
100 м Кнопка • для реализации режимов «триггер»
  и «импульс» используется MP146;
• диапазон рабочих температур
  приемника от -40 до +80 градусов;
• при использовании брелка MP433/
  передатчик число подключаемых брелков
  неограниченно.
MP324M/
передатчик
Брелок-
передатчик
Бат.12В 4 100 м • подходит для MP324M, MP326M
• 4 кнопки;
• можно заменить на MP433/
  передатчик.
MP325M Комплект
брелок-
передатчик+
приемник
=12 В
(приемник)
Бат.12 В
(передатчик
2 ~2000 Вт (10 А) MP433/
передатчикMP325M/
передатчикMP324M/
передатчик
100 м Кнопка, триггер

• при использовании брелка MP433/
  передатчик число подключаемых
  брелков неограниченно;
• светодиодная индикация состояний реле;
• входы типа «триггер» для сброса реле.

MP325M/
передатчик
Брелок-
передатчик
Бат.12В 2 100 м • дополнительный брелок для MP325M
MP326M Комплект
брелок-
передатчик+
приемник
=12 В
(приемник)
Бат.12 В
(передатчик
4 ~2000 Вт (10 А) MP325M/
передатчикMP324M/
передатчик
100 м Кнопка, триггер • светодиодная индикация состояний реле;
• сброс реле в режиме «триггер»;
• неограниченное число дополнительных
  брелков MP324M/передатчик.
MP426 SE Комплект
брелок-
передатчик+
приемник
=12 В
(приемник)
Бат.12 В
(передатчик
4 ~1000 Вт (5 А) MP433/
передатчик
100м Кнопка, триггер,
перебор каналов
• три режима работы;
• неограниченное число дополнительных
  брелков MP324M/передатчик.
MP433 Комплект
передатчик
приемник
на печатных
платах
=5 В
(приемник)
=12 В
(передатчик)
Маломощный,
TTL-уровни
100 м • аналоговые модули без кодирования
  для использования в проектах с
  микроконтроллерами и другими
  кодерами и декодерами;
• миниатюрное исполнение;
• низкое энергопотребление.
MP433/
передатчик
Брелок-
передатчик-
дубликатор
Бат.12 В 4 100 м • дублирование передатчиков;
• поддержка до 4-х разных приемников;
• работа с большим числом беспроводных
   систем с фиксированными и обучающими
   кодами.
MP433PRO Комплект
передатчик+
приемник на
печатных
платах
=5 В
(приемник)
=3-12 В
(передатчик)
Маломощный,
TTL-уровни
600 м • расстояние до 600 м;
• рабочая температура от -40 до +60º;
• аналоговые модули без кодирования
  для использования в проектах
  с микроконтроллерами и другими
  кодерами и декодерами;
• миниатюрное исполнение;
• низкое энергопотребление.
MP910 Брелок-передатчик Бат.12 В 2 100 м • передатчик для MP911, MP912 и MP913
MP911 Приемник 12 В 1 ~2000 Вт (10 А) MP910 100 м Кнопка • питание переменным или постоянным
  напряжением 12 В;
• возможно построение системы с
  несколькими   приемниками
  с использованием MP433/передатчик;
• изменение кодировки перемычками.
MP912 Приемник 12 В 1 ~2000 Вт (10 А) MP910 100 м Триггер • питание переменным или постоянным
  напряжением 12 В;
• возможно построение системы с
  несколькими   приемниками
  с использованием MP433/передатчик;
• изменение кодировки перемычками.
MP913 Приемник 12 В 2 ~2000 Вт (10 А) MP910 100 м Кнопка • питание переменным или постоянным
  напряжением 12 В;
• возможно построение системы с
  несколькими   приемниками
  с использованием MP433/передатчик;
• изменение кодировки перемычками.
MP8036mhz Сканер,
дубликатор,
ретранслятор,
маяк
=9-14 В 4 входных
8 выходных
Маломощный,
TTL-уровни
До 600 м • многофункциональный модуль
  управления беспроводными устройствами;
• входные и выходные линии TTL-уровней
  для подключения кнопок и силовых модулей;
• дисплей, пользовательское меню;
• поддержка большого количества
  беспроводных систем диапазона 433 МГц.
Популярные статьи  Простой электронный замок своими руками

Работа схемы

Схема устройства представлена на следующем рисунке.

Мини приемник и передатчик на 433 МГц для Ардуино

Примечание: чтобы видеть ответы модуля ESP8266 на поступающие команды откройте монитор последовательного порта (Serial Monitor) в программной среде Arduino IDE.

В программе первым делом нам необходимо будет соединить наш Wi-Fi модуль с Wi-Fi роутером чтобы подключить Wi-Fi модуль к сети интернет. Затем мы должны сконфигурировать локальный сервер, передать данные на веб-страницу и закрыть соединение. Для этого нам необходимо выполнить следующую последовательность действий:

1. Сначала нам необходимо произвести тест Wi-Fi модуля при помощи передачи ему AT команды, он должен ответить OK.

2. После этого мы должны выбрать необходимый режим работы с помощью команды AT+CWMODE=mode_id , мы будем использовать Mode Полный же список доступных режимов выглядит следующим образом: 1 = Station mode (client) (режим станции, клиента) 2 = AP mode (host) (режим базовой станции, хоста) 3 = AP + Station mode (Yes, ESP8266 has a dual mode!) (режим станции + хоста – модуль ESP8266 поддерживает этот двойной режим).

3. Затем мы должны отсоединить наш Wi-Fi модуль от прежней Wi-Fi сети с помощью команды AT+CWQAP поскольку модуль ESP8266 по умолчанию автоматически соединяется с предыдущей использованной сетью Wi-Fi.

4. После этого можно сбросить модуль командой AT+RST – это необязательный шаг.

5. После этого мы должны соединить модуль ESP8266 с Wi-Fi роутером с помощью команды: AT+CWJAP=”wifi_username”,”wifi_password” .

6. После этого мы должны получить IP адрес с помощью команды AT+CIFSR , которая вернет нам IP адрес.

7. После этого нам необходимо задействовать режим мультиплексирования с помощью команды AT+CIPMUX=1 (1 для соединения с мультиплексированием и 0 для одиночного соединения).

8. Теперь сконфигурируем ESP8266 как сервер с помощью команды AT+CIPSERVER=1,port_no (port может быть 80). Теперь наш Wi-Fi готов. В представленной команде ‘1’ используется для создания сервера и ‘0’ для удаления сервера.

9. Теперь с помощью соответствующих команд можно передавать данные на созданный локальный сервер: AT+CIPSEND =id, length of data Id = ID no. of transmit connection (номер соединения) Length = Max length of data is 2 kb (максимальная длина данный 2 Кбайта).

10. После передачи ID (номера, идентификатора) и Length (длины данных) на сервер мы можем передавать данные, к примеру: Serial.println(“[email protected]”);

11. После передачи данных нам необходимо закрыть соединение с помощью команды: AT+CIPCLOSE=0 После этого данные будет переданы на локальный сервер.

12. Теперь вы можете набрать IP адрес в строке адреса вашего браузера и нажать Enter. После этого вы увидите переданные данные на веб-странице.

Все описанные шаги можно более наглядно посмотреть в видео в конце статьи.

Пример приема одного байта по Манчестерскому коду

В программе при изменении уровня сигнала формируется прерывание.
— это значение уровня старое, до прерывания, — это значение уровня новое, после прерывания.
— длинный период(значит или 0 менялся на 1 или 1 на 0 в передаваемом бите), — короткий период (значит идет последовательность повторяющихся бит)

Для примера передается последовательность бит: 00101100

Выглядеть это будет по Манчестерскому коду так:

Мини приемник и передатчик на 433 МГц для Ардуино

черным выделены биты и сам сигнал, красным — моменты возникновения смены сигнала, зеленым — периоды

LS & RS период 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 слово
1 LS=1 RS=0 S
2 LS=0 RS=1 S 1 1
3 LS=1 RS=0 S 1 2
4 LS=0 RS=1 L 1 4
1 1 9
5 LS=1 RS=0 L 1 1 1 13
1 1 1 26
6 LS=0 RS=1 L 1 1 1 4C
1 1 1 1 99
7 LS=1 RS=0 S 1 1 1 1 132
8 LS=0 RS=1 S 1 1 1 1 1 265
9 LS=1 RS=0 L 1 1 1 1 1 1 4CB
1 1 1 1 1 1 996
10 LS=0 RS=1 S 1 1 1 1 1 1 1 132D
11 LS=1 RS=0 S 1 1 1 1 1 1 1 265A

итого имеем 0010011001011010. Разобьем по парам 00.10.01.10.01.01.10.10 и из каждой пары возьмем младьший бит — 00101100, т.е то число, которое закодировали в самом начале на картинке.

Тестирование RF модулей

При испытаниях обоих модулей от +5В источника постоянного тока, а также с 173 мм вертикальной штыревой антенной. (для частоты 433,92 МГц это «1/4 волны»), было получено реальных 20 метров через стены, и тип модулей не сильно влияет на эти тесты

Поэтому можно предположить, что эти результаты типичны для большинства блоков. Был использован цифровой источник сигнала с точной частотой и 50/50 скважностью, это было использовано для модуляции данных передатчика. 

Мини приемник и передатчик на 433 МГц для Ардуино   

Выше показан простой вариант блока для последовательной передачи информации микроконтроллеру, которая будет получена с компьютера. Единственное изменение — добавлен танталовый конденсатор 25 В 10 мкф на выводы питания (Vcc и GND) на оба модуля.

Step 5: Write Code for Your Device

If not, you’ll need to manually set the PulseLength and Protocol and send raw codes using the RCSwitch::send() or RCSwitch::sendTriState() methods, as shown below.

The following code – based on the “SendDemo” sketch – switches one of my remote controlled mains switches on and off every 1 second. Note the pulse length has to be manually set because it differs from the default pulse length for Protocol 1. I’ve created a function – command() – which accepts channel number and on/off as integer arguments and looks up the corresponding address and data commands specific to my device. For your device you could create a similar function, or just send the raw codes.

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

Serial.begin(9600);

// Transmitter is connected to Arduino Pin #10
mySwitch.enableTransmit(10);

// Optional set pulse length.
mySwitch.setPulseLength(321);

// set protocol (default is 1, will work for most outlets)
// mySwitch.setProtocol(2);

// Optional set number of transmission repetitions.
// mySwitch.setRepeatTransmit(15);

pinMode(13,OUTPUT);

}

void loop() {
mySwitch.send(«100000101100100011001000»);
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
delay(10000);
}

Here is the code which opens and closes my garage door (simulates button 1) every 10 seconds. It also flashes the on-board LED to indicate a command has been sent.

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void setup() {

Serial.begin(9600);

// Transmitter is connected to Arduino Pin #10
mySwitch.enableTransmit(10);

// Optional set pulse length.
mySwitch.setPulseLength(321);

// set protocol (default is 1, will work for most outlets)
// mySwitch.setProtocol(2);

// Optional set number of transmission repetitions.
// mySwitch.setRepeatTransmit(15);

pinMode(13,OUTPUT);

}

void loop() {
mySwitch.send(«100000101100100011001000»);
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
delay(10000);
}

Оцените статью
Денис Серебряков
Добавить комментарии

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Мини приемник и передатчик на 433 МГц для Ардуино
Кормушка для хомяка своими руками