Рассмотрим радионабор 433МГц состоящий из модуля передатчика FS1000A и приемника XY-MK-5V. Описание работы и устройства этих модулей можно найти по этой ссылке.
Задача
имеется:
- FS1000A
- XY-MK-5V
- джойстик KY-023
- микроконтроллеры attiny13a и attiny45
- 2 сервопривода в держателе для камеры для Raspberry PI
нужно сделать пульт с джойстиком, который бы управлял сервоприводами(и камерой). Нажатие на джойстик включало бы и выключало бы камеру. Сигналы с джойстика конечо должны передаваться по радиоканалу.
Передатчик
Для передатчика используем FS1000A, джойстик KY-023, attiny13a. Запитаем его от кроны через стабилизатор LM317 с понижением до 5В(он выступает как фильтр питающей линии).
В качестве библиотеки передачи данных по воздуху использовались исходники. Я только упростил исходный код, убрал лишний для других контроллеров, оставил только для attyny13/45.
С передатчиком проблем не возникло, скорость передачи выбрал достаточно низкую - MAN_1200 - это примерно 100 бит в секунду.
Микроконтроллер опрашивает через АЦП Rx и Ry ножки джойстка, т.к джойстик - это два потенциометра и определяет позицию потенциометра. А так же детектирует нажатие кнопки джойстика. Считанные данные 2 раза в секунду помещаются в такой массив:
#define MAGIC_NUMBER 0xFFEE
#define SEND_SIZE 4
#define Rx_coord sendData[SEND_SIZE-3]
#define Ry_coord sendData[SEND_SIZE-2]
#define TransmitKey sendData[SEND_SIZE-1]
unsigned int sendData[SEND_SIZE] = { MAGIC_NUMBER, 0, 0, 0 };
Массив - это 4 слова:
- 1 - число ключ для проверки приемником, что пришли правильные данные, а не мусор
- 2 - координата X, считанная с джойстика
- 3 - координата Y, считанная с джойстика
- 4 - была ли нажата кнопка
Массив по манчестерскому протоколу передается на передатчик. Один кадр передачи - это преамбула и сами данные. Преамбула - это 15 бит: 14 нулей и единица. преамбула нужна, чтоб приемник настроился на прием кадра и искючился мусор и шум.
Низкая частота передачи и длинная преамбула гарантируют корректный прием данных.
Вся программа опроса датчиков и передачи уместилась в микросхеме attiny13a.
F_CPU=9600000
KiCad проект
Вот схема пульта:
Приемник
А вот с приемником дела обстояли хуже.
Применик должен быть запитан 5Вольтовым напряжением. Т.к. сервоприводы тоже требуют 5 вольт, то я их объединил на одну шину питания, после стабилизатора L7805.
Входной источник питания - батарея крона 9В или адаптер 10В. При работе сервоприводов на шину питания возникала нагрузка до 300 милли ампер, в эти моменты просаживалось напряжение до 4.5 Вольт на выходе L7805, в сети питания были постояные помехи, даже добавление фильтрующей емкости не помогало.
Микросхема XY-MK-5V выдавала нестабильные результаты:
- входной сигнал был инвертирован, по отношению передаваемого
- появились задержки на спадающий фронт сигнала в 450 микросекнуд, что сильно снижало скорость передачи
вот пример такого сигнала.Синим цветом отображается сигнал, который модулировался на передатчике, фиолетовым - сигнал принимаемый на приемнике.
Красным квадратом выделен один из участков с задержкой. На 60 мс сигнал на передатчике переходит от 1 к 0, на приемнике лишь на 61 мс происходит реакция - смена 0 в 1. Пришлось играться с исходным кодом ManchesterRF.c подбирая таймауты для определения 0 и 1, а так же подстроить под инвертированный сигнал.
Но потом пришла идея разделить питание микроконтроллера и сервоприводов и микросхемы XY-MK-5V. Сама микросхема XY-MK-5V была перенесена на питание от L7805CV, а микроконтроллер и серводвигатели перенесены на вывход LM317 и все заработало, пропала инферсия сигнала и задержки. Т.е приемник оказался очень чувствительным к помехам в сети питания.
Вот каким стал сигнал после разделения питания:
Пропала задержка и на 4-й и 5-й дорожке можно видеть ШИМ сигнал для сервоприводов.
Исходный код для программы микроконтроллера attiny45 можно найти здесь, F_CPU=8000000
В программе используется алгоритм поиска в буфере магического числа #define MAGIC_NUMBER 0xFFEE
, даже если это число не в начале буфера, а например в конце, в этом случае прочитается еще один кадр и данные объединятся(можно было не усложнять и сделать просто проверку первых байт на MAGIC_NUMBER
при возникновении события ManchesterRF_available()
)
Ниже приведена схема из файлов для KiCad
Работа модели:
Пример приема одного байта по Манчестерскому коду
В программе при изменении уровня сигнала формируется прерывание.
LS
- это значение уровня старое, до прерывания, RS
- это значение уровня новое, после прерывания.
L
- длинный период(значит или 0 менялся на 1 или 1 на 0 в передаваемом бите), S
- короткий период (значит идет последовательность повторяющихся бит)
Для примера передается последовательность бит: 00101100
Выглядеть это будет по Манчестерскому коду так:
черным выделены биты и сам сигнал, красным - моменты возникновения смены сигнала, зеленым - периоды
№ | LS & RS | период | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | слово |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | LS=1 RS=0 | S | 0 | 0 | |||||||||||||||
2 | LS=0 RS=1 | S | 0 | 1 | 1 | ||||||||||||||
3 | LS=1 RS=0 | S | 0 | 1 | 0 | 2 | |||||||||||||
4 | LS=0 RS=1 | L | 0 | 1 | 0 | 0 | 4 | ||||||||||||
0 | 1 | 0 | 0 | 1 | 9 | ||||||||||||||
5 | LS=1 RS=0 | L | 0 | 1 | 0 | 0 | 1 | 1 | 13 | ||||||||||
0 | 1 | 0 | 0 | 1 | 1 | 0 | 26 | ||||||||||||
6 | LS=0 RS=1 | L | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 4C | ||||||||
0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 99 | ||||||||||
7 | LS=1 RS=0 | S | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 132 | ||||||
8 | LS=0 RS=1 | S | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 265 | |||||
9 | LS=1 RS=0 | L | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 4CB | ||||
0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 996 | ||||||
10 | LS=0 RS=1 | S | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 132D | ||
11 | LS=1 RS=0 | S | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 265A |
итого имеем 0010011001011010. Разобьем по парам 00.10.01.10.01.01.10.10 и из каждой пары возьмем младьший бит - 00101100, т.е то число, которое закодировали в самом начале на картинке.
Что еще нужно сделать
На текущий момент в проекте нет шифрования и сопряжения устройств, т.е легко можно перехватить управление. Нет возможности сопрягать несколько пар устройств, т.к. манипулятор не имеет адреса. Но в качестве манипулятора для камеры для дома вполне подойдет.